Untitled
unknown
c_cpp
a year ago
2.0 kB
9
Indexable
#include <sdkhooks>
#include <sourcemod>
#include <liquidHelpers>
ConVar TimeUntilKicked;
float TimeToKick;
float LastActionTimer[MAXPLAYERS + 1];
char FilePath[PLATFORM_MAX_PATH];
public void OnPluginStart()
{
TimeUntilKicked = CreateConVar("sm_afk_kick_time", "1200.0", "Time to kick AFK player");
TimeUntilKicked.AddChangeHook(ChangeHook);
GetCvars();
for (int i = 1; i <= MaxClients; i++)
{
LastActionTimer[i] = GetEngineTime();
}
BuildPath(Path_SM, FilePath, sizeof(FilePath), "logs/afk_kicks.log");
}
public void OnMapStart()
{
CreateTimer(1.0, AFKCheck, _, TIMER_FLAG_NO_MAPCHANGE | TIMER_REPEAT);
}
public void OnClientPostAdminCheck(int client)
{
LastActionTimer[client] = GetEngineTime();
}
void ChangeHook(ConVar convar, const char[] oldValue, const char[] newValue)
{
GetCvars();
}
void GetCvars()
{
TimeToKick = TimeUntilKicked.FloatValue;
}
public Action OnPlayerRunCmd(int client, int& buttons, int& impulse, float vel[3], float angles[3], int& weapon, int& subtype, int& cmdnum, int& tickcount, int& seed, int mouse[2]) {
if (buttons)
LastActionTimer[client] = GetEngineTime();
return Plugin_Continue;
}
public Action AFKCheck(Handle timer)
{
float currentTime = GetEngineTime();
for (int i = 1; i <= MaxClients; i++)
{
if (!IsValidClient(i) || !IsPlayerAlive(i))
continue;
if (IsFakeClient(i))
continue;
if (currentTime - LastActionTimer[i] > TimeToKick)
{
LogKick(i);
KickClient(i, "AFK for %im", RoundToNearest(TimeToKick / 60));
}
}
return Plugin_Continue;
}
void LogKick(int client)
{
File file = OpenFile(FilePath, "a");
if (file)
{
WriteFileLine(file, "Kicked player %N for being AFK for more than %0.1f seconds", client, TimeToKick);
FlushFile(file);
delete file;
}
else
{
LogError("Log file not found!");
}
}Editor is loading...
Leave a Comment