falko-hartmann.de

Clan War Creator für Counter-Strike v2.1 (11.09.2003)

Beschreibung

Ihr kennt sicherlich das Problem. Man möchte einen ClanWar starten, aber man muss Spieler vom Server werfen, die richtigen Einstellungen laden, die Maps wechseln, usw. Um uns die Administration des Wars zu vereinfachen, hatten Sir Drink a lot und ich den CW Creator entwickelt. Nach langer Ankündigung ist nun der CW Creator mit einer 2 in der Versionsnummer entstanden. Serveradministratoren, die bereits die Vorgängerversion eingesetzt haben, werden sich ziemlich umstellen müssen.

Das Plugin wurde entwickelt für maximale Bequemlichkeit bei maximaler Flexibilität und minimaler Eingriffe in den Server. Es ist verständlich, dass dabei nur ein Kompromiss herauskommen kann, aber, wie wir denken, ein guter.

Features:


Download

plugin_cw_creator


Installation

Die Installation des CW Creators ist sicherlich nicht so einfach wie bei anderen Plugins, aber die Mühe sollte es wert sein.

  1. Überprüfen, ob AdminMod einwandfrei läuft. Ist dies nicht der Fall, sorg dafür! (Minimum: AM 2.50.59 und neuer)
  2. Falls die Online-Warauswertung genutzt werden soll, bitte auch überprüfen, ob LogDaemon funktioniert.
  3. Plugin in den Ordner "addons/adminmod/scripts" installieren. Solltet Ihr die Addons verwenden wollen, müsst Ihr diese natürlich auch installieren! (s. Ordner addons)
  4. Erstelle ein Verzeichnis "addons/adminmod/config/cwcreator" und ein "addons/adminmod/config/cwcreator/rules".
  5. Schreibe die Datei in die "plugin.ini". (normalerweise: "addons/adminmod/scripts/plugin_cw_creator.amx")
  6. Werfe einen Blick in die beigelegte "warplugin.ini". Dort stehen derzeit einige Standard-Plugins und natürlich das jetzt zu installierende drin. Außerdem findet Ihr auskommentiert die Addons zum CW Creator (ggf. aktivieren). Plugins wie TK-Revenge oder Impressive stören nur während des Wars und gehören nicht in die "warplugin.ini". Anschließend muss diese Datei ins "addons/adminmod/config/cwcreator"-Verzeichnis auf dem Server.
  7. Schau in das Verzeichnis rules. Wir haben einige CS-Regeln für die bekanntesten Ligen zusammengestellt. Suche Dir die für Deine ClanWars benötigten Regeln aus und kopiere die Dateien in "addons/adminmod/config/cwcreator/rules-Verzeichnis". Schreib Dir die Namen auf. Du brauchst sie bei der Bedienung des Plugins. Du bist natürlich frei eigene Regeln anzulegen oder die bestehenden zu verändern. Bitte beachte, dass wir für die Aktualität der Dateien keine Gewähr übernehmen!
  8. Die "server.cfg" bearbeiten (ob über Webinterface oder FTP ist egal). Der LETZTE Eintrag muss lauten: "exec addons/adminmod/config/cwcreator/war.cfg" (ohne die Anführungszeichen). Habt Ihr eine Zeile, die mit "admin_command" beginnt in der "server.cfg", so muss diese als letzte Zeile gesetzt werden. Ansonsten MUSS es der LETZTE Eintrag sein. Keine Diskussion!! Es empfiehlt sich außerdem an das Ende der "server.cfg" "admin_command admin_say Mapstart" zu schreiben. Das veranlasst einen sofortigen Start von AdminMod.
  9. Überprüfe, ob in "addons/adminmod/config/adminmod.cfg" folgende CVars so gesetzt sind: "file_access_read 1", "file_access_write 1", "allow_client_exec 1".
  10. Fertig! Nach einem Mapchange ist das Plugin aktiviert.

Für den Fall, dass Bedarf besteht wird bei Verwendung von "admin_war_set" und "admin_war_end" eine Datei "addons/adminmod/config/cwcreator/startwar.cfg" bzw. "addons/adminmod/config/cwcreator/endwar.cfg" ausgeführt. Einfach eine gleichnamige Datei anlegen und mit Befehlen füllen, fertig!


Befehle

Für die Befehle braucht Ihr das Recht 256! (Insbesondere Upgrader sollten diesen Punkt beachten, da vorher 1024 genutzt wurde).

