falko-hartmann.de

Clan War Creator für Counter-Strike v3.0.2 (24.03.2005)

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_creator3


Installation

Die Installation des CW Creators ist sicherlich nicht so einfach wie bei anderen Plugins, aber die Mühe sollte es wert sein. Mit der Version 3.0 ist es allerdings deutlich einfacher geworden.

  1. Überprüfen, ob AdminMod einwandfrei läuft. Ist dies nicht der Fall, sorg dafür! (Minimum: AM 2.50.59 und neuer)
  2. 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)
  3. Erstelle ein Verzeichnis "addons/adminmod/config/cwcreator" und ein "addons/adminmod/config/cwcreator/rules".
  4. Schreibe die Datei in die "plugin.ini". (normalerweise: "addons/adminmod/scripts/plugin_cw_creator.amx")
  5. 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.
  6. 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!
  7. 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.
  8. Ü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".
  9. 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!

admin_war_set [<Option> <Wert>] [...]:
Mit diesem Befehl wird das Plugin konfiguriert. Gibt man nichts an, bekommt man einen Überblick über alle Optionen. Es ist auch möglich mehrere Optionen gleichzeitig zu setzen.
Als Optionen stehen zur Verfügung:
pass
Das Passwort während des Wars
tag
Euer Clantag, den gegnerischen Clantag gebt Ihr unter "admin_war_launch" an
map1
Die erste Map, die gespielt werden soll.
map2
Die zweite Map, die gespielt werden soll.
endmap
Die Map, auf die nach dem War gewechselt werden soll. In der Regel eine beliebte Map, um den Server wieder schnell zu füllen.
rules
Die Datei mit den speziellen Regeln für den War (muss im rules-Verzeichnis auf dem Server vorhanden sein)
restarts
Die Anzahl der Restarts beim Start
altip
Eine IP, auf die Spieler, die nicht dem War beiwohnen verschoben werden. 0 schaltet die Funktion ab.
admin_war_launch [<Gegner-Clantag>]:
"admin_war_lauch" setzt den Server in den War Modus, d.h. lädt die Regeln, erstellt einen Warmapcycle und lädt eine warplugin.ini, in der nur die notwendigen Plugins stehen. Wird hier kein Gegnertag angegeben, wird die Umleitungs- bzw. Kickfunktion nicht ausgeführt.
admin_war_start [now]:
Mit admin_war_start wird der War nach einem Vote gestartet. Optional kann der War auch ohne Vote mit dem Parameter "now" gestartet werden. Beachte: Die manuelle Ausführung von "sv_restartround" beendet nicht das Warmup!!
admin_war_end:
Dieser Befehl beendet den War und wechselt nach 60 Sekunden zur in "endmap" angegebenen Map.
admin_war_nextmap:
Der Befehl schreibt die zweite Map statt der ersten in den Mapcycle und wechselt zur zweiten Map. (oder umgekehrt)
admin_war_switch:
admin_war_switch tauscht die Teams. Der Tausch kann weder außerhalb des Warmodus noch im Warmup durchgeführt werden. Der War muss mit "admin_war_start" bereits auf dem Map gestartet worden sein.

Addons

Addons findet Ihr wie zu erwarten im Addons-Verzeichnis.


Bekannte Bugs


Quellcode

plugin_cw_creator.sma:

/* Black Knight's und Sir Drink a lot's ClanWar Creator 3.0.2 (24.03.2005) */
#pragma dynamic 8192
 
#include <core> 
#include <console> 
#include <string> 
#include <admin> 
#include <adminlib>
#include <plugin>
 
#define ACCESS_WAR 256
#define TERROR 1
#define CT 2
#define MAX_MESSAGES 38
#define MAX_IP_LENGTH 22
 
new STRING_VERSION[MAX_DATA_LENGTH] = "3.0.2";
 
new aTeam[MAX_PLAYERS];
new aSessionID[MAX_PLAYERS][MAX_AUTHID_LENGTH];
new iTausch=0;
 
language(iNummer,sMessage[]){
	new Text[MAX_TEXT_LENGTH];
	new i;
 
	if(!iNummer){
		static sMessages[MAX_MESSAGES][MAX_TEXT_LENGTH];
 
		/* Sprachdatei auslesen */
		strcpy(Text,"language.ini",MAX_TEXT_LENGTH);
		create_path(Text,"cwcreator");
		if(fileexists(Text)){
			for(i=1;i<MAX_MESSAGES;i++){
				readfile(Text,sMessages[i],i,MAX_TEXT_LENGTH);
			}
		}
		else{
			snprintf(Text,MAX_TEXT_LENGTH,"%s ??",Text);
			for(i=1;i<MAX_MESSAGES;i++){
				strcpy(sMessages[i],Text,MAX_TEXT_LENGTH);
			}
		}
 
		return PLUGIN_CONTINUE;
	}
	else{
		strcpy(sMessage,sMessages[iNummer],MAX_TEXT_LENGTH);
	}
	return PLUGIN_CONTINUE;
}
 
/* Setzt das Passwort */
set_password(){
 	new Text[MAX_TEXT_LENGTH];
 
	get_vaultdata("CWC_PASS",Text,MAX_TEXT_LENGTH);
	setstrvar("sv_password",Text);
	return 1;
}
 
/* Überprüfung, ob vault.ini existiert */
is_vaultfile_set(){
	new vault[MAX_DATA_LENGTH];
	new sLanguage[MAX_TEXT_LENGTH];
 
	getstrvar("admin_vault_file",vault,MAX_DATA_LENGTH);
	if(streq(vault,"0") || strlen(vault)==0){
		if(getvar("admin_debug")>0){
			language(1,sLanguage);
			log(sLanguage);
		}
		return 0;
	}
	return 1;
}
 
