/* This plugin enables non-admin started votes for noclipping, as well as autoresponse and admin_vote_noclip. I will have a website by the next version, which should include choosing the length of NOCLIP_TIME ingame, and an option for turning glow on along with noclip.
 * Scripts belong to respective owners, adapted from BenTheMeek's & KrezerJ's script, which borrowed from yensid and jag 
 * say up every round to get noclip, down to turn it off for you.
 * say vote_noclip - starts a vote on noclip mode
 * admin_noclipon - toggles noclip mode on and off
 * admin_vote_noclip - starts a vote on noclip mode, 1 enables public use of say vote_noclip
 * admin_noclipoff - toggles whether or not all users lose noclip when noclipping is turned off. This occurs after NOCLIP_TIME seconds, to give them time to reach safety.
 */
 
/* $Id: plugin_noclip.sma,v 1.2 4/21/02 by Thor $ */
 
#include <core>
#include <console>
#include <string>
#include <admin>
#include <adminlib>
#define ACCESS_RESTRICT 8192
#define ACCESS_ALL 0
#define ACCESS_NOCLIP 8192
#define ACCESS_VOTE_NOCLIP 8192
new STRING_VERSION[MAX_DATA_LENGTH] = "2.50.0";
 
 
/* Change to 1 to have a noclip vote start 450 seconds into a map */
#define AUTO_NOCLIP_VOTE 0
 
/*Change to 0 to disable admin_noclipon */
#define ENABLE_NOCLIP 1
#define ENABLE_NOCLIP_VOTE 1
#define ENABLE_NOCLIP_STATUS 1
 
/* Change this to whatever ratio of players need to vote for noclip to change it. */
#define NOCLIP_VOTE_RATIO 51
 
/* Change this to the number seconds a NON-admin will have to wait to revote noclip. To */
/* vote_noclip again you wait ?? seconds. */
new RVfreq=30;
 
/* If this is enabled (1), then noclip is turned off for everybody in the server after
   NOCLIP_TIME seconds. If it is disabled, then the people who are noclipping continue 
   to do so until the round ends. */
new NOCLIPOFF=1;
 
#define NOCLIP_TIME 10
 
#if ENABLE_NOCLIP_VOTE==1
/* Change this to 1 to disable public use of vote_noclip by default */
new NOCLIPVoteOff=0;
/*Change this to 0 to have noclipping off to start with, 1 for it to be on */
new COn=1;
#endif
 
 
 
/****************************************************/
/***** END OF SWITCHES FOR ALL YE PRYING ADMINS *****/
/****************************************************/
 
 
#if ENABLE_NOCLIP_VOTE==1
new vote_NOCLIPAllowed=1;
@NOCLIPVoteTimer() {
	vote_NOCLIPAllowed=1;
}
#endif
 
 
public CON() {
	COn = 1;
}
public COFF() {
	if (NOCLIPOFF==1) {
	set_timer("Noclip_Timer", 1, NOCLIP_TIME);
	}
	else {
	COn = 0;
	}
}
 
public NOCLIPVote() {
	new strDummy[10];
	vote("Noclip on?", "Off", "On", "HandleNOCLIPVote",strDummy);
}
 
public HandleNOCLIPVote(WinningOption,HLData,VoteCount,UserCount) {
	new Text[MAX_TEXT_LENGTH];
	new strNumber[MAX_NUMBER_LENGTH];
	new Ratio = NOCLIP_VOTE_RATIO;
	new strData[MAX_DATA_LENGTH];
	new i;
	new maxplayers = maxplayercount();
	new SessionID;
	new Target[MAX_NAME_LENGTH];
	new Team;
	new WONID;
	convert_string(HLData, strData,MAX_DATA_LENGTH);
 
	if (VoteCount >= Ratio*UserCount/100) {	
		if (WinningOption==1) {
			if (COn==0) { 
				snprintf(Text, MAX_TEXT_LENGTH, "Vote over.  Noclip will remain off.", strNumber);
			} else {
				snprintf(Text, MAX_TEXT_LENGTH, "Vote successful. Noclipping has been disabled!!!", strNumber);
				COFF();
			}
		} else {
			if (COn==1) { 
				snprintf(Text, MAX_TEXT_LENGTH, "Vote over. Noclipping will remain.", strNumber);
			} else {
				snprintf(Text, MAX_TEXT_LENGTH, "Clipping is on now!", strNumber);
				CON();
			}
		}
	} else {
		numtostr(Ratio*UserCount/100,strNumber);
		if (COn==0) { 
			snprintf(Text, MAX_TEXT_LENGTH, "Noclipping vote succeeded, but not enough votes for change (needed %s)^nNoclipping will remain off.", strNumber);
		} else {
			snprintf(Text, MAX_TEXT_LENGTH, "Noclipping vote succeeded, but not enough votes for change (needed %s)^nNoclippings will remain.", strNumber);
		}
	}
	centersay(Text,18,63,187,239);
	for(i=1; i<=maxplayers; i++) {
		strinit(Target);
		if(playerinfo(i,Target,MAX_NAME_LENGTH,SessionID,WONID,Team)==1) {
			messageex(Target,Text,print_console);
		}
	}
}
 
