[DarkRP] Как сделать афк систему

Хочу чтоб за минут 20-30 чела с профы кидали например - ПСУ 03 —] Приезжий.

Сначала давай определим стандартную профу. Пусть это будет TEAM_CITIZEN (гражданин, как обычно).

-- Словарь для хранения времени последнего движения каждого игрока
local lastPlayerMove = {}

-- Стандартная профа, на которую перекинет, если AFK
local defaultTeam = TEAM_CITIZEN

-- Время AFK в секундах (20 минут = 1200 секунд, 30 минут = 1800 секунд)
local afkTime = 1800

-- Проверяем движение игрока
hook.Add("PlayerTick", "CheckPlayerAFK", function(ply)
    if not lastPlayerMove[ply] then
        lastPlayerMove[ply] = CurTime()
    end
    
    -- Если игрок двигался
    if ply:GetVelocity():Length() > 0 then
        lastPlayerMove[ply] = CurTime()
    end
    
    -- Если прошло больше afkTime секунд с последнего движения
    if CurTime() - lastPlayerMove[ply] >= afkTime then
        -- Сбрасываем таймер
        lastPlayerMove[ply] = CurTime()
        
        -- Меняем профу на стандартную
        if ply:Team() ~= defaultTeam then
            ply:changeTeam(defaultTeam, true)
            DarkRP.notify(ply, 1, 5, "Ты был переведён на стандартную профу из-за AFK.")
        end
    end
end)

-- Если игрок выходит, удаляем его из словаря
hook.Add("PlayerDisconnected", "RemovePlayerAFK", function(ply)
    lastPlayerMove[ply] = nil
end)

Оптимизация через корутины:

local lastPlayerMove = {}

local defaultTeam = TEAM_CITIZEN

local afkTime = 1800

local function checkAFK()
    while true do
        for _, ply in pairs(player.GetAll()) do
            if not lastPlayerMove[ply] then
                lastPlayerMove[ply] = CurTime()
            end
            
            if CurTime() - lastPlayerMove[ply] >= afkTime then
                lastPlayerMove[ply] = CurTime()
                
                if ply:Team() ~= defaultTeam then
                    ply:changeTeam(defaultTeam, true)
                    DarkRP.notify(ply, 1, 5, "Ты был переведён на стандартную профу из-за AFK.")
                end
            end
            
            coroutine.yield()
        end
        
        coroutine.yield()
    end
end

local co = coroutine.create(checkAFK)
hook.Add("Think", "AFKCoroutineThink", function()
    coroutine.resume(co)
end)

hook.Add("PlayerTick", "UpdatePlayerMoveTime", function(ply)
    if ply:GetVelocity():Length() > 0 then
        lastPlayerMove[ply] = CurTime()
    end
end)

hook.Add("PlayerDisconnected", "RemovePlayerAFK", function(ply)
    lastPlayerMove[ply] = nil
end)

А куда это кидать?

lua/autorun/server/afk.lua

Спасибо

Я думаю вот так надо было сделать,верно? А то мало ли
sv_afk.lua (2,7 КБ)

Зачем ты вставил основной код и его же, но оптимизированного? Это вариации одного и того же скрипта

А,не обратил внимания

Спасибо

Спасибо зайка!