admin_war_set <gegnerischer Clantag>:
Mit diesem Befehl wird der Server in den Warmodus gesetzt. Der gegnerische Clantag ist optional. Wird keiner angegeben ist die Kickfunktion nicht im Betrieb. Aus diesem Grund empfehle ich das Weglassen nicht, aber einige wollten die Option. Ihr braucht bei vielen Sonderzeichen im Clantag vielfach diese nicht mitzuschreiben. Bei [WING] reicht in der Regel auch WING um die Clanmember eindeutig festzustellen. Allerdings sieht es beim Addon nicht so schön aus. Die einmalige Angabe des Tags mit den Sonderzeichen ist daher zu empfehlen.
admin_war_start:
Mit "admin_war_start" wird der War nach einem Vote gestartet. Beachte: Die Verwendung von "sv_restartround" beendet nicht das Warmup!!
admin_war_restart:
Wie "admin_war_start" mit dem Unterschied, dass der Vote umgangen wird. Beachte: Die Verwendung von "sv_restartround" beendet nicht das Warmup!!
admin_war_end:
Dieser Befehl beendet den War, zeigt ggf. das Endergebnis an und wechselt nach 60 Sekunden zur in "admin_war_endmap" angegebenen Map.
admin_war_tag <eigener Clantag>:
"admin_war_tag" legt den eigenen Clantag fest. Dieser Wert bleibt bis zur nächsten Änderung gespeichert.
admin_war_pass <Passwort>:
Hier wird das ClanWar Passwort hinterlegt. Da dieses bei vielen Clans selten verändert wird, wird es ebenfalls dauerhaft gespeichert.
admin_war_map1 <1. Map im War>:
Mit diesem Befehl wird die erste Map im War festgelegt (beispielsweise Eure Hausmap).
admin_war_map2 <2. Map im War>:
Legt die zweite Map fest (Wer hätte es gedacht?!).
admin_war_endmap <Map>:
"admin_war_endmap" gibt an, auf welche Map nach Ende des Wars gewechselt werden soll. Um den Server schnell wieder zu füllen wären Maps wie de_dust oder de_aztec ideal.
admin_war_rules <Regeldatei>:
Hier wird angegeben, nach welchen Regeln gespielt werden soll. Dazu gibt man eine Regeldatei an, die bereits in "addons/adminmod/config/cwcreator/rules" vorhanden ist.
admin_war_count <0/1>:
Dieser Befehl legt fest, ob mitgerechnet werden soll. Hier wird das Addon benötigt.
admin_war_demo <0/1> (außer Funktion):
Es war eigentlich vorgesehen eine automatische Demoaufnahme zu integrieren, auf die jedoch wegen eines Bugs im HL-Server derzeit verzichtet werden muss.
admin_war_countrules <attack/all>:
Hier wird festgelegt, wie gerechnet werden soll. Bei Timelimit-Matches werden in der Regel nur die Attacker-Wins gezählt (attack), während bei Maxround alle Wins zählen (all). Da dies aber nicht zwangsläufig so ist, ist diese Option dazugekommen.

Wenn Ihr einen Überblick über die Einstellungen bekommen wollt, gebt "admin_war_tag", "admin_war_pass", "admin_war_map1", "admin_war_map2", "admin_war_endmap", "admin_war_rules", "admin_war_count" oder "admin_war_countrules" ohne Parameter an. Es werden Euch dann alle Einstellungen in der Console dargestellt.


Addons

Addons findet Ihr wie zu erwarten im Addons-Verzeichnis.


Bekannte Bugs


Danksagungen


Quellcode

plugin_cw_creator.sma:

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

plugin_cwc_menu.sma:

/* 
CWC-MENUE
by: Sir Drink a lot
Plugin to make your settings of CW-Creator.
!!!Use amv_enable_beta "menu1" in your adminmod.cfg!!!
*/
 
#include <core> 
#include <console> 
#include <string> 
#include <admin> 
#include <adminlib>
#define ACCESS_WAR 256
 
new String_Version[]="05.05.03";
 
#define OK	0
#define BAD	1
 
new File[MAX_TEXT_LENGTH]="addons/adminmod/config/cwcreator/settings.ini";
new ruledir[MAX_DATA_LENGTH]="addons/adminmod/config/cwcreator/rules/";
 