#if ENABLE_NOCLIP_VOTE==1
public admin_vote_noclip(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);
	say_command(User,Command,Data);
 
	if (streq(Data, "off")==1) {
		selfmessage( "Public noclip voting has been disabled");
		NOCLIPVoteOff=1;
		return PLUGIN_HANDLED;
	}
	if (streq(Data, "on")==1) {
		selfmessage( "Public noclip voting has been enabled");
		NOCLIPVoteOff=0;
		return PLUGIN_HANDLED;
	}
 
	if (vote_allowed()!=1) {
		selfmessage( "Vote not allowed at this time.");
		return PLUGIN_HANDLED;
	}
 
	vote_NOCLIPAllowed=0;
	set_timer("@NOCLIPVoteTimer",RVfreq,1);
	NOCLIPVote();
 
	return PLUGIN_HANDLED;
}
#endif
 
#if ENABLE_NOCLIP_VOTE==1
public admin_noclipon(HLCommand,HLData,HLUserName,UserIndex) {
	new Command[MAX_COMMAND_LENGTH];
	new Data[MAX_DATA_LENGTH];
	new User[MAX_NAME_LENGTH];
	new Text[MAX_TEXT_LENGTH];
	new strNumber[MAX_NUMBER_LENGTH];
	new maxplayers = maxplayercount();
	new SessionID;
	new Target[MAX_NAME_LENGTH];
	new Team;
	new WONID;
	new i;
	convert_string(HLCommand,Command,MAX_COMMAND_LENGTH);
	convert_string(HLData,Data,MAX_DATA_LENGTH);
	convert_string(HLUserName,User,MAX_NAME_LENGTH);
 
	if (COn==0) {
		snprintf(Text, MAX_TEXT_LENGTH, "ADMIN has set noclipping to on!", strNumber);
		centersay(Text,10,0,255,0);
		for(i=1; i<=maxplayers; i++) {
			strinit(Target);
			if(playerinfo(i,Target,MAX_NAME_LENGTH,SessionID,WONID,Team)==1) {
				messageex(Target,Text,print_console);
			}
		}
		CON();
	} 
	else {
		snprintf(Text, MAX_TEXT_LENGTH, "ADMIN has turned off noclipping.", strNumber);
		centersay(Text,10,0,255,0);
		for(i=1; i<=maxplayers; i++) {
			strinit(Target);
			if(playerinfo(i,Target,MAX_NAME_LENGTH,SessionID,WONID,Team)==1) {
				messageex(Target,Text,print_console);
			}
		}
		COFF();
	}
	return PLUGIN_HANDLED;
}
#endif
 
#if ENABLE_NOCLIP_VOTE==1
public admin_noclipoff(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);
	say_command(User,Command,Data);
 
	if (streq(Data, "off")==1) {
		selfmessage( "Noclip turning off will not be enforced until the next round.");
		NOCLIPOFF=0;
		return PLUGIN_HANDLED;
	}
	if (streq(Data, "on")==1) {
		selfmessage( "Noclip will be turned off at the end of a vote or admin_noclipon.");
		NOCLIPOFF=1;
		return PLUGIN_HANDLED;
	}
 
 
	return PLUGIN_HANDLED;
}
#endif
 
public HandleSay(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);
 
	strstripquotes(Data);
 
	if (COn==1) {
		if (strcasestr(Data, "up")!=-1) {
			noclip(User, 1);
		}
		if (strcasestr(Data, "down")!=-1) {
			noclip(User, 0);
		}
	}
 
	#if ENABLE_NOCLIP_STATUS==1
	new Match = FALSE;
	if (strcasestr(Data, "cheat")!=-1) {
		Match = TRUE;
	}
	if (strcasestr(Data, "cheats")!=-1) {
		Match = TRUE;
	}
	if (strcasestr(Data, "noclip")!=-1) {
		Match = TRUE;
	}
	if (strcasestr(Data, "noclipping")!=-1) {
		Match = TRUE;
	}
	if (strcasestr(Data, "nocliping")!=-1) {
		Match = TRUE;
	}
	if (strcasestr(Data, "fly")!=-1) {
		Match = TRUE;
	}
	if (strcasestr(Data, "clip")!=-1) {
		Match = TRUE;
	} 
	if (strcasestr(Data, "clipping")!=-1) {
		Match = TRUE;
	}
	if (strcasestr(Data, "up")!=-1 && COn!=1) {
		Match = TRUE;
	}
 
