/* [WING]Sir Drink a lot's & [WING]Black Knight's CW-Creator 11.09.2003 */
 
#pragma dynamic 8192
 
#include <core> 
#include <console> 
#include <string> 
#include <admin> 
#include <adminlib>
#define ACCESS_WAR 256
#define MAX_IP_LENGTH 22
 
new STRING_VERSION[MAX_DATA_LENGTH] = "2.11";
new warpluginini[MAX_DATA_LENGTH]="addons/adminmod/config/cwcreator/warplugin.ini";
new warcfg[MAX_DATA_LENGTH]="addons/adminmod/config/cwcreator/war.cfg";
new ruledir[MAX_DATA_LENGTH]="addons/adminmod/config/cwcreator/rules/";
new cwmcf[MAX_DATA_LENGTH]="addons/adminmod/config/cwcreator/cwmapcycle.txt";
new settings[MAX_DATA_LENGTH]="addons/adminmod/config/cwcreator/settings.ini";
new cvartl[13][MAX_DATA_LENGTH]={"test","[WING]","de_aztec","de_dust","de_dust","esl.cfg","0","0","all","","0","",""};
new round=0;
new maxrounds;
new timelimit;
 
/******************************** WAR-SETTINGS ***************************************/
 
public admin_war_set(HLCommand,HLData,HLUserName,UserIndex) {
 	new Command[MAX_COMMAND_LENGTH];
 	new User[MAX_NAME_LENGTH];
  	new maxplayers = maxplayercount();
 	new Target[MAX_NAME_LENGTH];
	new i;
 	new SessionID;
 	new WONID;
 	new Team;
 	new execrule[MAX_TEXT_LENGTH]="exec ";
	new apf[MAX_DATA_LENGTH]="admin_plugin_file ";
	new mcf[MAX_DATA_LENGTH]="mapcyclefile ";
	new Text[MAX_TEXT_LENGTH]="sv_password ";
 
 	if(strmatch(cvartl[10],"0",MAX_DATA_LENGTH)) {
		for(i=0;i<=8;i++) {
			/*-------- ÜBERPRÜFUNG, OB ALLE DATEN ANGEGEBEN WURDEN ------*/
			if(strlen(cvartl[i])==0){
				selfmessage("Angaben unvollstaendig!");
				listprop();
				return PLUGIN_HANDLED;
			}
		}
 
	 	convert_string(HLData,cvartl[9],MAX_DATA_LENGTH);
		if(strlen(cvartl[9]) > 20) {
			selfmessage("Der Clantag ist zu lang!!");
			selfmessage("Bitte kuerzen");
			return PLUGIN_HANDLED;
		}
 
		/*-------- ALLE LEUTE OHNE CLANTAG WERDEN GEKICKT UND BEI REST WIRD PASSWORT GESETZT  ------*/ 
		if(strlen(cvartl[9])!=0){
			new ui=hltvonline();
			new freeslots=0;
			new hltvinfo[MAX_NAME_LENGTH];
			if(ui>0){
				new sIP[MAX_IP_LENGTH];
				new iPort;
				playerinfo(i,Target,MAX_NAME_LENGTH,SessionID,WONID,Team);
				get_userIP(Target,sIP,MAX_IP_LENGTH,iPort);
				get_userinfo(Target,"hltv_slots",hltvinfo,MAX_NAME_LENGTH);
				freeslots=strtonum(hltvinfo);
				get_userinfo(Target,"hltv_specs",hltvinfo,MAX_NAME_LENGTH);
				freeslots-=strtonum(hltvinfo);
				snprintf(hltvinfo,MAX_TEXT_LENGTH,"connect %s:%d",sIP,iPort);
			}
			new Userpassword[MAX_TEXT_LENGTH];
			for(i=1; i<=maxplayers; i++) {
		 		if(playerinfo(i,Target,MAX_NAME_LENGTH,SessionID,WONID,Team)==1) {
	 				if (strstr(Target,cvartl[1]) == -1 && strstr(Target,cvartl[9]) == -1 && Team != TEAM_PROXY) {
	 					if(check_immunity(Target)==0 && i != UserIndex) {
							if(freeslots>0){
								message(Target, "Sorry, CW! Du wirst auf den HLTV umgeleitet.");
								execclient(Target,hltvinfo);
							}
							else{
	 							message(Target, "Sorry, CW! Aber danke fuer das schnelle Disconnecten. ;p");
	 							kick(Target);
							}
	 					}
	 				}
					else {
						snprintf(Userpassword,MAX_TEXT_LENGTH,"password %s",cvartl[11]);
						execclient(Target,Userpassword);
					}
		 		}
		 	}
		}
		if(strlen(cvartl[9]) == 0) {
			strcpy(cvartl[9],"Gast",MAX_DATA_LENGTH);
		}
		writefile(settings,cvartl[9],10);
 
		/*-------- In die war.cfg wird die angegebene Regeln.cfg als Exec reingeschrieben  ------*/ 
 
		strcat(apf,warpluginini,MAX_DATA_LENGTH);
		writefile(warcfg,apf,-1);
		snprintf(execrule,MAX_DATA_LENGTH,"exec %s%s",ruledir,cvartl[5]);
		writefile(warcfg,execrule,-1);
		writefile(warcfg,"vote_freq 1",-1);
		writefile(warcfg,"admin_vote_echo 1",-1);
		writefile(warcfg,"admin_vote_autostart 0",-1);
		writefile(warcfg,"amv_vote_duration 15",-1);
		writefile(warcfg,"admin_cs_restrict 0",-1);
		writefile(warcfg,"admin_repeat_freq 0",-1);
		if(fileexists("addons/adminmod/config/cwcreator/startwar.cfg")){
			exec("exec addons/adminmod/config/cwcreator/startwar.cfg");
		} 
 
		/*-------- PASSWORT SETZEN UND MAPCHANGE DURCHFÜHREN ------
		Sperre, damit man nicht das ursprüngliche Server-Passwort 
		mit dem neu gesetzten Passwort, durch zweimal Aufrufen des 
		admin_warsettings,überschreibt.*/
 
		getstrvar("sv_password",cvartl[11],MAX_TEXT_LENGTH);
		writefile(settings,cvartl[11],12);
		getstrvar("mapcyclefile",cvartl[12],MAX_TEXT_LENGTH);
		writefile(settings,cvartl[12],13);
 
		strcat(Text,cvartl[0],MAX_TEXT_LENGTH);
		exec(Text);
	 	snprintf(Text,MAX_TEXT_LENGTH,"Das Passwort ist jetzt ^"%s^". ^n Nextmap %s",cvartl[0],cvartl[2]);
		for(i=1; i<=maxplayers; i++) {
	 		if(playerinfo(i,Target,MAX_NAME_LENGTH,SessionID,WONID,Team)==1) {
				if(Team!=TEAM_PROXY) {
					centersayex(Target,Text,10,68,255,125);
				}
	 		}
	 	}
	 	selfmessage(Text);
		convert_string(HLCommand,Command,MAX_COMMAND_LENGTH);
	 	convert_string(HLUserName,User,MAX_NAME_LENGTH);
	 	say_command(User,Command,cvartl[9]);
		set_vaultnumdata("admin_war_on",1);
		/*------------- Mapcyclefile anlegen -----------------*/
		strcat(mcf,cwmcf,MAX_DATA_LENGTH);
		writefile(warcfg,mcf,-1);
		resetfile(cwmcf);
		writefile(cwmcf,cvartl[2],-1);
		writefile(cwmcf,cvartl[3],-1);
		writefile(cwmcf,cvartl[3],-1);
		writefile(settings,"0",11);
		set_vaultnumdata("admin_war_rs",1);
	 	set_timer("mapchange",13,0,cvartl[2]);
	 	return PLUGIN_HANDLED;
	}
	selfmessage("In der settings.ini ist bereits ein Passwort gesetzt.");
	selfmessage("Bitte admin_war_end ausfuehren, um diese Einstellungen zu loeschen.");
	selfmessage("Danach admin_war_set erneut aufrufen.");
 	return PLUGIN_HANDLED;
}
 
