Skip to content

Instantly share code, notes, and snippets.

@D4edalus
Created September 12, 2017 19:27
Show Gist options
  • Save D4edalus/462e3de8adaf2363f425bf22a5288ebf to your computer and use it in GitHub Desktop.
Save D4edalus/462e3de8adaf2363f425bf22a5288ebf to your computer and use it in GitHub Desktop.
// Pingwatcher
// Author: D4edalus
// Date: 09/12/17
// Kicks player with sucky pings, players get only kicked if server is 80% full. Only kicks one player every 10 seconds
// Used metric is average + stddev (yeah I know that is statistical nonesense, but hey it works quite well)
#include maps\mp\gametypes\eventhandler; // the eventhandler from the duffman scripts thats floating around in the ether
init()
{
level.maxclients = getdvarint( "sv_maxclients" );
level.maxping = mygetdvarint( "sv_maxping", 350 );
addConnectThread(::onconnect);
level thread kickBadPings();
}
kickBadPings()
{
for(;;)
{
if( level.players.size >= level.maxclients * 0.8 )
{
worstPlayer = undefined;
worstPing = 0;
for( i = 0; i < level.players.size; i++ )
{
player = level.players[i];
if(isDefined(player.pers["pingquality"]) && player.pers["pingquality"] > worstPing)
{
worstPing = player.pers["pingquality"];
worstPlayer = player;
}
}
// try kick player
if(isDefined(worstPlayer) && worstPing > level.maxping)
{
kick( worstPlayer getentitynumber(), "^1AUTOKICK: ^2Sorry, your ping is too high" );
}
}
wait 10;
}
}
onconnect()
{
self endon("disconnect");
self.pers["pingquality"] = undefined;
wait 15;
pingList = [];
N = 15;
for(i = 0; i < N; i++) // fill the list
{
ping = self getPing();
pingList[i] = ping;
wait 1;
}
i = 0;
for(;;)
{
avg = 0;
for(j = 0; j < N; j++)
{
avg += pingList[j];
}
avg /= N;
stddev = 0;
for(j = 0; j < N; j++)
{
sqr = (pingList[j] - avg);
stddev += sqr * sqr;
}
stddev = sqrt(stddev);
self.pers["pingquality"] = avg + stddev; // ping quality = avg + stddev
ping = self getPing(); // add new ping
i = (i + 1) % N;
pingList[i] = ping;
wait 2;
}
}
mygetdvarint(name, def)
{
if(getdvar(name) == "")
{
setdvar(name, def);
return def;
}
else
return getdvarint(name);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment