/*CWC SCORE*/
 
#include <core>
#include <string>
#include <admin>
#include <plugin>
#include <adminlib>
 
#pragma dynamic 16384
 
#define ACCESS_CONSOLE	131072
#define ACCESS_WAR 256
 
new AM_VERSION_STRING[] = "cwc_3.0.1_score_1.0";
new g_ScoreFile[MAX_TEXT_LENGTH]="addons/adminmod/config/cwcreator/cwcscore.txt";
 
new g_status_plugin=1;
new g_maxplayers;
new g_plugin;
new g_cwround;
new g_restart;
new g_Map1[MAX_NAME_LENGTH];
new g_Map2[MAX_NAME_LENGTH];
new g_OwnTag[MAX_NAME_LENGTH];
new g_OppTag[MAX_NAME_LENGTH];
 
new g_maxrounds;	/*Wenn gesetzt, dann hört das Plugin bei erreichter Punktzahl auf zu zählen*/
new g_mapround;
new g_CurrentMap[MAX_NAME_LENGTH];
new g_Tag1[MAX_NAME_LENGTH];
new g_Tag2[MAX_NAME_LENGTH];
new g_ScoreT[6];
new g_ScoreCT[6];
new g_UserMenu[MAX_PLAYERS];
 
/*TOTAL SCORE*/
new g_iScoreMap1Own;
new g_iScoreMap2Own;
new g_iScoreMap1Opp;
new g_iScoreMap2Opp;
 
/*ATTACKER WINS*/
new g_iAttScoreMap1Own;
new g_iAttScoreMap2Own;
new g_iAttScoreMap1Opp;
new g_iAttScoreMap2Opp;
 
 
public plugin_init() {
	plugin_registerinfo("CWC-SCORE","Counts team score in CW",AM_VERSION_STRING);
	plugin_registercmd("admin_war_score","admin_war_score",ACCESS_WAR,"admin_war_score <on/off>: disables cwc score plugin");
	plugin_registercmd("say","HandleSay",ACCESS_ALL,"say .score: displays current cw-team-score");
	/*Reagieren auf CWC Befehle*/
	plugin_registercmd("cwc_addon_set","cwc_addon_set",ACCESS_WAR);
	plugin_registercmd("cwc_addon_start","cwc_addon_start",ACCESS_WAR);
	plugin_registercmd("cwc_addon_end","cwc_addon_end",ACCESS_WAR);
	/*LogD-Funktionen*/
	plugin_registercmd("cwc_team", "cwc_handler", ACCESS_CONSOLE, "");
	plugin_registercmd("cwc_world", "cwc_handler", ACCESS_CONSOLE, "");
	plugin_registercmd("cwc_score", "cwc_handler", ACCESS_CONSOLE, "");
	exec( "logd_reg 61 admin_command cwc_team" );
	exec( "logd_reg 62 admin_command cwc_world");
	exec( "logd_reg 65 admin_command cwc_score");
	/*Menü-Handling*/
	plugin_registercmd("menuselect","menuselect",ACCESS_ALL);
	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);
	/*Settings-Daten*/
	load_settings();
	return PLUGIN_CONTINUE;
}
 
///////////////////
// AM-FUNKTIONEN //
///////////////////
public admin_war_score(HLCommand,HLData,HLUserName,UserIndex){
	new Data[MAX_DATA_LENGTH];
	new iSet;
	convert_string(HLData,Data,MAX_DATA_LENGTH);
	iSet=check_param(Data);
	if(iSet){
		selfmessage("[CWC-SCORE] Plugin is enabled!");
		g_status_plugin=1;
	}else{
		selfmessage("[CWC-SCORE] Plugin is disabled!");
		g_status_plugin=0;
	}
	return PLUGIN_HANDLED;
}
 
public HandleSay(HLCommand,HLData,HLUserName,UserIndex){
	if(g_status_plugin){
		new Data[MAX_DATA_LENGTH];
		new UserName[MAX_NAME_LENGTH];
		convert_string(HLData,Data,MAX_DATA_LENGTH);
		convert_string(HLUserName,UserName,MAX_DATA_LENGTH);
		strstripquotes(Data);
		if(strcmp(Data,".score")==0){
			set_menu(UserName);
			return PLUGIN_HANDLED;
		}
	}
	return PLUGIN_CONTINUE;
}
 
/*CWC-SETTINGS CHANGED*/
public cwc_addon_set(HLCommand,HLData,HLUserName,UserIndex){
	if(g_status_plugin){
		load_settings();
	}
	return PLUGIN_CONTINUE;
}
 
