/*CWC MENÜ*/
 
#include <core>
#include <string>
#include <admin>
#include <plugin>
#include <adminlib>
 
#pragma dynamic 16384
 
#define ACCESS_WAR 256
 
new AM_VERSION_STRING[] = "cwc_3.0.1_menu_1.1";
 
/*PLAYER => RULES*/
/*SERVER => SET COMMANDS*/
/*VOTE => EXECUTE COMMANDS*/
 
/******************/
/* LOAD VAULT.INI */
/******************/
#define MAX_VAULT_SET	17
#define DISPLAY_SETTINGS 9
new g_VaultNames[MAX_VAULT_SET][]=
	{"CWC_MAP1","CWC_MAP2","CWC_ENDMAP","CWC_PASS","CWC_RULES",
	"CWC_TAG","CWC_RESTARTS","CWC_ALTIP","CWC_MAXROUNDS","CWCI_OPPONENT",
	"CWCI_LAUNCHED","CWCI_TIMELIMIT","CWCI_MAXROUNDS","CWCI_MCCF",
	"CWCI_OLDPASS","CWCI_OLDMCF","CWCI_ON"};				
new g_VaultData[MAX_VAULT_SET][MAX_NAME_LENGTH];
new g_WarModus[3];
new g_VoteSuccess;
 
/****************************************/
/* 	EDIT MAX COMMANDS AVAILABLE	*/
/*	FROM COMMANDS-FILE (MAX 100!!)	*/
/****************************************/
#define MAX_PLAYER_COMMANDS 	40
#define MAX_MAP_COMMANDS	5
#define MAX_SERVER_COMMANDS	30
#define MAX_VOTE_COMMANDS	30
/****************************************/
#define MAX_MAPS		60
/****************************************/
 
#define ITEMS_PER_PAGE 6
 
new g_PlayerCommandFile[]="addons/adminmod/config/cwcreator/menu/cwrules.cfg";
new g_MapCommandFile[]="addons/adminmod/config/cwcreator/menu/cwcmapcommands.cfg";
new g_MapFile[]="addons/adminmod/config/cwcreator/menu/cwmaps.cfg";
new g_ServerCommandFile[]="addons/adminmod/config/cwcreator/menu/cwcsettings.cfg";
new g_VoteCommandFile[]="addons/adminmod/config/cwcreator/menu/cwccommands.cfg";
 
new g_Maps[MAX_MAPS][MAX_NAME_LENGTH];
new g_lmaps;
 
/*MENUES*/
/*EBENE 1*/
#define MAINMENU	1
/*EBENE 2*/
#define PLAYERMENU	2
#define MAPMENU		3
#define SERVERMENU	4
#define VOTEMENU	5
#define DISPLAY		6
/*EBENE 3*/
#define PLAYERSELECT	7
#define MAPSELECT	8
/*EBENE 4*/
#define EXECUTEMENU	9
 
new g_PlayerCommands[MAX_PLAYER_COMMANDS][MAX_COMMAND_LENGTH];
new g_MapCommands[MAX_MAP_COMMANDS][MAX_COMMAND_LENGTH];
new g_ServerCommands[MAX_SERVER_COMMANDS][MAX_COMMAND_LENGTH];
new g_VoteCommands[MAX_VOTE_COMMANDS][MAX_COMMAND_LENGTH];
 
new g_lplayercommands;
new g_lmapcommands;
new g_lservercommands;
new g_lvotecommands;
 
 
/*USER SELECTS*/
new g_UserMenu[MAX_PLAYERS];
new g_UserLastMenu[MAX_PLAYERS];
new g_UserLastSelectLoop[MAX_PLAYERS]={1,1,...};
new g_UserMessageMode[MAX_PLAYERS];
new g_UserSelectLoop[MAX_PLAYERS]={1,1,...};
new g_UserCommand[MAX_PLAYERS][MAX_COMMAND_LENGTH];
new g_UserCommandData[MAX_PLAYERS][MAX_DATA_LENGTH];
 