public mapchange(Timer,Repeat,HLUser,HLParam) {
	new Map[MAX_NAME_LENGTH];
	convert_string(HLParam,Map,MAX_NAME_LENGTH);
	changelevel(Map,1);
	return PLUGIN_CONTINUE;
}
/********************************************************************************/
 
/********************************** CW - START **********************************/
 
public admin_war_start(HLCommand,HLData,HLUserName,UserIndex) {
	new Text[MAX_TEXT_LENGTH]="Wenn alle die Frage,'Seid Ihr bereit' mit JA beantworten,^nkommt 2 mal Restartround, und es geht los.";
	new hltv;
	new dummy[10];
	new hltvname[MAX_NAME_LENGTH];
	new on;
 
	get_vaultnumdata("admin_war_on",on);
	if(on==0) {
		selfmessage("Sorry, Befehl nur im Warmodus durchfuehrbar!");
		return PLUGIN_HANDLED;
	}
 
 
	if (strlen(cvartl[9]) != 0 && round == 1) {
		snprintf(Text,MAX_TEXT_LENGTH,"Wir begruessen den Clan %s zum heutigen Clanwar^nWenn alle die Frage,'Seid Ihr bereit' mit JA beantworten,^nkommt 2 mal Restartround, und es geht los.",cvartl[9]);
	}
	centersay(Text,30,68,255,125);
	vote("Seid ihr bereit?","Ja","Nein","HandleWarVote",dummy);
	hltv=hltvonline();
	if(hltv!=0){
		playerinfo(hltv,hltvname,MAX_NAME_LENGTH);
		messageex(hltvname,"Startvote begonnen",print_tty);
	}
 
	return PLUGIN_HANDLED;
}
 
