new Handle:g_hCvarCmdSpam;
new Handle:g_hCmds;
new Handle:g_hCvarShowStatus;
new Handle:g_hCvarShowPing;
new g_iCmdCount[66];
new g_iCmdSpam = 4;
new g_iShowStatus;
new bool:g_bShowPing;
public Plugin:myinfo =
{
name = "Status Protect",
description = "Status Protect",
author = "GoDtm666",
version = "1.0.0",
url = "http://www.myarena.ru/"
};
public OnPluginStart()
{
g_hCvarCmdSpam = CreateConVar("sm_antispam_statusping", "4", "Сколько раз разрешить игрокам ввести status и ping в 1 секунду.", 262144, true, 2.0, true, 10.0);
g_iCmdSpam = GetConVarInt(g_hCvarCmdSpam);
HookConVarChange(g_hCvarCmdSpam, CmdSpam_OnSettingsChanged);
g_hCvarShowStatus = CreateConVar("sm_show_status", "1", "Показывать Status: (0 всем, 1 Админам, 2 Только свой Status).", 262144, true, 0.0, true, 2.0);
g_iShowStatus = GetConVarInt(g_hCvarShowStatus);
HookConVarChange(g_hCvarShowStatus, ShowStatus_OnSettingsChanged);
g_hCvarShowPing = CreateConVar("sm_show_ping", "1", "Ping: (0 Не показывать, 1 Показывать).", 262144, true, 0.0, true, 1.0);
g_bShowPing = GetConVarBool(g_hCvarShowPing);
HookConVarChange(g_hCvarShowPing, ShowPing_OnSettingsChanged);
RegConsoleCmd("status", StatusCmd);
RegConsoleCmd("ping", PingCmd);
g_hCmds = CreateTrie();
SetTrieValue(g_hCmds, "status", 1, true);
SetTrieValue(g_hCmds, "ping", 1, true);
AddCommandListener(Commands_CommandListener);
CreateTimer(1.0, Timer_CountReset, _, 1);
LoadTranslations("common.phrases");
}
public CmdSpam_OnSettingsChanged(Handle:convar, String:oldValue[], String:newValue[])
{
g_iCmdSpam = GetConVarInt(convar);
}
public ShowStatus_OnSettingsChanged(Handle:convar, String:oldValue[], String:newValue[])
{
g_iShowStatus = GetConVarInt(convar);
}
public ShowPing_OnSettingsChanged(Handle:convar, String:oldValue[], String:newValue[])
{
g_bShowPing = GetConVarBool(convar);
}
public OnAllPluginsLoaded()
{
AutoExecConfig(true, "status_protect", "sourcemod");
PrintToServer("%s %s has been loaded successfully.", "Status Protect", "1.0.0");
}
public Action:StatusCmd(client, args)
{
switch (g_iShowStatus)
{
case 0:
{
DisplayStatus(client);
ForStatusCmd(client);
}
case 1:
{
if (CheckCommandAccess(client, "admin_notices", 2, false))
{
if (GetCmdReplySource() == SM_REPLY_TO_CHAT)
{
ReplyToCommand(client, "[SM] %t", "See console for output");
}
DisplayStatus(client);
ForStatusCmd(client);
}
}
case 2:
{
if (GetCmdReplySource() == SM_REPLY_TO_CHAT)
{
ReplyToCommand(client, "[SM] %t", "See console for output");
}
DisplayStatus(client);
if (CheckCommandAccess(client, "admin_notices", 2, false))
{
ForStatusCmd(client);
}
else
{
PrintToConsole(client, "# userid name uniqueid ip-address ping");
DisplayStatusInfo(client, client);
}
}
}
return Plugin_Handled;
}
ForStatusCmd(client)
{
PrintToConsole(client, "# userid name uniqueid ip-address ping");
for(new i = 1; i <= MaxClients; ++i)
{
if (IsClientInGame(i) && !IsFakeClient(i))
{
DisplayStatusInfo(client, i);
}
}
}
DisplayStatus(client)
{
new g_iClientInServer;
decl String:g_sHostName[512];
decl Handle:g_hHostIp;
decl Handle:g_hHostPort;
decl g_iHostIp;
decl String:g_sServerIpHost[32];
decl String:g_sServerPort[128];
decl String:g_sCurrentMap[256];
decl Handle:g_hHostName;
decl String:g_ServerTime[64];
decl Handle:g_hNextMap;
decl String:g_sNextmap[256];
g_hHostIp = FindConVar("hostip");
g_hHostPort = FindConVar("hostport");
g_iHostIp = GetConVarInt(g_hHostIp);
GetConVarString(g_hHostPort, g_sServerPort, 128);
FormatEx(g_sServerIpHost, 32, "%u.%u.%u.%u:%s", g_iHostIp >>> 24 & 255, g_iHostIp >>> 16 & 255, g_iHostIp >>> 8 & 255, g_iHostIp & 255, g_sServerPort);
GetCurrentMap(g_sCurrentMap, 256);
g_hNextMap = FindConVar("sm_nextmap");
GetConVarString(g_hNextMap, g_sNextmap, 256);
for(new i = 1; i <= MaxClients; ++i)
{
if (IsClientInGame(i))
{
g_iClientInServer++;
}
}
g_hHostName = FindConVar("hostname");
GetConVarString(g_hHostName, g_sHostName, 512);
FormatTime(g_ServerTime, 64, NULL_STRING, -1);
PrintToConsole(client, "hostname: %s", g_sHostName);
PrintToConsole(client, "udp/ip : %s", g_sServerIpHost);
PrintToConsole(client, "map : %s", g_sCurrentMap);
if (!StrEqual(g_sNextmap, "", false))
{
PrintToConsole(client, "next map: %s", g_sNextmap);
}
PrintToConsole(client, "players : %d (%d max)", g_iClientInServer, MaxClients);
PrintToConsole(client, "the time: %s\n", g_ServerTime);
}
DisplayStatusInfo(client, i)
{
decl String:g_sName[32];
decl String:g_sAuthID[32];
decl String:g_sIP[28];
decl g_iLatency;
decl g_iUserID;
if (!GetClientName(i, g_sName, 32))
{
strcopy(g_sName, 32, "Unknown");
}
if (!GetClientAuthString(i, g_sAuthID, 32))
{
strcopy(g_sAuthID, 32, "Unknown");
}
if (!GetClientIP(i, g_sIP, 28, false))
{
strcopy(g_sIP, 28, "Unknown");
}
g_iLatency = RoundToNearest(GetClientAvgLatency(i, NetFlow:0) * 1000.0);
g_iUserID = GetClientUserId(i);
PrintToConsole(client, "# %-6.6i %-32.31s %-22.29s %-28.29s %-4.5i", g_iUserID, g_sName, g_sAuthID, g_sIP, g_iLatency);
}
public Action:Commands_CommandListener(client, String:command[], argc)
{
if (!client)
{
return Plugin_Continue;
}
if (IsClientConnected(client) && IsFakeClient(client))
{
return Plugin_Continue;
}
if (!IsClientInGame(client))
{
return Plugin_Stop;
}
decl bool:f_bBan;
decl String:f_sCmd[64];
strcopy(f_sCmd, 64, command);
StringToLower(f_sCmd);
if (g_iCmdSpam && GetTrieValue(g_hCmds, f_sCmd, f_bBan) && ++g_iCmdCount[client] > g_iCmdSpam)
{
if (!IsClientInKickQueue(client))
{
KickClient(client, "Спам командами status, ping запрещен!");
}
return Plugin_Stop;
}
return Plugin_Continue;
}
public Action:PingCmd(client, args)
{
if (g_bShowPing)
{
if (GetCmdReplySource() == SM_REPLY_TO_CHAT)
{
ReplyToCommand(client, "[SM] %t", "See console for output");
}
PrintToConsole(client, "Client ping times:");
for(new i = 1; i <= MaxClients; ++i)
{
if (IsClientInGame(i) && !IsFakeClient(i))
{
decl String:g_sName[32];
decl g_iLatency;
GetClientName(i, g_sName, 32);
g_iLatency = RoundToNearest(GetClientAvgLatency(i, NetFlow:0) * 1000.0);
PrintToConsole(client, "%i ms : %s", g_iLatency, g_sName);
}
}
}
return Plugin_Handled;
}
public Action:Timer_CountReset(Handle:timer, any:args)
{
for(new i = 1; i <= MaxClients; ++i)
{
g_iCmdCount[i] = 0;
}
return Plugin_Continue;
}
StringToLower(String:f_sInput[])
{
new f_iSize = strlen(f_sInput);
new i;
while (i < f_iSize)
{
f_sInput[i] = CharToLower(f_sInput[i]);
i++;
}
}