Донат эффектный телепорт с кулдауном

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. Эффект молнии с неба будут видеть только другие игроки, вы сами услышите только звук.

видосик бы. Или хоть фотки