public HandleWarVote(WinningOption,HLMap,VoteCount,UserCount) {
	new VoteMap[MAX_DATA_LENGTH];
	new a=0;
 
	a=hltvonline();
	if(a!=0){
		a=1;
	}
 
	convert_string(HLMap,VoteMap,MAX_DATA_LENGTH);
 
	if (WinningOption == 1 && VoteCount >= (UserCount-a)) {
		centersay("Gut. Alle sind bereit.^nDann kann es ja nach 2 mal Restart Round losgehen.",10,68,255,125);
		restarttimers();
		return PLUGIN_CONTINUE;
	}
	else {
		centersay("Es haben leider nicht alle mit JA geantwortet.^nEs muessen alle mit JA abstimmen,^n um den CW zu starten.",10,255,40,44);
	}
	return PLUGIN_CONTINUE;
}
 
public admin_war_restart(HLCommand,HLData,HLUserName,UserIndex) {
		restarttimers();
		centersay("Nach 2 mal Restart Round geht es los.",10,68,255,125);
		return PLUGIN_HANDLED;
}
 
restarttimers(){
	new on;
 
	get_vaultnumdata("admin_war_on",on);
	if(on==1) {
		set_vaultnumdata("admin_war_rs",1);
		set_timer("Restart_Round",10,0);
		set_timer("warmup_end",12,0);
		set_timer("Restart_Round",13,0);
		set_timer("War_Starts",15,0);
	}
	else{
		selfmessage("Sorry, Befehl nur im Warmodus durchfuehrbar!");
	}
}
 
public Restart_Round(Timer,Repeat,HLUser) {
	exec("sv_restartround 1");
	return PLUGIN_CONTINUE;
}
 