#define SETTINGS 9
/*Hier werden die Setting reingeladen-- zur Zeit 9 Stück*/
new Commands[SETTINGS][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 Settings[SETTINGS][MAX_NAME_LENGTH];
new SaySettings[SETTINGS][MAX_TEXT_LENGTH]={{"Password"},{"Clantag"},{"Map 1"},{"Map 2"},{"Endmap"},{"Regel.cfg"},{"Score-Counter (0/1)"},{"Demo (0/1)"},{"Count-Modus (attack/all)"}};
 
/*Arrays zur Auswertung, anhand des UserIndex des Admins werden hoffentlich Fehlauswahlen verhindert*/
new MenuID[MAX_PLAYERS];
new LastMenuID[MAX_PLAYERS];
new MessageMode[MAX_PLAYERS];
new SelectedMenuCommand[MAX_PLAYERS];
new SelectedSet[MAX_PLAYERS];
new SelectedSetLoop[MAX_PLAYERS]={1,1,...};
new settingsloaded=0;
 
 
 
public admin_war_menu(HLCommand,HLData,HLUserName,UserIndex){
	new User[MAX_NAME_LENGTH];
	convert_string(HLUserName,User,MAX_NAME_LENGTH);
	mainmenu(User,UserIndex);
	return PLUGIN_HANDLED;
}
 
mainmenu(User[],UserIndex){
	new Text[512];
	new keys;
	new on;
	get_vaultnumdata("admin_war_on",on);
	if(on){
		snprintf(Text,MAX_TEXT_LENGTH,"\wCW-Creator-MainMenu:^n^n\y1. CW-Einstellungen^n\r2. -- CW Modus aktiv --^n\y3. CW-Regel.cfg nachtraeglich aendern^n4. CW-Runde mit Vote starten^n5. CW-Runde ohne Vote neu starten^n6. CW beenden^n^n\r0. Ende");
		keys=573;
	}else{
		snprintf(Text,MAX_TEXT_LENGTH,"\wCW-Creator-MainMenu:^n^n\y1. CW-Einstellungen^n2. CW-Modus starten^n\r3. -- nur im CW-Modus --^n4. -- nur im CW-Modus --^n5. -- nur im CW-Modus --^n6. -- nur im CW-Modus --^n^n0. Ende");
		keys=515;
	}
	menu(User,Text,keys);
	MenuID[UserIndex]=1;
	return 0;
}
 
/*Settingsauswahl 8 ist Next, 9 ist Back, 0 ist Cancel*/
setmenu(User[],UserIndex){
	new Text[512];
	new Auswahl[MAX_TEXT_LENGTH];
	new l=0;
	new i;
	new a=1;
	new keys=0;
	new on;
	get_vaultnumdata("admin_war_on",on);
	snprintf(Text,MAX_TEXT_LENGTH,"\wCW-Creator-Settings:^n^n");
	for(i=SelectedSetLoop[UserIndex];i<=settingsloaded;i++){
		l++;
		if(l==6){
			if(settingsloaded>SelectedSetLoop[UserIndex]+5){
				strcat(Text,"\y^n8. -x",MAX_TEXT_LENGTH);
				keys+=128;
				break;
			}else{
				break;
			}
		}else{
			if(!on){
				snprintf(Auswahl,MAX_TEXT_LENGTH,"\y%i. %s: \w%s^n",l,SaySettings[i-1],Settings[i-1]);
				strcat(Text,Auswahl,MAX_TEXT_LENGTH);
				a+=a;
				keys=a-1;
			}else{
				snprintf(Auswahl,MAX_TEXT_LENGTH,"\y%i. %s: \r%s^n",l,SaySettings[i-1],Settings[i-1]);
				strcat(Text,Auswahl,MAX_TEXT_LENGTH);
			}
		}
	}
	if(SelectedSetLoop[UserIndex]>=5){
		strcat(Text,"\y^n9. x-",MAX_TEXT_LENGTH);
		keys+=256;
	}
	strcat(Text,"\r^n0. Ende",MAX_TEXT_LENGTH);
	keys+=512;
	menu(User,Text,keys);
	MenuID[UserIndex]=2;
	return 0;
}
 
show_text(User[],Text[],UserIndex,ID){
	new Headline[512]="\w[CW-CREATOR] Meldung:^n^n";
	new keys;
	strcat(Headline,Text,MAX_TEXT_LENGTH);
	if(ID){
		strcat(Headline,"^n^n0. OK",MAX_TEXT_LENGTH);
		keys=512;
	}else{
		keys=1024;
	}	
	menu(User,Headline,keys);
	MenuID[UserIndex]=3;
	return 0;
}
 
/*Auswertung der Menüauswahl*/
public menuselect(HLCommand,HLData,HLUserName,UserIndex){
	new Data[MAX_DATA_LENGTH];
	new User[MAX_NAME_LENGTH];
  	convert_string(HLData,Data,MAX_DATA_LENGTH);
	convert_string(HLUserName,User,MAX_NAME_LENGTH);
	if(MenuID[UserIndex]!=0){
		SelectedMenuCommand[UserIndex]=strtonum(Data);
		if(MenuID[UserIndex]==1){
			switch(SelectedMenuCommand[UserIndex]){
				case 1: {
					setmenu(User,UserIndex);
				}
				case 2: {
					SelectedSet[UserIndex]=1;
					sethandling(User,UserIndex);
				}
				case 3: {
					SelectedSet[UserIndex]=5;
					sethandling(User,UserIndex);
				}
				case 4: {
					plugin_exec("admin_war_start",""); 
					reset_array(UserIndex);
					}
				case 5: {
					plugin_exec("admin_war_restart",""); 
					reset_array(UserIndex);
				}
				case 6: {
					plugin_exec("admin_war_end","");
					reset_array(UserIndex);
				}
				case 10: { 
					reset_array(UserIndex);
				}
			}
		}else if(MenuID[UserIndex]==2){
			if(SelectedMenuCommand[UserIndex]==8){
				SelectedSetLoop[UserIndex]=SelectedSetLoop[UserIndex]+5;
				setmenu(User,UserIndex);
			}else if(SelectedMenuCommand[UserIndex]==9){
				SelectedSetLoop[UserIndex]=SelectedSetLoop[UserIndex]-5;
				setmenu(User,UserIndex);
			}else if(SelectedMenuCommand[UserIndex]==10){
				reset_array(UserIndex);
				mainmenu(User,UserIndex);			
			}else{
				if(SelectedSetLoop[UserIndex]>=5){
					SelectedSet[UserIndex]=SelectedSetLoop[UserIndex]+SelectedMenuCommand[UserIndex]-2;
				}else{
					SelectedSet[UserIndex]=SelectedMenuCommand[UserIndex]-1;
				}
				sethandling(User,UserIndex);
			}
		}else if(MenuID[UserIndex]==3){
			if(SelectedMenuCommand[UserIndex]==10){
				/*Reset ohne den Loop des Users*/
				MessageMode[UserIndex]=0;
				SelectedMenuCommand[UserIndex]=0;
				SelectedSet[UserIndex]=0;
				if(LastMenuID[UserIndex]==1){
					mainmenu(User,UserIndex);
				}else if(LastMenuID[UserIndex]==2){
					setmenu(User,UserIndex);
				}
			}
		}
		return PLUGIN_HANDLED;
	}
	return PLUGIN_CONTINUE;
}
 
/*Wenn Map ausgewählt, entsprechend zur Map wechseln, wenn genug Stimmen vorhanden sind*/
sethandling(User[],UserIndex){
	if(SelectedSet[UserIndex]<=5){
		new Text[MAX_TEXT_LENGTH];
		if(MenuID[UserIndex]==1 && SelectedSet[UserIndex]==1){
			snprintf(Text,MAX_TEXT_LENGTH,"Bitte gebe den Clantag des Gastes^nim Chat ein,^num den CW-Modus zu starten!");
		}else if(MenuID[UserIndex]==1 && SelectedSet[UserIndex]==5){
			snprintf(Text,MAX_TEXT_LENGTH,"Bitte gebe die Regel.cfg im Chat ein,^ndie neu geladen werden soll!");
		}else if(MenuID[UserIndex]==2){
			snprintf(Text,MAX_TEXT_LENGTH,"Bitte gebe den Wert fuer^n'%s' im Chat ein!",SaySettings[SelectedSet[UserIndex]]);
		}
		MessageMode[UserIndex]=1;
		LastMenuID[UserIndex]=MenuID[UserIndex];
		show_text(User,Text,UserIndex,OK);
	}else{
		if(SelectedSet[UserIndex]==6 || SelectedSet[UserIndex]==7){
			if(Settings[SelectedSet[UserIndex]][0]=='0'){
				strcpy(Settings[SelectedSet[UserIndex]],"1",MAX_NUMBER_LENGTH);
			}else{
				strcpy(Settings[SelectedSet[UserIndex]],"0",MAX_NUMBER_LENGTH);
			}
		}else{
			if(strcmp(Settings[SelectedSet[UserIndex]],"attack")==0){
				strcpy(Settings[SelectedSet[UserIndex]],"all",MAX_NAME_LENGTH);
			}else{
				strcpy(Settings[SelectedSet[UserIndex]],"attack",MAX_NAME_LENGTH);
			}
		}
		plugin_exec(Commands[SelectedSet[UserIndex]],Settings[SelectedSet[UserIndex]]);
		/*erneutes Laden nur für Debug*/
		load_cw_settings();
		/*Reset ohne den Loop des Users*/
		MessageMode[UserIndex]=0;
		SelectedMenuCommand[UserIndex]=0;
		SelectedSet[UserIndex]=0;
		setmenu(User,UserIndex);
	}			
	return PLUGIN_HANDLED;
}
 
/*Reaktion auf die Chateingaben*/
public HandleSay(HLCommand,HLData,HLUserName,UserIndex) {
	new Data[MAX_DATA_LENGTH];
  	new UserName[MAX_NAME_LENGTH];
 
  	convert_string(HLData,Data,MAX_DATA_LENGTH);
  	convert_string(HLUserName,UserName,MAX_NAME_LENGTH);
 
  	strstripquotes(Data);
 
	if(MessageMode[UserIndex]==0){
	  	if (strcasestr(Data,"cwmenu")!=-1) {
	  		mainmenu(UserName,UserIndex);
			return PLUGIN_HANDLED;
		}
	}else if(MessageMode[UserIndex]==1){
		/*hier gilt 'cwmenu' als Abbruch der Chateingabe*/
		if(strcasestr(Data,"cwmenu")==-1){
			if(check_set(Commands[SelectedSet[UserIndex]],Data,UserName,UserIndex)==1){
				if(LastMenuID[UserIndex]==1 && SelectedSet[UserIndex]==5){
					strcpy(Settings[SelectedSet[UserIndex]],Data,MAX_TEXT_LENGTH);
					plugin_exec(Commands[SelectedSet[UserIndex]],Data);
				}else if(LastMenuID[UserIndex]==1 && SelectedSet[UserIndex]==1){
					/*den CW-Modus starten*/
					plugin_exec("admin_war_set",Data);
				}else if(LastMenuID[UserIndex]==2){
					strcpy(Settings[SelectedSet[UserIndex]],Data,MAX_TEXT_LENGTH);
					plugin_exec(Commands[SelectedSet[UserIndex]],Data);
				}
				/*erneutes Laden nur für Debug*/
				load_cw_settings();
				/*Reset ohne den Loop des Users*/
				SelectedMenuCommand[UserIndex]=0;
				SelectedSet[UserIndex]=0;
				if(LastMenuID[UserIndex]==1){
					mainmenu(UserName,UserIndex);
				}else if(LastMenuID[UserIndex]==2){
					setmenu(UserName,UserIndex);
				}
			}
		}else{
			reset_array(UserIndex);
			mainmenu(UserName,UserIndex);
		}		
		MessageMode[UserIndex]=0;
		return PLUGIN_HANDLED;
	}
	return PLUGIN_CONTINUE;
}
 
check_set(Command[],Value[],UserName[],UserIndex){
	new Text[MAX_TEXT_LENGTH];
	new error;
 
	if(strlen(Value)!=0){
		if(strcmp(Command,"admin_war_pass")==0){
			if (strcmp(Value,"none")== 0) {
				snprintf(Text,MAX_TEXT_LENGTH,"\rFehler:^nPasswort nicht korrekt!");
		 		error=1;
			}
		}else if(strcmp(Command,"admin_war_tag")==0){
			if(strlen(Value) > 20) {
				snprintf(Text,MAX_TEXT_LENGTH,"\rFehler:^nDer ClanTag^n%s^nist zu lang!",Value);
				error=1;
			}
		}else if(strcmp(Command,"admin_war_map1")==0 || strcmp(Command,"admin_war_map2")==0 || strcmp(Command,"admin_war_endmap")==0){
			if(!valid_map(Value)) {
				snprintf(Text,MAX_TEXT_LENGTH,"\rFehler:^nMap %s^nexistiert nicht!",Value);
				error=1;
			}
		}else if(strcmp(Command,"admin_war_rules")==0){
			new rule[MAX_DATA_LENGTH];
			snprintf(rule,MAX_DATA_LENGTH,"%s%s",ruledir,Value);
			if(!fileexists(rule)) {
				snprintf(Text,MAX_TEXT_LENGTH,"\rFehler:^nRegeldatei^n%s^nexistiert nicht!",Value);
				error=1;
			}
		}
		if(error){
			show_text(UserName,Text,UserIndex,BAD);
			return 0;
		}else{
			return 1;
		}
	}else{
		snprintf(Text,MAX_TEXT_LENGTH,"\rFehler:^nKeinen Wert fuer^n'%s' im chat eingegeben!",SaySettings[SelectedSet[UserIndex]]);
		show_text(UserName,Text,UserIndex,BAD);
		return 0;
	}
	return 0;
}
 
/*Lädt die settings.ini Datei.*/
load_cw_settings(){
	new Data[MAX_DATA_LENGTH];
	new Text[MAX_TEXT_LENGTH];
	new j;
	settingsloaded=0;
 
	for(j=1; j <= SETTINGS; j++){
		readfile(File,Data,j,MAX_TEXT_LENGTH);
		strcpy(Settings[settingsloaded],Data,MAX_TEXT_LENGTH);
		settingsloaded++;
	}
	snprintf(Text,MAX_TEXT_LENGTH,"[CWCREATOR-MENU] %i Settings loaded successfully from %s",settingsloaded,File);
	log(Text);
	return PLUGIN_CONTINUE;
}
 
/*Setzt die Arrays wieder zurück*/
reset_array(UserIndex){
	MenuID[UserIndex]=0;
	LastMenuID[UserIndex]=0;
	MessageMode[UserIndex]=0;
	SelectedMenuCommand[UserIndex]=0;
	SelectedSet[UserIndex]=0;
	SelectedSetLoop[UserIndex]=1;
	return PLUGIN_CONTINUE;
}
 
public SetMenuData(HLCommand,HLData,HLUserName,UserIndex){
	new UserName[MAX_NAME_LENGTH];
	new Text[MAX_TEXT_LENGTH];
	convert_string(HLUserName,UserName,MAX_NAME_LENGTH);
	if(MenuID[UserIndex]==1 || MenuID[UserIndex]==2 || MenuID[UserIndex]==3){
		reset_array(UserIndex);
		snprintf(Text,MAX_TEXT_LENGTH,"[CW-CREATOR-MENU] Menue wurde durch ein anderes Menue beendet!");
		messageex(UserName,Text,print_chat);
	}
	return PLUGIN_CONTINUE;
}
 
public plugin_init(){
	plugin_registerinfo("CWC-MENUE","Menue for settings of CW-Creator >v2.0",String_Version);
	plugin_registercmd("admin_war_menu","admin_war_menu",ACCESS_WAR,"admin_war_menu: Menuebedinung des CW-Creators.");
	plugin_registercmd("menuselect","menuselect",ACCESS_ALL);
	plugin_registercmd("say","HandleSay",ACCESS_ALL);
	plugin_registerhelp("say",ACCESS_WAR,"say cwmenu, um das CW-Creator Menue aufzurufen.");
	plugin_registercmd("radio1","SetMenuData",ACCESS_ALL);
	plugin_registercmd("radio2","SetMenuData",ACCESS_ALL);
	plugin_registercmd("radio3","SetMenuData",ACCESS_ALL);
	plugin_registercmd("buyequip","SetMenuData",ACCESS_ALL);
	plugin_registercmd("buy","SetMenuData",ACCESS_ALL);
	plugin_registercmd("chooseteam","SetMenuData",ACCESS_ALL);
	plugin_registercmd("showbriefing","SetMenuData",ACCESS_ALL);
	load_cw_settings();
	return PLUGIN_CONTINUE;
}
 

plugin_logd_cwcaddon.sma:

/* [WING]Black Knight's CW-Creator Addon 13.07.2003 */
 
#pragma dynamic 8192
 
#include <core> 
#include <console> 
#include <string> 
#include <admin> 
#include <adminlib>
#define ACCESS_WAR 256
#define ACCESS_CONSOLE 131072
/* Bis auf weiteres DEMO nicht auf 1 stellen. Ist leider auf Grund eines HL-Bugs ein zahnloser Tiger */
#define DEMO 0
 
new STRING_VERSION[MAX_DATA_LENGTH] = "2.1";
 
new settings[MAX_DATA_LENGTH]="addons/adminmod/config/cwcreator/settings.ini";
new round=0;
new starts=0;
new count;
new demo=0;
new maxrounds=0;
new timerid=0;
new tag[MAX_DATA_LENGTH];
new opponent[MAX_DATA_LENGTH];
/* Pausen Detektions Variablen */
new paused=0;
new pausedsec=0;
new day;
/* Count Variablen */
new homeattack=0;
new countrules=0;
new hometeam;
new homecount=0;
new guestcount=0;
new filename[MAX_DATA_LENGTH];
 
/* Startfunktion, wird von plugin_cw_creator aufgerufen */
public cwc_addon_start(HLCommand,HLData,HLUserName,UserIndex){
	new sTime[7];
	new Text[MAX_TEXT_LENGTH];
	new sdummy[30];
	new smaptype[30];
	new smaxrounds[5];
	new sround[5];
 
	convert_string(HLData,sdummy,30);
	strsplit(sdummy," ",sround,5,smaxrounds,5);
 
	round=strtonum(sround);
	maxrounds=strtonum(smaxrounds);
 
	servertime(sTime,7,"%d.%m");
 
	/* Demostartfunktion */
	if(demo){
		/* Demo starten */
		snprintf(Text,MAX_TEXT_LENGTH,"record %s-vs-%s-%s-%i.dem",tag,opponent,sTime,round);
		repairfn(Text,Text);
		say("Demoaufnahme wurde automatisch gestartet!");
		execclient_all(Text);
		snprintf(Text,MAX_TEXT_LENGTH,"%s-vs-%s-%s-%i.dem",tag,opponent,sTime,round);
		repairfn(Text,Text);
		say(Text);
		/* Mapabschlusserkennung einleiten */
		if(starts==0){
			if(maxrounds>0){
				logd_registering();
			}
			else{
				/* Wird bei Neustart nicht durchgeführt, Überarbeiten! */
				new timelimit;
				timelimit=getvar("mp_timelimit")*60-10;
				if(timerid!=0){
					kill_timer(timerid);
				}
				timerid=set_timer("end_maptimer",timelimit,0);
				plugin_registercmd("pause","HandlePause",ACCESS_ALL);
				if(count){
					logd_registering();
				}
			}
		}
	}
	else{
		if(count==1 && starts==0){
			logd_registering();
		}
	}
 
	if(count){
		/* Spielstandsdatei anlegen */
		if(round==1){
			if(fileexists(filename)){
				deletefile(filename);
			}
			snprintf(Text,MAX_TEXT_LENGTH,"%s : %s am %s",tag,opponent,sTime);
			writefile(filename,Text,-1);
		}
		currentmap(Text,MAX_TEXT_LENGTH);
		if(starts==1 && (round==1 || round==3)){
			writefile(filename,Text,-1);
		}
		if(starts==1){
			writefile(filename," ",-1);
		}
		/* Teamerkennung */
		hometeam=which_team();
		/* charge only Regeln setzen */
		if(countrules){
			strsplit(Text,"_",smaptype,30,sdummy,30);
			if(strmatch(smaptype,"de",MAX_DATA_LENGTH)||strmatch(smaptype,"es",MAX_DATA_LENGTH)){
				if(hometeam==1){
					homeattack=1;
				}
			}
			else if(strmatch(smaptype,"cs",MAX_DATA_LENGTH)||strmatch(smaptype,"as",MAX_DATA_LENGTH)){
				if(hometeam==2){
					homeattack=1;
				}
			}
			else{
				/* Für alle Volltrottel da draußen, Nicht-Standardmaps mit Charge only, nee iiiis klaaar */
				homeattack=2;
			}
		}
	}
	return PLUGIN_HANDLED;
}
 
get_score(){
	new i,lineno;
	new shomecount[30],sguestcount[30],dummy[30];
	new sresult[MAX_TEXT_LENGTH];
 
	if(round<=1){
		return PLUGIN_CONTINUE;
	}
 
	if(fileexists(filename)){
		for(i=2;i<=round;i++){
			lineno=3*i/2;
			readfile(filename,sresult,lineno,MAX_TEXT_LENGTH);
			strsplit(sresult,":",shomecount,30,sguestcount,30);
			strtrim(shomecount," ",2);
			strtrim(sguestcount," ",2);
			if(countrules){
				if(strchr(shomecount,' ')>=0){
					strsplit(shomecount," ",dummy,30,shomecount,30);
					homecount+=strtonum(shomecount);
				}
				else{
					strsplit(sguestcount," ",sguestcount,30,dummy,30);
					guestcount+=strtonum(sguestcount);
				}
			}
			else{
				homecount+=strtonum(shomecount);
				guestcount+=strtonum(sguestcount);
			}
		}
	}
	else{
		say("Datei nicht gefunden");
	}
	return PLUGIN_CONTINUE;
}
 
which_team(){
	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 < 3 && strstr(Target,tag)!=-1){
				return Team;
				break;
			}
		}
	}
	say("Klar doch, Funmap, bei der nur Attackerwins zaehlen...");
	return 2;
}
 