public plugin_init(){
	new Menu[MAX_NAME_LENGTH];
	getstrvar("amv_enable_beta",Menu,MAX_NAME_LENGTH);
	if(strstrx(Menu,"menu1")!=-1){
		new Text[MAX_TEXT_LENGTH];
		plugin_registerinfo("CWC Menu","Administrate the CW-Creator with menu",AM_VERSION_STRING);
		plugin_registercmd("admin_war_menu","cw_menu",ACCESS_WAR,"admin_war_menu: opens the menu");
		plugin_registercmd("say","HandleSay",ACCESS_ALL,"cwmenu: opens the admin mod menu");
		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);
		read_file(g_PlayerCommandFile,g_PlayerCommands,MAX_PLAYER_COMMANDS,g_lplayercommands);
		snprintf(Text,MAX_TEXT_LENGTH,"[CWC-MENU] loaded %i rules ",g_lplayercommands);
		selfmessage(Text);
		strinit(Text);
		read_file(g_MapCommandFile,g_MapCommands,MAX_MAP_COMMANDS,g_lmapcommands);
		snprintf(Text,MAX_TEXT_LENGTH,"[CWC-MENU] loaded %i mapcommands",g_lmapcommands);
		selfmessage(Text);
		strinit(Text);
		read_file(g_ServerCommandFile,g_ServerCommands,MAX_SERVER_COMMANDS,g_lservercommands);
		snprintf(Text,MAX_TEXT_LENGTH,"[CWC-MENU] loaded %i setting commands",g_lservercommands);
		selfmessage(Text);
		strinit(Text);
		read_file(g_VoteCommandFile,g_VoteCommands,MAX_VOTE_COMMANDS,g_lvotecommands);
		snprintf(Text,MAX_TEXT_LENGTH,"[CWC-MENU] loaded %i execute commands",g_lvotecommands);
		selfmessage(Text);
		strinit(Text);
		read_file(g_MapFile,g_Maps,MAX_MAPS,g_lmaps);
		snprintf(Text,MAX_TEXT_LENGTH,"[CWC-MENU] loaded %i maps",g_lmaps);
		selfmessage(Text);
		strinit(Text);
		/*LOAD VAULT DATA*/
		load_vault_data();
		get_serverinfo("war_start",g_WarModus,3);
		/*REACT ON CW-START*/
		plugin_registercmd("cwc_addon_start","cwc_addon_start",ACCESS_WAR);
		/*REACT ON CW-CHANIGINGS*/
		plugin_registercmd("cwc_addon_end","cwc_addon_set",ACCESS_WAR);
		plugin_registercmd("cwc_addon_set","cwc_addon_set",ACCESS_WAR);
	}else{
		plugin_registerinfo("CWC Menu","Script is disabled, because 'amv_enable_beta menu1' is not set in adminmod.cfg!",AM_VERSION_STRING);
	}
	return PLUGIN_CONTINUE;
}
 
read_file(File[],StoreArray[][],max_entries,&loaded){
	new Data[MAX_DATA_LENGTH];
	new iFileSize;
	new i;
 
	if(fileexists(File)){
		iFileSize=filesize(File);
		for(i=1;i<=iFileSize;i++){
			if(loaded==max_entries){
				break;
			}
			readfile(File,Data,i,MAX_NAME_LENGTH);
			if(strncmp(Data,"//",2)!=0 && strncmp(Data,"#",1)!=0 && strncmp(Data,";",1)!=0 && strlen(Data)!=0){
				loaded++;
				strcpy(StoreArray[loaded],Data,MAX_COMMAND_LENGTH);
			}
		}
	}else{
		snprintf(Data,MAX_DATA_LENGTH,"[CWC-MENU] File not found: %s !",File);
		selfmessage(File);
	}
}
 
/*LOAD VAULT.INI SETTINGS*/
load_vault_data(){
	new i;
	for(i=0;i<MAX_VAULT_SET;i++){
		get_vaultdata(g_VaultNames[i],g_VaultData[i],MAX_NAME_LENGTH);
	}
}
 
