/* plugin_bailo_warn.sma
   This plugin allows you to warn people like on AIM by saying /warn <player>
   Each warning is a 5% increment.
   15%: (3)Slapping
   35%: (10)Slapping
   50%: Slay
   65%: Gag
   80%: 5 slays, one every 30 seconds
   100%: Kick
   A single player may warn another player every 20 seconds.  After 180 seconds
   10% of your total warn level is removed.  One player can only warn another 
   player 7 times, until the target player hits zero again.
   ---Thanks to Greentryst for that last idea---
   You can also say: /wlvl <user> to see their warning level, or /mlvl to see your level
   admin_warning 1/0 enables or disables warning.  admin_warningimmune disables/enables
   admin immunity from punishments, admin_punishments disables/enables warning punishments.
****************************************************************************
(C)1995-2002 The TCW Organization; David Anderson a.k.a. BAILOPAN
**************************http://www.tcwonline.org*************************/
 
 
#include <core>
#include <console>
#include <string>
#include <admin>
#include <adminlib>
 
#define ACCESS_FUN 8192
 
new WarnLevels[MAX_PLAYERS];
new STRING_VERSION[MAX_DATA_LENGTH]="1.00";
new FlagPlayer[MAX_PLAYERS];
new CanWarn[MAX_PLAYERS] [MAX_PLAYERS];
new GagPlayer[MAX_PLAYERS];
new WarnLimit[MAX_PLAYERS] [MAX_PLAYERS];
new AllowPlayer[MAX_PLAYERS];
new AllowWarns=1;
new AllowImmune=0;
new AllowPunish=1;
 
public plugin_init() {
	plugin_registerinfo("Warn Plugin","Allows users to warn each other.",STRING_VERSION);
 
	plugin_registercmd("say", "HandleSay", ACCESS_ALL, "/warn <player>");
	plugin_registercmd("admin_warning", "admin_warning", ACCESS_FUN, "Enable/Disable Warning");
	plugin_registercmd("admin_warningimmune", "admin_warningimmune", ACCESS_FUN, "Enable/Disable Admin Punishment Immunities");
	plugin_registercmd("admin_punishments", "admin_punishments", ACCESS_FUN, "Enable/Disable Warning Punishments");
 
	return PLUGIN_CONTINUE;
}
 
public admin_warning(HLCommand, HLData, HLUserName, UserIndex)
{
	new Command[MAX_COMMAND_LENGTH];
	new Data[MAX_DATA_LENGTH];
	new User[MAX_NAME_LENGTH];
 
	convert_string(HLCommand, Command, MAX_COMMAND_LENGTH);
	convert_string(HLData, Data, MAX_DATA_LENGTH);
	convert_string(HLUserName, User, MAX_NAME_LENGTH);
 
	if (check_param(Data)==1) {
		selfmessage("Warning has been turned on!");
		AllowWarns=1;
	} 
	else {
		selfmessage("Warning has been turned off!");
		AllowWarns=0;
	}
	return PLUGIN_HANDLED;
}
 
public admin_warningimmune(HLCommand, HLData, HLUserName, UserIndex)
{
	new Command[MAX_COMMAND_LENGTH];
	new Data[MAX_DATA_LENGTH];
	new User[MAX_NAME_LENGTH];
 
	convert_string(HLCommand, Command, MAX_COMMAND_LENGTH);
	convert_string(HLData, Data, MAX_DATA_LENGTH);
	convert_string(HLUserName, User, MAX_NAME_LENGTH);
 
	if (check_param(Data)==1) {
		selfmessage("Warning Admin Immunity has been turned on!");
		AllowImmune=1;
	} 
	else {
		selfmessage("Warning Admin Immunity has been turned off!");
		AllowImmune=0;
	}
	return PLUGIN_HANDLED;
}
 
public admin_punishments(HLCommand, HLData, HLUserName, UserIndex)
{
	new Command[MAX_COMMAND_LENGTH];
	new Data[MAX_DATA_LENGTH];
	new User[MAX_NAME_LENGTH];
 
	convert_string(HLCommand, Command, MAX_COMMAND_LENGTH);
	convert_string(HLData, Data, MAX_DATA_LENGTH);
	convert_string(HLUserName, User, MAX_NAME_LENGTH);
 
	if (check_param(Data)==1) {
		selfmessage("Warning Punishments have been turned on!");
		AllowPunish=1;
	} 
	else {
		selfmessage("Warning Punishments have been turned off!");
		AllowPunish=0;
	}
	return PLUGIN_HANDLED;
}
 
