shared скрипт кидаем куда угодно в shared часть.
Пример: donteleport/lua/autorun/teleport.lua
Скрипт:
if CLIENT then
local EFFECT = {}
EFFECT.Mat = Material("sprites/physbeama")
function EFFECT:Init(data)
self.StartPos = data:GetStart()
self.EndPos = data:GetOrigin()
self.Normal = (self.EndPos - self.StartPos):GetNormalized()
self.Length = (self.StartPos - self.EndPos):Length()
self.LiveTime = 0.5
self.DieTime = CurTime() + self.LiveTime
local dlight = DynamicLight(self:EntIndex())
if dlight then
dlight.pos = self.EndPos
dlight.r = 255
dlight.g = 255
dlight.b = 255
dlight.brightness = 8
dlight.Decay = 50000
dlight.Size = 600
dlight.DieTime = CurTime() + self.LiveTime
end
end
function EFFECT:Think()
return CurTime() < self.DieTime
end
function EFFECT:Render()
local timeFraction = (self.DieTime - CurTime()) / self.LiveTime
local beamWidth = timeFraction * 128
render.SetMaterial(self.Mat)
render.DrawBeam(self.StartPos, self.EndPos, beamWidth, 0, self.Length / 4, Color(255, 255, 255, 255 * timeFraction))
end
effects.Register(EFFECT, "lightning_strike")
end
local function createLightningEffect(startPos, endPos, ply)
local effectData = EffectData()
effectData:SetStart(startPos)
effectData:SetOrigin(endPos)
util.Effect("lightning_strike", effectData)
local thunderSounds = {
"ambient/levels/labs/electric_explosion1.wav",
"ambient/levels/labs/electric_explosion2.wav",
"ambient/levels/labs/electric_explosion3.wav",
"ambient/levels/labs/electric_explosion4.wav"
}
ply:EmitSound(table.Random(thunderSounds), 100, 100)
end
local function teleportPlayer(ply)
if not ply:HasPurchase("teleport") then return end
local trace = ply:GetEyeTrace()
local targetPos = trace.HitPos + Vector(0, 0, 5)
local skyHeight = 100000
local lightningStartPos = ply:GetPos() + Vector(0, 0, skyHeight)
createLightningEffect(lightningStartPos, ply:GetPos(), ply)
ply:SetPos(targetPos)
lightningStartPos = targetPos + Vector(0, 0, skyHeight)
createLightningEffect(lightningStartPos, targetPos, ply)
ply:EmitSound("Weapon_PhysCannon.Launch", 75, 100)
ply:SetNWFloat("TeleportCooldown", CurTime() + 30)
ply:ChatPrint("Телепортация прошла успешно! Подождите 30 секунд для следующей телепортации.")
end
hook.Add("PlayerButtonDown", "TeleportButtonDown", function(ply, button)
if button == KEY_T then
local cooldown = ply:GetNWFloat("TeleportCooldown", 0)
if CurTime() >= cooldown then
teleportPlayer(ply)
else
local remainingTime = math.ceil(cooldown - CurTime())
ply:ChatPrint("Телепортация еще не доступна! Подождите еще " .. remainingTime .. " секунд.")
end
end
end)
hook.Add("PlayerInitialSpawn", "InitializeTeleportCooldown", function(ply)
ply:SetNWFloat("TeleportCooldown", 0)
end)
Чтобы работало, создаём любой донат с id teleport и покупаем его. Нажимаем T и телепортируемся куда смотрим, можно настроить, чтобы работало раз в час, просто изменив время в коде.
P. S. Эффект молнии с неба будут видеть только другие игроки, вы сами услышите только звук.