/*VOTE SUCCESSFUL in CWC*/
public cwc_addon_start(HLCommand,HLData,HLUserName,UserIndex){
	g_VoteSuccess+=1;
	load_vault_data();
	return PLUGIN_CONTINUE;
}
 
/*CWC-SETTINGS CHANGED*/
public cwc_addon_set(HLCommand,HLData,HLUserName,UserIndex){
	load_vault_data();
	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(g_UserMenu[UserIndex]!=0){
		reset_array(UserIndex);
		snprintf(Text,MAX_TEXT_LENGTH,"[CWC-MENU] cw-menu is closed by another menu!");
		messageex(UserName,Text,print_chat);
	}
	return PLUGIN_CONTINUE;
}
 
public cw_menu(HLCommand,HLData,HLUserName,UserIndex){
	new UserName[MAX_NAME_LENGTH];
	convert_string(HLUserName,UserName,MAX_NAME_LENGTH);
	main_menu(UserName,UserIndex);
	return PLUGIN_HANDLED;
}
 
 
/*MENUES*/
main_menu(UserName[],UserIndex){
	new Text[512];
	new keys;
	if(g_VaultData[16][0]=='0'){
		snprintf(Text,MAX_TEXT_LENGTH,"\w[CWC-MENU]^n\r[CW MODE INACTIV]\y^n");
	}else{
		snprintf(Text,MAX_TEXT_LENGTH,"\w[CWC-MENU]^n\r[CW MODE ACTIV]\y^n");
	}
	snprintf(Text,MAX_TEXT_LENGTH,"%s1. SET RULES^n2. SET MAPS^n3. SET CONFIG^n4. EXECUTE^n5. DISPLAY SETTINGS^n^n\w0. CANCEL",Text);
	keys=543;
	g_UserMenu[UserIndex]=MAINMENU;
	menu(UserName,Text,keys);
}
 
second_menu(UserName[],UserIndex,menuID){
	new Data[100][MAX_COMMAND_LENGTH];
	new Text[512];
	new a=1;
	new keys=0;
	new i;
	new x;
	new loaded;
 
	/*WHICH DATA SHALL BE DISPLAYED*/
	switch(menuID){
		case MAPMENU:{
			snprintf(Text,MAX_TEXT_LENGTH,"\w[MAP SETTINGS]^n");
			loaded=g_lmapcommands;
			for(i=1;i<=loaded;i++){
				strcpy(Data[i],g_MapCommands[i],MAX_COMMAND_LENGTH);
			}
		}
		case SERVERMENU:{
			snprintf(Text,MAX_TEXT_LENGTH,"\w[CWC SETTINGS]^n\r[admin_war_set]^n");
			loaded=g_lservercommands;
			for(i=1;i<=loaded;i++){
				strcpy(Data[i],g_ServerCommands[i],MAX_COMMAND_LENGTH);
			}
		}
		case VOTEMENU:{
			snprintf(Text,MAX_TEXT_LENGTH,"\w[CWC COMMANDS]^n");
			loaded=g_lvotecommands;
			for(i=1;i<=loaded;i++){
				strcpy(Data[i],g_VoteCommands[i],MAX_COMMAND_LENGTH);
			}
		}
		case DISPLAY:{
			new Display[MAX_COMMAND_LENGTH];
			snprintf(Text,MAX_TEXT_LENGTH,"\w[CURRENT SETTINGS]^n\r[DISPLAY ONLY!]^n");
			loaded=DISPLAY_SETTINGS;
			for(i=0;i<=loaded;i++){
				snprintf(Display,MAX_COMMAND_LENGTH,"%s: \w%s",g_VaultNames[i][4],g_VaultData[i]);
				strcpy(Data[i+1],Display,MAX_COMMAND_LENGTH);
				strinit(Display);
			}
		}	
		case PLAYERSELECT:{
			snprintf(Text,MAX_TEXT_LENGTH,"\w[RULES]^n");
			loaded=g_lplayercommands;
			for(i=1;i<=loaded;i++){
				strcpy(Data[i],g_PlayerCommands[i],MAX_COMMAND_LENGTH);
			}
		}
		case MAPSELECT:{
			snprintf(Text,MAX_TEXT_LENGTH,"\w[MAP SELECT]^n\r%s:^n",g_UserCommand[UserIndex]);
			loaded=g_lmaps;
			for(i=1;i<=loaded;i++){
				strcpy(Data[i],g_Maps[i],MAX_NAME_LENGTH);
			}
		}
	}
	/*CREATE MENU*/
	for(i=g_UserSelectLoop[UserIndex];i<=loaded;i++){
		x++;
		if(x>ITEMS_PER_PAGE){
			if(loaded>g_UserSelectLoop[UserIndex]+5){
				strcat(Text,"\w^n8. Next",MAX_TEXT_LENGTH);
				keys+=128;
				break;
			}else{
				break;
			}
		}else{
			if(menuID!=DISPLAY){
				snprintf(Text,MAX_TEXT_LENGTH,"%s\y%i. %s^n",Text,x,Data[i]);
				a+=a;
				keys=a-1;
			}else{
				snprintf(Text,MAX_TEXT_LENGTH,"%s\y %s^n",Text,Data[i]);
			}	
		}
	}
	if(g_UserSelectLoop[UserIndex]>=5){
		strcat(Text,"\w^n9. Back",MAX_TEXT_LENGTH);
		keys+=256;
	}
	strcat(Text,"\r^n^n0. Cancel",MAX_TEXT_LENGTH);
	keys+=512;	
	g_UserMenu[UserIndex]=menuID;
	menu(UserName,Text,keys);
}
 
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_DATA_LENGTH);
	strstripquotes(Data);
	if(g_UserMessageMode[UserIndex]==1){
		handle_data(Data,UserName,UserIndex);
		return PLUGIN_HANDLED;
	}
	if(strcmp(Data,"cwmenu")==0 && access(256)){
		main_menu(UserName,UserIndex);
		return PLUGIN_HANDLED;
	}
	return PLUGIN_CONTINUE;
}
 