/* Überprüfung, ob mapspezifische Datei existiert */
map_specific_exists(){
	new map[MAX_NAME_LENGTH];
	new sLanguage[MAX_TEXT_LENGTH];
 
	currentmap(map,MAX_NAME_LENGTH);
	strcat(map,".cfg",MAX_NAME_LENGTH);
	if(fileexists(map)){
		if(getvar("admin_debug")>0){
			language(2,sLanguage);
			log(sLanguage);
		}
		return 1;
	}
	return 0;
}
 
/* Merken der Timelimit und Maxrounds bei Warbeginn und Warmup-Settings einstellen */
launched() {
	new check;
	new Text[MAX_TEXT_LENGTH];
	if(get_vaultnumdata("CWCI_LAUNCHED",check) && check) {
		set_vaultnumdata("CWCI_TIMELIMIT",getvar("mp_timelimit"));
		set_vaultnumdata("CWCI_MAXROUNDS",getvar("mp_maxrounds"));
		set_vaultnumdata("CWCI_LAUNCHED",0);
	}
	/* benutzerdefiniertes File ausführen */
	strcpy(Text,"startwar.cfg",MAX_TEXT_LENGTH);
	create_path(Text,"cwcreator");
	if(fileexists(Text)){
		snprintf(Text,MAX_TEXT_LENGTH,"exec %s",Text);
		exec(Text);
	}
	setstrvar("mp_timelimit","0");
	setstrvar("mp_maxrounds","0");
}
 
/* Check, ob War bereits läuft */
war_on() {
	new check;
	new sLanguage[MAX_TEXT_LENGTH];
 
	get_vaultnumdata("CWCI_ON",check);
 	if(check){
		language(3,sLanguage);
		selfmessage(sLanguage);
 		return 1;
	}
	return 0;
}
 
/* Clantaglängencheck und Speicherung */
clantag(Text[]){
	new sLanguage[MAX_TEXT_LENGTH];
 
	if(strlen(Text)>20){
		language(4,sLanguage);
		selfmessage(sLanguage);
		return 1;
	}
	if(strlen(Text)==0){
		language(5,sLanguage);
		set_vaultdata("CWCI_OPPONENT",sLanguage);
	}
	else {
		set_vaultdata("CWCI_OPPONENT",Text);
	}
	return 0;
}
 
/* HLTV Online-Ueberpruefung */
hltvonline() {
	new i;
	new maxplayers = maxplayercount();
	new Target[MAX_NAME_LENGTH];
	new SessionID, WONID, Team;
	new iAccess;
	new hltvinfo[MAX_TEXT_LENGTH];
 
	for(i=1; i<=maxplayers; i++) {
 		if(playerinfo(i,Target,MAX_NAME_LENGTH,SessionID,WONID,Team)==1) {
 			if (Team == TEAM_PROXY && plugin_checkcommand("admin_hltv_connect",iAccess)>0) {
				new freeslots=0;
				get_userinfo(Target,"hltv_slots",hltvinfo,MAX_TEXT_LENGTH);
				freeslots=strtonum(hltvinfo);
				get_userinfo(Target,"hltv_specs",hltvinfo,MAX_TEXT_LENGTH);
				freeslots-=strtonum(hltvinfo);
				iAccess=0;
 				return freeslots;
 			}
 		}
 	}
	return -1;
}
 
/* Schiebt Nicht-CW-Teilnehmer auf einen HLTV */
sendtohltv(UserIndex,iFreeslots) {
  	new maxplayers = maxplayercount();
 	new Target[MAX_NAME_LENGTH];
	new i;
 	new SessionID,WONID,Team;
	new Text[MAX_TEXT_LENGTH];
	new merk=0;
 
	for(i=1; i<=maxplayers; i++) {
		if(playerinfo(i,Target,MAX_NAME_LENGTH,SessionID,WONID,Team) && get_vaultdata("CWC_TAG",Text,MAX_TEXT_LENGTH) && strstr(Target,Text)==-1 && get_vaultdata("CWCI_OPPONENT",Text,MAX_TEXT_LENGTH) && strstr(Target,Text)==-1 && Team!=TEAM_PROXY && check_immunity(Target)==0 && i!=UserIndex) {
			execclient(Target,"admin_hltv_connect");
			merk++;
			if(merk==iFreeslots){
				break;
			}
		}
 	}
	return PLUGIN_CONTINUE;
}
 
/* Schiebt Nicht-CW-Teilnehmer auf einen anderen Server */
redirect(UserIndex,sIP[]) {
  	new maxplayers = maxplayercount();
 	new Target[MAX_NAME_LENGTH];
	new i;
 	new SessionID,WONID,Team;
	new Text[MAX_TEXT_LENGTH];
 
	for(i=1; i<=maxplayers; i++) {
		if(playerinfo(i,Target,MAX_NAME_LENGTH,SessionID,WONID,Team) && get_vaultdata("CWC_TAG",Text,MAX_TEXT_LENGTH) && strstr(Target,Text)==-1 && get_vaultdata("CWCI_OPPONENT",Text,MAX_TEXT_LENGTH) && strstr(Target,Text)==-1 && Team!=TEAM_PROXY && check_immunity(Target)==0 && i!=UserIndex) {
			snprintf(Text,MAX_TEXT_LENGTH,"connect %s",sIP);
			execclient(Target,Text);
		}
 	}
	return PLUGIN_CONTINUE;
}
 
