浏览代码

git-svn-id: https://svn.code.sf.net/p/rathena/svn/branches/stable@629 54d463be-8e91-2dee-dedb-b68131a5f0ec

ajarn 20 年之前
父节点
当前提交
6bcd1db8cd
共有 4 个文件被更改,包括 156 次插入146 次删除
  1. 2 3
      Changelog.txt
  2. 31 27
      src/char_sql/char.c
  3. 33 29
      src/login_sql/login.c
  4. 90 87
      src/map/map.c

+ 2 - 3
Changelog.txt

@@ -1,14 +1,13 @@
 Date	Added
 Date	Added
 
 
-12/19
+12/18
+	* Fixed import command in inter_athena.conf file [Ajarn]
 	* Fixed a few command compiling problems for TXT [Codemaster]
 	* Fixed a few command compiling problems for TXT [Codemaster]
 	* Modified the main.sql to add the friend0 column; also added the upgrade_1.0.0.sql file [Codemaster]
 	* Modified the main.sql to add the friend0 column; also added the upgrade_1.0.0.sql file [Codemaster]
 	* Introduced StringBuf into utils for use in building larger queries [MouseJstr]
 	* Introduced StringBuf into utils for use in building larger queries [MouseJstr]
 	* tested GUILD_CACHE (reducing guild related sql traffic to 30%) in 
 	* tested GUILD_CACHE (reducing guild related sql traffic to 30%) in 
 	  prep for unleasing it on the sql using public [MouseJstr]
 	  prep for unleasing it on the sql using public [MouseJstr]
 	* Fixed some SQL queries crashing char server [davidsiaw]
 	* Fixed some SQL queries crashing char server [davidsiaw]
-
-12/18
 	* Added several PID GM commands, thanks to Dino9021 [nsstrunks]
 	* Added several PID GM commands, thanks to Dino9021 [nsstrunks]
 	* Storage was merging items incorrectly [Mousejstr]
 	* Storage was merging items incorrectly [Mousejstr]
 	* eliminated a uninitialized var when using afm maps [MouseJstr]
 	* eliminated a uninitialized var when using afm maps [MouseJstr]

+ 31 - 27
src/char_sql/char.c

@@ -160,12 +160,12 @@ void set_char_online(int char_id, int account_id) {
 		if (mysql_query(&mysql_handle, tmp_sql)) {
 		if (mysql_query(&mysql_handle, tmp_sql)) {
 			printf("DB server Error (set char online)- %s\n", mysql_error(&mysql_handle));
 			printf("DB server Error (set char online)- %s\n", mysql_error(&mysql_handle));
 		}
 		}
-    }		
-    
+    }
+
     WFIFOW(login_fd,0) = 0x272b;
     WFIFOW(login_fd,0) = 0x272b;
 	WFIFOL(login_fd,2) = account_id;
 	WFIFOL(login_fd,2) = account_id;
 	WFIFOSET(login_fd,6);
 	WFIFOSET(login_fd,6);
-        
+
 }
 }
 
 
 void set_all_offline(void) {
 void set_all_offline(void) {
@@ -181,16 +181,16 @@ void set_all_offline(void) {
 	            WFIFOW(login_fd,0) = 0x272c;
 	            WFIFOW(login_fd,0) = 0x272c;
 	            WFIFOL(login_fd,2) = atoi(sql_row[0]);
 	            WFIFOL(login_fd,2) = atoi(sql_row[0]);
 	            WFIFOSET(login_fd,6);
 	            WFIFOSET(login_fd,6);
-            } 
+            }
        }
        }
-    } 
-    
-   	mysql_free_result(sql_res);        
+    }
+
+   	mysql_free_result(sql_res);
     sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `online`='1'", char_db);
     sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `online`='1'", char_db);
 	if (mysql_query(&mysql_handle, tmp_sql)) {
 	if (mysql_query(&mysql_handle, tmp_sql)) {
 		printf("DB server Error (set_all_offline)- %s\n", mysql_error(&mysql_handle));
 		printf("DB server Error (set_all_offline)- %s\n", mysql_error(&mysql_handle));
 	}
 	}