public warmup_end(Timer,Repeat,HLUser) {
	new merk[MAX_TEXT_LENGTH];
	snprintf(merk, MAX_TEXT_LENGTH,"mp_timelimit %i",timelimit);
	exec(merk);
	snprintf(merk, MAX_TEXT_LENGTH,"mp_maxrounds %i",maxrounds);
	exec(merk);
	if (strmatch(cvartl[6],"1",MAX_DATA_LENGTH) || strmatch(cvartl[7],"1",MAX_DATA_LENGTH)){
		snprintf(merk, MAX_TEXT_LENGTH,"%s %d",cvartl[10],maxrounds);
		plugin_exec("cwc_addon_start",merk);
	}
 
	return PLUGIN_CONTINUE;
}
 
public War_Starts(Timer,Repeat,HLUser) {
	centersay("Und los geht's! ^n Viel Glueck allen Beteiligten!",10,68,255,125);
 
	return PLUGIN_CONTINUE;
}
 
/********************************************************************************/
 
/********************************** CW - END ************************************/
public admin_war_end(HLCommand,HLData,HLUserName,UserIndex) {
	new Text[MAX_TEXT_LENGTH];
	new on;
 
	get_vaultnumdata("admin_war_on",on);
	if(on==1){
		/*-------- Altes Passwort und alter Mapcycle werden wiederhergestellt ---------*/
		readfile(settings,cvartl[11],12,MAX_DATA_LENGTH);
		readfile(settings,cvartl[12],13,MAX_DATA_LENGTH);
		if (strlen(cvartl[11])==0){
			strcpy(cvartl[11],"none",MAX_DATA_LENGTH);
		}
		writefile(settings,"",12);
		snprintf(Text,MAX_TEXT_LENGTH,"sv_password %s",cvartl[11]);
		exec(Text);
		snprintf(Text,MAX_TEXT_LENGTH,"mapcyclefile %s",cvartl[12]);
		exec(Text);
		set_vaultnumdata("admin_war_on",0);
		/*-------- Die war.cfg wird geleert ---------*/
		resetfile(warcfg);
		/*-------- Kleines Dankeschön für den War ------------ */
		selfmessage("Die normalen Einstellungen werden nach einem Mapchange in 60 s wiederhergestellt.");
		centersay("Der War ist beendet.^n Vielen Dank an alle Beteiligten.",10,68,255,125);
		set_timer("mapchange",59,0,cvartl[4]);
		snprintf(Text, MAX_TEXT_LENGTH, "Mapchange auf %s in einer Minute.",cvartl[4]);
		say(Text);
		if (strmatch(cvartl[6],"1",MAX_DATA_LENGTH)){
			plugin_exec("cwc_addon_end",cvartl[10]);
		}
		strcpy(cvartl[10],"0",MAX_DATA_LENGTH);
		writefile(settings,"0",11);
		if(fileexists("addons/adminmod/config/cwcreator/endwar.cfg")){
			exec("exec addons/adminmod/config/cwcreator/endwar.cfg");
		}
	}
	else {
		selfmessage("Es laeuft kein War mehr!");
	}
	return PLUGIN_HANDLED;
}
 
/*********** HLTV Online-Ueberpruefung *************/
 
hltvonline() {
	new i;
	new maxplayers = maxplayercount();
	new Target[MAX_NAME_LENGTH];
	new SessionID;
	new WONID;
	new Team;
 
	for(i=1; i<=maxplayers; i++) {
 		if(playerinfo(i,Target,MAX_NAME_LENGTH,SessionID,WONID,Team)==1) {
 			if (Team == 600) {
 				return i;
 			}
 		}
 	}
	return 0;
}
 
/******* Spezifische Mapsettings ueberschreiben *********/
 
public nomapsets(Timer,Repeat,HLUser) {
	new Text[MAX_TEXT_LENGTH];
	snprintf(Text,MAX_TEXT_LENGTH,"exec %s",warcfg);
	exec(Text);
	say("Map-Settings ueberschrieben!");
	set_timer("warmup_init",3,0);
 
	return PLUGIN_CONTINUE;
}
 
/******* Warmup einstellen ***********/
 
public warmup_init(Timer,Repeat,HLUser) {
	timelimit=getvar("mp_timelimit");
	maxrounds=getvar("mp_maxrounds");
	exec("mp_timelimit 0");
	exec("mp_maxrounds 0");
 
	return PLUGIN_CONTINUE;
}
 