/* Grundsätzliche Gültigkeit der IP überprüfen */
is_valid_ip(sIP[]){
	new sSubIP[5][11];
	new i,iSubIP;
 
	strsplit(sIP,".",sSubIP[0],11,sSubIP[1],11,sSubIP[2],11,sSubIP[3],11);
	strsplit(sSubIP[3],":",sSubIP[3],11,sSubIP[4],11);
	for(i=0;i<3;i++){
		iSubIP=strtonum(sSubIP[i]);
		if(iSubIP<0 && iSubIP>255){
			return 0;
		}
	}
	iSubIP=strtonum(sSubIP[3]);
	if(iSubIP<1 && iSubIP>255){
		return 0;
	}
	iSubIP=strtonum(sSubIP[4]);
	if(iSubIP<1 && iSubIP>65535){
		return 0;
	}
	return 1;
}
 
/* Kickt Nicht-CW-Teilnehmer vom Server und setzt das CW-Passwort*/
kickplayers(UserIndex) {
  	new maxplayers = maxplayercount();
 	new Target[MAX_NAME_LENGTH];
	new i;
 	new SessionID,WONID,Team;
	new Text[MAX_TEXT_LENGTH];
	new sMessage[MAX_TEXT_LENGTH];
	new sLanguage[MAX_TEXT_LENGTH];
 
	get_vaultdata("CWC_PASS",sMessage,MAX_TEXT_LENGTH);
	language(6,sLanguage);
	/* Warmodus und Passwort ankündigen */
	snprintf(sMessage,MAX_TEXT_LENGTH,sLanguage,sMessage);
 
	for(i=1; i<=maxplayers; i++) {
		if(playerinfo(i,Target,MAX_NAME_LENGTH,SessionID,WONID,Team)){
			if(get_vaultdata("CWC_TAG",Text,MAX_TEXT_LENGTH) && strstr(Target,Text)==-1 && get_vaultdata("CWCI_OPPONENT",Text,MAX_TEXT_LENGTH) && strstr(Target,Text)==-1 && Team!=TEAM_PROXY && check_immunity(Target)==0 && i!=UserIndex) {
 				kick(Target);
			}
			else {
				if(Team!=TEAM_PROXY){
					get_vaultdata("CWC_PASS",Text,MAX_TEXT_LENGTH);
					snprintf(Text,MAX_TEXT_LENGTH,"password %s",Text);
					execclient(Target,Text);
					centersayex(Target,sMessage,10,68,255,125);
				}
			}
		}
 	}
	return PLUGIN_CONTINUE;
}
 
/* Mapchangecfgfile abschalten und alte Datei speichern */
delete_mccf() {
	new Text[MAX_DATA_LENGTH];
	new sPath[MAX_DATA_LENGTH]="cwcreator/rules";
 
	getstrvar("mapchangecfgfile",Text,MAX_DATA_LENGTH);
	set_vaultdata("CWCI_MCCF",Text);
 
	get_vaultdata("CWC_RULES",Text,MAX_DATA_LENGTH);
	create_path(Text,sPath);
	setstrvar("mapchangecfgfile",Text);
	return PLUGIN_CONTINUE;
}
 
/* Defaultwerte laden inkl. Regeldatei */
set_default() {
	new Text[MAX_DATA_LENGTH];
	new sPath[MAX_DATA_LENGTH];
 
	/* Warplugin.ini definieren */
	getstrvar("amv_default_config_dir",Text,MAX_DATA_LENGTH);
	strcpy(sPath,Text,MAX_DATA_LENGTH);
	strcat(sPath,"/cwcreator/warplugin.ini",MAX_DATA_LENGTH);
	setstrvar("admin_plugin_file",sPath);
	/* Regeldatei ausführen */
	get_vaultdata("CWC_RULES",sPath,MAX_DATA_LENGTH);
	snprintf(sPath,MAX_DATA_LENGTH,"exec %s%s%s",Text,"/cwcreator/rules/",sPath);
	exec(sPath);
	/* Admin Mod Variablen setzen */
	setstrvar("vote_freq","1");
	setstrvar("admin_vote_echo","1");
	setstrvar("admin_vote_autostart","0");
	setstrvar("amv_vote_duration","15");
	setstrvar("admin_cs_restrict","0");
	setstrvar("admin_repeat_freq","0");
	return PLUGIN_CONTINUE;
}
 
/* Altes Passwort und Mapcycle sichern */
save_password(){
	new Text[MAX_TEXT_LENGTH];
 
	getstrvar("sv_password",Text,MAX_TEXT_LENGTH);
	if(!strlen(Text)){
		strcpy(Text,"none",MAX_TEXT_LENGTH);
	}
	set_vaultdata("CWCI_OLDPASS",Text);
	getstrvar("mapcyclefile",Text,MAX_TEXT_LENGTH);
	set_vaultdata("CWCI_OLDMCF",Text);
	return PLUGIN_CONTINUE;
}
 
/* Pfad erstellen */
create_path(filename[],subdir[]){
	new sPath[MAX_DATA_LENGTH];
	getstrvar("amv_default_config_dir",sPath,MAX_DATA_LENGTH);
	snprintf(filename,MAX_DATA_LENGTH,"%s/%s/%s",sPath,subdir,filename);
	return PLUGIN_CONTINUE;
}
 
/* Mapcycle erzeugen und aktivieren*/
create_mapcycle(){
	new Text[MAX_DATA_LENGTH];
	new sPath[MAX_DATA_LENGTH];
 
	/* Pfad erstellen */
	strcpy(sPath,"cwmapcycle.txt",MAX_DATA_LENGTH);
	create_path(sPath,"cwcreator");
 
	/* Mapcyclefile erstellen */
	resetfile(sPath);
	get_vaultdata("CWC_MAP1",Text,MAX_DATA_LENGTH);
	writefile(sPath,Text,-1);
 
	/* Mapcycle einstellen */
	setstrvar("mapcyclefile",sPath);
 
	return PLUGIN_CONTINUE;
}
 