PunishHim(iUser, nUser[])
{
	new Text[MAX_TEXT_LENGTH];
	new Continue=0;
 
	if (AllowPunish==1) { Continue=1; }
	if (check_immunity(nUser)==1) {
		if (AllowImmune==1) { Continue=1; }
		else { Continue=0; }
	}
	if (Continue==1)
	{
	if (WarnLevels[iUser]==15) {
		slap(nUser);
		slap(nUser);
		slap(nUser);
		snprintf(Text, MAX_TEXT_LENGTH, "*%s's warning level is at %i and has been slapped 3 times.*", nUser, WarnLevels[iUser]);
		say(Text);
	}
	if (WarnLevels[iUser]==35) {
		slap(nUser);
		slap(nUser);
		slap(nUser);
		slap(nUser);
		slap(nUser);
		slap(nUser);
		slap(nUser);
		slap(nUser);
		slap(nUser);
		slap(nUser);
		snprintf(Text, MAX_TEXT_LENGTH, "*%s's warning level is at %i and has been slapped 10 times.*", nUser, WarnLevels[iUser]);
		say(Text);
	}
	if (WarnLevels[iUser]==50) {
		slay(nUser);
		snprintf(Text, MAX_TEXT_LENGTH, "*%s's warning level is at %i and has been slain.*", nUser, WarnLevels[iUser]);
		say(Text);
	}
	if (WarnLevels[iUser]==65) {
		GagPlayer[iUser]=1;
		snprintf(Text, MAX_TEXT_LENGTH, "*%s's warning level is at %i and has been gagged.*", nUser, WarnLevels[iUser]);
		say(Text);
	}
	if (WarnLevels[iUser]==80) {
		set_timer("ControlSlay", 30, 5, nUser);
		snprintf(Text, MAX_TEXT_LENGTH, "*%s's warning level is at %i and will be slain every 30 seconds 3 times.*", nUser, WarnLevels[iUser]);
		say(Text);
	}
	if (WarnLevels[iUser]==100) {
		snprintf(Text, MAX_TEXT_LENGTH, "*%s's warning level is at %1 and will be kicked.*", nUser, WarnLevels[iUser]);
		messageex(nUser,"Your warning level reached 100 and you were kicked.",print_console);
		say(Text);
		kick(nUser);
	}
	}
}
 
public WarnCheck(Timer, Repeat, HLName, HLParam)
{
	new iUser[MAX_NUMBER_LENGTH];
	new idUser;
	new ddUser;
 
	convert_string(HLParam,iUser,MAX_NUMBER_LENGTH);
	idUser=strtonum(iUser);
	ddUser=FlagPlayer[idUser];
	if (CanWarn[ddUser] [idUser]==1) {
		CanWarn[ddUser] [idUser]=0;
	}
}
 
public ControlSlay(Timer, Repeat, HLName, HLParam)
{
	new Text[MAX_TEXT_LENGTH];
	new nUser[MAX_TEXT_LENGTH];
 
	convert_string(HLParam, nUser, MAX_TEXT_LENGTH);
 
	slay(nUser);
 
	snprintf(Text, MAX_TEXT_LENGTH, "debug");
	say(Text);
}
 
 
public AllowAgain(Timer, Repeat, HLName, HLParam)
{
	new iUser[MAX_NUMBER_LENGTH];
	new idUser;
	new ddUser;
 
	convert_string(HLParam,iUser,MAX_NUMBER_LENGTH);
	idUser=strtonum(iUser);
	ddUser=FlagPlayer[idUser];
	WarnLimit[ddUser] [idUser]=0;
}
 
public LowerWarn(Timer, Repeat, HLName, HLParam)
{
	new Text[MAX_TEXT_LENGTH];
	new iUser[MAX_NUMBER_LENGTH];
	new idUser;
	convert_string(HLParam, iUser, MAX_NUMBER_LENGTH);
	idUser=strtonum(iUser);
	if (WarnLevels[idUser]==65) {
		GagPlayer[idUser]=0;
		snprintf(Text, MAX_TEXT_LENGTH, "[You are no longer gagged from warning.]");
		messageex(iUser, Text, print_chat);
	}
	if (WarnLevels[idUser]!=0) {
		WarnLevels[idUser]-=10;
		if (WarnLevels[idUser]<0) { WarnLevels[idUser]=0; }
		snprintf(Text, MAX_TEXT_LENGTH, "[Your warning level has lowered to %i]", WarnLevels[idUser]);
		messageex(iUser, Text, print_chat);
	}
}
 