/* LogD-Aktivierung; erst jetzt, da im Normalmodus nicht benötigt */
logd_registering(){
	plugin_registercmd("logd_cwc_score","logd_cwc_score",ACCESS_CONSOLE,"");
	exec("logd_reg 61 admin_command logd_cwc_score");
	/* Verhindern eines nochmaligen Aufrufs der LogD */
	starts++;
	/* Score laden */
	get_score();
	return PLUGIN_CONTINUE;
}
 
/* Demo beenden */
demo_stop(){
	execclient_all("stop");
	say("Demoaufnahme wurde automatisch beendet!");
	return PLUGIN_CONTINUE;
}
 
/* Demostop für Timelimit-Matches */
public end_maptimer(Timer,Repeat,HLUser){
	/* Aufzeichnung verlängern wegen Pause */
	timerid=0;
	if(pausedsec>0){
		timerid=set_timer("end_maptimer",pausedsec,0);
		pausedsec=0;
		return PLUGIN_CONTINUE;
	}
	/* Pause bei offiziellem Ende der Map, wer macht denn sowas? Was soll's...
	Lösung unschön, aber unumgänglich */
	if(paused>0){
		timerid=set_timer("end_maptimer",1,0);
		return PLUGIN_CONTINUE;
	}
	/* Offensichtlich keine weitere Pause, also Ende des Demos! (Timelimit)*/
	demo_stop();
 
	return PLUGIN_CONTINUE;
}
 