load_settings(){
	g_maxplayers=maxplayercount();
	get_vaultnumdata("CWC_MAXROUNDS",g_maxrounds);
	get_vaultnumdata("CWC_SCORE_ROUND",g_cwround);
	get_vaultdata("CWC_TAG",g_OwnTag,MAX_NAME_LENGTH);
	get_vaultdata("CWCI_OPPONENT",g_OppTag,MAX_NAME_LENGTH);
	get_vaultdata("CWC_MAP1",g_Map1,MAX_NAME_LENGTH);
	get_vaultdata("CWC_MAP2",g_Map2,MAX_NAME_LENGTH);
	currentmap(g_CurrentMap,MAX_NAME_LENGTH);
}
 
/*VOTE SUCCESSFUL in CWC*/
public cwc_addon_start(HLCommand,HLData,HLUserName,UserIndex){
	if(g_status_plugin){
		if(!g_plugin){
			g_plugin=1;
			g_cwround++;
		}
		say("[CWC-SCORE] Team-Score-Counter starts counting!");
	}
	return PLUGIN_CONTINUE;
}
 
///////////////////////
/// LOGD - HANDLING ///
///////////////////////
public cwc_handler(HLCommand,HLData,HLUserName,UserIndex){
	if(g_plugin){
		new Command[MAX_COMMAND_LENGTH];
		new Data[MAX_DATA_LENGTH];
		convert_string(HLCommand,Command,MAX_COMMAND_LENGTH);
		convert_string(HLData,Data,MAX_DATA_LENGTH);
		switch(Command[4]){
			case 'w': worldaction(Data);
			case 't': teamaction(Data);
			case 's': score();
		}
	}
	return PLUGIN_CONTINUE;
}
 
worldaction(Data[]){
	if(Data[8]=='R' && !g_restart || Data[0]=='G'){
		g_restart=1;
		g_mapround=0;
		strinit(g_ScoreCT);
		strinit(g_ScoreT);
		detect_team();
	}else if(Data[6]=='S') {
		g_restart=0;
	}	
}
 
detect_team(){
	new Player[MAX_NAME_LENGTH];
	new i;
	new iTeam;
 
	for(i=1;i<=g_maxplayers;i++){
		if(playerinfo(i,Player,MAX_NAME_LENGTH,_,_,iTeam)){
			if(strstrx(Player,g_OwnTag)!=-1){
				if(iTeam==2){
					strcpy(g_Tag1,g_OwnTag,MAX_NAME_LENGTH);
					strcpy(g_Tag2,g_OppTag,MAX_NAME_LENGTH);
				}else if(iTeam==1){
					strcpy(g_Tag1,g_OppTag,MAX_NAME_LENGTH);
					strcpy(g_Tag2,g_OwnTag,MAX_NAME_LENGTH);
				}
				break;
			}
		}
	}
	say("[CWC-SCORE] Team-Detection finished!");
}
 
teamaction(Data[]){
	new Data1[MAX_DATA_LENGTH];                                
        new Data2[MAX_DATA_LENGTH];  
	new Action[MAX_NAME_LENGTH];
	new dummy[10];
 
        strbreak(Data,Data1,Data2,MAX_DATA_LENGTH);
	strsplit(Data2, "# " ,Action,MAX_DATA_LENGTH,dummy,10,g_ScoreCT,6,dummy,10,g_ScoreT,6);
	g_mapround++;
	if(g_mapround==g_maxrounds){
		g_plugin=0;
		say("[CWC-SCORE] Team-Score-Counter stopped. MAXROUNDS reached!");
	}
	set_data();
	set_menu();
        return PLUGIN_CONTINUE;
}
 
score(){
	if(!g_restart){
		set_data();
	}
}
 
set_data(){
	new Vault[MAX_NAME_LENGTH];
	new Data[MAX_DATA_LENGTH];
	set_vaultnumdata("CWC_SCORE_ROUND",g_cwround);
	snprintf(Vault,MAX_NAME_LENGTH,"CWC_SCORE_ROUND_%i",g_cwround);
	snprintf(Data,MAX_DATA_LENGTH,"%s®%s®%s®%s®%s",g_CurrentMap,g_Tag1,g_ScoreCT,g_Tag2,g_ScoreT);
	set_vaultdata(Vault,Data);
	//say("[CWC-SCORE] Team-Score written to vault.ini!");
}
 