#endif
 
/****     Is it on or off?     ****/
#if ENABLE_NOCLIP_STATUS==1
	if (Match==TRUE) {
		if (COn==1) { 
			centersay ("Noclipping is on. ^n To change say vote_noclip. ^nType up to access.",9,0,255,0);
		} 
		else {
				centersay ("Noclipping is off!^nTo change say vote_noclip",12,0,255,0); 
		}
	}
#endif
 
 
#if ENABLE_NOCLIP_VOTE==1
	if (strcasestr(Data, "vote_noclip")!=-1) {
		if (NOCLIPVoteOff==1) {
			say("Admin has disable public use of vote_noclip.");
		} else {
			if (vote_NOCLIPAllowed != 1){
				say("A vote has just been completed, sorry if you didn't like the results.");
			} else {
				if (vote_allowed()!=1) {
					say("Vote not allowed at this time.");
				} else {
					vote_NOCLIPAllowed=0;
					set_timer("@NOCLIPVoteTimer",RVfreq,1);
					NOCLIPVote();
				}
			}
		}
	}
#endif
 
	return PLUGIN_CONTINUE;
}
 
@NOCLIPVote() {
	if (vote_allowed()==1) {
		NOCLIPVote();
		say("[AutoVoteNOCLIP] Vote Started");
	} else {
		set_timer("@NOCLIPVote",30,1);
		say("[AutoVoteNOCLIP] Vote not allowed at this time");
		say("Server will retry in 30 secconds");
	}
}
 
public Noclip_Timer(Timer, Repeat, HLUserName, HLParam)
{
	new Text[MAX_TEXT_LENGTH];
	new User[MAX_NAME_LENGTH];
 
	new Red = random(256);
	new Green = random(256);
	new Blue = random(256);
 
	convert_string(HLUserName, User, MAX_NAME_LENGTH);
 
	if (Repeat-1 == 0)
	{
		execute_all("kill");
		snprintf(Text, MAX_TEXT_LENGTH, "Noclipping is off.. I hope you aren't stuck!!", User);
		COn = 0;
	}
	else
	{
		snprintf(Text, MAX_TEXT_LENGTH, "The noclip cheat will turn off in %d more seconds.^nGet into open air!", Repeat-1);
	}
 
	typesay(Text, 1, Red, Green, Blue);
}
 
public execute_all(a[]) {
    new userid = 0;
    new wonid = 0;
    new teamid = 0;
    new username[200];
    new i=0;
    new x = 0;
    COn=0;
    x = maxplayercount();
    for(i=1; i<=x; i=i+1) {
        strinit(username);
        if(playerinfo(i, username, 200, userid, wonid, teamid)==1) {
            noclip (username, 0);
        }
    }
}
 
public plugin_init() {
	plugin_registerinfo("Noclipping Voting","vote for noclip with autorespond status",STRING_VERSION);
	plugin_registercmd("say","HandleSay",ACCESS_ALL);
#if ENABLE_NOCLIP==1
	plugin_registercmd("admin_noclipon","admin_noclipon",ACCESS_RESTRICT,"admin_noclipon : Toggles noclipping access on and off.");
#endif
 
#if ENABLE_NOCLIP_VOTE==1
	plugin_registercmd("admin_vote_noclip","admin_vote_noclip",ACCESS_RESTRICT,"admin_vote_noclip : Starts a vote to enable noclipping. off/on changes public use of vote_noclip");
	plugin_registerhelp("say",ACCESS_ALL,"say vote_noclip: Will start noclipping vote and give status.");
#endif
 
#if ENABLE_NOCLIP_STATUS==1
	plugin_registerhelp("say",ACCESS_ALL,"say noclip,noclipping,nocliping,fly: Will give noclip status.");
#endif
 
#if AUTO_NOCLIP_VOTE==1	
	set_timer("@NOCLIPVote",450,1);
#endif
 
 
	return PLUGIN_CONTINUE;
}