public logd_cwc_score(HLCommand,HLData,HLUserName,UserIndex){
	new Data[MAX_DATA_LENGTH];
	new sdummy[30];
	new sctscore[10];
	new stscore[10];
	new ctscore;
	new tscore;
	new homescore=0;
	new guestscore=0;
 
	/* Ergebnis auswerten */
	convert_string(HLData,Data,MAX_DATA_LENGTH);
	strsplit(Data," ",sdummy,30,sdummy,30,sctscore,10,stscore,10);
	strsplit(sctscore,"#",sdummy,30,sctscore,10);
	strsplit(stscore,"#",sdummy,30,stscore,10);
	ctscore=strtonum(sctscore);
	tscore=strtonum(stscore);
	/* Demostop für Maxrounds-Matches */
	if(ctscore+tscore==maxrounds && maxrounds>0 && demo==1){
		demo_stop();
	}
 
	if(count){
		if(countrules && homeattack!=2){
			if(homeattack==1){
				if(hometeam==2){
					homescore=ctscore;
				}
				else{
					homescore=tscore;
				}
			}
			else{
				if(hometeam==2){
					guestscore=tscore;
				}
				else{
					guestscore=ctscore;
				}
			}
		}
		else{
			if(hometeam==2){
				homescore=ctscore;
				guestscore=tscore;
			}
			else{
				homescore=tscore;
				guestscore=ctscore;
			}
		}
		new mrhome,mrguest;
		mrhome=homescore;
		mrguest=guestscore;
		homescore+=homecount;
		guestscore+=guestcount;
 
		new Text[MAX_TEXT_LENGTH];
		new Text2[MAX_TEXT_LENGTH];
		if(countrules && homeattack!=2){
			if(homeattack){
				snprintf(Text,MAX_TEXT_LENGTH,"(*) %d : %d",homescore,guestscore);
				snprintf(Text2,MAX_TEXT_LENGTH,"(*) %d : %d",mrhome,mrguest);
			}
			else{
				snprintf(Text,MAX_TEXT_LENGTH,"    %d : %d (*)",homescore,guestscore);
				snprintf(Text2,MAX_TEXT_LENGTH,"    %d : %d (*)",mrhome,mrguest);
			}
		}
		else{
			snprintf(Text,MAX_TEXT_LENGTH,"    %d : %d",homescore,guestscore);
			snprintf(Text2,MAX_TEXT_LENGTH,"    %d : %d",mrhome,mrguest);
		}
		writefile(filename,Text2,3*(round+1)/2);
		readfile(filename,Text2,1,MAX_TEXT_LENGTH);
		snprintf(Text,MAX_TEXT_LENGTH,"%s^n%s",Text2,Text);
		typesay(Text,3,127,127,255);
		if(maxrounds==0){
			execclient_all("timeleft");
		}
		else{
			snprintf(Text,MAX_TEXT_LENGTH,"%d rounds remaining.",maxrounds-ctscore-tscore);
			say(Text);
		}
	}
	if(paused>0 && demo==1){
		say("Pausenende nicht erkannt. Bitte Demo selber beenden -> Console: stop");
	}
 
	return PLUGIN_CONTINUE;
}
 