public mapchange(Timer,Repeat,HLUser,HLParam) {
	new Map[MAX_NAME_LENGTH];
 
	convert_string(HLParam,Map,MAX_NAME_LENGTH);
	changelevel(Map,1);
	return PLUGIN_CONTINUE;
}
 
/* Bei Warmodus, Serversettings ausführen */
execute_settings(){
	new iNum;
 
	if(get_vaultnumdata("CWCI_ON",iNum) && iNum){
		set_vaultnumdata("CWCI_LAUNCHED",1);
		/* Restart zum Verhindern des Mapchanges bei zu langem Warmup */
		set_timer("Restart_Round",1,0);
		set_timer("settings_timed",3,0);
		set_timer("launched_timed",5,0);
	}
	return PLUGIN_CONTINUE;
}
 
/* Neue Settings ausführen */
public settings_timed(Timer,Repeat,HLUserName,HLParam) {
	new sMerk[MAX_TEXT_LENGTH];
	new sValue[MAX_TEXT_LENGTH];
	new sMessage[MAX_TEXT_LENGTH];
	new sLanguage[MAX_TEXT_LENGTH];
 
	get_vaultdata("CWC_RULES",sMerk,MAX_TEXT_LENGTH);
	strcpy(sValue,sMerk,MAX_TEXT_LENGTH);
	create_path(sMerk,"cwcreator/rules");
	language(7,sLanguage);
	snprintf(sMessage,MAX_TEXT_LENGTH,sLanguage,sValue);
	say(sMessage);
	language(8,sLanguage);
	say(sLanguage);
	snprintf(sMessage,MAX_DATA_LENGTH,"exec %s",sMerk);
	exec(sMessage);
 
	return PLUGIN_CONTINUE;
}
 
/* Neue Warmupphase einleiten */
public launched_timed(Timer,Repeat,HLUserName,HLParam) {
	launched();
	return PLUGIN_CONTINUE;
}
 
/* Say-Message */
info_msg(UserIndex,sString[]){
	new sName[MAX_NAME_LENGTH];
 
	if(playerinfo(UserIndex,sName,MAX_NAME_LENGTH)){
		messageex(sName,sString,print_chat);
	}
	else{
		selfmessage(sString);
	}
 
	return PLUGIN_CONTINUE;
}
 
/******************************** WARMODE AKTIVIEREN ***************************************/
public admin_war_launch(HLCommand,HLData,HLUserName,UserIndex) {
	new Text[MAX_DATA_LENGTH];
	new sLanguage[MAX_TEXT_LENGTH];
	new iFreeslots;
	new sIP[MAX_IP_LENGTH];
 
	/* Check-Funktionen */
	convert_string(HLData,Text,MAX_DATA_LENGTH);
	strtrim(Text," ",2);
	if(war_on() || clantag(Text)) {
		return PLUGIN_HANDLED;
	}
 
	/* Nicht CW-Teinehmer kicken oder auf einen anderen Server schicken, Passwort zur Sicherheit beim Spieler setzen */ 
	language(5,sLanguage);
	if(get_vaultdata("CWCI_OPPONENT",Text,MAX_DATA_LENGTH) && strlen(Text)!=0 && !streq(Text,sLanguage)){
		iFreeslots=hltvonline();
		if(iFreeslots>0){
			sendtohltv(UserIndex,iFreeslots);
		}
		/* Grundsätzliche Gültigkeit der IP überprüfen und Leute auf alternativen Server schicken, sonst kicken*/
		if(get_vaultdata("CWC_ALTIP",sIP,MAX_IP_LENGTH) && is_valid_ip(sIP)){
			redirect(UserIndex,sIP);
		}
		kickplayers(UserIndex);
	}
 
	/* Mapchangecfgfile abschalten und alte Datei speichern */
	delete_mccf();
 
	/* Altes Passwort und Mapcycle sichern */
	save_password();
 
	/* Passwort setzen */
	set_password();
 
	/* Defaultwerte laden inkl. Regeldatei */
	set_default();
 
	/* War modus aktivieren */
	set_vaultnumdata("CWCI_ON",1);
 
	/* Mapcycle erzeugen und aktivieren*/
	create_mapcycle();
 
	/* Flag für erste Runde setzen */
	set_serverinfo("war_start","1");
 
	/* Mapchange */
	get_vaultdata("CWC_MAP1",Text,MAX_DATA_LENGTH);
 	set_timer("mapchange",10,0,Text);
 	return PLUGIN_HANDLED;
}
/********************************************************************************/
 
/********************************** CW - START **********************************/
/* War starten */
public admin_war_start(HLCommand,HLData,HLUserName,UserIndex) {
	new Text[MAX_DATA_LENGTH];
	new dummy[10];
	new no;
	new sLanguage[3][MAX_TEXT_LENGTH];
 
	/* Check, ob Server im Warmodus */
	if(war_off(UserIndex)==0) {
		return PLUGIN_HANDLED;
	}
 
	/* Sofortiger Start */
	convert_string(HLData,Text,MAX_DATA_LENGTH);
	strtrim(Text," ",2);
 
	if(!strcasecmp(Text,"now")){
		set_timer("restarttimers",5,0);
		return PLUGIN_HANDLED;
	}
 
	/* Clanbegruessung in der ersten Runde */
	language(5,sLanguage[0]);
	if (get_serverinfo("war_start",Text,MAX_DATA_LENGTH) && streq(Text,"1") && get_vaultdata("CWCI_OPPONENT",Text,MAX_DATA_LENGTH) && !streq(sLanguage[0],Text) && strlen(Text)!=0) {
		language(9,sLanguage[0]);
		snprintf(Text,MAX_DATA_LENGTH,sLanguage[0],Text);
	}
	else{
		strinit(Text);
	}
 
	/* Vote initiieren */
	get_vaultnumdata("CWC_RESTARTS",no);
	language(10,sLanguage[0]);
	snprintf(Text,MAX_DATA_LENGTH,sLanguage[0],Text,min(max(no,2),10));
	centersay(Text,30,68,255,125);
	for(no=0;no<3;no++){
		language(no+11,sLanguage[no]);
	}
	vote(sLanguage[0],sLanguage[1],sLanguage[2],"HandleWarVote",dummy);
 
	return PLUGIN_HANDLED;
}
 