-	
+
 }
 }
 
 
 void set_char_offline(int char_id, int account_id) {
 void set_char_offline(int char_id, int account_id) {
@@ -198,7 +198,7 @@ void set_char_offline(int char_id, int account_id) {
         sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `account_id`='%d'", char_db, account_id);
         sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `account_id`='%d'", char_db, account_id);
     else
     else
 	    sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `char_id`='%d'", char_db, char_id);
 	    sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `char_id`='%d'", char_db, char_id);
-	    
+
 	if (mysql_query(&mysql_handle, tmp_sql))
 	if (mysql_query(&mysql_handle, tmp_sql))
 		printf("DB server Error (set_char_offline)- %s\n", mysql_error(&mysql_handle));
 		printf("DB server Error (set_char_offline)- %s\n", mysql_error(&mysql_handle));
 
 
@@ -208,7 +208,7 @@ void set_char_offline(int char_id, int account_id) {
    WFIFOW(login_fd,0) = 0x272c;
    WFIFOW(login_fd,0) = 0x272c;
    WFIFOL(login_fd,2) = account_id;
    WFIFOL(login_fd,2) = account_id;
    WFIFOSET(login_fd,6);
    WFIFOSET(login_fd,6);
-}       
+}
 
 
 //-----------------------------------------------------
 //-----------------------------------------------------
 // Function to suppress control characters in a string.
 // Function to suppress control characters in a string.
@@ -2060,7 +2060,7 @@ int parse_frommap(int fd) {
 			set_char_online(RFIFOL(fd,2),RFIFOL(fd,6));
 			set_char_online(RFIFOL(fd,2),RFIFOL(fd,6));
 			RFIFOSKIP(fd,10);
 			RFIFOSKIP(fd,10);
 			break;
 			break;
-		          
+
 		default:
 		default:
 			// inter server - packet
 			// inter server - packet
 			{
 			{
@@ -2141,7 +2141,7 @@ int parse_char(int fd) {
 	unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
 	unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr;
 
 
 	sd = session[fd]->session_data;
 	sd = session[fd]->session_data;
-	
+
         if(login_fd < 0)
         if(login_fd < 0)
 		session[fd]->eof = 1;
 		session[fd]->eof = 1;
 	if(session[fd]->eof) {
 	if(session[fd]->eof) {
@@ -2176,7 +2176,7 @@ int parse_char(int fd) {
 //		if (sd == NULL && cmd != 0x65 && cmd != 0x20b && cmd != 0x187 &&
 //		if (sd == NULL && cmd != 0x65 && cmd != 0x20b && cmd != 0x187 &&
 //					 cmd != 0x2af8 && cmd != 0x7530 && cmd != 0x7532)
 //					 cmd != 0x2af8 && cmd != 0x7530 && cmd != 0x7532)
 //			cmd = 0xffff;	// パケットダンプを表示させる
 //			cmd = 0xffff;	// パケットダンプを表示させる
-		
+
 		switch(cmd){
 		switch(cmd){
 		case 0x20b: //20040622 encryption ragexe correspondence
 		case 0x20b: //20040622 encryption ragexe correspondence
 			if (RFIFOREST(fd) < 19)
 			if (RFIFOREST(fd) < 19)
@@ -2673,24 +2673,24 @@ int parse_char(int fd) {
 // Console Command Parser [Wizputer]
 // Console Command Parser [Wizputer]
 int parse_console(char *buf) {
 int parse_console(char *buf) {
     char *type,*command;
     char *type,*command;
-    
+
     type = (char *)malloc(64);
     type = (char *)malloc(64);
     command = (char *)malloc(64);
     command = (char *)malloc(64);
-    
+
     memset(type,0,64);
     memset(type,0,64);
     memset(command,0,64);
     memset(command,0,64);
-    
+
     printf("Console: %s\n",buf);
     printf("Console: %s\n",buf);
-    
+
     if ( sscanf(buf, "%[^:]:%[^\n]", type , command ) < 2 )
     if ( sscanf(buf, "%[^:]:%[^\n]", type , command ) < 2 )
         sscanf(buf,"%[^\n]",type);
         sscanf(buf,"%[^\n]",type);
-    
+
     printf("Type of command: %s || Command: %s \n",type,command);
     printf("Type of command: %s || Command: %s \n",type,command);
-    
+
     if(buf) free(buf);
     if(buf) free(buf);
     if(type) free(type);
     if(type) free(type);
     if(command) free(command);
     if(command) free(command);
-    
+
     return 0;
     return 0;
 }
 }
 
 
@@ -2856,7 +2856,7 @@ void do_final(void) {
 	flush_fifos();
 	flush_fifos();
 
 
 	sprintf(tmp_sql,"DELETE FROM `ragsrvinfo");
 	sprintf(tmp_sql,"DELETE FROM `ragsrvinfo");
-	if (mysql_query(&mysql_handle, tmp_sql)) 
+	if (mysql_query(&mysql_handle, tmp_sql))
 		printf("DB server Error (insert `char`)- %s\n", mysql_error(&mysql_handle));
 		printf("DB server Error (insert `char`)- %s\n", mysql_error(&mysql_handle));
 
 
 	if(gm_account)  {
 	if(gm_account)  {
@@ -2954,7 +2954,11 @@ void sql_config_read(const char *cfgName){ /* Kalaspuff, to get login_db */
 		}else if(strcmpi(w1,"lowest_gm_level")==0){
 		}else if(strcmpi(w1,"lowest_gm_level")==0){
 			lowest_gm_level = atoi(w2);
 			lowest_gm_level = atoi(w2);
 			printf("set lowest_gm_level : %s\n",w2);
 			printf("set lowest_gm_level : %s\n",w2);
+		//support the import command, just like any other config
+		}else if(strcmpi(w1,"import")==0){
+			sql_config_read(w2);
 		}
 		}
+
 	}
 	}
 	fclose(fp);
 	fclose(fp);
 	printf("reading configure done.....\n");
 	printf("reading configure done.....\n");
@@ -3140,14 +3144,14 @@ int do_init(int argc, char **argv){
 	printf("open port %d.....\n",char_port);
 	printf("open port %d.....\n",char_port);
 	char_fd = make_listen_port(char_port);
 	char_fd = make_listen_port(char_port);
 
 
-        if ((naddr_ != 0) && (login_ip_set_ == 0 || char_ip_set_ == 0)) { 
+        if ((naddr_ != 0) && (login_ip_set_ == 0 || char_ip_set_ == 0)) {
           // The char server should know what IP address it is running on
           // The char server should know what IP address it is running on
           //   - MouseJstr
           //   - MouseJstr
           int localaddr = ntohl(addr_[0]);
           int localaddr = ntohl(addr_[0]);
           unsigned char *ptr = (unsigned char *) &localaddr;
           unsigned char *ptr = (unsigned char *) &localaddr;
           char buf[16];
           char buf[16];
           sprintf(buf, "%d.%d.%d.%d", ptr[0], ptr[1], ptr[2], ptr[3]);;
           sprintf(buf, "%d.%d.%d.%d", ptr[0], ptr[1], ptr[2], ptr[3]);;
-          if (naddr_ != 1) 
+          if (naddr_ != 1)
             printf("Multiple interfaces detected..  using %s as our IP address\n", buf);
             printf("Multiple interfaces detected..  using %s as our IP address\n", buf);
           else
           else
             printf("Defaulting to %s as our IP address\n", buf);
             printf("Defaulting to %s as our IP address\n", buf);
@@ -3156,9 +3160,9 @@ int do_init(int argc, char **argv){
           if (char_ip_set_ == 0)
           if (char_ip_set_ == 0)
           	strcpy(char_ip_str, buf);
           	strcpy(char_ip_str, buf);
 
 
-          if (ptr[0] == 192 && ptr[1] == 168)  
+          if (ptr[0] == 192 && ptr[1] == 168)
             printf("Firewall detected.. edit lan_support.conf and char_athena.conf\n");
             printf("Firewall detected.. edit lan_support.conf and char_athena.conf\n");
-        } 
+        }
 
 
 	login_ip = inet_addr(login_ip_str);
 	login_ip = inet_addr(login_ip_str);
 	char_ip = inet_addr(char_ip_str);
 	char_ip = inet_addr(char_ip_str);
@@ -3190,12 +3194,12 @@ int do_init(int argc, char **argv){
 	}
 	}
 
 
 	read_gm_account();
 	read_gm_account();
-	
+
 	if ( console ) {
 	if ( console ) {
 	    set_defaultconsoleparse(parse_console);
 	    set_defaultconsoleparse(parse_console);
 	   	start_console();
 	   	start_console();
 	}
 	}
-	
+
 	printf("char server init func end (now unlimited loop start!)....\n");
 	printf("char server init func end (now unlimited loop start!)....\n");
 	printf("The char-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", char_port);
 	printf("The char-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", char_port);
 	return 0;
 	return 0;

+ 33 - 29
src/login_sql/login.c

@@ -124,7 +124,7 @@ int use_md5_passwds = 0;
 char login_db[256] = "login";
 char login_db[256] = "login";
 char loginlog_db[256] = "loginlog";
 char loginlog_db[256] = "loginlog";
 
 
-// added to help out custom login tables, without having to recompile 
+// added to help out custom login tables, without having to recompile
 // source so options are kept in the login_athena.conf or the inter_athena.conf
 // source so options are kept in the login_athena.conf or the inter_athena.conf
 char login_db_account_id[256] = "account_id";
 char login_db_account_id[256] = "account_id";
 char login_db_userid[256] = "userid";
 char login_db_userid[256] = "userid";
@@ -582,7 +582,7 @@ int mmo_auth( struct mmo_account* account , int fd){
 	return 3; // Rejected
 	return 3; // Rejected
 #endif
 #endif
     }
     }
-        
+
 	account->account_id = atoi(sql_row[0]);
 	account->account_id = atoi(sql_row[0]);
 	account->login_id1 = rand();
 	account->login_id1 = rand();
 	account->login_id2 = rand();
 	account->login_id2 = rand();
@@ -685,7 +685,7 @@ int parse_fromchar(int fd){
 				if (auth_fifo[i].account_id == account_id &&
 				if (auth_fifo[i].account_id == account_id &&
 				    auth_fifo[i].login_id1 == RFIFOL(fd,6) &&
 				    auth_fifo[i].login_id1 == RFIFOL(fd,6) &&
 #if CMP_AUTHFIFO_LOGIN2 != 0
 #if CMP_AUTHFIFO_LOGIN2 != 0
-				    auth_fifo[i].login_id2 == RFIFOL(fd,10) && // relate to the versions higher than 18 
+				    auth_fifo[i].login_id2 == RFIFOL(fd,10) && // relate to the versions higher than 18
 #endif
 #endif
 				    auth_fifo[i].sex == RFIFOB(fd,14) &&
 				    auth_fifo[i].sex == RFIFOB(fd,14) &&
 #if CMP_AUTHFIFO_IP != 0
 #if CMP_AUTHFIFO_IP != 0
@@ -850,9 +850,9 @@ int parse_fromchar(int fd){
 						      server[id].name, acc, sql_row[0], actual_email, ip);
 						      server[id].name, acc, sql_row[0], actual_email, ip);
 					}
 					}
 				}
 				}
-				
+
 			}
 			}
-		  }	
+		  }
 			RFIFOSKIP(fd, 86);
 			RFIFOSKIP(fd, 86);
 			break;
 			break;
 
 
@@ -929,7 +929,7 @@ int parse_fromchar(int fd){
 						WBUFL(buf,7) = timestamp; // status or final date of a banishment
 						WBUFL(buf,7) = timestamp; // status or final date of a banishment
 						charif_sendallwos(-1, buf, 11);
 						charif_sendallwos(-1, buf, 11);
 					}
 					}
-					printf("Account: %d Banned until: %ld\n", acc, timestamp); 
+					printf("Account: %d Banned until: %ld\n", acc, timestamp);
 					sprintf(tmpsql, "UPDATE `%s` SET `ban_until` = '%ld', `state`='7' WHERE `%s` = '%d'", login_db, timestamp, login_db_account_id, acc);
 					sprintf(tmpsql, "UPDATE `%s` SET `ban_until` = '%ld', `state`='7' WHERE `%s` = '%d'", login_db, timestamp, login_db_account_id, acc);
 					// query
 					// query
 					if (mysql_query(&mysql_handle, tmpsql)) {
 					if (mysql_query(&mysql_handle, tmpsql)) {
@@ -950,14 +950,14 @@ int parse_fromchar(int fd){
 				unsigned char buf[16];
 				unsigned char buf[16];
 				acc=RFIFOL(fd,4);
 				acc=RFIFOL(fd,4);
 				sprintf(tmpsql,"SELECT `sex` FROM `%s` WHERE `%s` = '%d'",login_db,login_db_account_id,acc);
 				sprintf(tmpsql,"SELECT `sex` FROM `%s` WHERE `%s` = '%d'",login_db,login_db_account_id,acc);
-        
+
 	        if(mysql_query(&mysql_handle, tmpsql)) {
 	        if(mysql_query(&mysql_handle, tmpsql)) {
                     printf("DB server Error - %s\n", mysql_error(&mysql_handle));
                     printf("DB server Error - %s\n", mysql_error(&mysql_handle));
 		    return 0;
 		    return 0;
                 }
                 }
-        
+
 	        sql_res = mysql_store_result(&mysql_handle) ;
 	        sql_res = mysql_store_result(&mysql_handle) ;
-        
+
 	        if (sql_res)	{
 	        if (sql_res)	{
 		        if (mysql_num_rows(sql_res) == 0) {
 		        if (mysql_num_rows(sql_res) == 0) {
 				mysql_free_result(sql_res);
 				mysql_free_result(sql_res);
@@ -965,7 +965,7 @@ int parse_fromchar(int fd){
 			}
 			}
 			sql_row = mysql_fetch_row(sql_res);	//row fetching
 			sql_row = mysql_fetch_row(sql_res);	//row fetching
 	        }
 	        }
-	
+
 	        if (strcmpi(sql_row[0], "M") == 0)
 	        if (strcmpi(sql_row[0], "M") == 0)
                     sex = 1;
                     sex = 1;
                 else
                 else
@@ -1013,7 +1013,7 @@ int parse_fromchar(int fd){
 					WBUFW(buf,0)=0x2729;
 					WBUFW(buf,0)=0x2729;
 					charif_sendallwos(fd,buf,WBUFW(buf,2));
 					charif_sendallwos(fd,buf,WBUFW(buf,2));
 				}
 				}
-			  }	
+			  }
 				RFIFOSKIP(fd,RFIFOW(fd,2));
 				RFIFOSKIP(fd,RFIFOW(fd,2));
 				//printf("login: save account_reg (from char)\n");
 				//printf("login: save account_reg (from char)\n");
 			    break;
 			    break;
@@ -1043,21 +1043,21 @@ int parse_fromchar(int fd){
 				RFIFOSKIP(fd,6);
 				RFIFOSKIP(fd,6);
 			}
 			}
 			return 0;
 			return 0;
-			
+
     case 0x272b:    // Set account_id to online [Wizputer]
     case 0x272b:    // Set account_id to online [Wizputer]
         if (RFIFOREST(fd) < 6)
         if (RFIFOREST(fd) < 6)
             return 0;
             return 0;
         add_online_user(RFIFOL(fd,2));
         add_online_user(RFIFOL(fd,2));
         RFIFOSKIP(fd,6);
         RFIFOSKIP(fd,6);
         break;
         break;
-    
+
     case 0x272c:   // Set account_id to offline [Wizputer]
     case 0x272c:   // Set account_id to offline [Wizputer]
         if (RFIFOREST(fd) < 6)
         if (RFIFOREST(fd) < 6)
             return 0;
             return 0;
         remove_online_user(RFIFOL(fd,2));
         remove_online_user(RFIFOL(fd,2));
         RFIFOSKIP(fd,6);
         RFIFOSKIP(fd,6);
         break;
         break;
-			
+
 	default:
 	default:
 		printf("login: unknown packet %x! (from char).\n", RFIFOW(fd,0));
 		printf("login: unknown packet %x! (from char).\n", RFIFOW(fd,0));
 		session[fd]->eof = 1;
 		session[fd]->eof = 1;
@@ -1461,24 +1461,24 @@ int parse_login(int fd) {
 // Console Command Parser [Wizputer]
 // Console Command Parser [Wizputer]
 int parse_console(char *buf) {
 int parse_console(char *buf) {
     char *type,*command;
     char *type,*command;
-    
+
     type = (char *)malloc(64);
     type = (char *)malloc(64);
     command = (char *)malloc(64);
     command = (char *)malloc(64);
-    
+
     memset(type,0,64);
     memset(type,0,64);
     memset(command,0,64);
     memset(command,0,64);
-    
+
     printf("Console: %s\n",buf);
     printf("Console: %s\n",buf);
-    
+
     if ( sscanf(buf, "%[^:]:%[^\n]", type , command ) < 2 )
     if ( sscanf(buf, "%[^:]:%[^\n]", type , command ) < 2 )
         sscanf(buf,"%[^\n]",type);
         sscanf(buf,"%[^\n]",type);
-    
+
     printf("Type of command: %s || Command: %s \n",type,command);
     printf("Type of command: %s || Command: %s \n",type,command);
-    
+
     if(buf) free(buf);
     if(buf) free(buf);
     if(type) free(type);
     if(type) free(type);
     if(command) free(command);
     if(command) free(command);
-    
+
     return 0;
     return 0;
 }
 }
 
 
@@ -1619,15 +1619,15 @@ int login_config_read(const char *cfgName){
 		else if(strcmpi(w1,"dynamic_pass_failure_ban_how_long")==0){
 		else if(strcmpi(w1,"dynamic_pass_failure_ban_how_long")==0){
 			dynamic_pass_failure_ban_how_long=atoi(w2);
 			dynamic_pass_failure_ban_how_long=atoi(w2);
 			printf ("set dynamic_pass_failure_ban_how_long : %d\n",dynamic_pass_failure_ban_how_long);
 			printf ("set dynamic_pass_failure_ban_how_long : %d\n",dynamic_pass_failure_ban_how_long);
-		} 
+		}
 		else if(strcmpi(w1,"anti_freeze_enable")==0){
 		else if(strcmpi(w1,"anti_freeze_enable")==0){
 			anti_freeze_enable = config_switch(w2);
 			anti_freeze_enable = config_switch(w2);
-		} 
+		}
 		else if (strcmpi(w1, "anti_freeze_interval") == 0) {
 		else if (strcmpi(w1, "anti_freeze_interval") == 0) {
 			ANTI_FREEZE_INTERVAL = atoi(w2);
 			ANTI_FREEZE_INTERVAL = atoi(w2);
 			if (ANTI_FREEZE_INTERVAL < 5)
 			if (ANTI_FREEZE_INTERVAL < 5)
 				ANTI_FREEZE_INTERVAL = 5; // minimum 5 seconds
 				ANTI_FREEZE_INTERVAL = 5; // minimum 5 seconds
-		} 
+		}
 		else if (strcmpi(w1, "import") == 0) {
 		else if (strcmpi(w1, "import") == 0) {
 			login_config_read(w2);
 			login_config_read(w2);
 		} else if(strcmpi(w1,"imalive_on")==0) {		//Added by Mugendai for I'm Alive mod
 		} else if(strcmpi(w1,"imalive_on")==0) {		//Added by Mugendai for I'm Alive mod
@@ -1741,9 +1741,13 @@ void sql_config_read(const char *cfgName){ /* Kalaspuff, to get login_db */
 		else if (strcmpi(w1, "loginlog_db") == 0) {
 		else if (strcmpi(w1, "loginlog_db") == 0) {
 			strcpy(loginlog_db, w2);
 			strcpy(loginlog_db, w2);
 		}
 		}
-        }
-        fclose(fp);
-        printf("reading configure done.....\n");
+		//support the import command, just like any other config
+		else if(strcmpi(w1,"import")==0){
+			sql_config_read(w2);
+		}
+	}
+	fclose(fp);
+	printf("reading configure done.....\n");
 }
 }
 
 
 
 
@@ -1830,11 +1834,11 @@ int do_init(int argc,char **argv){
 		set_defaultconsoleparse(parse_console);
 		set_defaultconsoleparse(parse_console);
 		start_console();
 		start_console();
 	}
 	}
-	
+
 	// Online user database init
 	// Online user database init
     free(online_db);
     free(online_db);
 	online_db = numdb_init();
 	online_db = numdb_init();
-	
+
 	printf("The login-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", login_port);
 	printf("The login-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", login_port);
 
 
 	return 0;
 	return 0;

+ 90 - 87
src/map/map.c

@@ -313,7 +313,7 @@ int map_delblock(struct block_list *bl)
 
 
 	if(bl->type==BL_PC)
 	if(bl->type==BL_PC)
 		map[bl->m].users--;
 		map[bl->m].users--;
-	if(bl->next) 
+	if(bl->next)
 		bl->next->prev = bl->prev;
 		bl->next->prev = bl->prev;
 	if(bl->prev==&bl_head){
 	if(bl->prev==&bl_head){
 		// リストの頭なので、map[]のblock_listを更新する
 		// リストの頭なので、map[]のblock_listを更新する
@@ -434,14 +434,14 @@ void map_foreachinarea(int (*func)(struct block_list*,va_list),int m,int x0,int
 				}
 				}
 			}
 			}
 		}
 		}
-	
+
 	if(bl_list_count>=BL_LIST_MAX) {
 	if(bl_list_count>=BL_LIST_MAX) {
 		if(battle_config.error_log)
 		if(battle_config.error_log)
 			printf("map_foreachinarea: *WARNING* block count too many!\n");
 			printf("map_foreachinarea: *WARNING* block count too many!\n");
 	}
 	}
 
 
 	map_freeblock_lock();	// メモリからの解放を禁止する
 	map_freeblock_lock();	// メモリからの解放を禁止する
-		
+
 	for(i=blockcount;i<bl_list_count;i++)
 	for(i=blockcount;i<bl_list_count;i++)
 		if(bl_list[i]->prev)	// 有?かどうかチェック
 		if(bl_list[i]->prev)	// 有?かどうかチェック
 			func(bl_list[i],ap);
 			func(bl_list[i],ap);
@@ -550,10 +550,10 @@ void map_foreachinmovearea(int (*func)(struct block_list*,va_list),int m,int x0,
 	}
 	}
 
 
 	map_freeblock_lock();	// メモリからの解放を禁止する
 	map_freeblock_lock();	// メモリからの解放を禁止する
-		
+
 	for(i=blockcount;i<bl_list_count;i++)
 	for(i=blockcount;i<bl_list_count;i++)
 		if(bl_list[i]->prev) {	// 有?かどうかチェック
 		if(bl_list[i]->prev) {	// 有?かどうかチェック
-			if (bl_list[i]->type == BL_PC 
+			if (bl_list[i]->type == BL_PC
 			  && session[((struct map_session_data *) bl_list[i])->fd] == NULL)
 			  && session[((struct map_session_data *) bl_list[i])->fd] == NULL)
 				continue;
 				continue;
 			func(bl_list[i],ap);
 			func(bl_list[i],ap);
@@ -602,7 +602,7 @@ void map_foreachincell(int (*func)(struct block_list*,va_list),int m,int x,int y
 			if(bl && bl->x==x && bl->y==y && bl_list_count<BL_LIST_MAX)
 			if(bl && bl->x==x && bl->y==y && bl_list_count<BL_LIST_MAX)
 				bl_list[bl_list_count++]=bl;
 				bl_list[bl_list_count++]=bl;
 		}
 		}
-	}	
+	}
 
 
 	if(bl_list_count>=BL_LIST_MAX) {
 	if(bl_list_count>=BL_LIST_MAX) {
 		if(battle_config.error_log)
 		if(battle_config.error_log)
@@ -610,7 +610,7 @@ void map_foreachincell(int (*func)(struct block_list*,va_list),int m,int x,int y
 	}
 	}
 
 
 	map_freeblock_lock();	// メモリからの解放を禁止する
 	map_freeblock_lock();	// メモリからの解放を禁止する
-		
+
 	for(i=blockcount;i<bl_list_count;i++)
 	for(i=blockcount;i<bl_list_count;i++)
 		if(bl_list[i]->prev)	// 有?かどうかチェック
 		if(bl_list[i]->prev)	// 有?かどうかチェック
 			func(bl_list[i],ap);
 			func(bl_list[i],ap);
@@ -689,7 +689,7 @@ int map_delobject(int id) {
 	if(obj==NULL)
 	if(obj==NULL)
 		return 0;
 		return 0;
 
 
-	map_delobjectnofree(id);	
+	map_delobjectnofree(id);
 	map_freeblock(obj);
 	map_freeblock(obj);
 
 
 	return 0;
 	return 0;
@@ -965,7 +965,7 @@ int map_quit(struct map_session_data *sd) {
 
 
 	if(sd->chatID)	// チャットから出る
 	if(sd->chatID)	// チャットから出る
 		chat_leavechat(sd);
 		chat_leavechat(sd);
-		
+
 	if(sd->trade_partner)	// 取引を中?する
 	if(sd->trade_partner)	// 取引を中?する
 		trade_tradecancel(sd);
 		trade_tradecancel(sd);
 
 
@@ -1191,7 +1191,7 @@ int map_addnpc(int m,struct npc_data *nd) {
 
 
 void map_removenpc(void) {
 void map_removenpc(void) {
     int i,m,n=0;
     int i,m,n=0;
-    
+
     for(m=0;m<map_num;m++) {
     for(m=0;m<map_num;m++) {
         for(i=0;i<map[m].npc_num && i<MAX_NPC_PER_MAP;i++) {
         for(i=0;i<map[m].npc_num && i<MAX_NPC_PER_MAP;i++) {
             if(map[m].npc[i]!=NULL) {
             if(map[m].npc[i]!=NULL) {
@@ -1208,7 +1208,7 @@ void map_removenpc(void) {
             }
             }
         }
         }
     }
     }
-	
+
     sprintf(tmp_output,"Successfully removed and freed from memory '\033[1;29m%d\033[0;0m' NPCs.\n",n);
     sprintf(tmp_output,"Successfully removed and freed from memory '\033[1;29m%d\033[0;0m' NPCs.\n",n);
 	ShowStatus(tmp_output);
 	ShowStatus(tmp_output);
 }
 }
@@ -1231,7 +1231,7 @@ int map_mapname2mapid(char *name) {
 			md = strdb_search(map_db,afm_name);
 			md = strdb_search(map_db,afm_name);
 		}
 		}
 	#endif
 	#endif
-	
+
 	if(md==NULL || md->gat==NULL)
 	if(md==NULL || md->gat==NULL)
 		return -1;
 		return -1;
 	return md->m;
 	return md->m;
@@ -1435,29 +1435,29 @@ static void map_readwater(char *watertxt) {
 
 
 #ifdef USE_AFM
 #ifdef USE_AFM
 static int map_readafm(int m,char *fn) {
 static int map_readafm(int m,char *fn) {
-	
+
 	/*
 	/*
 	Advanced Fusion Maps Support
 	Advanced Fusion Maps Support
 	(c) 2003-2004, The Fusion Project
 	(c) 2003-2004, The Fusion Project
 	- AlexKreuz
 	- AlexKreuz
-	
+
 	The following code has been provided by me for eAthena
 	The following code has been provided by me for eAthena
 	under the GNU GPL.  It provides Advanced Fusion
 	under the GNU GPL.  It provides Advanced Fusion
 	Map, the map format desgined by me for Fusion, support
 	Map, the map format desgined by me for Fusion, support
 	for the eAthena emulator.
 	for the eAthena emulator.
-	
+
 	I understand that because it is under the GPL
 	I understand that because it is under the GPL
 	that other emulators may very well use this code in their
 	that other emulators may very well use this code in their
 	GNU project as well.
 	GNU project as well.
-	
+
 	The AFM map format was not originally a part of the GNU
 	The AFM map format was not originally a part of the GNU
 	GPL. It originated from scratch by my own hand.  I understand
 	GPL. It originated from scratch by my own hand.  I understand
 	that distributing this code to read the AFM maps with eAthena
 	that distributing this code to read the AFM maps with eAthena
 	causes the GPL to apply to this code.  But the actual AFM
 	causes the GPL to apply to this code.  But the actual AFM
 	maps are STILL copyrighted to the Fusion Project.  By choosing
 	maps are STILL copyrighted to the Fusion Project.  By choosing
-	
+
 	In exchange for that 'act of faith' I ask for the following.
 	In exchange for that 'act of faith' I ask for the following.
-	
+
 	A) Give credit where it is due.  If you use this code, do not
 	A) Give credit where it is due.  If you use this code, do not
 	   place your name on the changelog.  Credit should be given
 	   place your name on the changelog.  Credit should be given
 	   to AlexKreuz.
 	   to AlexKreuz.
@@ -1468,65 +1468,65 @@ static int map_readafm(int m,char *fn) {
 	   and so I ask you to display the copyright message on the STARTUP
 	   and so I ask you to display the copyright message on the STARTUP
 	   SCREEN as I have done here. (refer to core.c)
 	   SCREEN as I have done here. (refer to core.c)
 	   "Advanced Fusion Maps (c) 2003-2004 The Fusion Project"
 	   "Advanced Fusion Maps (c) 2003-2004 The Fusion Project"
-	   
+
 	Without this copyright, you are NOT entitled to bundle or distribute
 	Without this copyright, you are NOT entitled to bundle or distribute
 	the AFM maps at all.  On top of that, your "support" for AFM maps
 	the AFM maps at all.  On top of that, your "support" for AFM maps
 	becomes just as shady as your "support" for Gravity GRF files.
 	becomes just as shady as your "support" for Gravity GRF files.
-	
+
 	The bottom line is this.  I know that there are those of you who
 	The bottom line is this.  I know that there are those of you who
 	would like to use this code but aren't going to want to provide the
 	would like to use this code but aren't going to want to provide the
 	proper credit.  I know this because I speak frome experience.  If
 	proper credit.  I know this because I speak frome experience.  If
 	you are one of those people who is going to try to get around my
 	you are one of those people who is going to try to get around my
 	requests, then save your breath because I don't want to hear it.
 	requests, then save your breath because I don't want to hear it.
-	
+
 	I have zero faith in GPL and I know and accept that if you choose to
 	I have zero faith in GPL and I know and accept that if you choose to
 	not display the copyright for the AFMs then there is absolutely nothing
 	not display the copyright for the AFMs then there is absolutely nothing
 	I can do about it.  I am not about to start a legal battle over something
 	I can do about it.  I am not about to start a legal battle over something
 	this silly.
 	this silly.
-	
+
 	Provide the proper credit because you believe in the GPL.  If you choose
 	Provide the proper credit because you believe in the GPL.  If you choose
 	not to and would rather argue about it, consider the GPL failed.
 	not to and would rather argue about it, consider the GPL failed.
-	
+
 	October 18th, 2004
 	October 18th, 2004
 	- AlexKreuz
 	- AlexKreuz
 	- The Fusion Project
 	- The Fusion Project
 	*/
 	*/
-	
-	
+
+
 	int s;
 	int s;
 	int x,y,xs,ys;
 	int x,y,xs,ys;
 	size_t size;
 	size_t size;
-	
+
 	char afm_line[65535];
 	char afm_line[65535];
 	int afm_size[1];
 	int afm_size[1];
 	FILE *afm_file;
 	FILE *afm_file;
 	char *str;
 	char *str;
-	
+
 	afm_file = fopen(fn, "r");
 	afm_file = fopen(fn, "r");
 	if (afm_file != NULL) {
 	if (afm_file != NULL) {
-			
+
 //		printf("\rLoading Maps [%d/%d]: %-50s  ",m,map_num,fn);
 //		printf("\rLoading Maps [%d/%d]: %-50s  ",m,map_num,fn);
 //		fflush(stdout);
 //		fflush(stdout);
 
 
 		str=fgets(afm_line, sizeof(afm_line)-1, afm_file);
 		str=fgets(afm_line, sizeof(afm_line)-1, afm_file);
 		str=fgets(afm_line, sizeof(afm_line)-1, afm_file);
 		str=fgets(afm_line, sizeof(afm_line)-1, afm_file);
 		str=fgets(afm_line, sizeof(afm_line)-1, afm_file);
 		str=fgets(afm_line, sizeof(afm_line)-1, afm_file);
-		sscanf(str , "%d%d", &afm_size[0], &afm_size[1]);	
+		sscanf(str , "%d%d", &afm_size[0], &afm_size[1]);
 
 
-		map[m].m = m;	
+		map[m].m = m;
 		xs = map[m].xs = afm_size[0];
 		xs = map[m].xs = afm_size[0];
 		ys = map[m].ys = afm_size[1];
 		ys = map[m].ys = afm_size[1];
 		map[m].gat = calloc(s = map[m].xs * map[m].ys, 1);
 		map[m].gat = calloc(s = map[m].xs * map[m].ys, 1);
-		
+
 		if(map[m].gat==NULL){
 		if(map[m].gat==NULL){
 			printf("out of memory : map_readmap gat\n");
 			printf("out of memory : map_readmap gat\n");
 			exit(1);
 			exit(1);
 		}
 		}
-		
+
 		map[m].npc_num=0;
 		map[m].npc_num=0;
 		map[m].users=0;
 		map[m].users=0;
 		memset(&map[m].flag,0,sizeof(map[m].flag));
 		memset(&map[m].flag,0,sizeof(map[m].flag));
-		
+
 		if(battle_config.pk_mode) map[m].flag.pvp = 1; // make all maps pvp for pk_mode [Valaris]
 		if(battle_config.pk_mode) map[m].flag.pvp = 1; // make all maps pvp for pk_mode [Valaris]
 
 
 		for (y = 0; y < ys; y++) {
 		for (y = 0; y < ys; y++) {
@@ -1535,25 +1535,25 @@ static int map_readafm(int m,char *fn) {
 				map[m].gat[x+y*xs] = str[x]-48;
 				map[m].gat[x+y*xs] = str[x]-48;
 			}
 			}
 		}
 		}
-		
+
 		map[m].bxs=(xs+BLOCK_SIZE-1)/BLOCK_SIZE;
 		map[m].bxs=(xs+BLOCK_SIZE-1)/BLOCK_SIZE;
 		map[m].bys=(ys+BLOCK_SIZE-1)/BLOCK_SIZE;
 		map[m].bys=(ys+BLOCK_SIZE-1)/BLOCK_SIZE;
 		size = map[m].bxs * map[m].bys * sizeof(struct block_list*);
 		size = map[m].bxs * map[m].bys * sizeof(struct block_list*);
 		map[m].block = calloc(size, 1);
 		map[m].block = calloc(size, 1);
-		
+
 		if(map[m].block == NULL){
 		if(map[m].block == NULL){
 			printf("out of memory : map_readmap block\n");
 			printf("out of memory : map_readmap block\n");
 			exit(1);
 			exit(1);
 		}
 		}
-		
+
 		map[m].block_mob = calloc(size, 1);
 		map[m].block_mob = calloc(size, 1);
 		if (map[m].block_mob == NULL) {
 		if (map[m].block_mob == NULL) {
 			printf("out of memory : map_readmap block_mob\n");
 			printf("out of memory : map_readmap block_mob\n");
 			exit(1);
 			exit(1);
 		}
 		}
-		
+
 		size = map[m].bxs*map[m].bys*sizeof(int);
 		size = map[m].bxs*map[m].bys*sizeof(int);
-		
+
 		map[m].block_count = calloc(size, 1);
 		map[m].block_count = calloc(size, 1);
 		if(map[m].block_count==NULL){
 		if(map[m].block_count==NULL){
 			printf("out of memory : map_readmap block\n");
 			printf("out of memory : map_readmap block\n");
@@ -1590,7 +1590,7 @@ static int map_readmap(int m,char *fn, char *alias) {
 	int wh;
 	int wh;
 	int i;
 	int i;
 	int e = 0;
 	int e = 0;
-	
+
 	size_t size;
 	size_t size;
 	char progress[21] = "                    ";
 	char progress[21] = "                    ";
 	// read & convert fn
 	// read & convert fn
@@ -1615,7 +1615,7 @@ static int map_readmap(int m,char *fn, char *alias) {
 	map[m].npc_num=0;
 	map[m].npc_num=0;
 	map[m].users=0;
 	map[m].users=0;
 	memset(&map[m].flag,0,sizeof(map[m].flag));
 	memset(&map[m].flag,0,sizeof(map[m].flag));
-	if(battle_config.pk_mode) 
+	if(battle_config.pk_mode)
 		map[m].flag.pvp = 1; // make all maps pvp for pk_mode [Valaris]
 		map[m].flag.pvp = 1; // make all maps pvp for pk_mode [Valaris]
 	wh=map_waterheight(map[m].name);
 	wh=map_waterheight(map[m].name);
 	for(y=0;y<ys;y++){
 	for(y=0;y<ys;y++){
@@ -1753,12 +1753,12 @@ int map_addmap(char *mapname) {
 int map_delmap(char *mapname) {
 int map_delmap(char *mapname) {
 
 
 	int i;
 	int i;
-	
+
 	if (strcmpi(mapname, "all") == 0) {
 	if (strcmpi(mapname, "all") == 0) {
 		map_num = 0;
 		map_num = 0;
 		return 0;
 		return 0;
 	}
 	}
-	
+
 	for(i = 0; i < map_num; i++) {
 	for(i = 0; i < map_num; i++) {
 		if (strcmp(map[i].name, mapname) == 0) {
 		if (strcmp(map[i].name, mapname) == 0) {
 		    printf("Removing map [ %s ] from maplist\n",map[i].name);
 		    printf("Removing map [ %s ] from maplist\n",map[i].name);
@@ -1781,52 +1781,52 @@ int parse_console(char *buf) {
     int x = 0, y = 0;
     int x = 0, y = 0;
     int m, n;
     int m, n;
     struct map_session_data *sd;
     struct map_session_data *sd;
-    
+
     sd = calloc(sizeof(*sd), 1);
     sd = calloc(sizeof(*sd), 1);
-    
+
     sd->fd = 0;
     sd->fd = 0;
     strcpy( sd->status.name , "console");
     strcpy( sd->status.name , "console");
-    
+
     type = (char *)malloc(64);
     type = (char *)malloc(64);
     command = (char *)malloc(64);
     command = (char *)malloc(64);
     map = (char *)malloc(64);
     map = (char *)malloc(64);
     buf2 = (char *)malloc(72);
     buf2 = (char *)malloc(72);
-    
+
     memset(type,0,64);
     memset(type,0,64);
     memset(command,0,64);
     memset(command,0,64);
     memset(map,0,64);
     memset(map,0,64);
-    memset(buf2,0,72);    
-    
+    memset(buf2,0,72);
+
     if ( ( n = sscanf(buf, "%[^:]:%[^:]:%99s %d %d[^\n]", type , command , map , &x , &y )) < 5 )
     if ( ( n = sscanf(buf, "%[^:]:%[^:]:%99s %d %d[^\n]", type , command , map , &x , &y )) < 5 )
         if ( ( n = sscanf(buf, "%[^:]:%[^\n]", type , command )) < 2 )
         if ( ( n = sscanf(buf, "%[^:]:%[^\n]", type , command )) < 2 )
             n = sscanf(buf,"%[^\n]",type);
             n = sscanf(buf,"%[^\n]",type);
-    
+
     if ( n == 5 ) {
     if ( n == 5 ) {
         if (x <= 0) {
         if (x <= 0) {
             x = rand() % 399 + 1;
             x = rand() % 399 + 1;
             sd->bl.x = x;
             sd->bl.x = x;
         } else {
         } else {
             sd->bl.x = x;
             sd->bl.x = x;
-        }        
-        
+        }
+
         if (y <= 0) {
         if (y <= 0) {
             y = rand() % 399 + 1;
             y = rand() % 399 + 1;
             sd->bl.y = y;
             sd->bl.y = y;
         } else {
         } else {
             sd->bl.y = y;
             sd->bl.y = y;
-        }            
-    
+        }
+
         m = map_mapname2mapid(map);
         m = map_mapname2mapid(map);
         if ( m >= 0 )
         if ( m >= 0 )
             sd->bl.m = m;
             sd->bl.m = m;
         else {
         else {
             printf("Console: Unknown map\n");
             printf("Console: Unknown map\n");
             goto end;
             goto end;
-        }    
-    }    
+        }
+    }
 
 
     printf("Type of command: %s || Command: %s || Map: %s Coords: %d %d\n",type,command,map,x,y);
     printf("Type of command: %s || Command: %s || Map: %s Coords: %d %d\n",type,command,map,x,y);
-    
+
     if ( strcmpi("admin",type) == 0 && n == 5 ) {
     if ( strcmpi("admin",type) == 0 && n == 5 ) {
         sprintf(buf2,"console: %s",command);
         sprintf(buf2,"console: %s",command);
         if( is_atcommand(sd->fd,sd,buf2,99) == AtCommand_None )
         if( is_atcommand(sd->fd,sd,buf2,99) == AtCommand_None )
@@ -1844,8 +1844,8 @@ int parse_console(char *buf) {
         printf("IE: @spawn\n");
         printf("IE: @spawn\n");
         printf("To shutdown the server:\n");
         printf("To shutdown the server:\n");
         printf("server:shutdown\n");
         printf("server:shutdown\n");
-    } 
-    
+    }
+
     end:
     end:
     free(buf);
     free(buf);
     free(type);
     free(type);
@@ -1853,7 +1853,7 @@ int parse_console(char *buf) {
     free(map);
     free(map);
     free(buf2);
     free(buf2);
     free(sd);
     free(sd);
-    
+
     return 0;
     return 0;
 }
 }
 
 
@@ -1882,7 +1882,7 @@ int map_config_read(char *cfgName) {
 			} else if (strcmpi(w1, "char_ip") == 0) {
 			} else if (strcmpi(w1, "char_ip") == 0) {
 				char_ip_set_ = 1;
 				char_ip_set_ = 1;
 				h = gethostbyname (w2);
 				h = gethostbyname (w2);
-				if(h != NULL) { 
+				if(h != NULL) {
 					snprintf(tmp_output,sizeof(tmp_output),"Char Server IP Address : '"CL_WHITE"%s"CL_RESET"' -> '"CL_WHITE"%d.%d.%d.%d"CL_RESET"'.\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
 					snprintf(tmp_output,sizeof(tmp_output),"Char Server IP Address : '"CL_WHITE"%s"CL_RESET"' -> '"CL_WHITE"%d.%d.%d.%d"CL_RESET"'.\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
 					ShowInfo(tmp_output);
 					ShowInfo(tmp_output);
 					sprintf(w2,"%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
 					sprintf(w2,"%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
@@ -1893,7 +1893,7 @@ int map_config_read(char *cfgName) {
 			} else if (strcmpi(w1, "map_ip") == 0) {
 			} else if (strcmpi(w1, "map_ip") == 0) {
 				map_ip_set_ = 1;
 				map_ip_set_ = 1;
 				h = gethostbyname (w2);
 				h = gethostbyname (w2);
-				if (h != NULL) { 
+				if (h != NULL) {
 					snprintf(tmp_output,sizeof(tmp_output),"Map Server IP Address : '"CL_WHITE"%s"CL_RESET"' -> '"CL_WHITE"%d.%d.%d.%d"CL_RESET"'.\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
 					snprintf(tmp_output,sizeof(tmp_output),"Map Server IP Address : '"CL_WHITE"%s"CL_RESET"' -> '"CL_WHITE"%d.%d.%d.%d"CL_RESET"'.\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
 					ShowInfo(tmp_output);
 					ShowInfo(tmp_output);
 					sprintf(w2, "%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
 					sprintf(w2, "%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]);
@@ -1973,9 +1973,9 @@ int map_sql_init(void){
 	else {
 	else {
 		printf ("connect success! (Map Server Connection)\n");
 		printf ("connect success! (Map Server Connection)\n");
 	}
 	}
-	
+
     mysql_init(&lmysql_handle);
     mysql_init(&lmysql_handle);
-    
+
     //DB connection start
     //DB connection start
     printf("Connect Login DB Server....\n");
     printf("Connect Login DB Server....\n");
     if(!mysql_real_connect(&lmysql_handle, login_server_ip, login_server_id, login_server_pw,
     if(!mysql_real_connect(&lmysql_handle, login_server_ip, login_server_id, login_server_pw,
@@ -1987,7 +1987,7 @@ int map_sql_init(void){
 	 else {
 	 else {
 		printf ("connect success! (Login Server Connection)\n");
 		printf ("connect success! (Login Server Connection)\n");
 	 }
 	 }
-	
+
 	if(battle_config.mail_system) { // mail system [Valaris]
 	if(battle_config.mail_system) { // mail system [Valaris]
 		mysql_init(&mail_handle);
 		mysql_init(&mail_handle);
 		if(!mysql_real_connect(&mail_handle, map_server_ip, map_server_id, map_server_pw,
 		if(!mysql_real_connect(&mail_handle, map_server_ip, map_server_id, map_server_pw,
@@ -2010,9 +2010,9 @@ int map_sql_close(void){
 }
 }
 
 
 int log_sql_init(void){
 int log_sql_init(void){
-	
+
     mysql_init(&mmysql_handle);
     mysql_init(&mmysql_handle);
-		
+
 	//DB connection start
 	//DB connection start
 	printf("\033[1;29m[SQL]\033[0;0m: Connecting to Log Database \033[1;29m%s\033[0;0m At \033[1;29m%s\033[0;0m...\n",log_db,log_db_ip);
 	printf("\033[1;29m[SQL]\033[0;0m: Connecting to Log Database \033[1;29m%s\033[0;0m At \033[1;29m%s\033[0;0m...\n",log_db,log_db_ip);
 	if(!mysql_real_connect(&mmysql_handle, log_db_ip, log_db_id, log_db_pw,
 	if(!mysql_real_connect(&mmysql_handle, log_db_ip, log_db_id, log_db_pw,
@@ -2055,7 +2055,7 @@ int sql_config_read(char *cfgName)
 		} else if(strcmpi(w1,"login_db")==0){
 		} else if(strcmpi(w1,"login_db")==0){
 			strcpy(login_db,w2);
 			strcpy(login_db,w2);
 		} else if (strcmpi(w1, "char_db") == 0) {
 		} else if (strcmpi(w1, "char_db") == 0) {
-			strcpy(char_db, w2); 
+			strcpy(char_db, w2);
 		} else if(strcmpi(w1,"gm_db_level")==0){
 		} else if(strcmpi(w1,"gm_db_level")==0){
 			strcpy(gm_db_level,w2);
 			strcpy(gm_db_level,w2);
 		} else if(strcmpi(w1,"gm_db_account_id")==0){
 		} else if(strcmpi(w1,"gm_db_account_id")==0){
@@ -2116,7 +2116,10 @@ int sql_config_read(char *cfgName)
 			strcpy(log_db_pw, w2);
 			strcpy(log_db_pw, w2);
 		} else if(strcmpi(w1,"log_db_port")==0) {
 		} else if(strcmpi(w1,"log_db_port")==0) {
 			log_db_port = atoi(w2);
 			log_db_port = atoi(w2);
-		} 
+		//support the import command, just like any other config
+		} else if(strcmpi(w1,"import")==0){
+			sql_config_read(w2);
+		}
 	}
 	}
 	fclose(fp);
 	fclose(fp);
 
 
@@ -2130,7 +2133,7 @@ int online_timer(int tid,unsigned int tick,int id,int data)
 
 
 	char_online_check();
 	char_online_check();
 
 
-	check_online_timer=add_timer(gettick()+CHECK_INTERVAL,online_timer,0,0);	
+	check_online_timer=add_timer(gettick()+CHECK_INTERVAL,online_timer,0,0);
 
 
 	return 0;
 	return 0;
 }
 }
@@ -2143,14 +2146,14 @@ void char_online_check(void)
 	chrif_char_reset_offline();
 	chrif_char_reset_offline();
 
 
 	for(i=0;i<fd_max;i++){
 	for(i=0;i<fd_max;i++){
-		if (session[i] && (sd = session[i]->session_data) && sd && sd->state.auth && 
+		if (session[i] && (sd = session[i]->session_data) && sd && sd->state.auth &&
 		 !(battle_config.hide_GM_session && pc_isGM(sd)))
 		 !(battle_config.hide_GM_session && pc_isGM(sd)))
 			if(sd->status.char_id) {
 			if(sd->status.char_id) {
 				 chrif_char_online(sd);
 				 chrif_char_online(sd);
 			}
 			}
 	}
 	}
 
 
-	
+
 	if(check_online_timer && check_online_timer != -1) {
 	if(check_online_timer && check_online_timer != -1) {
 		delete_timer(check_online_timer,online_timer);
 		delete_timer(check_online_timer,online_timer);
 		add_timer(gettick()+CHECK_INTERVAL,online_timer,0,0);
 		add_timer(gettick()+CHECK_INTERVAL,online_timer,0,0);
@@ -2225,7 +2228,7 @@ void do_final(void) {
 #ifndef TXT_ONLY
 #ifndef TXT_ONLY
     chrif_char_reset_offline();
     chrif_char_reset_offline();
 #endif
 #endif
-    for (i = 0; i < fd_max; i++) 
+    for (i = 0; i < fd_max; i++)
         delete_session(i);
         delete_session(i);
 
 
     map_removenpc();
     map_removenpc();
@@ -2341,20 +2344,20 @@ int do_init(int argc, char *argv[]) {
 
 
 	map_config_read(MAP_CONF_NAME);
 	map_config_read(MAP_CONF_NAME);
 
 
-        if ((naddr_ == 0) && (map_ip_set_ == 0 || char_ip_set_ == 0)) { 
+        if ((naddr_ == 0) && (map_ip_set_ == 0 || char_ip_set_ == 0)) {
             printf("\nUnable to determine your IP address... please edit\n");
             printf("\nUnable to determine your IP address... please edit\n");
             printf("the map_athena.conf file and set it.\n");
             printf("the map_athena.conf file and set it.\n");
             printf("(127.0.0.1 is valid if you have no network interface)\n");
             printf("(127.0.0.1 is valid if you have no network interface)\n");
         }
         }
 
 
-        if (map_ip_set_ == 0 || char_ip_set_ == 0) { 
+        if (map_ip_set_ == 0 || char_ip_set_ == 0) {
           // The map server should know what IP address it is running on
           // The map server should know what IP address it is running on
           //   - MouseJstr
           //   - MouseJstr
           int localaddr = ntohl(addr_[0]);
           int localaddr = ntohl(addr_[0]);
           unsigned char *ptr = (unsigned char *) &localaddr;
           unsigned char *ptr = (unsigned char *) &localaddr;
           char buf[16];
           char buf[16];
           sprintf(buf, "%d.%d.%d.%d", ptr[0], ptr[1], ptr[2], ptr[3]);;
           sprintf(buf, "%d.%d.%d.%d", ptr[0], ptr[1], ptr[2], ptr[3]);;
-          if (naddr_ != 1) 
+          if (naddr_ != 1)
             printf("Multiple interfaces detected..  using %s as our IP address\n", buf);
             printf("Multiple interfaces detected..  using %s as our IP address\n", buf);
           else
           else
             printf("Defaulting to %s as our IP address\n", buf);
             printf("Defaulting to %s as our IP address\n", buf);
@@ -2363,10 +2366,10 @@ int do_init(int argc, char *argv[]) {
           if (char_ip_set_ == 0)
           if (char_ip_set_ == 0)
 		chrif_setip(buf);
 		chrif_setip(buf);
 
 
-          if (ptr[0] == 192 && ptr[1] == 168)  
+          if (ptr[0] == 192 && ptr[1] == 168)
             printf("\nFirewall detected.. \n    edit lan_support.conf and map_athena.conf\n\n");
             printf("\nFirewall detected.. \n    edit lan_support.conf and map_athena.conf\n\n");
-        } 
-        
+        }
+
 	battle_config_read(BATTLE_CONF_FILENAME);
 	battle_config_read(BATTLE_CONF_FILENAME);
 	msg_config_read(MSG_CONF_NAME);
 	msg_config_read(MSG_CONF_NAME);
 	atcommand_config_read(ATCOMMAND_CONF_FILENAME);
 	atcommand_config_read(ATCOMMAND_CONF_FILENAME);
@@ -2400,7 +2403,7 @@ int do_init(int argc, char *argv[]) {
 		}
 		}
 		fclose(data_conf);
 		fclose(data_conf);
 	} // end of reading grf-files.txt for AFMs
 	} // end of reading grf-files.txt for AFMs
-	
+
 
 
 	map_readallmap();
 	map_readallmap();
 
 
@@ -2412,7 +2415,7 @@ int do_init(int argc, char *argv[]) {
 
 
 #ifndef TXT_ONLY // online status timer, checks every hour [Valaris]
 #ifndef TXT_ONLY // online status timer, checks every hour [Valaris]
 	add_timer_func_list(online_timer, "online_timer");
 	add_timer_func_list(online_timer, "online_timer");
-	check_online_timer=add_timer(gettick()+CHECK_INTERVAL,online_timer,0,0);	
+	check_online_timer=add_timer(gettick()+CHECK_INTERVAL,online_timer,0,0);
 #endif /* not TXT_ONLY */
 #endif /* not TXT_ONLY */
 
 
 	do_init_chrif();
 	do_init_chrif();
@@ -2429,11 +2432,11 @@ int do_init(int argc, char *argv[]) {
 	do_init_npc();
 	do_init_npc();
 
 
 #ifndef TXT_ONLY /* mail system [Valaris] */
 #ifndef TXT_ONLY /* mail system [Valaris] */
-	if(battle_config.mail_system)	
+	if(battle_config.mail_system)
 		do_init_mail();
 		do_init_mail();
 
 
-	if (log_config.branch || log_config.drop || log_config.mvpdrop || 
-		log_config.present || log_config.produce || log_config.refine || 
+	if (log_config.branch || log_config.drop || log_config.mvpdrop ||
+		log_config.present || log_config.produce || log_config.refine ||
 		log_config.trade)
 		log_config.trade)
 	{
 	{
 		log_sql_init();
 		log_sql_init();
@@ -2441,15 +2444,15 @@ int do_init(int argc, char *argv[]) {
 #endif /* not TXT_ONLY */
 #endif /* not TXT_ONLY */
 
 
 	npc_event_do_oninit();	// npcのOnInitイベント?行
 	npc_event_do_oninit();	// npcのOnInitイベント?行
-	
+
 	if ( console ) {
 	if ( console ) {
 	    set_defaultconsoleparse(parse_console);
 	    set_defaultconsoleparse(parse_console);
 	   	start_console();
 	   	start_console();
 	}
 	}
-	
+
 	if (battle_config.pk_mode == 1)
 	if (battle_config.pk_mode == 1)
 		ShowNotice("Server is running on '"CL_WHITE"PK Mode"CL_RESET"'.\n");
 		ShowNotice("Server is running on '"CL_WHITE"PK Mode"CL_RESET"'.\n");
-	
+
 	//Added for Mugendais I'm Alive mod
 	//Added for Mugendais I'm Alive mod
 	if (imalive_on)
 	if (imalive_on)
 		add_timer_interval(gettick()+10, imalive_timer,0,0,imalive_time*1000);
 		add_timer_interval(gettick()+10, imalive_timer,0,0,imalive_time*1000);
@@ -2458,7 +2461,7 @@ int do_init(int argc, char *argv[]) {
 	ShowStatus(tmp_output);
 	ShowStatus(tmp_output);
 
 
 	ticks = gettick();
 	ticks = gettick();
-	
+
 
 
 	return 0;
 	return 0;
 }
 }