public HandleSay(HLCommand, HLData, HLUserName, UserIndex) 
{
	new Command[MAX_COMMAND_LENGTH];
	new Speech[MAX_DATA_LENGTH];
	new User[MAX_NAME_LENGTH];
	new Text[MAX_TEXT_LENGTH];
	new Mesg[MAX_TEXT_LENGTH];
	new Targ[MAX_TEXT_LENGTH];
	new iUser;
	new UserStr[MAX_TEXT_LENGTH];
	new dUser;
	new dUserStr[MAX_TEXT_LENGTH];
 
	convert_string(HLCommand, Command, MAX_COMMAND_LENGTH);
	convert_string(HLData, Speech, MAX_DATA_LENGTH);
	convert_string(HLUserName, User, MAX_NAME_LENGTH);
 
	strstripquotes(Speech);
	get_userindex(User, dUser);
	if (AllowWarns==1) {
	if ( (strcasestr(Speech, "/wlvl ") != -1) )
	{
			strbreak(Speech, Targ, Mesg, MAX_TEXT_LENGTH);
			strbreak(Mesg, Targ, Mesg, MAX_TEXT_LENGTH);
			get_userindex(Targ, iUser);
			numtostr(iUser, UserStr);
			if (check_user(Targ)==1) {
			snprintf(Text, MAX_TEXT_LENGTH, "The current warning level of %s is %i", Targ, WarnLevels[iUser]);
			messageex(User, Text, print_chat);
			}
	}
 
	if ( (strcasestr(Speech, "/mlvl") != -1) ) {
		snprintf(Text, MAX_TEXT_LENGTH, "Your current warning level is %i", WarnLevels[dUser]);
		messageex(User, Text, print_chat);
	}
 
	if ( (strcasestr(Speech, "/warn ") != -1) ) 
	{
		strbreak(Speech, Targ, Mesg, MAX_TEXT_LENGTH);
		strbreak(Mesg, Targ, Mesg, MAX_TEXT_LENGTH);
		get_userindex(Targ, iUser);
		numtostr(iUser, UserStr);
		snprintf(dUserStr, MAX_TEXT_LENGTH, "%s", Targ);
		if (check_user(Targ)==1) 
		{
			if ((CanWarn[dUser] [iUser]==0) && (WarnLimit[dUser] [iUser]<=6)) {
				WarnLevels[iUser]+=5;
				CanWarn[dUser] [iUser]=1;
				WarnLimit[dUser] [iUser]+=1;
				FlagPlayer[iUser]=dUser;
				AllowPlayer[iUser]=dUser;
				set_timer("LowerWarn", 180, 1, UserStr);					
				set_timer("WarnCheck", 20, 1, UserStr);
				if (WarnLimit[dUser] [iUser]==7) {
					set_timer("AllowAgain", 1260, 1, UserStr);
				}
				PunishHim(iUser, dUserStr);
				snprintf(Text, MAX_TEXT_LENGTH, "[%s has warned %s to %i]", User, Targ, WarnLevels[iUser]);
				say(Text);
			} else {
				snprintf(Text, MAX_TEXT_LENGTH, "!! You cannot warn %s right now.", Targ);
				messageex(User, Text, print_chat);
			}	
			return PLUGIN_HANDLED;
		}
	}
	if (GagPlayer[dUser]==1) {
		snprintf(Text, MAX_TEXT_LENGTH, "!! You are currently gagged from being warned and cannot speak.");
		messageex(User, Text, print_chat);
		return PLUGIN_HANDLED;
	}
	}
 
	return PLUGIN_CONTINUE;
}
 
public plugin_disconnect(HLUserName, UserIndex) {
	if (UserIndex >= 1 && UserIndex <= MAX_PLAYERS) {
		WarnLevels[UserIndex]=0;
		//CanWarn[UserIndex]=1;
	}
	return PLUGIN_CONTINUE;
}