//===== eAthena Script =======================================
//= User Account Editor
//===== By ===================================================
//= lllchrislll
//===== Version ==============================================
//= 1.0 - Script Made
//		- Added Reset Equip
//		- Added Change Slot
//		- Fixed Change Slot Bug
//        Changed from Menu > input
//= 1.1 - Fixxed minor Bugs
//= 1.2 - Fixxed small bug, Showing Online Player was bugged
//		- Also reversed order of menu outputs (was pissing me off q.q)
//===== Compatible With ======================================
//= Every eAthena Version
//===== Description ==========================================
//= This Script allows Player's editing their Account in-Game
//  like an Control Panel.
//= For GM's over Level 40:
//- View Server Statistic
//- View your own Account - Same as Player
//- View other Char's Account Details by typing
//  the name of an character bounded to it; such us E-Mail, IP,
//  for GM's with Level 80 and higher Username and Account ID as well
//===== Comments =============================================
//= .@max_ch: Max Characters per Account, please
//  put the number you have or the Slot Change Part
//  won't work like it should.
//  For Renewal Servers : src/common/mmo.h > #define MAX_CHARS
//  Don't know for older servers anymore though.
//============================================================
help_lobby,59,140,6	script	In-Game CP	110,{
	set .@max_ch,21; // Max Characters per Account
	set .@n$,"^55AA88[Control Panel]^000000";
	
	mes .@n$;
	mes "Hello, " + strcharinfo(0);
	mes "I can tell you your Account";
	mes "Settings, as well I can";
	mes "change them for you.";
	mes "What do you like to do?";
	next;
	if(getgmlevel() >= 40) goto GM_Menu;
	menu "- Show my Info",CP_My,"- Nothing",CP_Quit;
	close;

//================== GM_Menu ==================
GM_Menu:
	if(select("- View Players Account's:- View my Account:- View Server Statistic") == 1) {

//===================== View other Player's Account =====================		
	mes .@n$;
	mes "Please type the character";
	mes "name you want and I'll find the";
	mes "Account bounded to it.";
	input @s_char$;
	next;
	mes .@n$;
	if(@s_char$ == "") { mes "Character Name is invalid."; close;}
	query_sql "SELECT `account_id` FROM `char` WHERE `name` = '"+@s_char$+"'",@s_accid;
	if(!@s_accid) { mes "Character Name is invalid."; close;}
	query_sql "SELECT `userid` , `sex` , `email` , `logincount` , `last_ip` FROM `login` WHERE `account_id` = '"+@s_accid+"'",@user$,@sex$,@email$,@login,@last_ip$;
	if(getgmlevel() >= 80) {
		mes "Username: " + @user$;
		mes "Account ID: " + @s_accid;
	}
	mes "Gender: " + @sex$;
	mes "E-Mail: " + @email$;
	mes "Login Count: " + @login;
	mes "Last IP: " + @last_ip$;
	mes " ";
	mes "Duo user protection";
	mes ((getgmlevel() >= 80) ? "the Password" : "the Username, Account ID and Password");
	mes "won't be shown.";
	close;
	
//================= View my Account =============
} else if(@menu == 2) {
CP_My:
	query_sql "SELECT `userid` , `sex` , `email` , `logincount` , `last_ip` FROM `login` WHERE `account_id` = '"+getcharid(3)+"'",@user$,@sex$,@email$,@login,@last_ip$;
	mes .@n$;
	mes "Username: " + @user$;
	mes "Account ID: " + getcharid(3);
	mes "Gender: " + @sex$;
	mes "E-Mail: " + @email$;
	mes "Login Count: " + @login;
	mes "Your IP: " + @last_ip$;
	mes " ";
	mes "Duo user protection";
	mes "the password won't be shown.";
	mes "What now?";
	next;
	switch(select("- View Char's:- Edit E-Mail:- Edit Gender:- Nothing")) {
		
//============== View Char's ============
		case 1:
		mes .@n$;
		mes "Choose a character, if you";
		mes "want to change something.";
		query_sql "SELECT `char_num` , `name` , `class` , `base_level` , `job_level` , `zeny` , `str` , `agi` , `vit` , `int` , `dex` , `luk` , `last_map` , `last_x` , `last_y` , `save_map` , `save_x` , `save_y` FROM `char` WHERE `account_id` = '"+getcharid(3)+"' ORDER BY `base_level` DESC",@char_num,@name$,@class,@base_level,@job_level,@zeny,@str,@agi,@int,@vit,@dex,@luk,@last_map$,@last_x,@last_y,@save_map$,@save_x,@save_y;
		set @menu$,"";
		mes " ";
		set @menu$,"- " + @name$[0] + "";
		mes "^FF0000~ "+@name$[0]+" ~^000000";
		mes "---------------------";
		mes "[Base/Job: " + @base_level[0] + "/" + @job_level[0] + "]";
		mes "(Class: " + jobname(@class[0]) + ")";
		mes "=====================";
		for( set @a,1; @a < getarraysize(@name$); set @a,@a + 1) {
			mes "^FF0000~ "+@name$[@a]+" ~^000000";
			mes "---------------------";
			mes "[Base/Job: " + @base_level[@a] + "/" + @job_level[@a] + "]";
			mes "(Class: " + jobname(@class[@a]) + ")";
			mes "=====================";
			set @menu$,@menu$ + ":- " + @name$[@a] + "";
		}
		next;
		if((prompt(@menu$) - getarraysize(@name$)) > 0) {
			close;
		} else {
			set @m,@menu - 1;
			
			mes .@n$;
			mes "You have chosen:";
			mes "^FF0000~ "+@name$[@m]+" ~^000000";
			mes "Base/Job: " + @base_level[@m] + "/" + @job_level[@m];
			mes "Class: " + jobname(@class[@m]);
			mes "Zeny: " + @zeny[@m];
			mes " ";
			mes "Strenght: " + @str[@m];
			mes "Agility: " + @agi[@m];
			mes "Vitality: " + @vit[@m];
			mes "Intelligence: " + @int[@m];
			mes "Dexterity: " + @dex[@m];
			mes "Luck: " + @luk[@m];
			mes " ";
			mes "Position:";
			mes "Current Map: " + @last_map$[@m];
			mes "Cooardinates x: " + @last_x[@m] + ", y: " + @last_y[@m];
			mes " ";
			mes "Savepoint:";
			mes "Map: "+ @save_map$[@m] + " x: " + @save_x[@m] + ", y: " + @save_y[@m];
			mes "What do you want to do?";
			next;
			switch(select("- Reset Position:- Reset Style:- Change Slot:- Reset Equip:- Nothing")) {
			
//=============================== Reset Position ============================
				case 1:
				mes .@n$;
				query_sql "SELECT `online` FROM `char` WHERE `name` = '"+escape_sql(@name$[@m])+"'",@online;
				if(@online) {
					mes "I'm sorry, but I can't reset the";
					mes "position of the chosen character";
					mes "while you are logged-in on it.";
					close;
					}
				mes "I will reset the position now.";
				query_sql "UPDATE `char` SET `last_map` =  '"+@save_map$[@m]+"' , `last_x` = '"+@save_x[@m]+"' , `last_y` = '"+@save_y[@m]+"' WHERE `name` = '"+escape_sql(@name$[@m])+"'";
				close;
				
//=============================== Reset Style ============================					
				case 2:
				mes .@n$;
				mes "This will reset your";
				mes "whole style.";
				next;
				if(select("- Proceed:- Stop!!") - 1) {
					mes .@n$;
					mes "As you wish.";
					mes "Your request has been canceled.";
					close;
				} else {
					mes .@n$;
					query_sql "SELECT `online` FROM `char` WHERE `name` = '"+escape_sql(@name$[@m])+"'",@online;
					if(@online) {
						mes "I'm sorry, but I can't reset the";
						mes "style of the chosen character";
						mes "while you are logged-in on it.";
						close;
					}
					query_sql "UPDATE `char` SET `hair` , `hair_color` , `clothes_color` = '0' , '0' , '0' WHERE `name` = '"+escape_sql(@name$[@m])+"'";
					mes "Your request has been completed.";
					close;
				}
				
//=============================== Change Character Slot ============================					
				case 3:
				set @menu_c$,"";
				mes .@n$;
				mes "The slots, which are used:";
				mes " ";
				for( set @num,0; @num < getarraysize(@char_num); set @num,@num + 1) {
					mes @char_num[@num] + ". " + @name$[@num];
				}
				mes " ";
				mes "Into which Slot do you want to change?";
				next;
				input @num_ch;
				
				mes .@n$;
				if(@num_ch > .@max_ch) {
					mes "I'm sorry, but you";
					mes "have put an invalid";
					mes "number. Try again please.";
					close;
				}
				mes "You have chosen:";
				mes @num_ch + ".";
				mes " ";
				mes "I will change the slot now.";
				mes "Is that correct?";
				if(select("- Yes, continue:- No, wrong") - 1) {
					close;
				} else {
					next;
					mes .@n$;
					query_sql "SELECT `online` FROM `char` WHERE `name` = '"+escape_sql(@name$[@m])+"'",@online;
					if(@online) {
						mes "I'm sorry, but I can't change the";
						mes "Slot of the chosen character";
						mes "while you are logged-in on it.";
						close;
					}
					for(set @n_ct,0; @n_ct < getarraysize(@char_num); set @n_ct,@n_ct + 1) {
						if(@char_num[@n_ct] == @num_ch) {
							mes "I'm sorry, but this";
							mes "Slot is in use already.";
							mes "Try again please.";
							close;
						}
					}
					query_sql "UPDATE `char` SET `char_num` = '"+@num_ch+"' WHERE `name` = '"+escape_sql(@name$[@m])+"'";
					mes "Your request has been completed.";
					close;
				}
//================================ Reset Equip ===============================
				case 4:
				mes .@n$;
				mes "Wanna reset your Equip?";
				if(select("- Yes, please:- No, thanks") - 1) {
					close;
				} else {
					next;
					mes .@n$;
					query_sql "SELECT `online` FROM `char` WHERE `name` = '"+@name$[@m]+"'",@online;
					if(@online) {
						mes "I'm sorry, but I can't reset";
						mes "your equipment of this character";
						mes "while you are logged-in on it.";
						close;
					}
					mes "I will start now.";
					query_sql "UPDATE `inventory` SET `equip` = '0' WHERE `char_id` = '"+getcharid(0,escape_sql(@name$[@m]))+"'";
					query_sql "UPDATE `char` SET `weapon` = '0' , `shield` = '0' , `head_top` = '0' , `head_mid` = '0' , `head_bottom`  = '0' WHERE `name` = '"+escape_sql(@name$[@m])+"'";
					next;
					mes .@n$;
					mes "Your request has been completed.";
					close;
				}
//===================== Nothing =====================					
				case 5:
				goto CP_Quit;
				break;
			} // Edit Char - End

		} // Choose Char - End 
//============== Edit Mail ============			
		case 2:
		mes .@n$;
		mes "Now input the new E-Mail";
		mes "Address:";
		mes "Note: Type 'Cancel' for";
		mes "aborting your attempt.";
		next;
		input @mail_n$;
		if(@mail_n$ == "Cancel") goto CP_Quit;
		mes .@n$;
		mes "Old E-Mail:" +@email$;
		mes "New E-Mail:" +@mail_n$;
		mes " ";
		mes "Is that correct?";
		next;
		if(select("- Yes, proceed please:- No, cancel it") - 1) {
			mes .@n$;
			mes "As you wish.";
			mes "Your request has been canceled.";
			close;
		} else {
			mes .@n$;
			mes "You're E-Mail will be changed now.";
			next;
			query_sql "UPDATE `login` SET `email` = '"+escape_sql(@mail_n$)+"' WHERE `account_id` = '"+getcharid(3)+"'";
			mes .@n$;
			mes "Your request has been completed.";
			close;
		}
//============== Edit Gender - 1 Month delay ============			
		case 3:
		mes .@n$;
		if(gettimetick(2) < #sexch) {
			mes "You can't change your";
			mes "gender again. The time left:";
			mes #sexch - gettimetick(2) + " Seconds.";
			close;
		}
		mes "Note: Delay between changing your";
		mes "gender again is one month.";
		mes "Wanna still change it?";
		next;
		if(select("- Yes, proceed please:- No, cancel it") - 1) {
			mes .@n$;
			mes "As you wish.";
			mes "Your request has been canceled.";
			close;
		} else {
			mes .@n$;
			mes "You're gender will be changed now,";
			mes "you'll be kicked afterwards.";
			next;
			mes .@n$;
			mes "Your request has been completed.";
			close2;
			set #sexch,gettimetick(2) + 2592000;
			changesex;
			end;
		}
//===================== Nothing =====================			
		case 4:
		goto CP_Quit;
		break;
	}
	
} else if(@menu == 3) {
//=============== Server Statistic ===================
	query_sql "SELECT count(*) FROM `login` WHERE `account_id` > 1",.@count_acc;
	query_sql "SELECT count(*) FROM `char`",.@count_char;
	query_sql "SELECT `zeny` FROM `char` WHERE `zeny` > 0",.@count_zeny;
	for( set .@z,0; .@z < getarraysize(.@count_zeny); set .@z,.@z + 1) 
		set .@total_zeny,.@total_zeny + .@count_zeny[.@z];
	next;
	mes .@n$;
	mes "Total Accounts: " + .@count_acc;
	mes "Total Characters: " + .@count_char;
	mes "Total Zeny: " + .@total_zeny;
	next;
	menu "Show Online Players",-,"Nothing",CP_Quit;
		mes .@n$;
		mes "I will now show the list of the";
		mes "Online Players	in your Chat Box.";
		close2;
		dispbottom "======~-[)* Online <Ü> Players *(]~-========";
		query_sql "SELECT `name` , `class` , `base_level` , `job_level` FROM `char` WHERE `online` = '1'",.@name$,.@class,.@b_level,.@j_level;
		for( set .@a,0; .@a < getarraysize(.@name$); set .@a,.@a + 1) 
			dispbottom .@name$[.@a] + " [Base/Job: " + .@b_level[.@a] + "/" + .@j_level[.@a] + "] (Class: " + jobname(.@class[.@a]) + ")";
			
		end;
}
//=================== Quit Message ==================
CP_Quit:
	mes .@n$;
	mes "Farewell, " + strcharinfo(0);
	close;
}