Hey, I'm using this auto afk kicker: [url]http://forums.ulyssesmod.net/index.php?topic=5963.0[/url]
The only thing is when you die and respawn it seems to reset the timer, So this isn't working on my deathrun server when you respawn every round.
The afk kicker works fine when your in spectate mode because your not respawning.
Heres the code:
[LUA]
CreateConVar("ulx_afk_flagminutes", 8, FCVAR_ARCHIVE, "How many minutes an player can be AFK before being flagged as AFK.")
CreateConVar("ulx_afk_kickminutes", 10, FCVAR_ARCHIVE, "How many minutes an player can be AFK before being kicked.")
CreateConVar("ulx_afk_ignoreadmins", 0, FCVAR_ARCHIVE, "Should we ignore AFK admins? (1=yes, 0=no).")
CreateConVar("ulx_afk_kickonafk", 1, FCVAR_ARCHIVE, "Should AFK players be kicked from the server at all? (1=yes, 0=no).")
CreateConVar("ulx_afk_kickonlywhenfull", 0, FCVAR_ARCHIVE, "Should the script only kick afk players when the server is full? (1=yes, 0=no).")
if SERVER then
function ulx.CheckAFK( pl )
if pl:IsAdmin() and GetConVarNumber( "ulx_afk_ignoreadmins" ) == 1 then
return
end
local afk_kth = GetConVarNumber( "ulx_afk_kickminutes" )
if not IsValid( pl ) then return end
if not pl:IsConnected() then return end
if pl.lpos == nil then
pl.lpos = pl:GetPos()
pl.lang = pl:GetAngles()
pl.afk = false
return
end
if pl.afkc == nil then
pl.afkc = 0
end
if ( pl:GetPos() == pl.lpos) and ( pl:GetAngles() == pl.lang ) then
pl.afkc = pl.afkc + 1
else
pl.afkc = 0
pl.afk = false
pl.lpos = pl:GetPos()
pl.lang = pl:GetAngles()
return
end
if pl.afkc >= GetConVarNumber( "ulx_afk_flagminutes" ) then
if pl.afk == false then
pl.afk = true
ulx.fancyLogAdmin( pl, "#A went AFK!" )
ULib.tsayColor(_, Color(0,0,0,255), "[AAFK] ", team.GetColor(pl:Team()), pl:Nick(), Color(255,255,255), " went ", Color(255,0,0,255), "AFK.")
end
end
if ( pl.afkc >= afk_kth ) and ( GetConVarNumber( "ulx_afk_kickonafk" ) ) then
if ( #player.GetAll() < game.MaxPlayers() ) and ( GetConVarNumber( "ulx_afk_kickonlywhenfull" ) == 1 ) then
return
end
ULib.kick( pl, "AFK: Exceeding the allowed AFK time!" )
end
end
function ulx.AFKTimer( pl )
local PID = pl:SteamID64()
pl.afkc = 0
pl.afk = false
pl:SetNWBool("afk", false)
pl.lpos = pl:GetPos()
pl.lang = pl:GetAngles()
timer.Create("ulx_afk_" .. PID, 60, 0, function() ulx.CheckAFK( pl ) end )
end
hook.Add( "ULibLocalPlayerReady", "AFKTimer", ulx.AFKTimer )
function ulx.ResetAFKStatus( pl )
if pl.lpos == nil then
pl.lpos = pl:GetPos()
pl.lang = pl:GetAngles()
pl.afk = false
return
end
pl.afkc = 0
pl.afk = false
pl:SetNWBool("afk", false)
pl.lpos = pl:GetPos()
pl.lang = pl:GetAngles()
ulx.fancyLogAdmin( pl, "#A returned from being AFK!" )
ULib.tsayColor(_, Color(0,0,0,255), "[AAFK] ", team.GetColor(pl:Team()), pl:Nick(), Color(255,255,255), " returned from being ", Color(255,0,0,255), "AFK.")
end
function ulx.AFKExit_Chat( pl )
if pl.afk == false then return end
if not IsValid( pl ) then return end
if not pl:IsConnected() then return end
ulx.ResetAFKStatus( pl )
print("1")
end
hook.Add("PlayerSay", "AFKExit_Chat", ulx.AFKExit_Chat)
function ulx.AFKExit_KeyPress( pl )
if pl.afk == false then return end
if not IsValid( pl ) then return end
if not pl:IsConnected() then return end
ulx.ResetAFKStatus( pl )
print("2")
end
hook.Add("KeyPress", "AFKExit_KeyPress", ulx.AFKExit_KeyPress)
function ulx.AFKExit_Move( pl )
if pl.afk == false then return end
if not IsValid( pl ) then return end
if not pl:IsConnected() then return end
ulx.ResetAFKStatus( pl )
print("2")
end
hook.Add("PlayerFootstep", "AFKExit_Move", ulx.AFKExit_Move)
end
if CLIENT then
surface.CreateFont( "SGS_HUD3", {
font = "tahoma",
size = 14,
weight = 600
}
)
local enablenames = true
local enabletitles = true
local textalign = 1
local distancemulti = 0.6
function DrawAFKStatus()
local vStart = LocalPlayer():GetPos()
local vEnd
for k, v in pairs(player.GetAll()) do
if v:GetNWBool("afk", false) == false then continue end
local vStart = LocalPlayer():GetPos()
local vEnd = v:GetPos() + Vector(0,0,25)
local trace = {}
trace.start = vStart
trace.endpos = vEnd
local trace = util.TraceLine( trace )
if trace.HitWorld then
local mepos = LocalPlayer():GetPos()
local tpos = v:GetPos()
local tdist = mepos:Distance(tpos)
if tdist <= 2000 then
local zadj = 0.03334 * tdist
local pos = v:GetPos() + Vector(0,0,v:OBBMaxs().z + 5 + zadj)
pos = pos:ToScreen()
draw.RoundedBoxEx( 2, pos.x - 4, pos.y - 4, 8, 8, Color(255,0,0,255), true, true, true, true )
end
else
local mepos = LocalPlayer():GetPos()
local tpos = v:GetPos()
local tdist = mepos:Distance(tpos)
if tdist <= 600 then
local zadj = 0.03334 * tdist
local pos = v:GetPos() + Vector(0,0,v:OBBMaxs().z + 5 + zadj)
pos = pos:ToScreen()
if v != LocalPlayer() then
draw.SimpleTextOutlined( "[AFK]", "SGS_HUD3", pos.x, pos.y - 8 , Color(255,0,0,255), textalign, 1,1,Color(0,0,0,255))
draw.SimpleTextOutlined( v:Name(), "SGS_HUD3", pos.x, pos.y - 23 , Color(255,0,0,255), textalign, 1,1,Color(0,0,0,255))
end
elseif tdist > 600 and tdist <= 2000 then
local zadj = 0.03334 * tdist
local pos = v:GetPos() + Vector(0,0,v:OBBMaxs().z + 5 + zadj)
pos = pos:ToScreen()
draw.RoundedBoxEx( 2, pos.x - 4, pos.y - 4, 8, 8, Color(255,0,0,255), true, true, true, true )
end
end
end
end
hook.Add("HUDPaint", "DrawAFKStatus", DrawAFKStatus)
end
[/LUA]
Its because when you respawn for the next round, it changes your position so it thinks you're not AFK anymore. I can't fix it right now tho, if someone doesn't by tomorrow then I will.
[lua]
--------------------------------------------------
AFK_TIME = 900
AFK_WARN_TIME = 600
--------------------------------------------------
hook.Add("PlayerInitialSpawn", "MakeAFKVar", function(ply)
ply.NextAFK = CurTime() + AFK_TIME
end)
hook.Add("Think", "HandleAFKPlayers", function()
for _, ply in pairs (player.GetAll()) do
if ( ply:IsConnected() and ply:IsFullyAuthenticated() ) then
if (!ply.NextAFK) then
ply.NextAFK = CurTime() + AFK_TIME
end
local afktime = ply.NextAFK
if (CurTime() >= afktime - AFK_WARN_TIME) and (!ply.Warning) then
ply:ChatPrint("------------------------------------------------------")
ply:ChatPrint("Warning: You will be kicked soon if you are inactive.")
ply:ChatPrint("------------------------------------------------------")
ply.Warning = true
elseif (CurTime() >= afktime) and (ply.Warning) then
ply.Warning = nil
ply.NextAFK = nil
ply:Kick("Kicked for being AFK for 15 minutes.\n ")
end
end
end
end)
hook.Add("KeyPress", "PlayerMoved", function(ply, key)
ply.NextAFK = CurTime() + AFK_TIME
ply.Warning = false
end)
[/lua]
This works :)
[QUOTE=SwikCoder;46137889][lua]
--------------------------------------------------
AFK_TIME = 900
AFK_WARN_TIME = 600
--------------------------------------------------
hook.Add("PlayerInitialSpawn", "MakeAFKVar", function(ply)
ply.NextAFK = CurTime() + AFK_TIME
end)
hook.Add("Think", "HandleAFKPlayers", function()
for _, ply in pairs (player.GetAll()) do
if ( ply:IsConnected() and ply:IsFullyAuthenticated() ) then
if (!ply.NextAFK) then
ply.NextAFK = CurTime() + AFK_TIME
end
local afktime = ply.NextAFK
if (CurTime() >= afktime - AFK_WARN_TIME) and (!ply.Warning) then
ply:ChatPrint("------------------------------------------------------")
ply:ChatPrint("Warning: You will be kicked soon if you are inactive.")
ply:ChatPrint("------------------------------------------------------")
ply.Warning = true
elseif (CurTime() >= afktime) and (ply.Warning) then
ply.Warning = nil
ply.NextAFK = nil
ply:Kick("Kicked for being AFK for 15 minutes.\n ")
end
end
end
end)
hook.Add("KeyPress", "PlayerMoved", function(ply, key)
ply.NextAFK = CurTime() + AFK_TIME
ply.Warning = false
end)
[/lua]
This works :)[/QUOTE]
I get spammed with this lua error in client console.
[LUA]
[ERROR] lua/autorun/afk.lua:13: attempt to call method 'IsConnected' (a nil value)
1. fn - lua/autorun/afk.lua:13
2. unknown - addons/ulib/lua/ulib/shared/hook.lua:183
[/LUA]
[QUOTE=freaqzz;46140680]I get spammed with this lua error in client console.
[LUA]
[ERROR] lua/autorun/afk.lua:13: attempt to call method 'IsConnected' (a nil value)
1. fn - lua/autorun/afk.lua:13
2. unknown - addons/ulib/lua/ulib/shared/hook.lua:183
[/LUA][/QUOTE]
Try server side
I tested what Swik posted. It only resets the afk time if they press a key on their keyboard and doesn't check for all of the other shit like position or PlayerFootstep so it should work if you go to
[CODE]E: gmodserver\garrysmod\lua\autorun\server[/CODE]
Create a new file called afk.lua and pase the code in there. Should work flawlessly.
Sorry, you need to Log In to post a reply to this thread.