/********* CW Creator settings.ini cvars setzen *************/
listprop(){
	new cmd[9][MAX_COMMAND_LENGTH]={"admin_war_pass","admin_war_tag","admin_war_map1","admin_war_map2","admin_war_endmap","admin_war_rules","admin_war_count","admin_war_demo","admin_war_countrules"};
	new i;
	new Text[MAX_TEXT_LENGTH];
 
	selfmessage("CW-Einstellungen:");
	for(i=0;i<=8;i++){
		snprintf(Text,MAX_TEXT_LENGTH,"%s %s",cmd[i],cvartl[i]);
		selfmessage(Text);
	}
	return PLUGIN_CONTINUE;
}	
 
setorinfo(cvar2[],Value[]){
	new cmd[9][MAX_COMMAND_LENGTH]={"admin_war_pass","admin_war_tag","admin_war_map1","admin_war_map2","admin_war_endmap","admin_war_rules","admin_war_count","admin_war_demo","admin_war_countrules"};
	new i;
	new merk;
 
	if(strlen(Value)!=0){
		for(i=0;i<=8;i++){
			if(strcasecmp(cvar2,cmd[i])==0){
				merk=i;
				break;
			}
		}
		writefile(settings,Value,merk+1);
		strcpy(cvartl[merk],Value,MAX_DATA_LENGTH);
	}
	listprop();
	return PLUGIN_CONTINUE;
}
 
public admin_war_cvar(HLCommand,HLData,HLUserName,UserIndex){
	new Value[MAX_DATA_LENGTH];
	new cvar2[MAX_DATA_LENGTH];
	new iNum;
 
	convert_string(HLData,Value,MAX_DATA_LENGTH);
	convert_string(HLCommand,cvar2,MAX_DATA_LENGTH);
 
	if(strlen(Value)!=0){
		if(strcasecmp(cvar2,"admin_war_pass")==0){
			if (strcmp(Value,"none")== 0) {
		 		selfmessage("Passwort nicht korrekt!");
				return PLUGIN_HANDLED;
			}
		}
		else if(strcasecmp(cvar2,"admin_war_tag")==0){
			if(strlen(Value) > 20) {
				selfmessage("Der ClanTag ist zu lang!");
				return PLUGIN_HANDLED;
			}
		}
		else if(strcasecmp(cvar2,"admin_war_map1")==0 || strcasecmp(cvar2,"admin_war_map2")==0 || strcasecmp(cvar2,"admin_war_endmap")==0){
			if(!valid_map(Value)) {
				selfmessage("Map existiert nicht!");
				return PLUGIN_HANDLED;
			}
		}
		else if(strcasecmp(cvar2,"admin_war_rules")==0){
			new rule[MAX_DATA_LENGTH];
			snprintf(rule,MAX_DATA_LENGTH,"%s%s",ruledir,Value);
			if(!fileexists(rule)) {
				selfmessage("Regeldatei existiert nicht!");
				return PLUGIN_HANDLED;
			}
			new on;
			get_vaultnumdata("admin_war_on",on);
			if(on){
				new execrule[MAX_TEXT_LENGTH];
				snprintf(execrule,MAX_DATA_LENGTH,"exec %s%s",ruledir,Value);
				writefile(warcfg,execrule,2);
				exec(execrule);
				set_timer("warmup_init",5,0);
				say("Map-Settings werden in 5 Sekunden neu gesetzt!");
			}
		}
		else if(strcasecmp(cvar2,"admin_war_count")==0 || strcasecmp(cvar2,"admin_war_demo")==0){
			iNum=strtonum(Value);
			if(iNum<0 || iNum>1) {
				selfmessage("Ungueltiger Wert! Waehle 1 oder 0.");
				return PLUGIN_HANDLED;
			}
		}
		else if(strcasecmp(cvar2,"admin_war_countrules")==0){
			if(strcasecmp(Value,"attack")!=0 && strcasecmp(Value,"all")!=0) {
				selfmessage("Ungueltiger Wert! Waehle attack oder all.!");
				return PLUGIN_HANDLED;
			}
		}
	}
	setorinfo(cvar2,Value);
 
	return PLUGIN_HANDLED;
}
 