/* Startvote auswerten */
public HandleWarVote(WinningOption,HLMap,VoteCount,UserCount) {
	new VoteMap[MAX_DATA_LENGTH];
	new a=0;
	new sLanguage[MAX_TEXT_LENGTH];
	new maxplayers = maxplayercount();
	new Target[MAX_NAME_LENGTH];
	new SessionID, WONID, Team;
 
	for(new i=1; i<=maxplayers; i++) {
 		if(playerinfo(i,Target,MAX_NAME_LENGTH,SessionID,WONID,Team)==1) {
 			if (Team == TEAM_PROXY) {
				a=1;
			}
		}
	}
 
	convert_string(HLMap,VoteMap,MAX_DATA_LENGTH);
 
	if (WinningOption == 1 && VoteCount >= (UserCount-a)) {
		set_timer("restarttimers",5,0,"1");
		return PLUGIN_CONTINUE;
	}
	else {
		language(14,sLanguage);
		centersay(sLanguage,10,255,40,44);
	}
	return PLUGIN_CONTINUE;
}
 
/* Timer für Warstart */
public restarttimers(Timer,Repeat,HLUserName,HLParam){
	new no;
	new Text[MAX_DATA_LENGTH];
	new sLanguage[MAX_TEXT_LENGTH];
 
	/* Begruessung des Gegnerclans abschalten */
	set_serverinfo("war_start","");
 
	/* String für erfolgreichen Vote */
	convert_string(HLParam,Text,MAX_DATA_LENGTH);
	if(strtonum(Text)){
		language(15,sLanguage);
		strcpy(Text,sLanguage,MAX_DATA_LENGTH);
	}
	else {
		strinit(Text);
	}
 
	/* Teamzugehörigkeit für admin_war_switch merken */
	who_is_in_which_team();
 
	/* Ankündigung des Starts */
	get_vaultnumdata("CWC_RESTARTS",no);
	no=min(max(no,2),10);
	language(16,sLanguage);
	snprintf(Text,MAX_DATA_LENGTH,sLanguage,Text,no);
	centersay(Text,10,68,255,125);
 
	/* Restarts auslösen */
	set_timer("Restart_Round",2,no);
 
	/* Timelimit und Maxrounds zurücksetzen; Addons auslösen */
	set_timer("warmup_end",3,0);
	/* Warstart Nachricht */
	set_timer("War_Starts",(no+1)*2+1,0);
}
 
/* Teamzugehörigkeit für admin_war_switch merken */
who_is_in_which_team(){
	new iTeam;
	new iMaxPlayers=maxplayercount();
	new i;
	new sName[MAX_NAME_LENGTH];
	new iUserID,iWONID,iDead;
	new sAuthID[MAX_AUTHID_LENGTH];
	new iLAN;
 
	iLAN=getvar("sv_lan");
	/* Globale Array beschreiben, wenn kein Spieler im Slot Null eintragen */	
	for(i=0;i<iMaxPlayers;i++){
		if(playerinfo(i+1,sName,MAX_NAME_LENGTH,iUserID,iWONID,iTeam,iDead,sAuthID)){
			aTeam[i]=iTeam;
			/* SessionID benutzen um Kompatibilität zum LAN zu erhalten */
			if(iLAN){
				get_userIP(sName,aSessionID[i],MAX_AUTHID_LENGTH);
			}
			else{
				strcpy(aSessionID[i],sAuthID,MAX_AUTHID_LENGTH);
			}
		}
		else{
			aTeam[i]=0;
			strinit(aSessionID[i]);
		}
	}
	iTausch=1;
	return PLUGIN_CONTINUE;
}
 
/* Restarts auslösen */
public Restart_Round(Timer,Repeat,HLUserName,HLParam) {
	setstrvar("sv_restartround","1");
	return PLUGIN_CONTINUE;
}
 
/* Timelimit und Maxrounds zurücksetzen; Addons auslösen */
public warmup_end(Timer,Repeat,HLUserName,HLParam) {
	new merk[MAX_TEXT_LENGTH];
	new iAccess;
 
	get_vaultdata("CWCI_TIMELIMIT",merk,MAX_TEXT_LENGTH);
	setstrvar("mp_timelimit",merk);
	get_vaultdata("CWCI_MAXROUNDS",merk,MAX_TEXT_LENGTH);
	setstrvar("mp_maxrounds",merk);
 
	if (plugin_checkcommand("cwc_addon_start",iAccess)>0){
		plugin_exec("cwc_addon_start","");
		iAccess=0;
	}
 
	return PLUGIN_CONTINUE;
}
 
