/**
* =============================================================================
* High Ping Kicker - Lite Edition
* Ping Ellenőrzés
*
* [ SourceMod (C)2004-2007 AlliedModders - LLC. Minden Jog fenntartva. ]
* =============================================================================
*/
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>
#define VERSION "1.0.0.1"
#define VERSION_FLAGS FCVAR_REPLICATED|FCVAR_NOTIFY|FCVAR_DONTRECORD
#define TIMER_FLAGS TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE
#define UMIN(%1,%2) (%1 < %2 ? %2 : %1)
new Handle:g_Cvar_Enabled = INVALID_HANDLE; // HPK Be legyen kapcsolva?
new Handle:g_Cvar_MaxPing = INVALID_HANDLE; // Ping korlát
new Handle:g_Cvar_MaxChecks = INVALID_HANDLE; // Ellenőrzések száma
new Handle:g_Cvar_StartCheck = INVALID_HANDLE; // Ping ellenőrzés kezdése mapváltás után (Másodpercekben)
new Handle:g_Cvar_AdminsImmune = INVALID_HANDLE; // Adminoknak immunisság
new g_FailedChecks[MAXPLAYERS+1]; // Ellenőrzés
new g_Ping[MAXPLAYERS+1];
public Plugin:myinfo =
{
name = "High Ping Kicker - Lite Edition",
author = "Liam",
description = "Magas Ping Kicker",
version = VERSION,
url = "http://www.sourcemod.net"
};
public OnPluginStart( )
{
LoadTranslations("common.phrases");
CreateConVar("hpk_lite_version", VERSION, "HPK - Lite Verzió Szám", VERSION_FLAGS);
g_Cvar_Enabled = CreateConVar("sm_hpk_enabled", "1", "0 = Ki | 1 = Be -- Be legyen kapcsolva?");
g_Cvar_MaxPing = CreateConVar("sm_maxping", "150", "Max ping korlát");
g_Cvar_MaxChecks = CreateConVar("sm_maxchecks", "10", "Ellenőrzések száma");
g_Cvar_StartCheck = CreateConVar("sm_startcheck", "15.0", "Ping ellenőrzés kezdése mapváltás után (Másodpercekben) ");
g_Cvar_AdminsImmune = CreateConVar("sm_adminsimmune", "1", "0 = Ki | 1 = Be -- Adminokra immunis legyen a ellenőrzés?");
AutoExecConfig(true, "hpk_lite");
}
public OnMapStart( )
{
new maxclients = GetMaxClients( );
if(GetConVarInt(g_Cvar_Enabled) == 1)
{
CreateTimer(GetConVarFloat(g_Cvar_StartCheck), Timer_CheckPing, _, TIMER_FLAGS);
}
for(new i = 1; i < maxclients; i++)
{
g_Ping[i] = 0;
g_FailedChecks[i] = 0;
}
}
public OnClientPutInServer(client)
{
g_Ping[client] = 0;
g_FailedChecks[client] = 0;
}
public Action:Timer_CheckPing(Handle:Timer)
{
if(GetConVarInt(g_Cvar_Enabled) == 0)
return Plugin_Stop;
new maxclients = GetMaxClients( );
for(new i = 1; i < maxclients; i++)
{
if(!IsClientConnected(i) || !IsClientInGame(i)
|| IsFakeClient(i) || IsAdmin(i))
continue;
UpdatePingStatus(i);
}
HandleHighPingers( );
return Plugin_Continue;
}
UpdatePingStatus(client)
{
decl String:rate[32];
GetClientInfo(client, "cl_cmdrate", rate, sizeof(rate));
new Float:ping = GetClientAvgLatency(client, NetFlow_Outgoing);
new Float:tickRate = GetTickInterval( );
new cmdRate = UMIN(StringToInt(rate), 20);
ping -= ((0.5 / cmdRate) + (tickRate * 1.0));
ping -= (tickRate * 0.5);
ping *= 1000.0;
g_Ping[client] = RoundToZero(ping);
if(g_Ping[client] > GetConVarInt(g_Cvar_MaxPing))
g_FailedChecks[client]++;
else
{
if(g_FailedChecks[client] > 0)
g_FailedChecks[client]--;
}
}
HandleHighPingers( )
{
new maxclients = GetMaxClients( );
for(new i = 1; i < maxclients; i++)
{
if(!IsClientConnected(i) || !IsClientInGame(i) || IsFakeClient(i))
continue;
if(g_FailedChecks[i] >= GetConVarInt(g_Cvar_MaxChecks))
{
KickClient(i, "A Te Pinged tul magas ezert kickelve lettel. (%d) Megengedett: (%d)",
g_Ping[i], GetConVarInt(g_Cvar_MaxPing));
}
}
}
bool:IsAdmin(client)
{
if(GetConVarInt(g_Cvar_AdminsImmune) == 0)
return false;
new AdminId:admin = GetUserAdmin(client);
if(admin == INVALID_ADMIN_ID)
return false;
return true;
}