// plugin_slothog.sma, v 1.00, 10/30/2001
 
#include <core>
#include <console>
#include <string>
#include <admin>
#include <adminlib>
 
// tells whether to check for slothogs, enable with admin_slothogcheck 1 or on and disable
// with admin_slothogcheck 0
new EnableSlothogCheck = 1;
 
// check every x seconds
new POLLING_INTERVAL = 180;
 
// number of warnings they have before they get kicked. -1 to disable this feature.
new SLOTHOG_WARNINGS = 3;
 
// set to 1 if you want to slap a slothog each time they are warned. 0 to disable.
new SLOTHOG_SLAP = 1;
 
new STRING_VERSION[MAX_DATA_LENGTH] = "1.00";
 
// value that keeps track of the timer
new SlothogTimer = 0;
new First = 1;
 
playsoundall(sound[])
{
	new maxplayers = maxplayercount();
	new Name[MAX_NAME_LENGTH];
	new i;
 
	for(i=1; i<=maxplayers; i++)
	{
		if(playerinfo(i, Name, MAX_NAME_LENGTH) == 1)
		{
			playsound(Name, sound);
		}
	}
}
 
public Poll()
{
	new Dead;
	new i;
	new maxplayers = maxplayercount();
	new Name[MAX_NAME_LENGTH];
	new Text[MAX_TEXT_LENGTH];
	new SessionID;
	new Team;
	new WONID;
 
	if (EnableSlothogCheck == 0)
	{
		return PLUGIN_CONTINUE;
	}
 
	// if this is the first polling interval, reset the warning counts
	if (First == 1)
	{
		ResetWarningCounts();
		First = 0;
	}
 
	for (i = 1; i <= maxplayers; i++) 
	{
		if (playerinfo(i, Name, MAX_NAME_LENGTH, SessionID, WONID, Team, Dead) != 0)
		{
			if (Team == 0) 
			{
				snprintf(Text, MAX_TEXT_LENGTH, "%s polled on team %i", Name, Team);
				log(Text);
				if (check_immunity(Name) == 0) 
				{
					IssueWarning(i, Name);	
				}	
			}
		}
	}
 
	return PLUGIN_CONTINUE;
}
 
public IssueWarning(iUser, Name[])
{
	new wKey[MAX_TEXT_LENGTH];
	new wID[MAX_AUTHID_LENGTH]; 
	new sWarnings[10];
	new warnings;
 
	// create vault key for warning data for user
	get_userAuthID(Name, wID);
 
	wKey = "w";
	strcat(wKey, wID, MAX_TEXT_LENGTH);
 
	new Text[MAX_TEXT_LENGTH];
 
	// slot hogging
	if(SLOTHOG_SLAP == 1)
		slap(Name);
 
	// get number of warnings left from vault
	get_vaultdata(wKey, sWarnings, MAX_TEXT_LENGTH);
	warnings = strtonum(sWarnings);
 
	if(warnings == 0)
	{
		SlotHogKick(iUser, Name);
		return PLUGIN_CONTINUE;
	}
 
	// decrement the number of warnings left and write to vault
	warnings = warnings - 1;
	numtostr(warnings, sWarnings);
	set_vaultdata(wKey, sWarnings);
 
	// let player know
	snprintf(Text, MAX_TEXT_LENGTH, "Please join a team. You have %i warnings left", warnings);
	messageex(Name, Text, print_center);
 
	snprintf(Text, MAX_TEXT_LENGTH, "%s warned for slot hogging.", Name);
	log(Text);
 
	return PLUGIN_CONTINUE;
}
 
public ResetWarningCounts()
{
	new maxplayers = maxplayercount();
	new Name[MAX_NAME_LENGTH];
	new SessionID;
	new Team;
	new WONID;
	new wID[MAX_AUTHID_LENGTH];
	new Dead;
	new i;
	new wKey[MAX_TEXT_LENGTH];
	new sWarnings[MAX_TEXT_LENGTH];
 
	// reset warning counts for all players
	for (i = 1; i <= maxplayers; i++) 
	{
		if (playerinfo(i, Name, MAX_NAME_LENGTH, SessionID, WONID, Team, Dead, wID) != 0)
		{
			wKey = "w";
			strcat(wKey, wID, MAX_TEXT_LENGTH);
			numtostr(SLOTHOG_WARNINGS, sWarnings);
			set_vaultdata(wKey, sWarnings);
		}
	}
 
	return PLUGIN_CONTINUE;
}
 
