Browse Source

* Fixed memleak when use `@set` command for string type variable.
* Removed `0x2715` and `logchrif_parse_updmail`, not being used that was duplicated by `logchrif_parse_reqchangemail` (`0x2722`).
* Changed packet header `0x2736` to `0x2b13` of `chrif_update_ip` from map-server to char-server. That was ambiguous with `0x2736` of `logchrif_parse_updcharip` that being used by char-server to login-server.
* Changed packet header `0x3804` to `0x2726`, the one that being used to send back global account reg from login-server to char-server. That was ambiguous with `0x3804` that being used by char-server (was inter actually) to map-server.
* Some indent clean up as result from char & login server refactor.

Signed-off-by: Cydh Ramdh <cydh@pservero.com>

Cydh Ramdh 9 years ago
parent
commit
631747bb07

+ 24 - 15
doc/packet_interserv.txt

@@ -75,16 +75,7 @@ Currently the max packet size is 0xFFFF (see 'WFIFOSET()' in 'src/common/socket.
 		- Retrieve the number of user present on a char-serv
 
 0x2715:
-	Type: HA
-	Structure: <cmd>.W <aid>.L <email>40B
-	index: 0,2,6
-	len: 46
-	parameter:
-		- cmd : packet identification (0x2715)
-		- aid: account identification
-		- email: new email for account id
-	desc:
-		- Request to update the email linked to this aid
+	free
 
 0x2716:
 	Type: HA
@@ -234,7 +225,24 @@ Currently the max packet size is 0xFFFF (see 'WFIFOSET()' in 'src/common/socket.
 		- Receiving of map-server via char-server a ban request (alter the ban time)
 
 0x2726:
-    free
+	Type: AH
+	Structure: <cmd>.W <len>.W <aid>.L <cid>.L <?>.B <type>.B <count>.W { <keyLength>.B <key>.<keyLength> <index>.L <valLength>.B <val>.<valLength> }*
+	index: 0,2,4,8,12,13,14,16,...
+	len: variable
+	parameter:
+		- cmd : packet identification (0x2726)
+		- ?
+		- aid
+		- cid
+		- type
+		- count
+		- keyLength
+		- key
+		- index
+		- val
+		- valLength
+	desc:
+		- Send global account registry
 
 0x2727:
 	Type: HA
@@ -385,7 +393,8 @@ Currently the max packet size is 0xFFFF (see 'WFIFOSET()' in 'src/common/socket.
 	parameter:
 		- cmd : packet identification (0x2735
 	desc:
-		- ip address update signal from login server
+		- IP address update signal from login server.
+		- Send back the IP of char server to login-server if IP was changed.
 
 0x2736:
 	Type: HA
@@ -1441,10 +1450,10 @@ Currently the max packet size is 0xFFFF (see 'WFIFOSET()' in 'src/common/socket.
 		- Parse whisper to GM
 
 0x3804
-	Type: AH
+	Type: HZ
 	Structure: <cmd>.W <len>.W <aid>.L <cid>.L <?>.B <type>.B <count>.W { <keyLength>.B <key>.<keyLength> <index>.L <valLength>.B <val>.<valLength> }*
 	index: 0,2,4,8,12,13,14,16,...
-	len: variable: 13 or p (Max=5013)
+	len: variable
 	parameter:
 		- cmd : packet identification (0x3804)
 		- ?
@@ -1458,7 +1467,7 @@ Currently the max packet size is 0xFFFF (see 'WFIFOSET()' in 'src/common/socket.
 		- val
 		- valLength
 	desc:
-		- Account registry transfer to map-server
+		- Send global account registry to map-server from login-server
 
 0x3806
 	Type: IZ

+ 173 - 178
src/char/char_clif.c

@@ -871,55 +871,54 @@ void chclif_refuse_delchar(int fd, uint8 errCode){
 }
 
 int chclif_parse_delchar(int fd,struct char_session_data* sd, int cmd){
-    if (cmd == 0x68) FIFOSD_CHECK(46)
-    else if (cmd == 0x1fb) FIFOSD_CHECK(56)
-    else return 0;
-    {
-        char email[40];
-        int i, ch;
-        int cid = RFIFOL(fd,2);
-
-        ShowInfo(CL_RED"Request Char Deletion: "CL_GREEN"%d (%d)"CL_RESET"\n", sd->account_id, cid);
-        memcpy(email, RFIFOP(fd,6), 40);
-        RFIFOSKIP(fd,( cmd == 0x68) ? 46 : 56);
-
-        // Check if e-mail is correct
-        if(strcmpi(email, sd->email) && //email does not matches and
-        (
-                strcmp("a@a.com", sd->email) || //it is not default email, or
-                (strcmp("a@a.com", email) && strcmp("", email)) //email sent does not matches default
-        )) {	//Fail
-		chclif_refuse_delchar(fd,0); // 00 = Incorrect Email address
-                return 1;
-        }
-
-        // check if this char exists
-        ARR_FIND( 0, MAX_CHARS, i, sd->found_char[i] == cid );
-        if( i == MAX_CHARS )
-        { // Such a character does not exist in the account
-		chclif_refuse_delchar(fd,0);
-                return 1;
-        }
-
-        // remove char from list and compact it
-        for(ch = i; ch < MAX_CHARS-1; ch++)
-                sd->found_char[ch] = sd->found_char[ch+1];
-        sd->found_char[MAX_CHARS-1] = -1;
-
-        /* Delete character */
-        if(char_delete_char_sql(cid)<0){
-                //can't delete the char
-                //either SQL error or can't delete by some CONFIG conditions
-                //del fail
-		chclif_refuse_delchar(fd,0);
-                return 1;
-        }
-        /* Char successfully deleted.*/
-        WFIFOHEAD(fd,2);
-        WFIFOW(fd,0) = 0x6f;
-        WFIFOSET(fd,2);
-    }
-    return 1;
+	if (cmd == 0x68) FIFOSD_CHECK(46)
+	else if (cmd == 0x1fb) FIFOSD_CHECK(56)
+	else return 0;
+	{
+		char email[40];
+		int i, ch;
+		int cid = RFIFOL(fd,2);
+
+		ShowInfo(CL_RED"Request Char Deletion: "CL_GREEN"%d (%d)"CL_RESET"\n", sd->account_id, cid);
+		memcpy(email, RFIFOP(fd,6), 40);
+		RFIFOSKIP(fd,( cmd == 0x68) ? 46 : 56);
+
+		// Check if e-mail is correct
+		if(strcmpi(email, sd->email) && //email does not matches and
+			(strcmp("a@a.com", sd->email) || //it is not default email, or
+			(strcmp("a@a.com", email) && strcmp("", email)) //email sent does not matches default
+			))
+		{	//Fail
+			chclif_refuse_delchar(fd,0); // 00 = Incorrect Email address
+			return 1;
+		}
+
+		// check if this char exists
+		ARR_FIND( 0, MAX_CHARS, i, sd->found_char[i] == cid );
+		if( i == MAX_CHARS ) { // Such a character does not exist in the account
+			chclif_refuse_delchar(fd,0);
+			return 1;
+		}
+
+		// remove char from list and compact it
+		for(ch = i; ch < MAX_CHARS-1; ch++)
+			sd->found_char[ch] = sd->found_char[ch+1];
+		sd->found_char[MAX_CHARS-1] = -1;
+
+		/* Delete character */
+		if(char_delete_char_sql(cid)<0){
+			//can't delete the char
+			//either SQL error or can't delete by some CONFIG conditions
+			//del fail
+			chclif_refuse_delchar(fd,0);
+			return 1;
+		}
+		/* Char successfully deleted.*/
+		WFIFOHEAD(fd,2);
+		WFIFOW(fd,0) = 0x6f;
+		WFIFOSET(fd,2);
+	}
+	return 1;
 }
 
 // R 0187 <account ID>.l
@@ -934,46 +933,45 @@ int chclif_parse_keepalive(int fd){
 // R 08fc <char ID>.l <new name>.24B
 // R 028d <account ID>.l <char ID>.l <new name>.24B
 int chclif_parse_reqrename(int fd, struct char_session_data* sd, int cmd){
-    int i, cid=0;
-    char name[NAME_LENGTH];
-    char esc_name[NAME_LENGTH*2+1];
-
-    if(cmd == 0x8fc){
-            FIFOSD_CHECK(30)
-            cid =RFIFOL(fd,2);
-            safestrncpy(name, (char *)RFIFOP(fd,6), NAME_LENGTH);
-            RFIFOSKIP(fd,30);
-    }
-    else if(cmd == 0x28d) {
-            int aid;
-            FIFOSD_CHECK(34);
-            aid = RFIFOL(fd,2);
-            cid =RFIFOL(fd,6);
-            safestrncpy(name, (char *)RFIFOP(fd,10), NAME_LENGTH);
-            RFIFOSKIP(fd,34);
-            if( aid != sd->account_id )
-                    return 1;
-    }
-
-    ARR_FIND( 0, MAX_CHARS, i, sd->found_char[i] == cid );
-    if( i == MAX_CHARS )
-            return 1;
-
-    normalize_name(name,TRIM_CHARS);
-    Sql_EscapeStringLen(sql_handle, esc_name, name, strnlen(name, NAME_LENGTH));
-    if( !char_check_char_name(name,esc_name) )
-    {
-            i = 1;
-            safestrncpy(sd->new_name, name, NAME_LENGTH);
-    }
-    else
-            i = 0;
-
-    WFIFOHEAD(fd, 4);
-    WFIFOW(fd,0) = 0x28e;
-    WFIFOW(fd,2) = i;
-    WFIFOSET(fd,4);
-    return 1;
+	int i, cid = 0;
+	char name[NAME_LENGTH];
+	char esc_name[NAME_LENGTH*2+1];
+
+	if(cmd == 0x8fc){
+		FIFOSD_CHECK(30)
+		cid =RFIFOL(fd,2);
+		safestrncpy(name, (char *)RFIFOP(fd,6), NAME_LENGTH);
+		RFIFOSKIP(fd,30);
+	}
+	else if(cmd == 0x28d) {
+		int aid;
+		FIFOSD_CHECK(34);
+		aid = RFIFOL(fd,2);
+		cid =RFIFOL(fd,6);
+		safestrncpy(name, (char *)RFIFOP(fd,10), NAME_LENGTH);
+		RFIFOSKIP(fd,34);
+		if( aid != sd->account_id )
+			return 1;
+	}
+
+	ARR_FIND( 0, MAX_CHARS, i, sd->found_char[i] == cid );
+	if( i == MAX_CHARS )
+		return 1;
+
+	normalize_name(name,TRIM_CHARS);
+	Sql_EscapeStringLen(sql_handle, esc_name, name, strnlen(name, NAME_LENGTH));
+	if( !char_check_char_name(name,esc_name) ) {
+		i = 1;
+		safestrncpy(sd->new_name, name, NAME_LENGTH);
+	}
+	else
+			i = 0;
+
+	WFIFOHEAD(fd, 4);
+	WFIFOW(fd,0) = 0x28e;
+	WFIFOW(fd,2) = i;
+	WFIFOSET(fd,4);
+	return 1;
 }
 
 
@@ -1037,61 +1035,61 @@ void chclif_block_character( int fd, struct char_session_data* sd){
 
 // 0x28f <char_id>.L
 int chclif_parse_ackrename(int fd, struct char_session_data* sd){
-    // 0: Successful
-    // 1: This character's name has already been changed. You cannot change a character's name more than once.
-    // 2: User information is not correct.
-    // 3: You have failed to change this character's name.
-    // 4: Another user is using this character name, so please select another one.
-    FIFOSD_CHECK(6)
-    {
-        int i;
-        int cid = RFIFOL(fd,2);
-        RFIFOSKIP(fd,6);
-
-        ARR_FIND( 0, MAX_CHARS, i, sd->found_char[i] == cid );
-        if( i == MAX_CHARS )
-                return 1;
-        i = char_rename_char_sql(sd, cid);
-
-        WFIFOHEAD(fd, 4);
-        WFIFOW(fd,0) = 0x290;
-        WFIFOW(fd,2) = i;
-        WFIFOSET(fd,4);
-    }
-    return 1;
+	// 0: Successful
+	// 1: This character's name has already been changed. You cannot change a character's name more than once.
+	// 2: User information is not correct.
+	// 3: You have failed to change this character's name.
+	// 4: Another user is using this character name, so please select another one.
+	FIFOSD_CHECK(6)
+	{
+		int i;
+		int cid = RFIFOL(fd,2);
+		RFIFOSKIP(fd,6);
+
+		ARR_FIND( 0, MAX_CHARS, i, sd->found_char[i] == cid );
+		if( i == MAX_CHARS )
+			return 1;
+		i = char_rename_char_sql(sd, cid);
+
+		WFIFOHEAD(fd, 4);
+		WFIFOW(fd,0) = 0x290;
+		WFIFOW(fd,2) = i;
+		WFIFOSET(fd,4);
+	}
+	return 1;
 }
 
 int chclif_ack_captcha(int fd){
-    WFIFOHEAD(fd,5);
-    WFIFOW(fd,0) = 0x7e9;
-    WFIFOW(fd,2) = 5;
-    WFIFOB(fd,4) = 1;
-    WFIFOSET(fd,5);
-    return 1;
+	WFIFOHEAD(fd,5);
+	WFIFOW(fd,0) = 0x7e9;
+	WFIFOW(fd,2) = 5;
+	WFIFOB(fd,4) = 1;
+	WFIFOSET(fd,5);
+	return 1;
 }
 
 // R 06C <ErrorCode>B HEADER_HC_REFUSE_ENTER
 void chclif_reject(int fd, uint8 errCode){
-    WFIFOHEAD(fd,3);
-    WFIFOW(fd,0) = 0x6c;
-    WFIFOB(fd,2) = errCode;// rejected from server
-    WFIFOSET(fd,3);
+	WFIFOHEAD(fd,3);
+	WFIFOW(fd,0) = 0x6c;
+	WFIFOB(fd,2) = errCode;// rejected from server
+	WFIFOSET(fd,3);
 }
 
 // R 07e5 <?>.w <aid>.l
 int chclif_parse_reqcaptcha(int fd){
-    //FIFOSD_CHECK(8)
-    RFIFOSKIP(fd,8);
-    chclif_ack_captcha(fd); 
-    return 1;
+	//FIFOSD_CHECK(8)
+	RFIFOSKIP(fd,8);
+	chclif_ack_captcha(fd); 
+	return 1;
 }
 
 // R 07e7 <len>.w <aid>.l <code>.b10 <?>.b14
 int chclif_parse_chkcaptcha(int fd){
-    //FIFOSD_CHECK(32)
-    RFIFOSKIP(fd,32);
-    chclif_ack_captcha(fd);
-    return 1;
+	//FIFOSD_CHECK(32)
+	RFIFOSKIP(fd,32);
+	chclif_ack_captcha(fd);
+	return 1;
 }
 
 /**
@@ -1102,15 +1100,13 @@ int chclif_parse_chkcaptcha(int fd){
 int chclif_parse(int fd) {
 	struct char_session_data* sd = (struct char_session_data*)session[fd]->session_data;
 	uint32 ipl = session[fd]->client_addr;
-    
+
 	// disconnect any player if no login-server.
 	if(login_fd < 0)
 		set_eof(fd);
 
-	if(session[fd]->flag.eof)
-	{
-		if( sd != NULL && sd->auth )
-		{	// already authed client
+	if(session[fd]->flag.eof) {
+		if( sd != NULL && sd->auth ) { // already authed client
 			DBMap *online_char_db = char_get_onlinedb();
 			struct online_char_data* data = (struct online_char_data*)idb_get(online_char_db, sd->account_id);
 			if( data != NULL && data->fd == fd)
@@ -1122,55 +1118,54 @@ int chclif_parse(int fd) {
 		return 0;
 	}
 
-	while( RFIFOREST(fd) >= 2 )
-	{
+	while( RFIFOREST(fd) >= 2 ) {
 		int next = 1;
 		unsigned short cmd;
 
 		cmd = RFIFOW(fd,0);
-		switch( cmd )
-		{
-		case 0x65: next=chclif_parse_reqtoconnect(fd,sd,ipl); break;
-		// char select
-		case 0x66: next=chclif_parse_charselect(fd,sd,ipl); break;
-		// createnewchar
-		case 0x970: next=chclif_parse_createnewchar(fd,sd,cmd); break;
-		case 0x67: next=chclif_parse_createnewchar(fd,sd,cmd); break;
-		// delete char
-		case 0x68: next=chclif_parse_delchar(fd,sd,cmd); break; //
-		case 0x1fb: next=chclif_parse_delchar(fd,sd,cmd); break; // 2004-04-19aSakexe+ langtype 12 char deletion packet
-		// client keep-alive packet (every 12 seconds)
-		case 0x187: next=chclif_parse_keepalive(fd); break;
-		// char rename
-		case 0x8fc: next=chclif_parse_reqrename(fd,sd,cmd); break; //request <date/version?>
-		case 0x28d: next=chclif_parse_reqrename(fd,sd,cmd); break; //request <date/version?>
-		case 0x28f: next=chclif_parse_ackrename(fd,sd); break; //Confirm change name.
-		// captcha
-		case 0x7e5: next=chclif_parse_reqcaptcha(fd); break; // captcha code request (not implemented)
-		case 0x7e7: next=chclif_parse_chkcaptcha(fd); break; // captcha code check (not implemented)
-		// deletion timer request
-		case 0x827: next=chclif_parse_char_delete2_req(fd, sd); break;
-		// deletion accept request
-		case 0x829: next=chclif_parse_char_delete2_accept(fd, sd); break;
-		// deletion cancel request
-		case 0x82b: next=chclif_parse_char_delete2_cancel(fd, sd); break;
-		// login as map-server
-		case 0x2af8: chclif_parse_maplogin(fd); return 0; // avoid processing of followup packets here
-		//pincode
-		case 0x8b8: next=chclif_parse_pincode_check( fd, sd ); break; // checks the entered pin
-		case 0x8c5: next=chclif_parse_reqpincode_window(fd,sd); break; // request for PIN window
-		case 0x8be: next=chclif_parse_pincode_change( fd, sd ); break; // pincode change request
-		case 0x8ba: next=chclif_parse_pincode_setnew( fd, sd ); break; // activate PIN system and set first PIN
-		// character movement request
-		case 0x8d4: next=chclif_parse_moveCharSlot(fd,sd); break;
-		case 0x9a1: next=chclif_parse_req_charlist(fd,sd); break;
-		// unknown packet received
-		default:
-			ShowError("parse_char: Received unknown packet "CL_WHITE"0x%x"CL_RESET" from ip '"CL_WHITE"%s"CL_RESET"'! Disconnecting!\n", RFIFOW(fd,0), ip2str(ipl, NULL));
-			set_eof(fd);
-			return 0;
+		switch( cmd ) {
+			case 0x65: next=chclif_parse_reqtoconnect(fd,sd,ipl); break;
+			// char select
+			case 0x66: next=chclif_parse_charselect(fd,sd,ipl); break;
+			// createnewchar
+			case 0x970: next=chclif_parse_createnewchar(fd,sd,cmd); break;
+			case 0x67: next=chclif_parse_createnewchar(fd,sd,cmd); break;
+			// delete char
+			case 0x68: next=chclif_parse_delchar(fd,sd,cmd); break; //
+			case 0x1fb: next=chclif_parse_delchar(fd,sd,cmd); break; // 2004-04-19aSakexe+ langtype 12 char deletion packet
+			// client keep-alive packet (every 12 seconds)
+			case 0x187: next=chclif_parse_keepalive(fd); break;
+			// char rename
+			case 0x8fc: next=chclif_parse_reqrename(fd,sd,cmd); break; //request <date/version?>
+			case 0x28d: next=chclif_parse_reqrename(fd,sd,cmd); break; //request <date/version?>
+			case 0x28f: next=chclif_parse_ackrename(fd,sd); break; //Confirm change name.
+			// captcha
+			case 0x7e5: next=chclif_parse_reqcaptcha(fd); break; // captcha code request (not implemented)
+			case 0x7e7: next=chclif_parse_chkcaptcha(fd); break; // captcha code check (not implemented)
+			// deletion timer request
+			case 0x827: next=chclif_parse_char_delete2_req(fd, sd); break;
+			// deletion accept request
+			case 0x829: next=chclif_parse_char_delete2_accept(fd, sd); break;
+			// deletion cancel request
+			case 0x82b: next=chclif_parse_char_delete2_cancel(fd, sd); break;
+			// login as map-server
+			case 0x2af8: chclif_parse_maplogin(fd); return 0; // avoid processing of followup packets here
+			//pincode
+			case 0x8b8: next=chclif_parse_pincode_check( fd, sd ); break; // checks the entered pin
+			case 0x8c5: next=chclif_parse_reqpincode_window(fd,sd); break; // request for PIN window
+			case 0x8be: next=chclif_parse_pincode_change( fd, sd ); break; // pincode change request
+			case 0x8ba: next=chclif_parse_pincode_setnew( fd, sd ); break; // activate PIN system and set first PIN
+			// character movement request
+			case 0x8d4: next=chclif_parse_moveCharSlot(fd,sd); break;
+			case 0x9a1: next=chclif_parse_req_charlist(fd,sd); break;
+			// unknown packet received
+			default:
+				ShowError("parse_char: Received unknown packet "CL_WHITE"0x%x"CL_RESET" from ip '"CL_WHITE"%s"CL_RESET"'! Disconnecting!\n", RFIFOW(fd,0), ip2str(ipl, NULL));
+				set_eof(fd);
+				return 0;
 		}
-		if(next==0) return 0; // avoid processing of followup packets (prev was probably incomplete)
+		if (next == 0)
+			return 0; // avoid processing of followup packets (prev was probably incomplete)
 	}
 
 	RFIFOFLUSH(fd);

+ 85 - 99
src/char/char_logif.c

@@ -20,19 +20,17 @@
 void chlogif_on_ready(void);
 void chlogif_on_disconnect(void);
 
-int chlogif_pincode_notifyLoginPinError( uint32 account_id ){
-	if (login_fd > 0 && session[login_fd] && !session[login_fd]->flag.eof){
+void chlogif_pincode_notifyLoginPinError( uint32 account_id ){
+	if ( chlogif_isconnected() ){
 		WFIFOHEAD(login_fd,6);
 		WFIFOW(login_fd,0) = 0x2739;
 		WFIFOL(login_fd,2) = account_id;
 		WFIFOSET(login_fd,6);
-		return 1;
 	}
-	return 0;
 }
 
-int chlogif_pincode_notifyLoginPinUpdate( uint32 account_id, char* pin ){
-	if (login_fd > 0 && session[login_fd] && !session[login_fd]->flag.eof){
+void chlogif_pincode_notifyLoginPinUpdate( uint32 account_id, char* pin ){
+	if ( chlogif_isconnected() ){
 		int size = 8 + PINCODE_LENGTH+1;
 		WFIFOHEAD(login_fd,size);
 		WFIFOW(login_fd,0) = 0x2738;
@@ -40,9 +38,7 @@ int chlogif_pincode_notifyLoginPinUpdate( uint32 account_id, char* pin ){
 		WFIFOL(login_fd,4) = account_id;
 		strncpy( (char*)WFIFOP(login_fd,8), pin, PINCODE_LENGTH+1 );
 		WFIFOSET(login_fd,size);
-		return 1;
 	}
-	return 0;
 }
 
 void chlogif_pincode_start(int fd, struct char_session_data* sd){
@@ -122,17 +118,14 @@ int chlogif_send_acc_tologin(int tid, unsigned int tick, int id, intptr_t data)
 	return 0;
 }
 
-int chlogif_send_usercount(int users){
-	if( login_fd > 0 && session[login_fd] )
-	{
-		// send number of user to login server
-		WFIFOHEAD(login_fd,6);
-		WFIFOW(login_fd,0) = 0x2714;
-		WFIFOL(login_fd,2) = users;
-		WFIFOSET(login_fd,6);
-		return 1;
-	}
-	return 0;
+void chlogif_send_usercount(int users){
+	if (!chlogif_isconnected())
+		return;
+	// send number of user to login server
+	WFIFOHEAD(login_fd,6);
+	WFIFOW(login_fd,0) = 0x2714;
+	WFIFOL(login_fd,2) = users;
+	WFIFOSET(login_fd,6);
 }
 
 
@@ -164,23 +157,30 @@ int chlogif_broadcast_user_count(int tid, unsigned int tick, int id, intptr_t da
 	return 0;
 }
 
-void chlogif_request_global_accreg(uint32 account_id, uint32 char_id) {
-	WFIFOHEAD(login_fd, 60000 + 300);
-	WFIFOW(login_fd, 0) = 0x2728;
-	WFIFOW(login_fd, 2) = 14;
-	WFIFOL(login_fd, 4) = account_id;
-	WFIFOL(login_fd, 8) = char_id;
-	WFIFOW(login_fd, 12) = 0; // count
+void chlogif_upd_global_accreg(uint32 account_id, uint32 char_id) {
+	if ( chlogif_isconnected() ){
+		WFIFOHEAD(login_fd, 60000 + 300);
+		WFIFOW(login_fd, 0) = 0x2728;
+		WFIFOW(login_fd, 2) = 14;
+		WFIFOL(login_fd, 4) = account_id;
+		WFIFOL(login_fd, 8) = char_id;
+		WFIFOW(login_fd, 12) = 0; // count
+	}
 }
 
 void chlogif_prepsend_global_accreg(void) {
-	WFIFOSET(login_fd, WFIFOW(login_fd,2));
+	if ( chlogif_isconnected() ){
+		WFIFOSET(login_fd, WFIFOW(login_fd,2));
+	}
 }
 
 void chlogif_send_global_accreg(const char *key, unsigned int index, intptr_t val, bool is_string) {
 	int nlen = WFIFOW(login_fd, 2);
 	size_t len;
 
+	if (!chlogif_isconnected())
+		return;
+
 	len = strlen(key)+1;
 
 	WFIFOB(login_fd, nlen) = (unsigned char)len; // won't be higher; the column size is 32
@@ -223,62 +223,53 @@ void chlogif_send_global_accreg(const char *key, unsigned int index, intptr_t va
 		int account_id = WFIFOL(login_fd,4), char_id = WFIFOL(login_fd,8);
 
 		chlogif_prepsend_global_accreg();
-		chlogif_request_global_accreg(account_id, char_id); // prepare next
+		chlogif_upd_global_accreg(account_id, char_id); // prepare next
 	}
 }
 
-int chlogif_request_accreg2(uint32 account_id, uint32 char_id){
-	if (login_fd > 0) {
-		WFIFOHEAD(login_fd,10);
-		WFIFOW(login_fd,0) = 0x272e;
-		WFIFOL(login_fd,2) = account_id;
-		WFIFOL(login_fd,6) = char_id;
-		WFIFOSET(login_fd,10);
-		return 1;
-	}
-	return 0;
+void chlogif_request_accreg2(uint32 account_id, uint32 char_id){
+	if (!chlogif_isconnected())
+		return;
+	WFIFOHEAD(login_fd,10);
+	WFIFOW(login_fd,0) = 0x272e;
+	WFIFOL(login_fd,2) = account_id;
+	WFIFOL(login_fd,6) = char_id;
+	WFIFOSET(login_fd,10);
 }
 
-int chlogif_send_reqaccdata(int fd, struct char_session_data *sd){
-        //loginif_isconnected
-	if (login_fd > 0) { // request account data
-		// request account data
-		WFIFOHEAD(fd,6);
-		WFIFOW(fd,0) = 0x2716;
-		WFIFOL(fd,2) = sd->account_id;
-		WFIFOSET(fd,6);
-		return 1;
-	}
-	return 0;
+void chlogif_send_reqaccdata(int fd, struct char_session_data *sd){
+	if (!chlogif_isconnected())
+		return;
+	WFIFOHEAD(fd,6);
+	WFIFOW(fd,0) = 0x2716;
+	WFIFOL(fd,2) = sd->account_id;
+	WFIFOSET(fd,6);
 }
 
-int chlogif_send_setacconline(int aid){
-        //loginif_isconnected
-	if (login_fd > 0 && !session[login_fd]->flag.eof){
-		WFIFOHEAD(login_fd,6);
-		WFIFOW(login_fd,0) = 0x272b;
-		WFIFOL(login_fd,2) = aid;
-		WFIFOSET(login_fd,6);
-		return 1;
-	}
-	return 0;
+void chlogif_send_setacconline(int aid){
+	if (!chlogif_isconnected())
+		return;
+	WFIFOHEAD(login_fd,6);
+	WFIFOW(login_fd,0) = 0x272b;
+	WFIFOL(login_fd,2) = aid;
+	WFIFOSET(login_fd,6);
 }
 
 void chlogif_send_setallaccoffline(int fd){
+	if (!chlogif_isconnected())
+		return;
 	WFIFOHEAD(fd,2);
 	WFIFOW(fd,0) = 0x2737;
 	WFIFOSET(fd,2);
 }
 
-int chlogif_send_setaccoffline(int fd, int aid){
-	if (chlogif_isconnected()){
-		WFIFOHEAD(fd,6);
-		WFIFOW(fd,0) = 0x272c;
-		WFIFOL(fd,2) = aid;
-		WFIFOSET(fd,6);
-		return 1;
-	}
-	return 0;
+void chlogif_send_setaccoffline(int fd, int aid){
+	if (!chlogif_isconnected())
+		return;
+	WFIFOHEAD(fd,6);
+	WFIFOW(fd,0) = 0x272c;
+	WFIFOL(fd,2) = aid;
+	WFIFOSET(fd,6);
 }
 
 int chlogif_parse_ackconnect(int fd, struct char_session_data* sd){
@@ -359,11 +350,11 @@ int chlogif_parse_reqaccdata(int fd, struct char_session_data* sd){
 		} else if ( !sd->char_slots )/* no value aka 0 in sql */
 			sd->char_slots = MIN_CHARS;/* cap to minimum */
 		safestrncpy(sd->birthdate, (const char*)RFIFOP(fd,52), sizeof(sd->birthdate));
-                safestrncpy(sd->pincode, (const char*)RFIFOP(fd,63), sizeof(sd->pincode));
-                sd->pincode_change = (time_t)RFIFOL(fd,68);
-                sd->isvip = RFIFOB(fd,72);
-                sd->chars_vip = RFIFOB(fd,73);
-                sd->chars_billing = RFIFOB(fd,74);
+		safestrncpy(sd->pincode, (const char*)RFIFOP(fd,63), sizeof(sd->pincode));
+		sd->pincode_change = (time_t)RFIFOL(fd,68);
+		sd->isvip = RFIFOB(fd,72);
+		sd->chars_vip = RFIFOB(fd,73);
+		sd->chars_billing = RFIFOB(fd,74);
 		ARR_FIND( 0, ARRAYLENGTH(map_server), server_id, map_server[server_id].fd > 0 && map_server[server_id].map[0] );
 		// continued from char_auth_ok...
 		if( server_id == ARRAYLENGTH(map_server) || //server not online, bugreport:2359
@@ -432,7 +423,7 @@ int chlogif_parse_ackchangesex(int fd, struct char_session_data* sd)
 {
 	if (RFIFOREST(fd) < 7)
 		return 0;
-	{
+	else {
 		unsigned char buf[7];
 		int acc = RFIFOL(fd,2);
 		int sex = RFIFOB(fd,6);
@@ -522,11 +513,11 @@ int chlogif_parse_ackchangecharsex(int char_id, int sex)
 	return 0;
 }
 
-int chlogif_parse_ackacc2req(int fd, struct char_session_data* sd){
+int chlogif_parse_ack_global_accreg(int fd, struct char_session_data* sd){
 	if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
 		return 0;
-
-	{	//Receive account_reg2 registry, forward to map servers.
+	else { //Receive account_reg2 registry, forward to map servers.
+		RFIFOW(fd,0) = 0x3804;
 		chmapif_sendall(RFIFOP(fd,0), RFIFOW(fd,2));
 		RFIFOSKIP(fd, RFIFOW(fd,2));
 	}
@@ -536,8 +527,7 @@ int chlogif_parse_ackacc2req(int fd, struct char_session_data* sd){
 int chlogif_parse_accbannotification(int fd, struct char_session_data* sd){
 	if (RFIFOREST(fd) < 11)
 		return 0;
-
-	{	// send to all map-servers to disconnect the player
+	else { // send to all map-servers to disconnect the player
 		unsigned char buf[11];
 		WBUFW(buf,0) = 0x2b14;
 		WBUFL(buf,2) = RFIFOL(fd,2);
@@ -554,7 +544,7 @@ int chlogif_parse_accbannotification(int fd, struct char_session_data* sd){
 int chlogif_parse_askkick(int fd, struct char_session_data* sd){
 	if (RFIFOREST(fd) < 6)
 		return 0;
-	{
+	else {
 		DBMap*  online_char_db = char_get_onlinedb();
 		DBMap*  auth_db = char_get_authdb();
 		int aid = RFIFOL(fd,2);
@@ -591,6 +581,10 @@ int chlogif_parse_updip(int fd, struct char_session_data* sd){
 	unsigned char buf[2];
 	uint32 new_ip = 0;
 
+	/**
+	 * !CHECKME: This is intended? Just tell if there's IP sync request
+	 * without sending current char IP (if changed) to map-server?
+	 **/
 	WBUFW(buf,0) = 0x2b1e;
 	chmapif_sendall(buf, 2);
 
@@ -599,8 +593,7 @@ int chlogif_parse_updip(int fd, struct char_session_data* sd){
 		charserv_config.login_ip = new_ip; //Update login ip, too.
 
 	new_ip = host2ip(charserv_config.char_ip_str);
-	if (new_ip && new_ip != charserv_config.char_ip)
-	{	//Update ip.
+	if (new_ip && new_ip != charserv_config.char_ip) { // Char-server IP is updated.
 		charserv_config.char_ip = new_ip;
 		ShowInfo("Updating IP for [%s].\n", charserv_config.char_ip_str);
 		// notify login server about the change
@@ -733,37 +726,30 @@ int chlogif_parse(int fd) {
 	sd = (struct char_session_data*)session[fd]->session_data;
 
 	while(RFIFOREST(fd) >= 2) {
-		int next=1;
+		// -1: Login server is not connected
+		//  0: Avoid processing followup packets (prev was probably incomplete) packet
+		//  1: Continue parsing
+		int next = 1;
 		uint16 command = RFIFOW(fd,0);
-		switch( command )
-		{
-			case 0x2743: next = chlogif_parse_vipack(fd); break;
-			// acknowledgement of connect-to-loginserver request
+		switch( command ) {
 			case 0x2711: next = chlogif_parse_ackconnect(fd,sd); break;
-			// acknowledgement of account authentication request
 			case 0x2713: next = chlogif_parse_ackaccreq(fd, sd); break;
-			// account data
 			case 0x2717: next = chlogif_parse_reqaccdata(fd, sd); break;
-			// login-server alive packet
 			case 0x2718: next = chlogif_parse_keepalive(fd, sd); break;
-			// changesex reply
+			case 0x2721: next = chlogif_parse_AccInfoAck(fd); break;
 			case 0x2723: next = chlogif_parse_ackchangesex(fd, sd); break;
-			// reply to an account_reg2 registry request
-			case 0x3804: next = chlogif_parse_ackacc2req(fd, sd); break;
-			// State change of account/ban notification (from login-server)
+			case 0x2726: next = chlogif_parse_ack_global_accreg(fd, sd); break;
 			case 0x2731: next = chlogif_parse_accbannotification(fd, sd); break;
-			// Login server request to kick a character out. [Skotlex]
 			case 0x2734: next = chlogif_parse_askkick(fd,sd); break;
-			// ip address update signal from login server
 			case 0x2735: next = chlogif_parse_updip(fd,sd); break;
-			// @accinfo result
-			case 0x2721: next = chlogif_parse_AccInfoAck(fd); break;
+			case 0x2743: next = chlogif_parse_vipack(fd); break;
 			default:
 				ShowError("Unknown packet 0x%04x received from login-server, disconnecting.\n", command);
 				set_eof(fd);
 				return 0;
 		}
-		if(next==0) return 0; //do not parse next data
+		if (next == 0)
+			return 0; //do not parse next data
 	}
 
 	RFIFOFLUSH(fd);

+ 10 - 9
src/char/char_logif.h

@@ -14,20 +14,21 @@
 extern "C" {
 #endif
 
-int chlogif_pincode_notifyLoginPinError( uint32 account_id );
-int chlogif_pincode_notifyLoginPinUpdate( uint32 account_id, char* pin );
+void chlogif_pincode_notifyLoginPinError( uint32 account_id );
+void chlogif_pincode_notifyLoginPinUpdate( uint32 account_id, char* pin );
 void chlogif_pincode_start(int fd, struct char_session_data* sd);
 int chlogif_send_acc_tologin(int tid, unsigned int tick, int id, intptr_t data);
 int chlogif_broadcast_user_count(int tid, unsigned int tick, int id, intptr_t data);
-int chlogif_send_usercount(int users);
-void chlogif_request_global_accreg(uint32 account_id, uint32 char_id);
+void chlogif_send_usercount(int users);
+void chlogif_upd_global_accreg(uint32 account_id, uint32 char_id);
 void chlogif_prepsend_global_accreg(void);
 void chlogif_send_global_accreg(const char *key, unsigned int index, intptr_t val, bool is_string);
-int chlogif_request_accreg2(uint32 account_id, uint32 char_id);
-int chlogif_send_reqaccdata(int fd, struct char_session_data *sd);
-int chlogif_send_setacconline(int aid);
+void chlogif_request_accreg2(uint32 account_id, uint32 char_id);
+void chlogif_send_reqaccdata(int fd, struct char_session_data *sd);
+void chlogif_send_setacconline(int aid);
 void chlogif_send_setallaccoffline(int fd);
-int chlogif_send_setaccoffline(int fd, int aid);
+void chlogif_send_setaccoffline(int fd, int aid);
+
 int chlogif_parse_ackconnect(int fd, struct char_session_data* sd);
 int chlogif_parse_ackaccreq(int fd, struct char_session_data* sd);
 int chlogif_parse_reqaccdata(int fd, struct char_session_data* sd);
@@ -35,7 +36,7 @@ int chlogif_parse_keepalive(int fd, struct char_session_data* sd);
 void chlogif_parse_change_sex_sub(int sex, int acc, int char_id, int class_, int guild_id);
 int chlogif_parse_ackchangesex(int fd, struct char_session_data* sd);
 int chlogif_parse_ackchangecharsex(int char_id, int sex);
-int chlogif_parse_ackacc2req(int fd, struct char_session_data* sd);
+int chlogif_parse_ack_global_accreg(int fd, struct char_session_data* sd);
 int chlogif_parse_accbannotification(int fd, struct char_session_data* sd);
 int chlogif_parse_askkick(int fd, struct char_session_data* sd);
 int chlogif_parse_updip(int fd, struct char_session_data* sd);

+ 89 - 90
src/char/char_mapif.c

@@ -278,7 +278,7 @@ int chmapif_parse_getmapname(int fd, int id){
 int chmapif_parse_askscdata(int fd){
 	if (RFIFOREST(fd) < 10)
 		return 0;
-	{
+	else {
 #ifdef ENABLE_SC_SAVING
 		int aid, cid;
 		aid = RFIFOL(fd,2);
@@ -351,7 +351,7 @@ int chmapif_parse_getusercount(int fd, int id){
 int chmapif_parse_regmapuser(int fd, int id){
 	if (RFIFOREST(fd) < 6 || RFIFOREST(fd) < RFIFOW(fd,2))
 		return 0;
-	{
+	else {
 		//TODO: When data mismatches memory, update guild/party online/offline states.
 		DBMap* online_char_db = char_get_onlinedb();
 		int i;
@@ -387,7 +387,7 @@ int chmapif_parse_regmapuser(int fd, int id){
 int chmapif_parse_reqsavechar(int fd, int id){
 	if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2))
 		return 0;
-	{
+	else {
 		int aid = RFIFOL(fd,4), cid = RFIFOL(fd,8), size = RFIFOW(fd,2);
 		struct online_char_data* character;
 		DBMap* online_char_db = char_get_onlinedb();
@@ -592,7 +592,7 @@ void chmapif_changemapserv_ack(int fd, bool nok){
 int chmapif_parse_reqchangemapserv(int fd){
 	if (RFIFOREST(fd) < 39)
 		return 0;
-	{
+	else {
 		int map_id, map_fd = -1;
 		struct mmo_charstatus* char_data;
 		struct mmo_charstatus char_dat;
@@ -662,7 +662,7 @@ int chmapif_parse_reqchangemapserv(int fd){
 int chmapif_parse_askrmfriend(int fd){
 	if (RFIFOREST(fd) < 10)
 		return 0;
-	{
+	else {
 		uint32 char_id, friend_id;
 		char_id = RFIFOL(fd,2);
 		friend_id = RFIFOL(fd,6);
@@ -862,7 +862,7 @@ int chmapif_parse_reqdivorce(int fd){
 int chmapif_parse_updmapinfo(int fd){
 	if( RFIFOREST(fd) < 14 )
 		return 0;
-	{
+	else {
 		char esc_server_name[sizeof(charserv_config.server_name)*2+1];
 		Sql_EscapeString(sql_handle, esc_server_name, charserv_config.server_name);
 		if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `%s` SET `index`='%d',`name`='%s',`exp`='%d',`jexp`='%d',`drop`='%d'",
@@ -998,99 +998,98 @@ int chmapif_parse_keepalive(int fd){
  * @return : 0 not enough data received, 1 success
  */
 int chmapif_parse_reqauth(int fd, int id){
-    if (RFIFOREST(fd) < 20)
-            return 0;
+	if (RFIFOREST(fd) < 20)
+		return 0;
+	else {
+		uint32 account_id;
+		uint32 char_id;
+		uint32 login_id1;
+		unsigned char sex;
+		uint32 ip;
+		struct auth_node* node;
+		struct mmo_charstatus* cd;
+		struct mmo_charstatus char_dat;
+		bool autotrade;
 
-    {
-        uint32 account_id;
-        uint32 char_id;
-        uint32 login_id1;
-        unsigned char sex;
-        uint32 ip;
-        struct auth_node* node;
-        struct mmo_charstatus* cd;
-        struct mmo_charstatus char_dat;
-        bool autotrade;
-
-        DBMap*  auth_db = char_get_authdb();
-        DBMap* char_db_ = char_get_chardb();
-
-        account_id = RFIFOL(fd,2);
-        char_id    = RFIFOL(fd,6);
-        login_id1  = RFIFOL(fd,10);
-        sex        = RFIFOB(fd,14);
-        ip         = ntohl(RFIFOL(fd,15));
-        autotrade  = RFIFOB(fd,19);
-        RFIFOSKIP(fd,20);
-
-        node = (struct auth_node*)idb_get(auth_db, account_id);
-        cd = (struct mmo_charstatus*)uidb_get(char_db_,char_id);
-        if( cd == NULL )
-        {	//Really shouldn't happen. (or autotrade)
-                char_mmo_char_fromsql(char_id, &char_dat, true);
-                cd = (struct mmo_charstatus*)uidb_get(char_db_,char_id);
-        }
-        if( runflag == CHARSERVER_ST_RUNNING && autotrade && cd ){
-            uint16 mmo_charstatus_len = sizeof(struct mmo_charstatus) + 25;
+		DBMap*  auth_db = char_get_authdb();
+		DBMap* char_db_ = char_get_chardb();
+
+		account_id = RFIFOL(fd,2);
+		char_id    = RFIFOL(fd,6);
+		login_id1  = RFIFOL(fd,10);
+		sex        = RFIFOB(fd,14);
+		ip         = ntohl(RFIFOL(fd,15));
+		autotrade  = RFIFOB(fd,19);
+		RFIFOSKIP(fd,20);
+
+		node = (struct auth_node*)idb_get(auth_db, account_id);
+		cd = (struct mmo_charstatus*)uidb_get(char_db_,char_id);
+		if( cd == NULL )
+		{	//Really shouldn't happen. (or autotrade)
+				char_mmo_char_fromsql(char_id, &char_dat, true);
+				cd = (struct mmo_charstatus*)uidb_get(char_db_,char_id);
+		}
+		if( runflag == CHARSERVER_ST_RUNNING && autotrade && cd ){
+			uint16 mmo_charstatus_len = sizeof(struct mmo_charstatus) + 25;
 			if (cd->sex == 99)
 				cd->sex = sex;
 
-            WFIFOHEAD(fd,mmo_charstatus_len);
-            WFIFOW(fd,0) = 0x2afd;
-            WFIFOW(fd,2) = mmo_charstatus_len;
-            WFIFOL(fd,4) = account_id;
-            WFIFOL(fd,8) = 0;
-            WFIFOL(fd,12) = 0;
-            WFIFOL(fd,16) = 0;
-            WFIFOL(fd,20) = 0;
-            WFIFOB(fd,24) = 0;
-            memcpy(WFIFOP(fd,25), cd, sizeof(struct mmo_charstatus));
-            WFIFOSET(fd, WFIFOW(fd,2));
-
-            char_set_char_online(id, char_id, account_id);
-        } else if( runflag == CHARSERVER_ST_RUNNING &&
-            cd != NULL &&
-            node != NULL &&
-            node->account_id == account_id &&
-            node->char_id == char_id &&
-            node->login_id1 == login_id1
-            //&& node->ip == ip
+			WFIFOHEAD(fd,mmo_charstatus_len);
+			WFIFOW(fd,0) = 0x2afd;
+			WFIFOW(fd,2) = mmo_charstatus_len;
+			WFIFOL(fd,4) = account_id;
+			WFIFOL(fd,8) = 0;
+			WFIFOL(fd,12) = 0;
+			WFIFOL(fd,16) = 0;
+			WFIFOL(fd,20) = 0;
+			WFIFOB(fd,24) = 0;
+			memcpy(WFIFOP(fd,25), cd, sizeof(struct mmo_charstatus));
+			WFIFOSET(fd, WFIFOW(fd,2));
+
+			char_set_char_online(id, char_id, account_id);
+		} else if( runflag == CHARSERVER_ST_RUNNING &&
+			cd != NULL &&
+			node != NULL &&
+			node->account_id == account_id &&
+			node->char_id == char_id &&
+			node->login_id1 == login_id1
+			//&& node->ip == ip
 #if PACKETVER < 20141016
 			&& node->sex == sex
 #endif
 			)
-        {// auth ok
-            uint16 mmo_charstatus_len = sizeof(struct mmo_charstatus) + 25;
+		{// auth ok
+			uint16 mmo_charstatus_len = sizeof(struct mmo_charstatus) + 25;
 			if (cd->sex == 99)
 				cd->sex = sex;
 
-            WFIFOHEAD(fd,mmo_charstatus_len);
-            WFIFOW(fd,0) = 0x2afd;
-            WFIFOW(fd,2) = mmo_charstatus_len;
-            WFIFOL(fd,4) = account_id;
-            WFIFOL(fd,8) = node->login_id1;
-            WFIFOL(fd,12) = node->login_id2;
-            WFIFOL(fd,16) = (uint32)node->expiration_time; // FIXME: will wrap to negative after "19-Jan-2038, 03:14:07 AM GMT"
-            WFIFOL(fd,20) = node->group_id;
-            WFIFOB(fd,24) = node->changing_mapservers;
-            memcpy(WFIFOP(fd,25), cd, sizeof(struct mmo_charstatus));
-            WFIFOSET(fd, WFIFOW(fd,2));
-
-            // only use the auth once and mark user online
-            idb_remove(auth_db, account_id);
-            char_set_char_online(id, char_id, account_id);
-        } else {// auth failed
-                WFIFOHEAD(fd,19);
-                WFIFOW(fd,0) = 0x2b27;
-                WFIFOL(fd,2) = account_id;
-                WFIFOL(fd,6) = char_id;
-                WFIFOL(fd,10) = login_id1;
-                WFIFOB(fd,14) = sex;
-                WFIFOL(fd,15) = htonl(ip);
-                WFIFOSET(fd,19);
-        }
-    }
-    return 1;
+			WFIFOHEAD(fd,mmo_charstatus_len);
+			WFIFOW(fd,0) = 0x2afd;
+			WFIFOW(fd,2) = mmo_charstatus_len;
+			WFIFOL(fd,4) = account_id;
+			WFIFOL(fd,8) = node->login_id1;
+			WFIFOL(fd,12) = node->login_id2;
+			WFIFOL(fd,16) = (uint32)node->expiration_time; // FIXME: will wrap to negative after "19-Jan-2038, 03:14:07 AM GMT"
+			WFIFOL(fd,20) = node->group_id;
+			WFIFOB(fd,24) = node->changing_mapservers;
+			memcpy(WFIFOP(fd,25), cd, sizeof(struct mmo_charstatus));
+			WFIFOSET(fd, WFIFOW(fd,2));
+
+			// only use the auth once and mark user online
+			idb_remove(auth_db, account_id);
+			char_set_char_online(id, char_id, account_id);
+		} else {// auth failed
+			WFIFOHEAD(fd,19);
+			WFIFOW(fd,0) = 0x2b27;
+			WFIFOL(fd,2) = account_id;
+			WFIFOL(fd,6) = char_id;
+			WFIFOL(fd,10) = login_id1;
+			WFIFOB(fd,14) = sex;
+			WFIFOL(fd,15) = htonl(ip);
+			WFIFOSET(fd,19);
+		}
+	}
+	return 1;
 }
 
 /**
@@ -1100,7 +1099,7 @@ int chmapif_parse_reqauth(int fd, int id){
  */
 int chmapif_parse_updmapip(int fd, int id){
 	if (RFIFOREST(fd) < 6) 
-            return 0;
+		return 0;
 	map_server[id].ip = ntohl(RFIFOL(fd, 2));
 	ShowInfo("Updated IP address of map-server #%d to %d.%d.%d.%d.\n", id, CONVIP(map_server[id].ip));
 	RFIFOSKIP(fd,6);
@@ -1450,7 +1449,6 @@ int chmapif_parse(int fd){
 	while(RFIFOREST(fd) >= 2){
 		int next=1;
 		switch(RFIFOW(fd,0)){
-			case 0x2736: next=chmapif_parse_updmapip(fd,id); break;
 			case 0x2afa: next=chmapif_parse_getmapname(fd,id); break;
 			case 0x2afc: next=chmapif_parse_askscdata(fd); break;
 			case 0x2afe: next=chmapif_parse_getusercount(fd,id); break; //get nb user
@@ -1465,6 +1463,7 @@ int chmapif_parse(int fd){
 			case 0x2b0e: next=chmapif_parse_fwlog_changestatus(fd); break;
 			case 0x2b10: next=chmapif_parse_updfamelist(fd); break;
 			case 0x2b11: next=chmapif_parse_reqdivorce(fd); break;
+			case 0x2b13: next=chmapif_parse_updmapip(fd,id); break;
 			case 0x2b15: next=chmapif_parse_req_saveskillcooldown(fd); break;
 			case 0x2b16: next=chmapif_parse_updmapinfo(fd); break;
 			case 0x2b17: next=chmapif_parse_setcharoffline(fd); break;

+ 1 - 1
src/char/inter.c

@@ -1119,7 +1119,7 @@ int mapif_parse_Registry(int fd)
 		bool isLoginActive = session_isActive(login_fd);
 
 		if( isLoginActive )
-			chlogif_request_global_accreg(account_id,char_id);
+			chlogif_upd_global_accreg(account_id,char_id);
 
 		for(i = 0; i < count; i++) {
 			unsigned int index;

+ 7 - 7
src/login/account.c

@@ -650,7 +650,7 @@ static bool mmo_auth_tosql(AccountDB_SQL* db, const struct mmo_account* acc, boo
 	return result;
 }
 
-void mmo_save_accreg2(AccountDB* self, int fd, int account_id, int char_id) {
+void mmo_save_global_accreg(AccountDB* self, int fd, int account_id, int char_id) {
 	Sql* sql_handle = ((AccountDB_SQL*)self)->accounts;
 	AccountDB_SQL* db = (AccountDB_SQL*)self;
 	int count = RFIFOW(fd, 12);
@@ -690,14 +690,14 @@ void mmo_save_accreg2(AccountDB* self, int fd, int account_id, int char_id) {
 						Sql_ShowDebug(sql_handle);
 					break;
 				default:
-					ShowError("mmo_save_accreg2: unknown type %d\n",RFIFOB(fd, cursor - 1));
+					ShowError("mmo_save_global_accreg: unknown type %d\n",RFIFOB(fd, cursor - 1));
 					return;
 			}
 		}
 	}
 }
 
-void mmo_send_accreg2(AccountDB* self, int fd, int account_id, int char_id) {
+void mmo_send_global_accreg(AccountDB* self, int fd, int account_id, int char_id) {
 	Sql* sql_handle = ((AccountDB_SQL*)self)->accounts;
 	AccountDB_SQL* db = (AccountDB_SQL*)self;
 	char* data;
@@ -708,7 +708,7 @@ void mmo_send_accreg2(AccountDB* self, int fd, int account_id, int char_id) {
 		Sql_ShowDebug(sql_handle);
 
 	WFIFOHEAD(fd, 60000 + 300);
-	WFIFOW(fd, 0) = 0x3804;
+	WFIFOW(fd, 0) = 0x2726;
 	// 0x2 = length, set prior to being sent
 	WFIFOL(fd, 4) = account_id;
 	WFIFOL(fd, 8) = char_id;
@@ -755,7 +755,7 @@ void mmo_send_accreg2(AccountDB* self, int fd, int account_id, int char_id) {
 
 			// prepare follow up
 			WFIFOHEAD(fd, 60000 + 300);
-			WFIFOW(fd, 0) = 0x3804;
+			WFIFOW(fd, 0) = 0x2726;
 			// 0x2 = length, set prior to being sent
 			WFIFOL(fd, 4) = account_id;
 			WFIFOL(fd, 8) = char_id;
@@ -775,7 +775,7 @@ void mmo_send_accreg2(AccountDB* self, int fd, int account_id, int char_id) {
 		Sql_ShowDebug(sql_handle);
 
 	WFIFOHEAD(fd, 60000 + 300);
-	WFIFOW(fd, 0) = 0x3804;
+	WFIFOW(fd, 0) = 0x2726;
 	// 0x2 = length, set prior to being sent
 	WFIFOL(fd, 4) = account_id;
 	WFIFOL(fd, 8) = char_id;
@@ -818,7 +818,7 @@ void mmo_send_accreg2(AccountDB* self, int fd, int account_id, int char_id) {
 
 			// prepare follow up
 			WFIFOHEAD(fd, 60000 + 300);
-			WFIFOW(fd, 0) = 0x3804;
+			WFIFOW(fd, 0) = 0x2726;
 			// 0x2 = length, set prior to being sent
 			WFIFOL(fd, 4) = account_id;
 			WFIFOL(fd, 8) = char_id;

+ 2 - 2
src/login/account.h

@@ -138,8 +138,8 @@ struct AccountDB {
 	AccountDBIterator* (*iterator)(AccountDB* self);
 };
 
-void mmo_send_accreg2(AccountDB* self, int fd, int account_id, int char_id);
-void mmo_save_accreg2(AccountDB* self, int fd, int account_id, int char_id);
+void mmo_send_global_accreg(AccountDB* self, int fd, int account_id, int char_id);
+void mmo_save_global_accreg(AccountDB* self, int fd, int account_id, int char_id);
 
 
 #endif // __ACCOUNT_H_INCLUDED__

+ 31 - 64
src/login/loginchrif.c

@@ -149,39 +149,6 @@ int logchrif_parse_ackusercount(int fd, int id){
 	return 1;
 }
 
-/**
- * Receive a request from char-server to change e-mail from default "a@a.com".
- * @param fd: fd to parse from (char-serv)
- * @param id: id of char-serv
- * @param ip: char-serv ip (used for info)
- * @return 0 not enough info transmitted, 1 success
- */
-int logchrif_parse_updmail(int fd, int id, char* ip){
-	if (RFIFOREST(fd) < 46)
-		return 0;
-	else{
-		AccountDB* accounts = login_get_accounts_db();
-		struct mmo_account acc;
-		char email[40];
-
-		uint32 account_id = RFIFOL(fd,2);
-		safestrncpy(email, (char*)RFIFOP(fd,6), 40); remove_control_chars(email);
-		RFIFOSKIP(fd,46);
-
-		if( e_mail_check(email) == 0 )
-			ShowNotice("Char-server '%s': Attempt to create an e-mail on an account with a default e-mail REFUSED - e-mail is invalid (account: %d, ip: %s)\n", ch_server[id].name, account_id, ip);
-		else if( !accounts->load_num(accounts, &acc, account_id) || strcmp(acc.email, "a@a.com") == 0 || acc.email[0] == '\0' )
-			ShowNotice("Char-server '%s': Attempt to create an e-mail on an account with a default e-mail REFUSED - account doesn't exist or e-mail of account isn't default e-mail (account: %d, ip: %s).\n", ch_server[id].name, account_id, ip);
-		else{
-			memcpy(acc.email, email, 40);
-			ShowNotice("Char-server '%s': Create an e-mail on an account with a default e-mail (account: %d, new e-mail: %s, ip: %s).\n", ch_server[id].name, account_id, email, ip);
-			// Save
-			accounts->save(accounts, &acc);
-		}
-	}
-	return 1;
-}
-
 /**
  * Transmit account data to char_server
  * S 2717 aid.W email.40B exp_time.L group_id.B char_slot.B birthdate.11B pincode.5B pincode_change.L
@@ -476,7 +443,7 @@ int logchrif_parse_reqchgsex(int fd, int id, char* ip){
  * @param ip: char-serv ip (used for info)
  * @return 0 not enough info transmitted, 1 success
  */
-int logchrif_parse_updreg2(int fd, int id, char* ip){
+int logchrif_parse_upd_global_accreg(int fd, int id, char* ip){
 	if( RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2) )
 		return 0;
 	else{
@@ -487,7 +454,7 @@ int logchrif_parse_updreg2(int fd, int id, char* ip){
 		if( !accounts->load_num(accounts, &acc, account_id) )
 			ShowStatus("Char-server '%s': receiving (from the char-server) of account_reg2 (account: %d not found, ip: %s).\n", ch_server[id].name, account_id, ip);
 		else
-			mmo_save_accreg2(accounts,fd,account_id,RFIFOL(fd, 8));
+			mmo_save_global_accreg(accounts,fd,account_id,RFIFOL(fd, 8));
 		RFIFOSKIP(fd,RFIFOW(fd,2));
 	}
 	return 1;
@@ -585,7 +552,7 @@ int logchrif_parse_updonlinedb(int fd, int id){
  * @param fd: fd to parse from (char-serv)
  * @return 0 not enough info transmitted, 1 success
  */
-int logchrif_parse_reqacc2reg(int fd){
+int logchrif_parse_req_global_accreg(int fd){
 	if (RFIFOREST(fd) < 10)
 		return 0;
 	else{
@@ -594,7 +561,7 @@ int logchrif_parse_reqacc2reg(int fd){
 		uint32 char_id = RFIFOL(fd,6);
 		RFIFOSKIP(fd,10);
 
-		mmo_send_accreg2(accounts,fd,account_id,char_id);
+		mmo_send_global_accreg(accounts,fd,account_id,char_id);
 	}
 	return 1;
 }
@@ -822,36 +789,36 @@ int logchrif_parse(int fd){
 	ip2str(ipl, ip);
 
 	while( RFIFOREST(fd) >= 2 ){
-		int next = 1;
+		int next = 1; // 0: avoid processing followup packets (prev was probably incomplete) packet, 1: Continue parsing
 		uint16 command = RFIFOW(fd,0);
 		switch( command ){
-		case 0x2712: next = logchrif_parse_reqauth(fd, cid, ip); break;
-		case 0x2714: next = logchrif_parse_ackusercount(fd, cid); break;
-		case 0x2715: next = logchrif_parse_updmail(fd, cid, ip); break;
-		case 0x2716: next = logchrif_parse_reqaccdata(fd, cid, ip); break;
-		case 0x2719: next = logchrif_parse_keepalive(fd); break;
-		case 0x2720: next = logchrif_parse_accinfo(fd); break; //@accinfo from inter-server
-		case 0x2722: next = logchrif_parse_reqchangemail(fd,cid,ip); break;
-		case 0x2724: next = logchrif_parse_requpdaccstate(fd,cid,ip); break;
-		case 0x2725: next = logchrif_parse_reqbanacc(fd,cid,ip); break;
-		case 0x2727: next = logchrif_parse_reqchgsex(fd,cid,ip); break;
-		case 0x2728: next = logchrif_parse_updreg2(fd,cid,ip); break;
-		case 0x272a: next = logchrif_parse_requnbanacc(fd,cid,ip); break;
-		case 0x272b: next = logchrif_parse_setacconline(fd,cid); break;
-		case 0x272c: next = logchrif_parse_setaccoffline(fd); break;
-		case 0x272d: next = logchrif_parse_updonlinedb(fd,cid); break;
-		case 0x272e: next = logchrif_parse_reqacc2reg(fd); break;
-		case 0x2736: next = logchrif_parse_updcharip(fd,cid); break;
-		case 0x2737: next = logchrif_parse_setalloffline(fd,cid); break;
-		case 0x2738: next = logchrif_parse_updpincode(fd); break;
-		case 0x2739: next = logchrif_parse_pincode_authfail(fd); break;
-		case 0x2742: next = logchrif_parse_reqvipdata(fd); break; //Vip sys
-		default:
-			ShowError("logchrif_parse: Unknown packet 0x%x from a char-server! Disconnecting!\n", command);
-			set_eof(fd);
-			return 0;
+			case 0x2712: next = logchrif_parse_reqauth(fd, cid, ip); break;
+			case 0x2714: next = logchrif_parse_ackusercount(fd, cid); break;
+			case 0x2716: next = logchrif_parse_reqaccdata(fd, cid, ip); break;
+			case 0x2719: next = logchrif_parse_keepalive(fd); break;
+			case 0x2720: next = logchrif_parse_accinfo(fd); break; //@accinfo from inter-server
+			case 0x2722: next = logchrif_parse_reqchangemail(fd,cid,ip); break;
+			case 0x2724: next = logchrif_parse_requpdaccstate(fd,cid,ip); break;
+			case 0x2725: next = logchrif_parse_reqbanacc(fd,cid,ip); break;
+			case 0x2727: next = logchrif_parse_reqchgsex(fd,cid,ip); break;
+			case 0x2728: next = logchrif_parse_upd_global_accreg(fd,cid,ip); break;
+			case 0x272a: next = logchrif_parse_requnbanacc(fd,cid,ip); break;
+			case 0x272b: next = logchrif_parse_setacconline(fd,cid); break;
+			case 0x272c: next = logchrif_parse_setaccoffline(fd); break;
+			case 0x272d: next = logchrif_parse_updonlinedb(fd,cid); break;
+			case 0x272e: next = logchrif_parse_req_global_accreg(fd); break;
+			case 0x2736: next = logchrif_parse_updcharip(fd,cid); break;
+			case 0x2737: next = logchrif_parse_setalloffline(fd,cid); break;
+			case 0x2738: next = logchrif_parse_updpincode(fd); break;
+			case 0x2739: next = logchrif_parse_pincode_authfail(fd); break;
+			case 0x2742: next = logchrif_parse_reqvipdata(fd); break; //Vip sys
+			default:
+				ShowError("logchrif_parse: Unknown packet 0x%x from a char-server! Disconnecting!\n", command);
+				set_eof(fd);
+				return 0;
 		} // switch
-		if(next==0) return 0; // avoid processing of followup packets (prev was probably incomplete)
+		if (next == 0)
+			return 0;
 	} // while
 	return 1; //or 0
 }

+ 1 - 1
src/login/loginclif.c

@@ -400,7 +400,7 @@ static int logclif_parse_reqkey(int fd, struct login_session_data *sd){
 static int logclif_parse_reqcharconnec(int fd, struct login_session_data *sd, char* ip){
 	if (RFIFOREST(fd) < 86)
 		return 0;
-	{
+	else {
 		int result;
 		char server_name[20];
 		char message[256];

+ 2 - 0
src/map/atcommand.c

@@ -9062,6 +9062,8 @@ ACMD_FUNC(set) {
 
 	clif_displaymessage(fd, atcmd_output);
 
+	if (is_str && data->u.str)
+		aFree(data->u.str);
 	aFree(data);
 
 	return 0;

+ 9 - 3
src/map/chrif.c

@@ -69,7 +69,7 @@ static const int packet_len_table[0x3d] = { // U - used, F - free
 //2b10: Outgoing, chrif_updatefamelist -> 'Update the fame ranking lists and send them'
 //2b11: Outgoing, chrif_divorce -> 'tell the charserver to do divorce'
 //2b12: Incoming, chrif_divorceack -> 'divorce chars
-//2b13: FREE
+//2b13: Outgoing, chrif_update_ip -> 'tell the change of map-server IP'
 //2b14: Incoming, chrif_accountban -> 'not sure: kick the player with message XY'
 //2b15: Outgoing, chrif_skillcooldown_save -> request to save skillcooldown
 //2b16: Outgoing, chrif_ragsrvinfo -> 'sends base / job / drop rates ....'
@@ -1527,7 +1527,12 @@ void chrif_on_disconnect(void) {
 	add_timer(gettick() + 1000, check_connect_char_server, 0, 0);
 }
 
-
+/**
+ * !CHECKME: This is intended?
+ * On sync request received, map-server only send its own IP
+ * without change the char IP (if any)?
+ * Since no IP info sent by 0x2b1e (chlogif_parse_updip)
+ **/
 void chrif_update_ip(int fd) {
 	uint32 new_ip;
 
@@ -1543,7 +1548,7 @@ void chrif_update_ip(int fd) {
 	if (!new_ip)
 		return; //No change
 
-	WFIFOW(fd,0) = 0x2736;
+	WFIFOW(fd,0) = 0x2b13;
 	WFIFOL(fd,2) = htonl(new_ip);
 	WFIFOSET(fd,6);
 }
@@ -1554,6 +1559,7 @@ void chrif_keepalive(int fd) {
 	WFIFOW(fd,0) = 0x2b23;
 	WFIFOSET(fd,2);
 }
+
 void chrif_keepalive_ack(int fd) {
 	session[fd]->flag.ping = 0;/* reset ping state, we received a packet */
 }

+ 1 - 1
src/map/script.c

@@ -3122,7 +3122,7 @@ int set_reg(struct script_state* st, TBL_PC* sd, int64 num, const char* name, co
 
 int set_var(TBL_PC* sd, char* name, void* val)
 {
-    return set_reg(NULL, sd, reference_uid(add_str(name),0), name, val, NULL);
+	return set_reg(NULL, sd, reference_uid(add_str(name),0), name, val, NULL);
 }
 
 void setd_sub(struct script_state *st, TBL_PC *sd, const char *varname, int elem, void *value, struct reg_db *ref)