#include <sdkhooks>
#include <sdktools_functions>
#pragma semicolon 1
#pragma newdecls required
public Plugin myinfo = {name = "AntiAfk", author = "Drumanid", version = "1.0", url = "http://vk.com/drumanid"}
Handle hTimer[MAXPLAYERS +1];
bool bAfk[MAXPLAYERS +1];
int iTime[MAXPLAYERS +1], iLimit[MAXPLAYERS +1];
int ciTime, ciLimit, ciSpecKick;
char tBuffer[192];
public void OnPluginStart()
{
ConVar CV;
(CV = CreateConVar("cvTime", "30", "RU: Время перед наказанием | EN: Time of punishment", _, true, 5.0, true, 60.0)).AddChangeHook(Cvar_ciTime);
ciTime = CV.IntValue;
(CV = CreateConVar("cvLimit", "3", "RU: Предупреждения | EN: Warning", _, true, 2.0, true, 6.0)).AddChangeHook(Cvar_ciLimit);
ciLimit = CV.IntValue;
(CV = CreateConVar("cvSpecKick", "0", "RU: 0 - Кикать / 1 - Перевести в наблюдатели | EN: 0 - Kicked | 1 - Change team 1(spec)", _, true, 0.0, true, 1.0)).AddChangeHook(Cvar_ciSpecKick);
ciSpecKick = CV.IntValue;
LoadTranslations("AntiAfk.phrases");
AutoExecConfig(true, "AntiAfk");
}
public void Cvar_ciTime(ConVar convar, const char[] oldValue, const char[] newValue) {ciTime = convar.IntValue;}
public void Cvar_ciLimit(ConVar convar, const char[] oldValue, const char[] newValue) {ciLimit = convar.IntValue;}
public void Cvar_ciSpecKick(ConVar convar, const char[] oldValue, const char[] newValue) {ciSpecKick = convar.IntValue;}
public void OnClientPostAdminCheck(int iClient)
{
if(!IsFakeClient(iClient)) SDKHook(iClient, SDKHook_SpawnPost, SpawnPost);
}
public Action SpawnPost(int iClient)
{
if(iClient)
{
bAfk[iClient] = true;
if(hTimer[iClient] && iTime[iClient] > 0) iTime[iClient] = ciTime;
else
{
iTime[iClient] = ciTime;
hTimer[iClient] = CreateTimer(1.0, CheckAfk, GetClientUserId(iClient), TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE);
}
}
}
public Action CheckAfk(Handle timer, any UserId)
{
int iClient = GetClientOfUserId(UserId);
if(iClient && IsPlayerAlive(iClient) && !IsFakeClient(iClient) && bAfk[iClient])
{
if(--iTime[iClient] > 0)
{
if(iTime[iClient] > (ciTime - 5)) return Plugin_Handled;
else
{
FormatEx(tBuffer, sizeof(tBuffer), "%t", "Warning motion hud", iTime[iClient]);
SetHudTextParams(0.005, 0.5, 1.0, 255, 68, 68, 255, 0, 1.0, 0.1, 0.1);
ShowHudText(iClient, -1, tBuffer);
}
return Plugin_Continue;
}
++iLimit[iClient];
FormatEx(tBuffer, sizeof(tBuffer), "%t", "Warning motion chat", iLimit[iClient], ciLimit);
PrintToChat(iClient, tBuffer);
if(iLimit[iClient] == ciLimit)
{
switch(ciSpecKick)
{
case 0:
{
FormatEx(tBuffer, sizeof(tBuffer), "%T", "Kick message");
KickClient(iClient, tBuffer);
}
case 1:
{
ChangeClientTeam(iClient, 1);
FormatEx(tBuffer, sizeof(tBuffer), "%t", "Change team");
PrintToChat(iClient, tBuffer);
}
}
}
else
{
ForcePlayerSuicide(iClient);
FormatEx(tBuffer, sizeof(tBuffer), "%t", "Kill player", iClient);
PrintToChatAll(tBuffer);
}
}
hTimer[iClient] = null;
return Plugin_Stop;
}
public Action OnPlayerRunCmd(int iClient, int &iButtons, int &iImpulse, float fVel[3], float fAngles[3], int &iWeapon)
{
if(bAfk[iClient] && IsPlayerAlive(iClient) && !IsFakeClient(iClient))
{
if(iButtons) // if(iButtons & IN_RUN || iButtons & IN_RIGHT || iButtons & IN_LEFT || iButtons & IN_BACK || iButtons & IN_DUCK || iButtons & IN_JUMP)
{
bAfk[iClient] = false;
iLimit[iClient] = 0;
}
}
}
public void OnClientDisconnect(int iClient)
{
if(hTimer[iClient] != null)
{
KillTimer(hTimer[iClient]);
hTimer[iClient] = null;
}
iLimit[iClient] = 0;
}