/* Die aktuellen Einstellungen vor jeder Runde allgemein anzeigen */
show_settings(){
	new cmd[4][MAX_COMMAND_LENGTH]={"CWC_PASS","CWC_MAP1","CWC_MAP2","CWC_RULES"};
	new i;
	new sLanguage[MAX_DATA_LENGTH];
	new maxplayers=maxplayercount();
	new sName[MAX_NAME_LENGTH];
	new iMenu=0;
	new iFreeze=getvar("mp_freezetime");
	new sMerke[MAX_DATA_LENGTH];
	new SessionID,WONID,Team;
 
	for(i=0;i<=3;i++){
		get_vaultdata(cmd[i],cmd[i],MAX_TEXT_LENGTH);
	}
	language(35,sLanguage);
	snprintf(sLanguage,MAX_DATA_LENGTH,sLanguage,cmd[0],cmd[1],cmd[2],cmd[3]);
	if(getstrvar("amv_enable_beta",sMerke,MAX_DATA_LENGTH) && strcasestrx(sMerke,"menu1")!=-1){
		iMenu=1;
	}
	for(i=1;i<=maxplayers;i++){
		if(playerinfo(i,sName,MAX_NAME_LENGTH,SessionID,WONID,Team) && Team!=TEAM_PROXY){
			if(iMenu && iFreeze>0){
				if(iFreeze>0){
					menu(sName,sLanguage,1024,iFreeze);
				}
				else{
					menu(sName,sLanguage,1024,5);
				}
			}
			else{
				messageex(sName,sLanguage,print_tty);
			}
		}
	}	
	return PLUGIN_CONTINUE;
}
 
 
/* Warstart Nachricht */
public War_Starts(Timer,Repeat,HLUserName,HLParam) {
	new sLanguage[MAX_TEXT_LENGTH];
 
	show_settings();
 
	language(17,sLanguage);
	centersay(sLanguage,10,68,255,125);
 
	return PLUGIN_CONTINUE;
}
 
/* Check, ob Server im Warmodus */
war_off(UserIndex) {
	new on;
	new sLanguage[MAX_TEXT_LENGTH];
 
	if(get_vaultnumdata("CWCI_ON",on) && !on) {
		language(18,sLanguage);
		info_msg(UserIndex,sLanguage);
		return 0;
	}
	return 1;
}
/********************************************************************************/
 
/********************************** CW - END ************************************/
public admin_war_end(HLCommand,HLData,HLUserName,UserIndex) {
	new Text[MAX_TEXT_LENGTH];
	new on;
	new sLanguage[MAX_TEXT_LENGTH];
 
	if(get_vaultnumdata("CWCI_ON",on) && on!=1){
		language(19,sLanguage);
		info_msg(UserIndex,sLanguage);
		return PLUGIN_HANDLED;
	}
 
	/* Altes Passwort wiederhergestellt */
	get_vaultdata("CWCI_OLDPASS",Text,MAX_TEXT_LENGTH);
	if (strlen(Text)==0){
		strcpy(Text,"none",MAX_DATA_LENGTH);
	}
	setstrvar("sv_password",Text);
 
	/* Alter Mapcycle wiederhergestellt */
	get_vaultdata("CWCI_OLDMCF",Text,MAX_TEXT_LENGTH);
	setstrvar("mapcyclefile",Text);
 
	/* Altes Mapchangecfgfile wiederhergestellt */
	strinit(Text);
	get_vaultdata("CWCI_MCCF",Text,MAX_TEXT_LENGTH);
	setstrvar("mapchangecfgfile",Text);
 
	/* Einstellungen resetten */
	if(!strlen(Text)){
		getstrvar("servercfgfile",Text,MAX_DATA_LENGTH);
	}
	snprintf(Text,MAX_TEXT_LENGTH,"exec %s",Text);
	exec(Text);
 
	/* Warmodus deaktivieren */
	set_vaultnumdata("CWCI_ON",0);
 
	/* Kleines Dankeschön für den War */
	language(20,sLanguage);
	info_msg(UserIndex,sLanguage);
	language(21,sLanguage);
	centersay(sLanguage,10,68,255,125);
 
	/* Wechsel auf bevorzugte Map initiiert */
	get_vaultdata("CWC_ENDMAP",Text,MAX_TEXT_LENGTH);
	set_timer("ChangeMap",59,0,Text);
	language(22,sLanguage);
	snprintf(Text,MAX_TEXT_LENGTH,sLanguage,Text);
	say(Text);
 
	/* Addons Warende bekanntmachen */
	if (plugin_checkcommand("cwc_addon_end",on)>0){
		plugin_exec("cwc_addon_end","");
		on=0;
	}
 
	/* benutzerspezifisches File am Ende des Wars ausführen */
	strcpy(Text,"endwar.cfg",MAX_TEXT_LENGTH);
	create_path(Text,"cwcreator");
	if(fileexists(Text)){
		snprintf(Text,MAX_TEXT_LENGTH,"exec %s",Text);
		exec(Text);
	}
	return PLUGIN_HANDLED;
}
/********************************************************************************/
 
/************************ CW Creator CVars setzen *******************************/
 
/* Schreiben von Pluginsettings */
change_settings(sWarCvar[],sValue[]){
	new sLocalCvar[MAX_TEXT_LENGTH]="CWC_";
	new sLocalValue[MAX_TEXT_LENGTH];
	new sLanguage[MAX_TEXT_LENGTH];
 
	strcat(sLocalCvar,sWarCvar,MAX_TEXT_LENGTH);
 
	if(get_vaultdata(sLocalCvar,sLocalValue,MAX_TEXT_LENGTH) && strlen(sValue)!=0){
		set_vaultdata(sLocalCvar,sValue);
		if(getvar("admin_debug")>0){
			language(23,sLanguage);
			snprintf(sLocalValue,MAX_TEXT_LENGTH,sLanguage,sLocalCvar,sValue,sLocalValue);
			log(sLocalValue);
		}
	}
 
	return PLUGIN_CONTINUE;
}
 