public cwc_addon_end(HLCommand,HLData,HLUserName,UserIndex){
	new Text[512]="";
	new i;
	new sizeoffile;
	new content[MAX_TEXT_LENGTH];
	new maxplayers = maxplayercount();
	new Target[MAX_NAME_LENGTH];
	new sround[MAX_DATA_LENGTH];
 
	convert_string(HLData,sround,MAX_DATA_LENGTH);
	round=strtonum(sround);
	get_score();
	if(fileexists(filename)){
		sizeoffile=filesize(filename);
		for(i=1;i<=sizeoffile;i++){
			readfile(filename,content,i,MAX_TEXT_LENGTH);
			strcat(Text,content,512);
			strcat(Text,"^n",512);
		}
		new Text2[MAX_NAME_LENGTH];
		snprintf(Text2,MAX_TEXT_LENGTH,"^nErgebnis: %d : %d",homecount,guestcount);
		writefile(filename,Text2,-1);
		strcat(Text,Text2,512);
		for(i=1; i<=maxplayers; i++) {
			if(playerinfo(i,Target,MAX_NAME_LENGTH)) {
 				if(check_user(Target)) {
 					menu(Target,Text,1024,60);
 				}
 			}
 		}
 
	}
	return PLUGIN_CONTINUE;
}
 