set_menu(User[]=""){
	new Text[512];
	new Data[MAX_DATA_LENGTH];
	new Vault[MAX_NAME_LENGTH];
	new MapName[MAX_NAME_LENGTH];
	new Tag1[MAX_NAME_LENGTH];
	new Tag2[MAX_NAME_LENGTH];
	new ScoreCT[6];
	new ScoreT[6];
	new i;
	snprintf(Text,512,"\y[CWC-SCORE]^n");
	for(i=1;i<=g_cwround;i++){
		strinit(Data);
		snprintf(Vault,MAX_NAME_LENGTH,"CWC_SCORE_ROUND_%i",i);
		get_vaultdata(Vault,Data,MAX_DATA_LENGTH);
		strsplit(Data,"®",MapName,MAX_NAME_LENGTH,Tag1,MAX_NAME_LENGTH,ScoreCT,6,Tag2,MAX_NAME_LENGTH,ScoreT,6);
		snprintf(Text,512,"%s^n\w%i. %s:^n\y%s:\w%s -- \r%s:\w%s",Text,i,MapName,Tag1,ScoreCT,Tag2,ScoreT);
	}
	if(g_plugin){
		display_menu(Text,User);
	}else{
		display_menu(Text,User,1023,60);
	}
}
 
/*CW ENDS*/
public cwc_addon_end(HLCommand,HLData,HLUserName,UserIndex){
	g_plugin=0;
	say("[CWC-SCORE] Team-Score-Counter stopped. CW ends. Calculating results!");
	calculate_score();
	return PLUGIN_CONTINUE;
}
 
calculate_score(){
	new Data[MAX_DATA_LENGTH];
	new Vault[MAX_NAME_LENGTH];
	new MapName[MAX_NAME_LENGTH];
	new Tag1[MAX_NAME_LENGTH];
	new Tag2[MAX_NAME_LENGTH];
	new ScoreCT[6];
	new ScoreT[6];
	new iScoreCT;
	new iScoreT;
	new i;
	writefile(g_ScoreFile,"----------------------------------------",-1);
	writefile(g_ScoreFile,"",-1);
	servertime(Data,MAX_DATA_LENGTH,"*** CW vom %d.%m.%y um %H:%M:%S Uhr ***");
	writefile(g_ScoreFile,Data,-1);
	writefile(g_ScoreFile,"",-1);
	writefile(g_ScoreFile,"********** EINZEL-ERGEBNISSE: **********",-1);
	writefile(g_ScoreFile,"",-1);
	for(i=1;i<=g_cwround;i++){
		strinit(Data);
		snprintf(Vault,MAX_NAME_LENGTH,"CWC_SCORE_ROUND_%i",i);
		get_vaultdata(Vault,Data,MAX_DATA_LENGTH);
		strsplit(Data,"®",MapName,MAX_NAME_LENGTH,Tag1,MAX_NAME_LENGTH,ScoreCT,6,Tag2,MAX_NAME_LENGTH,ScoreT,6);
		strsubst(Data,"®"," : ",MAX_DATA_LENGTH);
		writefile(g_ScoreFile,Data,-1);
		iScoreT=strtonum(ScoreT);
		iScoreCT=strtonum(ScoreCT);
		if(strcmp(Tag1,g_OwnTag)==0){
			if(strcmp(MapName,g_Map1)==0){
				g_iScoreMap1Own+=iScoreCT;
				g_iScoreMap1Opp+=iScoreT;
				g_iAttScoreMap1Opp+=iScoreT;
			}else{
				g_iScoreMap2Own+=iScoreCT;
				g_iScoreMap2Opp+=iScoreT;
				g_iAttScoreMap2Opp+=iScoreT;
			}
		}else{
			if(strcmp(MapName,g_Map1)==0){
				g_iScoreMap1Opp+=iScoreCT;
				g_iScoreMap1Own+=iScoreT;
				g_iAttScoreMap1Own+=iScoreT;
			}else{
				g_iScoreMap2Opp+=iScoreCT;
				g_iScoreMap2Own+=iScoreT;
				g_iAttScoreMap2Own+=iScoreT;
			}
		}
		set_vaultdata(Vault,"");
	}
	set_vaultdata("CWC_SCORE_ROUND","");
	writefile(g_ScoreFile,"",-1);
	writefile(g_ScoreFile,"**********     ALL POINTS:    **********^n",-1);
	snprintf(Data,512,"Map %s:^n%s : %i -- %s : %i^n^nMap %s:^n%s : %i -- %s : %i^n^nTOTAL:^n%s : %i -- %s : %i^n",g_Map1,g_OwnTag,g_iScoreMap1Own,g_OppTag,g_iScoreMap1Opp,g_Map2,g_OwnTag,g_iScoreMap2Own,g_OppTag,g_iScoreMap2Opp,g_OwnTag,g_iScoreMap1Own+g_iScoreMap2Own,g_OppTag,g_iScoreMap1Opp+g_iScoreMap2Opp);
	writefile(g_ScoreFile,Data,-1);
	writefile(g_ScoreFile,"**********    ATTACKER WINS:  **********^n",-1);
	snprintf(Data,512,"Map %s:^n%s : %i -- %s : %i^n^nMap %s:^n%s : %i -- %s : %i^n^nTOTAL:^n%s : %i -- %s : %i^n",g_Map1,g_OwnTag,g_iAttScoreMap1Own,g_OppTag,g_iAttScoreMap1Opp,g_Map2,g_OwnTag,g_iAttScoreMap2Own,g_OppTag,g_iAttScoreMap2Opp,g_OwnTag,g_iAttScoreMap1Own+g_iAttScoreMap2Own,g_OppTag,g_iAttScoreMap1Opp+g_iAttScoreMap2Opp);
	writefile(g_ScoreFile,Data,-1);
	writefile(g_ScoreFile,"----------------------------------------",-1);
	score_results1();
}
 
