// 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; }