/* Pausen Detektion */
public HandlePause(HLCommand,HLData,HLUserName,UserIndex) {
	if(getvar("pausable")){
		new sTimeString[3];
		new Time;
		new newday;
		/* Tag auswerten, falls Pause über 0 Uhr hinausgeht */
		servertime(sTimeString,3,"%d");
		newday=strtonum(sTimeString);
		/* Uhrzeit in Sekunden umrechnen */
		servertime(sTimeString,3,"%H");
		Time=strtonum(sTimeString)*3600;
		servertime(sTimeString,3,"%M");
		Time+=strtonum(sTimeString)*60;
		servertime(sTimeString,3,"%S");
		Time+=strtonum(sTimeString);
		/* Beim Beenden der Pause addieren der Pausenzeit zur Verlängerung des Timers */
		if(paused>0){
			if(newday!=day){
				pausedsec+=86400-paused+Time;
			}
			else {
				pausedsec+=Time-paused;
			}
			paused=0;
		}
		else {
			paused=Time;
		}
		day=newday;
	}
 
	return PLUGIN_CONTINUE;
}
 
repairfn(d[],s[]) {
	new i;
	new maxlen=strlen(s);
 
	for(i=0; i<=maxlen; i++){
		switch(s[i]){
			case '\','/','*','?','"','<','>','|':{
				d[i]='x';
			}
			default:{
				d[i]=s[i];
			}
		}
	}
	d[maxlen+1]=NULL_CHAR;
	return 1;
}
 