/* Rückgabe von Pluginsettings */
display_settings(){
	new cmd[8][MAX_COMMAND_LENGTH]={"PASS","TAG","MAP1","MAP2","ENDMAP","RULES","RESTARTS","ALTIP"};
	new i;
	new Text[MAX_TEXT_LENGTH];
	new sLanguage[MAX_TEXT_LENGTH];
 
	language(24,sLanguage);
	selfmessage(sLanguage);
	for(i=0;i<=7;i++){
		strcpy(Text,"CWC_",MAX_TEXT_LENGTH);
		strcat(Text,cmd[i],MAX_TEXT_LENGTH);
		/* Aktuellen Wert ausgeben */
		get_vaultdata(Text,Text,MAX_TEXT_LENGTH);
		snprintf(Text,MAX_TEXT_LENGTH,"%s %s",cmd[i],Text);
		selfmessage(Text);
	}
 
	return PLUGIN_CONTINUE;
}
 
/* Variablen Check */
public admin_war_set(HLCommand,HLData,HLUserName,UserIndex){
	new sValue[MAX_DATA_LENGTH];
	new sWarCvar[MAX_DATA_LENGTH];
	new sMerke[MAX_DATA_LENGTH];
	new i;
	new sLanguage[MAX_TEXT_LENGTH];
	new sName[MAX_NAME_LENGTH];
 
	convert_string(HLData,sMerke,MAX_DATA_LENGTH);
	convert_string(HLUserName,sName,MAX_NAME_LENGTH);
	strtrim(sMerke," ",2);
 
	for(i=0;i<8;i++){
		strbreak(sMerke,sWarCvar,sValue,MAX_DATA_LENGTH);
		strbreak(sValue,sValue,sMerke,MAX_DATA_LENGTH);
 
		/* Variablencheck */
		if(strcasecmp(sWarCvar,"pass")==0){
			/* Leeres Passwort ablehnen */
			if (strcmp(sValue,"none")== 0) {
				language(25,sLanguage);
		 		info_msg(UserIndex,sLanguage);
				return PLUGIN_HANDLED;
			}
		}
		else if(strcasecmp(sWarCvar,"tag")==0){
			/* Clantag auf 20 Zeichen limitiert */
			if(strlen(sValue) > 20) {
				language(4,sLanguage);
				info_msg(UserIndex,sLanguage);
				return PLUGIN_HANDLED;
			}
		}
		else if(strcasecmp(sWarCvar,"map1")==0 || strcasecmp(sWarCvar,"map2")==0 || strcasecmp(sWarCvar,"endmap")==0){
			/* Überprüfen, ob eine gültige Map angegeben wurde */
			if(!valid_map(sValue)) {
				language(26,sLanguage);
				info_msg(UserIndex,sLanguage);
				return PLUGIN_HANDLED;
			}
		}
		else if(strcasecmp(sWarCvar,"rules")==0){
			/* Pfad erstellen */
			new sMerk[MAX_DATA_LENGTH];
			strcpy(sMerk,sValue,MAX_DATA_LENGTH);
			create_path(sMerk,"cwcreator/rules");
			/* Überprüfen, ob die Regeldatei existiert */
			if(!fileexists(sMerk)) {
				info_msg(UserIndex,sMerk);
				language(27,sLanguage);
				info_msg(UserIndex,sLanguage);
				return PLUGIN_HANDLED;
			}
			else {
				/* Bei Warmodus, Serversettings ausführen */
				set_timer("overwrite_settings",1,0);
			}
		}
		else if(strcasecmp(sWarCvar,"altip")==0){
			if(!is_valid_ip(sValue)){
				language(36,sLanguage);
				info_msg(UserIndex,sLanguage);
				strcpy(sValue,"0",MAX_DATA_LENGTH);
			}
		}
		else if(strcasecmp(sWarCvar,"restarts")==0){
			new iValue;
			iValue=strtonum(sValue);
			if(iValue>10 || iValue<2){
				iValue=min(max(iValue,2),10);
				numtostr(iValue,sValue);
			}
		}
		change_settings(sWarCvar,sValue);
		strtrim(sMerke," ",2);
		if(!strlen(sMerke)){
			break;
		}
	}
	display_settings();
	/* Addons Änderungen der Settings bekanntmachen */
	if (plugin_checkcommand("cwc_addon_set",i)>0){
		plugin_exec("cwc_addon_set",sName);
		i=0;
	}
 
 
	return PLUGIN_HANDLED;
}
/********************************************************************************/
 
/****************************** PLUGIN-START ************************************/
 
public admin_war_switch(HLCommand,HLData,HLUserName,UserIndex){
	new iTeam;
	new iMaxPlayers=maxplayercount();
	new i,j;
	new sName[MAX_NAME_LENGTH];
	new sCommand[MAX_TEXT_LENGTH];
	new iUserID,iWONID,iDead;
	new sAuthID[MAX_AUTHID_LENGTH];
	new iMerk=0;
	new sLanguage[MAX_TEXT_LENGTH];
	new iLAN;
 
	if(war_off(UserIndex)) {
		if(!iTausch){
			language(37,sLanguage);
			info_msg(UserIndex,sLanguage);
			return PLUGIN_HANDLED;
		}
		if(!getvar("admin_ignore_immunity")){
			setstrvar("admin_ignore_immunity","1");
			iMerk=1;
		}
		language(28,sLanguage);
		say(sLanguage);
 
		iLAN=getvar("sv_lan");
 
		/* Switch Teams */
		for(i=0;i<iMaxPlayers;i++){
			if(playerinfo(i+1,sName,MAX_NAME_LENGTH,iUserID,iWONID,iTeam,iDead,sAuthID)){
				if(iLAN){
					get_userIP(sName,sAuthID,MAX_AUTHID_LENGTH);
				}
				for(j=0;j<iMaxPlayers;j++){
					if(streq(aSessionID[j],sAuthID) && aTeam[j]==iTeam){
						if(iTeam==CT){
							iTeam=TERROR;
						}
						else{
							iTeam=CT;
						}
						snprintf(sCommand,MAX_TEXT_LENGTH,"jointeam %d",iTeam);
						execclient(sName,sCommand);
						break;
					}
				}
			}
		}
		if(iMerk){
			setstrvar("admin_ignore_immunity","0");
		}
	}
	return PLUGIN_HANDLED;
}
 