public ResetPlayerData(Index)
{
	new Name[MAX_NAME_LENGTH];
	new SessionID;
	new Team;
	new WONID;
	new Dead;
	new wKey[MAX_TEXT_LENGTH];
	new wID[MAX_AUTHID_LENGTH];
	new sWarnings[10];
 
	// clear player's data in vault otherwise they won't be able to reconnect
	if (playerinfo(Index, Name, MAX_NAME_LENGTH, SessionID, WONID, Team, Dead, wID) != 0)
	{
		// create vault keys and write to vault
		wKey = "w";
		strcat(wKey, wID, MAX_TEXT_LENGTH);
		numtostr(SLOTHOG_WARNINGS, sWarnings);
		set_vaultdata(wKey, sWarnings);
	}
 
	return PLUGIN_CONTINUE;
}
 
public SlotHogKick(iUser, Name[])
{
	new Text[MAX_TEXT_LENGTH];
	new partyMsg;
 
	// notify slot hogger and the other players they have been kicked
	messageex(Name, "You have been kicked for slot hogging.", print_console);
	snprintf(Text, MAX_TEXT_LENGTH,"%s was kicked for slot hogging.", Name);
	log(Text);
	say(Text);
 
	// kick slot hogger
	kick(Name);
 
	// clear player's data in vault otherwise they won't be able to reconnect
	ResetPlayerData(iUser);
 
	// play a sound for all others to enjoy. the sounds referenced are part of
	// the TFC pak. if you are running a different mod, you may want to find
	// a suitable sound or just comment out this code.
	partyMsg = random(2);
	if (partyMsg == 0)
		playsoundall("sound/misc/party1.wav");
	else
		playsoundall("sound/misc/party2.wav");
 
	return PLUGIN_CONTINUE;
}
 
public admin_slothogcheck(HLCommand,HLData,HLUserName,UserIndex) {
	new Command[MAX_COMMAND_LENGTH];
	new Data[MAX_DATA_LENGTH];
	new User[MAX_NAME_LENGTH];
	new Text[MAX_TEXT_LENGTH];
 
	convert_string(HLCommand,Command,MAX_COMMAND_LENGTH);
	convert_string(HLData,Data,MAX_DATA_LENGTH);
	convert_string(HLUserName,User,MAX_NAME_LENGTH);
 
	if (strlen(Data) == 0) 
	{ 
		snprintf(Text, MAX_TEXT_LENGTH, "Slothog checking: %i", EnableSlothogCheck);
		selfmessage(Text);
	}
	else if(check_param(Data) == 1) 
	{
		selfmessage("Slothog checking: 1");
		EnableSlothogCheck = 1;
	} 
	else 
	{
		selfmessage("Slothog checking: 0");
		EnableSlothogCheck = 0;
	}
	say_command(User,Command,Data);
	return PLUGIN_HANDLED;
}
 
public admin_slothogslap(HLCommand,HLData,HLUserName,UserIndex) 
{
	new Command[MAX_COMMAND_LENGTH];
	new Data[MAX_DATA_LENGTH];
	new User[MAX_NAME_LENGTH];
	new Text[MAX_TEXT_LENGTH];
 
	convert_string(HLCommand,Command,MAX_COMMAND_LENGTH);
	convert_string(HLData,Data,MAX_DATA_LENGTH);
	convert_string(HLUserName,User,MAX_NAME_LENGTH);
 
	if (strlen(Data) == 0) 
	{
		snprintf(Text,MAX_TEXT_LENGTH,"Slothog slap: %i",SLOTHOG_SLAP);
		selfmessage(Text);
	} 
	else if(check_param(Data) == 1)
	{
		SLOTHOG_SLAP = 1;
		snprintf(Text, MAX_TEXT_LENGTH, "Slothog slap: %i", SLOTHOG_SLAP);
		selfmessage(Text);
	}
	else 
	{
		SLOTHOG_SLAP = 0;
		snprintf(Text, MAX_TEXT_LENGTH, "Slothog slap: %i", SLOTHOG_SLAP);
		selfmessage(Text);
	}
	say_command(User, Command, Data);
	return PLUGIN_HANDLED;
}
 
