Created
September 12, 2017 19:27
-
-
Save D4edalus/462e3de8adaf2363f425bf22a5288ebf to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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