/********************************************************************************/
 
/******************************** NEXTMAP ***************************************/
public admin_war_nextmap(HLCommand,HLData,HLUserName,UserIndex){
	new sMap[MAX_DATA_LENGTH];
	new sCurrentMap[MAX_DATA_LENGTH];
	new sPath[MAX_DATA_LENGTH];
	new Text[MAX_DATA_LENGTH];
 
	/* Check, ob Server im Warmodus */
	if(war_off(UserIndex)==0) {
		return PLUGIN_HANDLED;
	}
 
	/* Alter Mapcycle wiederhergestellt wegen Problemen im Mapcycle von HLDS*/
	get_vaultdata("CWCI_OLDMCF",Text,MAX_TEXT_LENGTH);
	setstrvar("mapcyclefile",Text);
 
	/* Pfad erstellen */
	strcpy(sPath,"cwmapcycle.txt",MAX_DATA_LENGTH);
	create_path(sPath,"cwcreator");
	resetfile(sPath);
 
	get_vaultdata("CWC_MAP2",sMap,MAX_DATA_LENGTH);
	currentmap(sCurrentMap,MAX_DATA_LENGTH);
 
	if(streq(sMap,sCurrentMap)){
		get_vaultdata("CWC_MAP1",sMap,MAX_DATA_LENGTH);
	}
	writefile(sPath,sMap,-1);
	/* Den neuen Cycle aktivieren, hoffen wir, dass das Prozedere die Probleme behebt */
	setstrvar("mapcyclefile",sPath);
	changelevel(sMap);
 
 	return PLUGIN_HANDLED; 
}
/********************************************************************************/
 
/****************************** PLUGIN-START ************************************/
public plugin_init() {
	new merk;
	new sLanguage[MAX_TEXT_LENGTH]="";
 
	/* Sprache initieren */
	language(0,sLanguage);
 
	/* CVar Check */
	if(getvar("file_access_write")*getvar("file_access_read")*getvar("allow_client_exec")*is_vaultfile_set()){
		/* Plugin Registrierung */
		language(29,sLanguage);
		plugin_registerinfo("Clan War Creator",sLanguage,STRING_VERSION);
		language(30,sLanguage);
		plugin_registercmd("admin_war_launch","admin_war_launch",ACCESS_WAR,sLanguage);
		plugin_registercmd("admin_war_start","admin_war_start",ACCESS_WAR,"admin_war_start [now]");
		plugin_registercmd("admin_war_end","admin_war_end",ACCESS_WAR,"admin_war_end");
		language(31,sLanguage);
		plugin_registercmd("admin_war_set","admin_war_set",ACCESS_WAR,sLanguage);
		plugin_registercmd("admin_war_switch","admin_war_switch",ACCESS_WAR,"admin_war_switch");
		plugin_registercmd("admin_war_nextmap","admin_war_nextmap",ACCESS_WAR,"admin_war_nextmap");
 
		/* Im Warmodus? Passwort setzen und evtl. Mapsettings ueberschreiben */
 
		if(get_vaultnumdata("CWCI_ON",merk) && merk) {
			if(map_specific_exists()){
				set_timer("overwrite_settings",5,0);
			}
			else{
				new Text[MAX_TEXT_LENGTH];
				if(get_serverinfo("war_start",Text,MAX_TEXT_LENGTH) && strtonum(Text)){
					set_vaultnumdata("CWCI_LAUNCHED",1);
				}
				launched();
			}
		}
 
		/* Bei fehlenden Vault.ini-Einträgen Default setzen */
 
		if(!get_vaultnumdata("CWC_RESTARTS",merk)){
			set_vaultdata("CWC_PASS","test");
			set_vaultdata("CWC_TAG","[WING]");
			set_vaultdata("CWC_MAP1","de_dust");
			set_vaultdata("CWC_MAP2","de_inferno");
			set_vaultdata("CWC_ENDMAP","de_aztec");
			set_vaultdata("CWC_RESTARTS","3");
			set_vaultdata("CWC_RULES","esl5on5mr.cfg");
			set_vaultdata("CWCI_ON","0");
			set_vaultdata("CWC_ALTIP","213.202.195.22:27015");
		}
 
		if (plugin_checkcommand("cwc_addon_init",merk)>0){
			plugin_exec("cwc_addon_init","");
			merk=0;
		}
 
	}
	else{
		language(32,sLanguage);
		plugin_registerinfo("Clan War Creator",sLanguage,STRING_VERSION);
		language(33,sLanguage);
		log(sLanguage);
		language(34,sLanguage);
		log(sLanguage);
	}
 
 	return PLUGIN_CONTINUE; 
}
 
public overwrite_settings(Timer,Repeat,HLUserName,HLParam) {
	execute_settings();
	return PLUGIN_CONTINUE;
}
 
/********************************************************************************/