public admin_slothogtime(HLCommand,HLData,HLUserName,UserIndex) 
{
	new Command[MAX_COMMAND_LENGTH];
	new Data[MAX_DATA_LENGTH];
	new User[MAX_NAME_LENGTH];
	new Text[MAX_TEXT_LENGTH];
	convert_string(HLCommand,Command,MAX_COMMAND_LENGTH);
	convert_string(HLData,Data,MAX_DATA_LENGTH);
	convert_string(HLUserName,User,MAX_NAME_LENGTH);
 
	new temp_time = 0;
 
	if (strlen(Data) == 0) 
	{
		snprintf(Text, MAX_TEXT_LENGTH, "Slothog polling interval: %i", POLLING_INTERVAL);
		selfmessage(Text);
	} 
	else
	{
		temp_time = strtonum(Data);
		POLLING_INTERVAL = temp_time;
		kill_timer(SlothogTimer);
		SlothogTimer = set_timer("Poll", POLLING_INTERVAL, 9999);
		snprintf(Text, MAX_TEXT_LENGTH, "Slothog polling interval: %i", POLLING_INTERVAL);
		selfmessage(Text);
	}
	say_command(User, Command, Data);
	return PLUGIN_HANDLED;
}
 
public admin_slothogwarn(HLCommand,HLData,HLUserName,UserIndex) 
{
	new Command[MAX_COMMAND_LENGTH];
	new Data[MAX_DATA_LENGTH];
	new User[MAX_NAME_LENGTH];
	new Text[MAX_TEXT_LENGTH];
 
	convert_string(HLCommand,Command,MAX_COMMAND_LENGTH);
	convert_string(HLData,Data,MAX_DATA_LENGTH);
	convert_string(HLUserName,User,MAX_NAME_LENGTH);
 
	new temp_tol = 0;
 
	if (strlen(Data) == 0) 
	{
		snprintf(Text, MAX_TEXT_LENGTH, "Slothog warnings: %i", SLOTHOG_WARNINGS);
		selfmessage(Text);
	} 
	else
	{
		temp_tol = strtonum(Data);
		SLOTHOG_WARNINGS = temp_tol;
		snprintf(Text, MAX_TEXT_LENGTH, "Slothog warnings: %i", SLOTHOG_WARNINGS);
		selfmessage(Text);
		ResetWarningCounts();
	}
	say_command(User, Command, Data);
	return PLUGIN_HANDLED;
}
 
public plugin_connect(HLUserName, HLIP, UserIndex) 
{
	ResetPlayerData(UserIndex);
	return PLUGIN_CONTINUE;
}
 
public plugin_disconnect(HLUserName, UserIndex) 
{
	ResetPlayerData(UserIndex);
	return PLUGIN_CONTINUE;
}
 
public plugin_init() 
{
	plugin_registerinfo("Slothog Monitoring plugin", "Auto detects slothogs and kicks them after warnings.", STRING_VERSION);
	plugin_registercmd("admin_slothogcheck", "admin_slothogcheck", ACCESS_KICK, "Enables/disables checking for slot hoggers.");
	plugin_registercmd("admin_slothogslap", "admin_slothogslap", ACCESS_KICK, "admin_slothogslap <value> Enables/disables and displays the current setting of slothog slap.");
	plugin_registercmd("admin_slothogtime", "admin_slothogtime", ACCESS_KICK, "admin_slothogtime <time> Sets/displays slothog time check in seconds.");
	plugin_registercmd("admin_slothogwarn", "admin_slothogwarn", ACCESS_KICK, "admin_slothogwarn <value> Sets/displays number of slothog warnings. Resests warnings.");
	SlothogTimer = set_timer("Poll", POLLING_INTERVAL, 9999);
	return PLUGIN_CONTINUE;
}