forked from jeremyvillanuevar/scripting
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSimpleAFKManager.sp
More file actions
134 lines (103 loc) · 3.36 KB
/
Copy pathSimpleAFKManager.sp
File metadata and controls
134 lines (103 loc) · 3.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#define PLUGIN_VERSION "1.0 coop"
#include <sourcemod>
#define debug 0
public Plugin:myinfo =
{
name = "[L4D & L4D2] Simple Afk Manager",
author = "raziEiL [disawar1]",
description = "Afk manager for cooperative gamemode",
version = PLUGIN_VERSION,
url = "http://steamcommunity.com/id/raziEiL"
}
static Handle:g_hAutoKick, Handle:g_hKickT, Handle:g_hAdmin, Float:g_fCvarKickT, g_iCvarAdmFlag, Handle:g_hTimer[MAXPLAYERS+1];
public OnPluginStart()
{
g_hAutoKick = FindConVar("mp_autokick");
CreateConVar("sam_version", PLUGIN_VERSION, "Simple Afk Manager plugin version", FCVAR_REPLICATED|FCVAR_NOTIFY);
g_hKickT = CreateConVar("sam_kick_time", "120", "Time before idle player will be kicked in seconds");
g_hAdmin = CreateConVar("sam_respect_admins", "k", "Admins have immunity againts afk manager. Flag value or empty \"\" to don't protect admins");
AutoExecConfig(true, "SimpleAfkManager");
HookConVarChange(g_hAutoKick, OnCvarChange_AutoKick);
HookConVarChange(g_hKickT, OnCvarChange_KickT);
HookConVarChange(g_hAdmin, OnCvarChange_Admin);
SAM_GetAllCvar();
SetConVarInt("director_afk_timeout",33); // Put into AFK after this seconds
HookEvent("player_team", Event_PlayerTeam);
}
public OnClientDisconnect(client)
{
if (client)
SAM_TimeToKill(client);
}
public Action:Event_PlayerTeam(Handle:event, String:event_name[], bool:dontBroadcast)
{
new client = GetClientOfUserId(GetEventInt(event, "userid"));
if (client && !IsFakeClient(client)){
SAM_TimeToKill(client);
if (bWhoAmI(client)){
#if debug
PrintToChatAll("[IDLE debug] Event_PlayerTeam()-> %N have admin flag", client);
#endif
return;
}
if (!GetEventBool(event, "disconnect") && GetEventInt(event, "team") == 1){
g_hTimer[client] = CreateTimer(g_fCvarKickT, SAM_t_ActionKick, client, TIMER_FLAG_NO_MAPCHANGE);
#if debug
PrintToChatAll("[IDLE debug] Event_PlayerTeam()-> %N afk, timer %x hndl", client, g_hTimer[client]);
#endif
}
}
}
SAM_TimeToKill(client)
{
if (g_hTimer[client] != INVALID_HANDLE){
#if debug
PrintToChatAll("[IDLE debug] SAM_TimeToKill(%N)-> Kill %x timer hndl", client, g_hTimer[client]);
#endif
KillTimer(g_hTimer[client]);
g_hTimer[client] = INVALID_HANDLE;
}
}
public Action:SAM_t_ActionKick(Handle:timer, any:client)
{
#if debug
PrintToChatAll("[IDLE debug] SAM_t_ActionKick(%N) Kick player", client);
#endif
KickClient(client, "You away from keyboard for %.1f sec", g_fCvarKickT);
g_hTimer[client] = INVALID_HANDLE;
}
bool:bWhoAmI(client)
{
return g_iCvarAdmFlag && GetUserFlagBits(client) && CheckCommandAccess(client, "", g_iCvarAdmFlag);
}
public OnCvarChange_AutoKick(Handle:hHandle, const String:sOldVal[], const String:sNewVal[])
{
if (!StrEqual(sOldVal, sNewVal))
SetConVarInt(g_hAutoKick, 0); // Dont kick IDLE players by server
}
public OnCvarChange_KickT(Handle:hHandle, const String:sOldVal[], const String:sNewVal[])
{
if (!StrEqual(sOldVal, sNewVal))
g_fCvarKickT = GetConVarFloat(g_hKickT);
}
public OnCvarChange_Admin(Handle:hHandle, const String:sOldVal[], const String:sNewVal[])
{
if (!StrEqual(sOldVal, sNewVal))
GetAdmCvar();
}
GetAdmCvar()
{
decl String:sFlags[2];
GetConVarString(g_hAdmin, sFlags, 2);
g_iCvarAdmFlag = ReadFlagString(sFlags);
}
public OnConfigsExecuted()
{
SAM_GetAllCvar();
}
SAM_GetAllCvar()
{
SetConVarInt(g_hAutoKick, 0);
g_fCvarKickT = GetConVarFloat(g_hKickT);
GetAdmCvar();
}