score_results1(User[]=""){
	new Text[512];
	snprintf(Text,512,"\y[CW-SCORE-RESULTS]^n\wALL POINTS:^nMap %s:^n\y%s : %i \w-- \r%s : %i^n\wMap %s:^n\y%s : %i \w-- \r%s : %i^n^n\wTOTAL:^n\y%s : %i \w-- \r%s : %i^n^n\w1. ATTACKER-WINS -- 0.CANCEL",g_Map1,g_OwnTag,g_iScoreMap1Own,g_OppTag,g_iScoreMap1Opp,g_Map2,g_OwnTag,g_iScoreMap2Own,g_OppTag,g_iScoreMap2Opp,g_OwnTag,g_iScoreMap1Own+g_iScoreMap2Own,g_OppTag,g_iScoreMap1Opp+g_iScoreMap2Opp);
	display_menu(Text,User,513,60,2);
}
 
score_results2(User[]=""){
	new Text[512];
	snprintf(Text,512,"\y[CW-SCORE-RESULTS]^n\wATTACKER WINS:^nMap %s:^n\y%s : %i \w-- \r%s : %i^n\wMap %s:^n\y%s : %i \w-- \r%s : %i^n^n\wTOTAL:^n\y%s : %i \w-- \r%s : %i^n^n\w1. ALL WINS -- 0.CANCEL",g_Map1,g_OwnTag,g_iAttScoreMap1Own,g_OppTag,g_iAttScoreMap1Opp,g_Map2,g_OwnTag,g_iAttScoreMap2Own,g_OppTag,g_iAttScoreMap2Opp,g_OwnTag,g_iAttScoreMap1Own+g_iAttScoreMap2Own,g_OppTag,g_iAttScoreMap1Opp+g_iAttScoreMap2Opp);
	display_menu(Text,User,513,60,3);
}
 
display_menu(Text[],User[]="",keys=1023,iTime=8,MenuID=1){
	new Player[MAX_NAME_LENGTH];
	new i;
	if(strlen(User)==0){
		for(i=1;i<=g_maxplayers;i++){
			if(playerinfo(i,Player,MAX_NAME_LENGTH)){
				menu(Player,Text,1023,8);
				g_UserMenu[i]=MenuID;
			}
		}
	}else{
		get_userindex(User,i);
		g_UserMenu[i]=MenuID;
		menu(User,Text,keys,iTime);
	}
}
 
public SetMenuData(HLCommand,HLData,HLUserName,UserIndex){
	if(g_UserMenu[UserIndex]!=0){
		reset_menu(UserIndex);
	}
	return PLUGIN_CONTINUE;
}
 
public menuselect(HLCommand,HLData,HLUserName,UserIndex){
	new Data[MAX_DATA_LENGTH];
	new Player[MAX_NAME_LENGTH];
	new iSelect;
	convert_string(HLData,Data,MAX_DATA_LENGTH);
	convert_string(HLUserName,Player,MAX_NAME_LENGTH);
	iSelect=strtonum(Data);
 
	if(g_UserMenu[UserIndex]!=0){
		if(g_UserMenu[UserIndex]==1){
			reset_menu(UserIndex);
			return PLUGIN_CONTINUE;
		}
		if(iSelect==1){
			 if(g_UserMenu[UserIndex]==2){
			 	score_results2(Player);
			 }else if(g_UserMenu[UserIndex]==3){
			 	score_results1(Player);
			 }
		}else{
			reset_menu(UserIndex);
		}
	}				 	
	return PLUGIN_CONTINUE;
}
 
reset_menu(UserIndex){
	g_UserMenu[UserIndex]=0;
}