#include <amxmodx>
#include <amxmisc>

stock const PLUGIN_NAME[] = "Ultimate High Ping Checker";
stock const PLUGIN_VERSION[] = "1.0";
stock const PLUGIN_AUTHOR[] = "Kimi";

new MAX_HIGHPING = 100 // Set Max Ping .
new TIME_HIGHPING = 15  // Frequency of Ping Checking (seconds) .
new CHECK_HIGHPING = 4  // Min. Number of Checks before kicking/banning .

new hpksound, hpkban;

new gsound[] = {"misc/sound"} ////// -------- Ban/kick sound .
new iNumTests[33]

public plugin_init() 
{
	register_plugin(PLUGIN_NAME,PLUGIN_VERSION,PLUGIN_AUTHOR);
	hpksound = register_cvar("amx_hpk_sound","0")
	hpkban = register_cvar("amx_hpk_ban","1")
	register_dictionary("Ultimate_High_Ping_Checker.txt");
	if (TIME_HIGHPING < 15) TIME_HIGHPING = 15
	if (CHECK_HIGHPING < 4) CHECK_HIGHPING = 4
	return PLUGIN_CONTINUE
}
	
public client_putinserver(id) 
{
	iNumTests[id] = 0
	if (!is_user_bot(id)) {
		new param[1]
		param[0] = id
		set_task(25.0, "Warning", id, param, 1)
	}
	return PLUGIN_CONTINUE
}


public Warning(param[]) 
{
	if(get_pcvar_num(hpkban) == 1)
	{
		client_print(param[0], print_chat, "%L",LANG_PLAYER,"Warning_ban", MAX_HIGHPING);
		set_task(float(TIME_HIGHPING), "checkPing", param[0], param, 1, "b")
	}
	else
	{
		client_print(param[0], print_chat, "%L",LANG_PLAYER,"Warning_kick", MAX_HIGHPING);
		set_task(float(TIME_HIGHPING), "checkPing", param[0], param, 1, "b")
	}
}


public client_disconnect(id) 
{
	remove_task(id)
	return PLUGIN_CONTINUE
}

BanLag(id) 
{
	if(get_pcvar_num(hpksound) == 1)
	{
		if(get_pcvar_num(hpkban) == 1)
		{
			new name[32]
			get_user_name(id, name, 31)
			new uID = get_user_userid(id)
			server_cmd("banip 5 #%d", uID)
			client_cmd(id, "echo ^"[ U.H.P.C ] Too High Ping !^"; disconnect")
			client_print(0, print_chat, "%L",LANG_PLAYER,"banmsg", name)
			client_cmd(0, "spk %d", gsound)
		}

		else
		{
			new name[32]
			get_user_name(id, name, 31)
			new uID = get_user_userid(id)
			server_cmd("kick #%d", uID)
			client_cmd(id, "echo ^"[ U.H.P.C ] Too High Ping !^"; disconnect")
			client_print(0, print_chat, "%L",LANG_PLAYER,"kickmsg", name)
			client_cmd(0, "spk %d", gsound)
		}
	}

	else
	{
		if(get_pcvar_num(hpkban) == 1)
		{
			new name[32]
			get_user_name(id, name, 31)
			new uID = get_user_userid(id)
			server_cmd("banip 5 #%d", uID)
			client_cmd(id, "echo ^"[ U.H.P.C ] Too High Ping !^"; disconnect")
			client_print(0, print_chat, "%L",LANG_PLAYER,"banmsg", name)
		}

		else
		{
			new name[32]
			get_user_name(id, name, 31)
			new uID = get_user_userid(id)
			server_cmd("kick 5 #%d", uID)
			client_cmd(id, "echo ^"[ U.H.P.C ] Too High Ping !^"; disconnect")
			client_print(0, print_chat, "%L",LANG_PLAYER,"kickmsg", name)
		}
	}

	return PLUGIN_CONTINUE
} 

public checkPing(param[]) 
{
	new id = param[0]
	if ((get_user_flags(id) & ADMIN_IMMUNITY) || (get_user_flags(id) & ADMIN_RESERVATION)) {
		remove_task(id)
		client_print(id, print_chat, "%L",LANG_PLAYER,"imun_msg")
		return PLUGIN_CONTINUE
	}
	new ping, loss
	get_user_ping(id, ping, loss)
	if (ping > MAX_HIGHPING)
		++iNumTests[id]
	else
		if (iNumTests[id] > 0) --iNumTests[id]
	if (iNumTests[id] > CHECK_HIGHPING)
		BanLag(id)
	return PLUGIN_CONTINUE
}

public plugin_precache()
{
	precache_sound(gsound);
}