/************* INIT ********************/
public plugin_init() {
 	plugin_registerinfo("Clan War Creator Addon","Counting and demo recording for cwc",STRING_VERSION);
 	plugin_registercmd("cwc_addon_start","cwc_addon_start",ACCESS_WAR);
	plugin_registercmd("cwc_addon_end","cwc_addon_end",ACCESS_WAR);
 
	new on;
	get_vaultnumdata("admin_war_on",on);
	if(on) {
		/* Gobale Optionsvariablen setzen */
		new scount[MAX_DATA_LENGTH];
#if(DEMO)
		new sdemo[MAX_DATA_LENGTH];
#endif
		new scountrules[MAX_DATA_LENGTH];
 
		readfile(settings,scount,7,MAX_DATA_LENGTH);
#if(DEMO)
		readfile(settings,sdemo,8,MAX_DATA_LENGTH);
#endif
		readfile(settings,scountrules,9,MAX_DATA_LENGTH);
		count=strtonum(scount);
#if(DEMO)
		demo=strtonum(sdemo);
#endif
		if(strmatch(scountrules,"attack",MAX_DATA_LENGTH)){
			countrules=1;
		}
 
		readfile(settings,tag,2,MAX_DATA_LENGTH);
		readfile(settings,opponent,10,MAX_DATA_LENGTH);
		snprintf(filename,MAX_DATA_LENGTH,"%s-vs-%s.txt",tag,opponent);
		repairfn(filename,filename);
	}
 
 	return PLUGIN_CONTINUE; 
}