diff options
Diffstat (limited to 'src/char_sql/inter.c')
-rw-r--r-- | src/char_sql/inter.c | 971 |
1 files changed, 530 insertions, 441 deletions
diff --git a/src/char_sql/inter.c b/src/char_sql/inter.c index d1ee194..048d466 100644 --- a/src/char_sql/inter.c +++ b/src/char_sql/inter.c @@ -15,559 +15,648 @@ #include "int_pet.h" #include "lock.h" -#define WISDATA_TTL (60*1000) // Wisデータの生存時間(60秒) -#define WISDELLIST_MAX 256 // Wisデータ削除リストの要素数 +#define WISDATA_TTL (60*1000) // Wisデータの生存時間(60秒) +#define WISDELLIST_MAX 256 // Wisデータ削除リストの要素数 - -struct accreg { - int account_id,reg_num; - struct global_reg reg[ACCOUNT_REG_NUM]; +struct accreg +{ + int account_id, reg_num; + struct global_reg reg[ACCOUNT_REG_NUM]; }; static struct accreg *accreg_pt; - -int party_share_level = 10; +int party_share_level = 10; MYSQL mysql_handle; -MYSQL_RES* sql_res ; -MYSQL_ROW sql_row ; -int sql_fields, sql_cnt; +MYSQL_RES *sql_res; +MYSQL_ROW sql_row; +int sql_fields, sql_cnt; char tmp_sql[65535]; MYSQL lmysql_handle; char tmp_lsql[65535]; -MYSQL_RES* lsql_res ; -MYSQL_ROW lsql_row ; +MYSQL_RES *lsql_res; +MYSQL_ROW lsql_row; -int char_server_port = 3306; +int char_server_port = 3306; char char_server_ip[32] = "127.0.0.1"; char char_server_id[32] = "ragnarok"; char char_server_pw[32] = "ragnarok"; char char_server_db[32] = "ragnarok"; -int login_server_port = 3306; +int login_server_port = 3306; char login_server_ip[32] = "127.0.0.1"; char login_server_id[32] = "ragnarok"; char login_server_pw[32] = "ragnarok"; char login_server_db[32] = "ragnarok"; // sending packet list -int inter_send_packet_length[]={ - -1,-1,27, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -1, 7, 0, 0, 0, 0, 0, 0, -1,11, 0, 0, 0, 0, 0, 0, - 35,-1,11,15, 34,29, 7,-1, 0, 0, 0, 0, 0, 0, 0, 0, - 10,-1,15, 0, 79,19, 7,-1, 0,-1,-1,-1, 14,67,186,-1, - 9, 9,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 11,-1, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +int inter_send_packet_length[] = { + -1, -1, 27, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -1, 7, 0, 0, 0, 0, 0, 0, -1, 11, 0, 0, 0, 0, 0, 0, + 35, -1, 11, 15, 34, 29, 7, -1, 0, 0, 0, 0, 0, 0, 0, 0, + 10, -1, 15, 0, 79, 19, 7, -1, 0, -1, -1, -1, 14, 67, 186, -1, + 9, 9, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, -1, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; + // recv. packet list -int inter_recv_packet_length[]={ - -1,-1, 7, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6,-1, 0, 0, 0, 0, 0, 0, 10,-1, 0, 0, 0, 0, 0, 0, - 72, 6,52,14, 10,29, 6,-1, 34, 0, 0, 0, 0, 0, 0, 0, - -1, 6,-1, 0, 55,19, 6,-1, 14,-1,-1,-1, 14,19,186,-1, - 5, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 48,14,-1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +int inter_recv_packet_length[] = { + -1, -1, 7, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, -1, 0, 0, 0, 0, 0, 0, 10, -1, 0, 0, 0, 0, 0, 0, + 72, 6, 52, 14, 10, 29, 6, -1, 34, 0, 0, 0, 0, 0, 0, 0, + -1, 6, -1, 0, 55, 19, 6, -1, 14, -1, -1, -1, 14, 19, 186, -1, + 5, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 14, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -struct WisData { - int id,fd,count,len; - unsigned long tick; - unsigned char src[24],dst[24],msg[512]; +struct WisData +{ + int id, fd, count, len; + unsigned long tick; + unsigned char src[24], dst[24], msg[512]; }; -static struct dbt * wis_db = NULL; +static struct dbt *wis_db = NULL; static int wis_dellist[WISDELLIST_MAX], wis_delnum; //-------------------------------------------------------- // Save account_reg to sql (type=2) -int inter_accreg_tosql(int account_id,struct accreg *reg){ - - int j; - char temp_str[32]; - if (account_id<=0) return 0; - reg->account_id=account_id; - - //`global_reg_value` (`type`, `account_id`, `char_id`, `str`, `value`) - sprintf(tmp_sql,"DELETE FROM `%s` WHERE `type`=2 AND `account_id`='%d'",reg_db, account_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `global_reg_value`)- %s\n", mysql_error(&mysql_handle) ); - } - - if (reg->reg_num<=0) return 0; - - for(j=0;j<reg->reg_num;j++){ - if(reg->reg[j].str != NULL){ - sprintf(tmp_sql,"INSERT INTO `%s` (`type`, `account_id`, `str`, `value`) VALUES (2,'%d', '%s','%d')", - reg_db, reg->account_id, jstrescapecpy(temp_str,reg->reg[j].str), reg->reg[j].value); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (insert `global_reg_value`)- %s\n", mysql_error(&mysql_handle) ); - } - } - } - return 0; +int inter_accreg_tosql (int account_id, struct accreg *reg) +{ + + int j; + char temp_str[32]; + if (account_id <= 0) + return 0; + reg->account_id = account_id; + + //`global_reg_value` (`type`, `account_id`, `char_id`, `str`, `value`) + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `type`=2 AND `account_id`='%d'", + reg_db, account_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `global_reg_value`)- %s\n", + mysql_error (&mysql_handle)); + } + + if (reg->reg_num <= 0) + return 0; + + for (j = 0; j < reg->reg_num; j++) + { + if (reg->reg[j].str != NULL) + { + sprintf (tmp_sql, + "INSERT INTO `%s` (`type`, `account_id`, `str`, `value`) VALUES (2,'%d', '%s','%d')", + reg_db, reg->account_id, jstrescapecpy (temp_str, + reg->reg[j].str), + reg->reg[j].value); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (insert `global_reg_value`)- %s\n", + mysql_error (&mysql_handle)); + } + } + } + return 0; } // Load account_reg from sql (type=2) -int inter_accreg_fromsql(int account_id,struct accreg *reg) +int inter_accreg_fromsql (int account_id, struct accreg *reg) { - int j=0; - if (reg==NULL) return 0; - memset(reg, 0, sizeof(struct accreg)); - reg->account_id=account_id; - - //`global_reg_value` (`type`, `account_id`, `char_id`, `str`, `value`) - sprintf (tmp_sql, "SELECT `str`, `value` FROM `%s` WHERE `type`=2 AND `account_id`='%d'",reg_db, reg->account_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (select `global_reg_value`)- %s\n", mysql_error(&mysql_handle) ); - } - sql_res = mysql_store_result(&mysql_handle); - - if (sql_res) { - for(j=0;(sql_row = mysql_fetch_row(sql_res));j++){ - memcpy(reg->reg[j].str, sql_row[0],32); - reg->reg[j].value = atoi(sql_row[1]); - } - mysql_free_result(sql_res); - } - reg->reg_num=j; - return 0; + int j = 0; + if (reg == NULL) + return 0; + memset (reg, 0, sizeof (struct accreg)); + reg->account_id = account_id; + + //`global_reg_value` (`type`, `account_id`, `char_id`, `str`, `value`) + sprintf (tmp_sql, + "SELECT `str`, `value` FROM `%s` WHERE `type`=2 AND `account_id`='%d'", + reg_db, reg->account_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (select `global_reg_value`)- %s\n", + mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + + if (sql_res) + { + for (j = 0; (sql_row = mysql_fetch_row (sql_res)); j++) + { + memcpy (reg->reg[j].str, sql_row[0], 32); + reg->reg[j].value = atoi (sql_row[1]); + } + mysql_free_result (sql_res); + } + reg->reg_num = j; + return 0; } // Initialize -int inter_accreg_sql_init() +int inter_accreg_sql_init () { - CREATE(accreg_pt, struct accreg, 1); - return 0; - + CREATE (accreg_pt, struct accreg, 1); + return 0; + } /*========================================== * read config file *------------------------------------------ */ -int inter_config_read(const char *cfgName) { - printf ("start reading interserver configuration: %s\n",cfgName); - int i; - char line[1024], w1[1024], w2[1024]; - FILE *fp; - - fp=fopen_(cfgName,"r"); - if(fp==NULL){ - printf("file not found: %s\n", cfgName); - return 1; - } - while(fgets(line, 1020, fp)){ - i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2); - if(i!=2) - continue; - - if(strcmpi(w1,"char_server_ip")==0){ - strcpy(char_server_ip, w2); - printf ("set char_server_ip : %s\n",w2); - } - else if(strcmpi(w1,"char_server_port")==0){ - char_server_port=atoi(w2); - printf ("set char_server_port : %s\n",w2); - } - else if(strcmpi(w1,"char_server_id")==0){ - strcpy(char_server_id, w2); - printf ("set char_server_id : %s\n",w2); - } - else if(strcmpi(w1,"char_server_pw")==0){ - strcpy(char_server_pw, w2); - printf ("set char_server_pw : %s\n",w2); - } - else if(strcmpi(w1,"char_server_db")==0){ - strcpy(char_server_db, w2); - printf ("set char_server_db : %s\n",w2); - } - //Logins information to be read from the inter_athena.conf - //for character deletion (checks email in the loginDB) - - else if(strcmpi(w1,"login_server_ip")==0){ - strcpy(login_server_ip, w2); - printf ("set login_server_ip : %s\n",w2); - } - else if(strcmpi(w1,"login_server_port")==0){ - login_server_port=atoi(w2); - printf ("set login_server_port : %s\n",w2); - } - else if(strcmpi(w1,"login_server_id")==0){ - strcpy(login_server_id, w2); - printf ("set login_server_id : %s\n",w2); - } - else if(strcmpi(w1,"login_server_pw")==0){ - strcpy(login_server_pw, w2); - printf ("set login_server_pw : %s\n",w2); - } - else if(strcmpi(w1,"login_server_db")==0){ - strcpy(login_server_db, w2); - printf ("set login_server_db : %s\n",w2); - } - else if(strcmpi(w1,"party_share_level")==0){ - party_share_level=atoi(w2); - if(party_share_level < 0) party_share_level = 0; - }else if(strcmpi(w1,"import")==0){ - inter_config_read(w2); - } - else if(strcmpi(w1,"login_server_db")==0){ - strcpy(login_server_db, w2); - printf ("set login_server_db : %s\n",w2); - } - } - fclose_(fp); - - printf ("success reading interserver configuration\n"); - - return 0; +int inter_config_read (const char *cfgName) +{ + printf ("start reading interserver configuration: %s\n", cfgName); + int i; + char line[1024], w1[1024], w2[1024]; + FILE *fp; + + fp = fopen_ (cfgName, "r"); + if (fp == NULL) + { + printf ("file not found: %s\n", cfgName); + return 1; + } + while (fgets (line, 1020, fp)) + { + i = sscanf (line, "%[^:]: %[^\r\n]", w1, w2); + if (i != 2) + continue; + + if (strcmpi (w1, "char_server_ip") == 0) + { + strcpy (char_server_ip, w2); + printf ("set char_server_ip : %s\n", w2); + } + else if (strcmpi (w1, "char_server_port") == 0) + { + char_server_port = atoi (w2); + printf ("set char_server_port : %s\n", w2); + } + else if (strcmpi (w1, "char_server_id") == 0) + { + strcpy (char_server_id, w2); + printf ("set char_server_id : %s\n", w2); + } + else if (strcmpi (w1, "char_server_pw") == 0) + { + strcpy (char_server_pw, w2); + printf ("set char_server_pw : %s\n", w2); + } + else if (strcmpi (w1, "char_server_db") == 0) + { + strcpy (char_server_db, w2); + printf ("set char_server_db : %s\n", w2); + } + //Logins information to be read from the inter_athena.conf + //for character deletion (checks email in the loginDB) + + else if (strcmpi (w1, "login_server_ip") == 0) + { + strcpy (login_server_ip, w2); + printf ("set login_server_ip : %s\n", w2); + } + else if (strcmpi (w1, "login_server_port") == 0) + { + login_server_port = atoi (w2); + printf ("set login_server_port : %s\n", w2); + } + else if (strcmpi (w1, "login_server_id") == 0) + { + strcpy (login_server_id, w2); + printf ("set login_server_id : %s\n", w2); + } + else if (strcmpi (w1, "login_server_pw") == 0) + { + strcpy (login_server_pw, w2); + printf ("set login_server_pw : %s\n", w2); + } + else if (strcmpi (w1, "login_server_db") == 0) + { + strcpy (login_server_db, w2); + printf ("set login_server_db : %s\n", w2); + } + else if (strcmpi (w1, "party_share_level") == 0) + { + party_share_level = atoi (w2); + if (party_share_level < 0) + party_share_level = 0; + } + else if (strcmpi (w1, "import") == 0) + { + inter_config_read (w2); + } + else if (strcmpi (w1, "login_server_db") == 0) + { + strcpy (login_server_db, w2); + printf ("set login_server_db : %s\n", w2); + } + } + fclose_ (fp); + + printf ("success reading interserver configuration\n"); + + return 0; } // Save interlog into sql -int inter_log(char *fmt,...) +int inter_log (char *fmt, ...) { - char str[255]; - char temp_str[255]; - va_list ap; - va_start(ap,fmt); - - vsprintf(str,fmt,ap); - sprintf(tmp_sql,"INSERT INTO `%s` (`time`, `log`) VALUES (NOW(), '%s')",interlog_db, jstrescapecpy(temp_str,str)); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (insert `interlog`)- %s\n", mysql_error(&mysql_handle) ); - } - - va_end(ap); - return 0; + char str[255]; + char temp_str[255]; + va_list ap; + va_start (ap, fmt); + + vsprintf (str, fmt, ap); + sprintf (tmp_sql, + "INSERT INTO `%s` (`time`, `log`) VALUES (NOW(), '%s')", + interlog_db, jstrescapecpy (temp_str, str)); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (insert `interlog`)- %s\n", + mysql_error (&mysql_handle)); + } + + va_end (ap); + return 0; } - // initialize -int inter_init(const char *file) +int inter_init (const char *file) { - //int i; - - printf ("interserver initialize...\n"); - inter_config_read(file); - - //DB connection initialized - mysql_init(&mysql_handle); - printf("Connect Character DB server.... (Character Server)\n"); - if(!mysql_real_connect(&mysql_handle, char_server_ip, char_server_id, char_server_pw, - char_server_db ,char_server_port, (char *)NULL, 0)) { - //pointer check - printf("%s\n",mysql_error(&mysql_handle)); - exit(1); - } - else { - printf ("Connect Success! (Character Server)\n"); - } - - mysql_init(&lmysql_handle); - printf("Connect Character DB server.... (login server)\n"); - if(!mysql_real_connect(&lmysql_handle, login_server_ip, login_server_id, login_server_pw, - login_server_db ,login_server_port, (char *)NULL, 0)) { - //pointer check - printf("%s\n",mysql_error(&lmysql_handle)); - exit(1); - }else { - printf ("Connect Success! (Login Server)"); - } - wis_db = numdb_init(); - inter_guild_sql_init(); - inter_storage_sql_init(); - inter_party_sql_init(); - - inter_pet_sql_init(); - inter_accreg_sql_init(); - - //printf ("interserver timer initializing : %d sec...\n",autosave_interval); - //i=add_timer_interval(gettick()+autosave_interval,inter_save_timer,0,0,autosave_interval); - - return 0; + //int i; + + printf ("interserver initialize...\n"); + inter_config_read (file); + + //DB connection initialized + mysql_init (&mysql_handle); + printf ("Connect Character DB server.... (Character Server)\n"); + if (!mysql_real_connect + (&mysql_handle, char_server_ip, char_server_id, char_server_pw, + char_server_db, char_server_port, (char *) NULL, 0)) + { + //pointer check + printf ("%s\n", mysql_error (&mysql_handle)); + exit (1); + } + else + { + printf ("Connect Success! (Character Server)\n"); + } + + mysql_init (&lmysql_handle); + printf ("Connect Character DB server.... (login server)\n"); + if (!mysql_real_connect + (&lmysql_handle, login_server_ip, login_server_id, login_server_pw, + login_server_db, login_server_port, (char *) NULL, 0)) + { + //pointer check + printf ("%s\n", mysql_error (&lmysql_handle)); + exit (1); + } + else + { + printf ("Connect Success! (Login Server)"); + } + wis_db = numdb_init (); + inter_guild_sql_init (); + inter_storage_sql_init (); + inter_party_sql_init (); + + inter_pet_sql_init (); + inter_accreg_sql_init (); + + //printf ("interserver timer initializing : %d sec...\n",autosave_interval); + //i=add_timer_interval(gettick()+autosave_interval,inter_save_timer,0,0,autosave_interval); + + return 0; } -int inter_mapif_init(int fd) { - inter_guild_mapif_init(fd); +int inter_mapif_init (int fd) +{ + inter_guild_mapif_init (fd); - return 0; + return 0; } - //-------------------------------------------------------- // GM message sending -int mapif_GMmessage(unsigned char *mes, int len) { - unsigned char buf[len]; - - WBUFW(buf, 0) = 0x3800; - WBUFW(buf, 2) = len; - memcpy(WBUFP(buf, 4), mes, len-4); - mapif_sendall(buf, len); - printf("\033[1;34m inter server: GM[len:%d] - '%s' \033[0m\n", len, mes); - return 0; +int mapif_GMmessage (unsigned char *mes, int len) +{ + unsigned char buf[len]; + + WBUFW (buf, 0) = 0x3800; + WBUFW (buf, 2) = len; + memcpy (WBUFP (buf, 4), mes, len - 4); + mapif_sendall (buf, len); + printf ("\033[1;34m inter server: GM[len:%d] - '%s' \033[0m\n", len, mes); + return 0; } // Wis sending -int mapif_wis_message(struct WisData *wd) { - unsigned char buf[56 + wd->len]; - - WBUFW(buf, 0) = 0x3801; - WBUFW(buf, 2) = 56 +wd->len; - WBUFL(buf, 4) = wd->id; - memcpy(WBUFP(buf, 8), wd->src, 24); - memcpy(WBUFP(buf,32), wd->dst, 24); - memcpy(WBUFP(buf,56), wd->msg, wd->len); - wd->count = mapif_sendall(buf,WBUFW(buf,2)); - - return 0; +int mapif_wis_message (struct WisData *wd) +{ + unsigned char buf[56 + wd->len]; + + WBUFW (buf, 0) = 0x3801; + WBUFW (buf, 2) = 56 + wd->len; + WBUFL (buf, 4) = wd->id; + memcpy (WBUFP (buf, 8), wd->src, 24); + memcpy (WBUFP (buf, 32), wd->dst, 24); + memcpy (WBUFP (buf, 56), wd->msg, wd->len); + wd->count = mapif_sendall (buf, WBUFW (buf, 2)); + + return 0; } + // Wis sending result -int mapif_wis_end(struct WisData *wd,int flag) +int mapif_wis_end (struct WisData *wd, int flag) { - unsigned char buf[27]; - - WBUFW(buf, 0)=0x3802; - memcpy(WBUFP(buf, 2),wd->src,24); - WBUFB(buf,26)=flag; - mapif_send(wd->fd,buf,27); -// printf("inter server wis_end %d\n",flag); - return 0; + unsigned char buf[27]; + + WBUFW (buf, 0) = 0x3802; + memcpy (WBUFP (buf, 2), wd->src, 24); + WBUFB (buf, 26) = flag; + mapif_send (wd->fd, buf, 27); +// printf("inter server wis_end %d\n",flag); + return 0; } -int mapif_account_reg(int fd,unsigned char *src) +int mapif_account_reg (int fd, unsigned char *src) { - unsigned char buf[WBUFW(src,2)]; - memcpy(WBUFP(buf,0),src,WBUFW(src,2)); - WBUFW(buf, 0)=0x3804; - mapif_sendallwos(fd,buf,WBUFW(buf,2)); - return 0; + unsigned char buf[WBUFW (src, 2)]; + memcpy (WBUFP (buf, 0), src, WBUFW (src, 2)); + WBUFW (buf, 0) = 0x3804; + mapif_sendallwos (fd, buf, WBUFW (buf, 2)); + return 0; } // Send the requested account_reg -int mapif_account_reg_reply(int fd,int account_id) +int mapif_account_reg_reply (int fd, int account_id) { - struct accreg *reg=accreg_pt; - inter_accreg_fromsql(account_id,reg); - - WFIFOW(fd,0)=0x3804; - WFIFOL(fd,4)=account_id; - if(reg->reg_num==0){ - WFIFOW(fd,2)=8; - }else{ - int j,p; - for(j=0,p=8;j<reg->reg_num;j++,p+=36){ - memcpy(WFIFOP(fd,p),reg->reg[j].str,32); - WFIFOL(fd,p+32)=reg->reg[j].value; - } - WFIFOW(fd,2)=p; - } - WFIFOSET(fd,WFIFOW(fd,2)); - return 0; + struct accreg *reg = accreg_pt; + inter_accreg_fromsql (account_id, reg); + + WFIFOW (fd, 0) = 0x3804; + WFIFOL (fd, 4) = account_id; + if (reg->reg_num == 0) + { + WFIFOW (fd, 2) = 8; + } + else + { + int j, p; + for (j = 0, p = 8; j < reg->reg_num; j++, p += 36) + { + memcpy (WFIFOP (fd, p), reg->reg[j].str, 32); + WFIFOL (fd, p + 32) = reg->reg[j].value; + } + WFIFOW (fd, 2) = p; + } + WFIFOSET (fd, WFIFOW (fd, 2)); + return 0; } //-------------------------------------------------------- // Existence check of WISP data -int check_ttl_wisdata_sub(void *key, void *data, va_list ap) { - unsigned long tick; - struct WisData *wd = (struct WisData *)data; - tick = va_arg(ap, unsigned long); +int check_ttl_wisdata_sub (void *key, void *data, va_list ap) +{ + unsigned long tick; + struct WisData *wd = (struct WisData *) data; + tick = va_arg (ap, unsigned long); - if (DIFF_TICK(tick, wd->tick) > WISDATA_TTL && wis_delnum < WISDELLIST_MAX) - wis_dellist[wis_delnum++] = wd->id; + if (DIFF_TICK (tick, wd->tick) > WISDATA_TTL + && wis_delnum < WISDELLIST_MAX) + wis_dellist[wis_delnum++] = wd->id; - return 0; + return 0; } -int check_ttl_wisdata() { - unsigned long tick = gettick(); - int i; - - do { - wis_delnum = 0; - numdb_foreach(wis_db, check_ttl_wisdata_sub, tick); - for(i = 0; i < wis_delnum; i++) { - struct WisData *wd = numdb_search(wis_db, wis_dellist[i]); - printf("inter: wis data id=%d time out : from %s to %s\n", wd->id, wd->src, wd->dst); - // removed. not send information after a timeout. Just no answer for the player - //mapif_wis_end(wd, 1); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target - numdb_erase(wis_db, wd->id); - free(wd); - } - } while(wis_delnum >= WISDELLIST_MAX); - - return 0; +int check_ttl_wisdata () +{ + unsigned long tick = gettick (); + int i; + + do + { + wis_delnum = 0; + numdb_foreach (wis_db, check_ttl_wisdata_sub, tick); + for (i = 0; i < wis_delnum; i++) + { + struct WisData *wd = numdb_search (wis_db, wis_dellist[i]); + printf ("inter: wis data id=%d time out : from %s to %s\n", + wd->id, wd->src, wd->dst); + // removed. not send information after a timeout. Just no answer for the player + //mapif_wis_end(wd, 1); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target + numdb_erase (wis_db, wd->id); + free (wd); + } + } + while (wis_delnum >= WISDELLIST_MAX); + + return 0; } //-------------------------------------------------------- // GM message sending -int mapif_parse_GMmessage(int fd) +int mapif_parse_GMmessage (int fd) { - mapif_GMmessage(RFIFOP(fd, 4), RFIFOW(fd, 2)); - return 0; + mapif_GMmessage (RFIFOP (fd, 4), RFIFOW (fd, 2)); + return 0; } - // Wisp/page request to send -int mapif_parse_WisRequest(int fd) { - struct WisData* wd; - static int wisid = 0; - - if (RFIFOW(fd,2)-52 >= sizeof(wd->msg)) { - printf("inter: Wis message size too long.\n"); - return 0; - } else if (RFIFOW(fd,2)-52 <= 0) { // normaly, impossible, but who knows... - printf("inter: Wis message doesn't exist.\n"); - return 0; - } - sprintf (tmp_sql, "SELECT `name` FROM `%s` WHERE `char_id`='%d'",char_db, (int) RFIFOP(fd,28)); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - } - sql_res = mysql_store_result(&mysql_handle); - - // search if character exists before to ask all map-servers - if (!(sql_row = mysql_fetch_row(sql_res))) { - unsigned char buf[27]; - WBUFW(buf, 0) = 0x3802; - memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), 24); - WBUFB(buf,26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target - mapif_send(fd, buf, 27); - // Character exists. So, ask all map-servers - } else { - // to be sure of the correct name, rewrite it - memset(RFIFOP(fd,28), 0, 24); - strncpy(RFIFOP(fd,28), sql_row[0], 24); - // if source is destination, don't ask other servers. - if (strcmp(RFIFOP(fd,4),RFIFOP(fd,28)) == 0) { - unsigned char buf[27]; - WBUFW(buf, 0) = 0x3802; - memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), 24); - WBUFB(buf,26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target - mapif_send(fd, buf, 27); - } else { - - CREATE(wd, struct WisData, 1); - - // Whether the failure of previous wisp/page transmission (timeout) - check_ttl_wisdata(); - - wd->id = ++wisid; - wd->fd = fd; - wd->len= RFIFOW(fd,2)-52; - memcpy(wd->src, RFIFOP(fd, 4), 24); - memcpy(wd->dst, RFIFOP(fd,28), 24); - memcpy(wd->msg, RFIFOP(fd,52), wd->len); - wd->tick = gettick(); - numdb_insert(wis_db, wd->id, wd); - mapif_wis_message(wd); - } - } - - return 0; +int mapif_parse_WisRequest (int fd) +{ + struct WisData *wd; + static int wisid = 0; + + if (RFIFOW (fd, 2) - 52 >= sizeof (wd->msg)) + { + printf ("inter: Wis message size too long.\n"); + return 0; + } + else if (RFIFOW (fd, 2) - 52 <= 0) + { // normaly, impossible, but who knows... + printf ("inter: Wis message doesn't exist.\n"); + return 0; + } + sprintf (tmp_sql, "SELECT `name` FROM `%s` WHERE `char_id`='%d'", char_db, + (int) RFIFOP (fd, 28)); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + + // search if character exists before to ask all map-servers + if (!(sql_row = mysql_fetch_row (sql_res))) + { + unsigned char buf[27]; + WBUFW (buf, 0) = 0x3802; + memcpy (WBUFP (buf, 2), RFIFOP (fd, 4), 24); + WBUFB (buf, 26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target + mapif_send (fd, buf, 27); + // Character exists. So, ask all map-servers + } + else + { + // to be sure of the correct name, rewrite it + memset (RFIFOP (fd, 28), 0, 24); + strncpy (RFIFOP (fd, 28), sql_row[0], 24); + // if source is destination, don't ask other servers. + if (strcmp (RFIFOP (fd, 4), RFIFOP (fd, 28)) == 0) + { + unsigned char buf[27]; + WBUFW (buf, 0) = 0x3802; + memcpy (WBUFP (buf, 2), RFIFOP (fd, 4), 24); + WBUFB (buf, 26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target + mapif_send (fd, buf, 27); + } + else + { + + CREATE (wd, struct WisData, 1); + + // Whether the failure of previous wisp/page transmission (timeout) + check_ttl_wisdata (); + + wd->id = ++wisid; + wd->fd = fd; + wd->len = RFIFOW (fd, 2) - 52; + memcpy (wd->src, RFIFOP (fd, 4), 24); + memcpy (wd->dst, RFIFOP (fd, 28), 24); + memcpy (wd->msg, RFIFOP (fd, 52), wd->len); + wd->tick = gettick (); + numdb_insert (wis_db, wd->id, wd); + mapif_wis_message (wd); + } + } + + return 0; } - // Wisp/page transmission result -int mapif_parse_WisReply(int fd) { - int id = RFIFOL(fd,2), flag = RFIFOB(fd,6); - struct WisData *wd = numdb_search(wis_db, id); +int mapif_parse_WisReply (int fd) +{ + int id = RFIFOL (fd, 2), flag = RFIFOB (fd, 6); + struct WisData *wd = numdb_search (wis_db, id); - if (wd == NULL) - return 0; // This wisp was probably suppress before, because it was timeout of because of target was found on another map-server + if (wd == NULL) + return 0; // This wisp was probably suppress before, because it was timeout of because of target was found on another map-server - if ((--wd->count) <= 0 || flag != 1) { - mapif_wis_end(wd, flag); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target - numdb_erase(wis_db, id); - free(wd); - } + if ((--wd->count) <= 0 || flag != 1) + { + mapif_wis_end (wd, flag); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target + numdb_erase (wis_db, id); + free (wd); + } - return 0; + return 0; } - // Save account_reg into sql (type=2) -int mapif_parse_AccReg(int fd) +int mapif_parse_AccReg (int fd) { - int j,p; - struct accreg *reg=accreg_pt; - int account_id = RFIFOL(fd,4); - memset(accreg_pt,0,sizeof(struct accreg)); - - for(j=0,p=8;j<ACCOUNT_REG_NUM && p<RFIFOW(fd,2);j++,p+=36){ - memcpy(reg->reg[j].str,RFIFOP(fd,p),32); - reg->reg[j].value=RFIFOL(fd,p+32); - } - reg->reg_num=j; - - inter_accreg_tosql(account_id,reg); - mapif_account_reg(fd,RFIFOP(fd,0)); // Send confirm message to map - return 0; + int j, p; + struct accreg *reg = accreg_pt; + int account_id = RFIFOL (fd, 4); + memset (accreg_pt, 0, sizeof (struct accreg)); + + for (j = 0, p = 8; j < ACCOUNT_REG_NUM && p < RFIFOW (fd, 2); + j++, p += 36) + { + memcpy (reg->reg[j].str, RFIFOP (fd, p), 32); + reg->reg[j].value = RFIFOL (fd, p + 32); + } + reg->reg_num = j; + + inter_accreg_tosql (account_id, reg); + mapif_account_reg (fd, RFIFOP (fd, 0)); // Send confirm message to map + return 0; } // Request the value of account_reg -int mapif_parse_AccRegRequest(int fd) +int mapif_parse_AccRegRequest (int fd) { -// printf("mapif: accreg request\n"); - return mapif_account_reg_reply(fd,RFIFOL(fd,2)); +// printf("mapif: accreg request\n"); + return mapif_account_reg_reply (fd, RFIFOL (fd, 2)); } - - //-------------------------------------------------------- -int inter_parse_frommap(int fd) +int inter_parse_frommap (int fd) { - int cmd=RFIFOW(fd,0); - int len=0; - - // inter鯖管轄かを調べる - if(cmd<0x3000 || cmd>=0x3000+( sizeof(inter_recv_packet_length)/ - sizeof(inter_recv_packet_length[0]) ) ) - return 0; - - // パケット長を調べる - if( (len=inter_check_length(fd,inter_recv_packet_length[cmd-0x3000]))==0 ) - return 2; - - switch(cmd){ - case 0x3000: mapif_parse_GMmessage(fd); break; - case 0x3001: mapif_parse_WisRequest(fd); break; - case 0x3002: mapif_parse_WisReply(fd); break; - case 0x3004: mapif_parse_AccReg(fd); break; - case 0x3005: mapif_parse_AccRegRequest(fd); break; - default: - if( inter_party_parse_frommap(fd) ) - break; - if( inter_guild_parse_frommap(fd) ) - break; - if( inter_storage_parse_frommap(fd) ) - break; - if( inter_pet_parse_frommap(fd) ) - break; - return 0; - } - RFIFOSKIP(fd, len ); - return 1; + int cmd = RFIFOW (fd, 0); + int len = 0; + + // inter鯖管轄かを調べる + if (cmd < 0x3000 || cmd >= 0x3000 + (sizeof (inter_recv_packet_length) / + sizeof (inter_recv_packet_length + [0]))) + return 0; + + // パケット長を調べる + if ((len = + inter_check_length (fd, + inter_recv_packet_length[cmd - 0x3000])) == 0) + return 2; + + switch (cmd) + { + case 0x3000: + mapif_parse_GMmessage (fd); + break; + case 0x3001: + mapif_parse_WisRequest (fd); + break; + case 0x3002: + mapif_parse_WisReply (fd); + break; + case 0x3004: + mapif_parse_AccReg (fd); + break; + case 0x3005: + mapif_parse_AccRegRequest (fd); + break; + default: + if (inter_party_parse_frommap (fd)) + break; + if (inter_guild_parse_frommap (fd)) + break; + if (inter_storage_parse_frommap (fd)) + break; + if (inter_pet_parse_frommap (fd)) + break; + return 0; + } + RFIFOSKIP (fd, len); + return 1; } // RFIFO check -int inter_check_length(int fd, int length) +int inter_check_length (int fd, int length) { - if(length==-1){ // v-len packet - if(RFIFOREST(fd)<4) // packet not yet - return 0; - length = RFIFOW(fd, 2); - } - - if(RFIFOREST(fd)<length) // packet not yet - return 0; - - return length; + if (length == -1) + { // v-len packet + if (RFIFOREST (fd) < 4) // packet not yet + return 0; + length = RFIFOW (fd, 2); + } + + if (RFIFOREST (fd) < length) // packet not yet + return 0; + + return length; } |