/*BULDING USERCOMMAND-DATA WITH MESSAGEMODE-DATA*/
handle_data(Data[],UserName[],UserIndex){
	if(strlen(g_UserCommandData[UserIndex])==0){
		snprintf(g_UserCommandData[UserIndex],MAX_DATA_LENGTH,"%s",Data);
	}else{
		snprintf(g_UserCommandData[UserIndex],MAX_DATA_LENGTH,"%s %s",g_UserCommandData[UserIndex],Data);
	}
	messagemode_menu(UserName,UserIndex);	
}
 
messagemode_menu(UserName[],UserIndex){
	new Text[512];
	new keys=513;
	snprintf(Text,MAX_TEXT_LENGTH,"\w[CWC MENU]^n\yCommand (with parameter): \w%s^n\y other parameter:^n\w%s^n^n\yOther parameter must be entered in chat!^n^n\w1. Execute command^n0. Cancel",g_UserCommand[UserIndex],g_UserCommandData[UserIndex]);
	g_UserMessageMode[UserIndex]=1;
	g_UserMenu[UserIndex]=EXECUTEMENU;
	menu(UserName,Text,keys);
}
 
public menuselect(HLCommand,HLData,HLUserName,UserIndex){
	new Data[MAX_DATA_LENGTH];
	new UserName[MAX_NAME_LENGTH];
	new iSelect;
  	convert_string(HLData,Data,MAX_DATA_LENGTH);
	convert_string(HLUserName,UserName,MAX_NAME_LENGTH);
 
	if(g_UserMenu[UserIndex]!=0){
		iSelect=strtonum(Data);
 
		/*NEXT*/
		if(iSelect==8){
			g_UserSelectLoop[UserIndex]=g_UserSelectLoop[UserIndex]+ITEMS_PER_PAGE;
			second_menu(UserName,UserIndex,g_UserMenu[UserIndex]);
		/*BACK*/
		}else if(iSelect==9){
			g_UserSelectLoop[UserIndex]=g_UserSelectLoop[UserIndex]-ITEMS_PER_PAGE;
			second_menu(UserName,UserIndex,g_UserMenu[UserIndex]);
		/*CANCEL*/
		}else if(iSelect==10){
			if(g_UserMenu[UserIndex]==MAINMENU){
				reset_array(UserIndex);
			}else if(g_UserMenu[UserIndex]>MAINMENU && g_UserMenu[UserIndex]< PLAYERSELECT){
				reset_array(UserIndex);
				main_menu(UserName,UserIndex);
			}else if(g_UserMenu[UserIndex]>=PLAYERSELECT && g_UserMenu[UserIndex]<EXECUTEMENU){
				g_UserSelectLoop[UserIndex]=1;
				strinit(g_UserCommandData[UserIndex]);
				if(g_UserLastMenu[UserIndex]==PLAYERSELECT){
					reset_array(UserIndex);
					main_menu(UserName,UserIndex);
					return PLUGIN_CONTINUE;
				}else if(g_UserLastMenu[UserIndex]==MAPSELECT){
					g_UserLastMenu[UserIndex]=MAPMENU;
				}
				second_menu(UserName,UserIndex,g_UserLastMenu[UserIndex]);
			}else if(g_UserMenu[UserIndex]==EXECUTEMENU){
				g_UserSelectLoop[UserIndex]=g_UserLastSelectLoop[UserIndex];
				g_UserMessageMode[UserIndex]=0;
				strinit(g_UserCommandData[UserIndex]);
				second_menu(UserName,UserIndex,g_UserLastMenu[UserIndex]);
			}				
		}else{
			if(g_UserMenu[UserIndex]==MAINMENU){
				iSelect+=1;
				switch(iSelect){
					case PLAYERMENU:{
						g_UserLastMenu[UserIndex]=PLAYERSELECT;
						strcpy(g_UserCommand[UserIndex],"admin_war_set rules",MAX_COMMAND_LENGTH);
						second_menu(UserName,UserIndex,PLAYERSELECT);
					}
					case MAPMENU:{
						second_menu(UserName,UserIndex,MAPMENU);
					}
					case SERVERMENU:{
						strcpy(g_UserCommand[UserIndex],"admin_war_set",MAX_COMMAND_LENGTH);
						second_menu(UserName,UserIndex,SERVERMENU);
					}
					case VOTEMENU:{
						second_menu(UserName,UserIndex,VOTEMENU);
					}
					case DISPLAY:{
						second_menu(UserName,UserIndex,DISPLAY);
					}
				}
			}else if(g_UserMenu[UserIndex]==MAPMENU){
				g_UserLastMenu[UserIndex]=MAPMENU;
				g_UserLastSelectLoop[UserIndex]=g_UserSelectLoop[UserIndex];
				if(g_UserSelectLoop[UserIndex]>=5){
					strcpy(g_UserCommand[UserIndex],g_MapCommands[g_UserSelectLoop[UserIndex]+iSelect-1],MAX_COMMAND_LENGTH);
				}else{
					strcpy(g_UserCommand[UserIndex],g_MapCommands[iSelect],MAX_COMMAND_LENGTH);
				}
				g_UserSelectLoop[UserIndex]=1;
				second_menu(UserName,UserIndex,MAPSELECT);
 
			}else if(g_UserMenu[UserIndex]==SERVERMENU){
				g_UserLastMenu[UserIndex]=SERVERMENU;
				g_UserLastSelectLoop[UserIndex]=g_UserSelectLoop[UserIndex];
				if(g_UserSelectLoop[UserIndex]>=5){
					strcpy(g_UserCommandData[UserIndex],g_ServerCommands[g_UserSelectLoop[UserIndex]+iSelect-1],MAX_COMMAND_LENGTH);
				}else{
					strcpy(g_UserCommandData[UserIndex],g_ServerCommands[iSelect],MAX_COMMAND_LENGTH);
				}
				messagemode_menu(UserName,UserIndex);
 
			}else if(g_UserMenu[UserIndex]==VOTEMENU){
				g_UserLastMenu[UserIndex]=VOTEMENU;
				g_UserLastSelectLoop[UserIndex]=g_UserSelectLoop[UserIndex];
				if(g_UserSelectLoop[UserIndex]>=5){
					strcpy(g_UserCommand[UserIndex],g_VoteCommands[g_UserSelectLoop[UserIndex]+iSelect-1],MAX_COMMAND_LENGTH);
				}else{
					strcpy(g_UserCommand[UserIndex],g_VoteCommands[iSelect],MAX_COMMAND_LENGTH);
				}
				strbreak(g_UserCommand[UserIndex],g_UserCommand[UserIndex],g_UserCommandData[UserIndex],MAX_COMMAND_LENGTH);
				messagemode_menu(UserName,UserIndex);
 
			}else if(g_UserMenu[UserIndex]==DISPLAY){
				reset_array(UserIndex);
				main_menu(UserName,UserIndex);				
			}else if(g_UserMenu[UserIndex]==PLAYERSELECT){
				g_UserLastMenu[UserIndex]=PLAYERSELECT;
				g_UserLastSelectLoop[UserIndex]=g_UserSelectLoop[UserIndex];
				if(g_UserSelectLoop[UserIndex]>=5){
					strcpy(g_UserCommandData[UserIndex],g_PlayerCommands[g_UserSelectLoop[UserIndex]+iSelect-1],MAX_COMMAND_LENGTH);
				}else{
					strcpy(g_UserCommandData[UserIndex],g_PlayerCommands[iSelect],MAX_COMMAND_LENGTH);
				}
				messagemode_menu(UserName,UserIndex);
 
			}else if(g_UserMenu[UserIndex]==MAPSELECT){
				g_UserLastMenu[UserIndex]=MAPSELECT;
				g_UserLastSelectLoop[UserIndex]=g_UserSelectLoop[UserIndex];
				if(g_UserSelectLoop[UserIndex]>=5){
					strcpy(g_UserCommandData[UserIndex],g_Maps[g_UserSelectLoop[UserIndex]+iSelect-1],MAX_NAME_LENGTH);
				}else{
					strcpy(g_UserCommandData[UserIndex],g_Maps[iSelect],MAX_NAME_LENGTH);
				}
				messagemode_menu(UserName,UserIndex);
 
			}else if(g_UserMenu[UserIndex]==EXECUTEMENU){
				if(iSelect==1){
					exec_command(UserName,UserIndex);
				}				
			}
		}
	}
	return PLUGIN_CONTINUE;
}
 
 
exec_command(UserName[],UserIndex){
	new Text[MAX_TEXT_LENGTH];
	new Command[MAX_COMMAND_LENGTH];
	new Param[MAX_DATA_LENGTH];
	strsep(g_UserCommand[UserIndex]," ",Command,MAX_COMMAND_LENGTH,Param,MAX_DATA_LENGTH);
	if(strlen(Param)!=0 && strlen(g_UserCommandData[UserIndex])!=0){
		snprintf(Param,MAX_DATA_LENGTH,"%s %s",Param,g_UserCommandData[UserIndex]);
	}else if(strlen(Param)==0 && strlen(g_UserCommandData[UserIndex])!=0){
		snprintf(Param,MAX_DATA_LENGTH,"%s",g_UserCommandData[UserIndex]);
	}	
	plugin_exec(Command,Param);
 
	snprintf(Text,MAX_TEXT_LENGTH,"[CWC-MENU] %s: %s %s executed!",UserName,Command,Param);
	messageex(UserName,Text,print_chat);
	log(Text);
	reset_array(UserIndex);
	main_menu(UserName,UserIndex);
}
 
 
reset_array(UserIndex){
	g_UserMenu[UserIndex]=0;
	g_UserLastMenu[UserIndex]=0;
	g_UserLastSelectLoop[UserIndex]=1;
	g_UserMessageMode[UserIndex]=0;
	g_UserSelectLoop[UserIndex]=1;
	strinit(g_UserCommand[UserIndex]);
	strinit(g_UserCommandData[UserIndex]);
}