/************* INIT ********************/
 
public plugin_init() {
	new write=getvar("file_access_write");
	new read=getvar("file_access_read");
	new vault[MAX_DATA_LENGTH];
	new ivault=1;
	new execute=getvar("allow_client_exec");
 
	getstrvar("admin_vault_file",vault,MAX_DATA_LENGTH);
	if(streq(vault,"0")){
		ivault=0;
	}
	if(write==1 && read==1 && ivault==1 && execute){
		plugin_registerinfo("Clan War Creator","Sets server settings for CWs.",STRING_VERSION);
		plugin_registercmd("admin_war_set","admin_war_set",ACCESS_WAR,"admin_war_set <OpponentClanTag>");
		plugin_registercmd("admin_war_start","admin_war_start",ACCESS_WAR,"admin_war_start");
		plugin_registercmd("admin_war_restart","admin_war_restart",ACCESS_WAR,"admin_war_restart");
		plugin_registercmd("admin_war_end","admin_war_end",ACCESS_WAR,"admin_war_end");
		plugin_registercmd("admin_war_tag","admin_war_cvar",ACCESS_WAR,"admin_war_tag <eigener Clan-Tag>");
		plugin_registercmd("admin_war_pass","admin_war_cvar",ACCESS_WAR,"admin_war_pass <CW Passwort>");
		plugin_registercmd("admin_war_map1","admin_war_cvar",ACCESS_WAR,"admin_war_map1 <1.CW-Map>");
		plugin_registercmd("admin_war_map2","admin_war_cvar",ACCESS_WAR,"admin_war_map2 <2.CW-Map>");
		plugin_registercmd("admin_war_endmap","admin_war_cvar",ACCESS_WAR,"admin_war_endmap <Map nach Ende des Wars>");
		plugin_registercmd("admin_war_rules","admin_war_cvar",ACCESS_WAR,"admin_war_rules <Regeldatei>");
		plugin_registercmd("admin_war_count","admin_war_cvar",ACCESS_WAR,"admin_war_count <0/1>");
		plugin_registercmd("admin_war_demo","admin_war_cvar",ACCESS_WAR,"admin_war_demo <0/1>");
		plugin_registercmd("admin_war_countrules","admin_war_cvar",ACCESS_WAR,"admin_war_countrules <attack/all>");
 
		/******* Einstellungen besorgen *******/
		new i;
		if(fileexists(settings)){
			for(i=1;i<=10;i++){
				readfile(settings,cvartl[i-1],i,MAX_DATA_LENGTH);
			}
		}
		else{
			for(i=1;i<=13;i++){
				writefile(settings,cvartl[i-1],-1);
			}
		}
 
		/******* Im Warmodus? Passwort setzen und Mapsettings ueberschreiben ****/
 		new Text[MAX_TEXT_LENGTH]="sv_password ";
		new on;
		get_vaultnumdata("admin_war_on",on);
		if(on==1) {
 			exec("say War-Password ist gesetzt!");
			strcat(Text,cvartl[0],MAX_TEXT_LENGTH);
			exec(Text);
			set_timer("nomapsets",10,0);
			get_vaultnumdata("admin_war_rs",on);
			readfile(settings,cvartl[10],11,MAX_DATA_LENGTH);
			round=strtonum(cvartl[10]);
			if(on){
				round++;
				numtostr(round,cvartl[10]);
				writefile(settings,cvartl[10],11);
			}
			set_vaultnumdata("admin_war_rs",0);
		}
	}
	else{
		plugin_registerinfo("Clan War Creator","Disabled! Check your cvars",STRING_VERSION);
		log("Check file_access_read, file_access_write, admin_vault_file und allow_client_exec.");
	}
 
 	return PLUGIN_CONTINUE; 
}