From 796b97455cf1da41e580cf2ea84cf03797db3587 Mon Sep 17 00:00:00 2001 From: Cydh Ramdh Date: Mon, 17 Nov 2014 20:19:30 +0700 Subject: [PATCH] * Fixed #109 - @charunban is fully usable now - Updated Inter-Server Packet documentation * Added misc battle config, 'disp_servervip_msg' (default: no) Signed-off-by: Cydh Ramdh --- conf/battle/misc.conf | 1 + doc/packet_interserv.txt | 8 ++-- src/char/char_clif.c | 2 +- src/char/char_mapif.c | 101 ++++++++++++++++++++------------------- src/map/atcommand.c | 49 ++++++++++--------- src/map/battle.c | 1 + src/map/battle.h | 1 + src/map/chrif.c | 59 +++++++++++++++-------- src/map/chrif.h | 18 ++++++- src/map/pc.c | 4 +- src/map/script.c | 2 +- src/map/trade.c | 4 +- 12 files changed, 147 insertions(+), 103 deletions(-) diff --git a/conf/battle/misc.conf b/conf/battle/misc.conf index 9b1e668e04..dab6d85c38 100644 --- a/conf/battle/misc.conf +++ b/conf/battle/misc.conf @@ -146,6 +146,7 @@ discount_item_point_shop: 0 // Don't display message "login-serv has been asked to %s the player '%.*s'." (Note 1) disp_serverbank_msg: no +disp_servervip_msg: no // Delay to allow user resend new mail (default & minimum is 1000) mail_delay: 1000 diff --git a/doc/packet_interserv.txt b/doc/packet_interserv.txt index ce393ecac4..a8da9e7e0e 100644 --- a/doc/packet_interserv.txt +++ b/doc/packet_interserv.txt @@ -2753,11 +2753,13 @@ Currently the max packet size is 0xFFFF (see 'WFIFOSET()' in 'src/common/socket. 0x2b2a Type: ZA - Structure: .W .L - index: 0,2 - len: 6 + Structure: .W .L .?B + index: 0,2,6 + len: 6+NAME_LENGTH parameter: - cmd : packet identification (0x2b2a) + - aid + - character_name desc: - chrif_req_charunban diff --git a/src/char/char_clif.c b/src/char/char_clif.c index dda82be9a8..e1a1c89e1d 100644 --- a/src/char/char_clif.c +++ b/src/char/char_clif.c @@ -712,7 +712,7 @@ int chclif_parse_charselect(int fd, struct char_session_data* sd,uint32 ipl){ WFIFOSET(fd,3); return 1; } - + /* set char as online prior to loading its data so 3rd party applications will realise the sql data is not reliable */ char_set_char_online(-2,char_id,sd->account_id); if( !char_mmo_char_fromsql(char_id, &char_dat, true) ) { /* failed? set it back offline */ diff --git a/src/char/char_mapif.c b/src/char/char_mapif.c index 5756dd63c4..1e9f246382 100644 --- a/src/char/char_mapif.c +++ b/src/char/char_mapif.c @@ -1205,7 +1205,8 @@ int chmapif_parse_reqcharban(int fd){ || SQL_SUCCESS != SqlStmt_BindParam(stmt, 1, SQLDT_INT, (void*)&t_cid, sizeof(t_cid)) || SQL_SUCCESS != SqlStmt_Execute(stmt) - ) { + ) + { SqlStmt_ShowDebug(stmt); SqlStmt_Free(stmt); return 1; @@ -1229,13 +1230,13 @@ int chmapif_parse_reqcharban(int fd){ } int chmapif_parse_reqcharunban(int fd){ - if (RFIFOREST(fd) < 6) - return 0; + if (RFIFOREST(fd) < 6+NAME_LENGTH) + return 0; else { - int cid = RFIFOL(fd,2); - RFIFOSKIP(fd,6); + const char* name = (char*)RFIFOP(fd,6); + RFIFOSKIP(fd,6+NAME_LENGTH); - if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `unban_time` = '0' WHERE `char_id` = '%d' LIMIT 1", schema_config.char_db, cid) ) { + if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `unban_time` = '0' WHERE `name` = '%s' LIMIT 1", schema_config.char_db, name) ) { Sql_ShowDebug(sql_handle); return 1; } @@ -1249,7 +1250,7 @@ int chmapif_parse_reqcharunban(int fd){ */ int chmapif_bonus_script_get(int fd) { if (RFIFOREST(fd) < 6) - return 0; + return 0; else { int cid; cid = RFIFOL(fd,2); @@ -1301,7 +1302,7 @@ int chmapif_bonus_script_get(int fd) { */ int chmapif_bonus_script_save(int fd) { if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2)) - return 0; + return 0; else { int count, cid; @@ -1342,7 +1343,7 @@ int chmapif_bonus_script_save(int fd) { */ int chmapif_parse(int fd){ int id; //mapserv id - + ARR_FIND( 0, ARRAYLENGTH(map_server), id, map_server[id].fd == fd ); if( id == ARRAYLENGTH(map_server) ) {// not a map server @@ -1361,47 +1362,47 @@ 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 - case 0x2aff: next=chmapif_parse_regmapuser(fd,id); break; //register users - case 0x2b01: next=chmapif_parse_reqsavechar(fd,id); break; - case 0x2b02: next=chmapif_parse_authok(fd); break; - case 0x2b05: next=chmapif_parse_reqchangemapserv(fd); break; - case 0x2b07: next=chmapif_parse_askrmfriend(fd); break; - case 0x2b08: next=chmapif_parse_reqcharname(fd); break; - case 0x2b0a: next=chmapif_parse_req_skillcooldown(fd); break; - case 0x2b0c: next=chmapif_parse_reqnewemail(fd); break; - 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 0x2b15: next=chmapif_parse_req_saveskillcooldown(fd); break; - case 0x2b16: next=chmapif_parse_updmapinfo(fd); break; - case 0x2b17: next=chmapif_parse_setcharoffline(fd); break; - case 0x2b18: next=chmapif_parse_setalloffline(fd,id); break; - case 0x2b19: next=chmapif_parse_setcharonline(fd,id); break; - case 0x2b1a: next=chmapif_parse_reqfamelist(fd); break; - case 0x2b1c: next=chmapif_parse_save_scdata(fd); break; - case 0x2b23: next=chmapif_parse_keepalive(fd); break; - case 0x2b26: next=chmapif_parse_reqauth(fd,id); break; - case 0x2b28: chmapif_parse_reqcharban(fd); break; //charban - case 0x2b2a: chmapif_parse_reqcharunban(fd); break; //charunban - //case 0x2b2c: /*free*/; break; - case 0x2b2d: chmapif_bonus_script_get(fd); break; //Load data - case 0x2b2e: chmapif_bonus_script_save(fd); break;//Save data - case 0x3008: next=chmapif_parse_fw_configstats(fd); break; - default: - { - // inter server - packet - int r = inter_parse_frommap(fd); - if (r == 1) break; // processed - if (r == 2) return 0; // need more packet - // no inter server packet. no char server packet -> disconnect - ShowError("Unknown packet 0x%04x from map server, disconnecting.\n", RFIFOW(fd,0)); - set_eof(fd); - return 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 + case 0x2aff: next=chmapif_parse_regmapuser(fd,id); break; //register users + case 0x2b01: next=chmapif_parse_reqsavechar(fd,id); break; + case 0x2b02: next=chmapif_parse_authok(fd); break; + case 0x2b05: next=chmapif_parse_reqchangemapserv(fd); break; + case 0x2b07: next=chmapif_parse_askrmfriend(fd); break; + case 0x2b08: next=chmapif_parse_reqcharname(fd); break; + case 0x2b0a: next=chmapif_parse_req_skillcooldown(fd); break; + case 0x2b0c: next=chmapif_parse_reqnewemail(fd); break; + 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 0x2b15: next=chmapif_parse_req_saveskillcooldown(fd); break; + case 0x2b16: next=chmapif_parse_updmapinfo(fd); break; + case 0x2b17: next=chmapif_parse_setcharoffline(fd); break; + case 0x2b18: next=chmapif_parse_setalloffline(fd,id); break; + case 0x2b19: next=chmapif_parse_setcharonline(fd,id); break; + case 0x2b1a: next=chmapif_parse_reqfamelist(fd); break; + case 0x2b1c: next=chmapif_parse_save_scdata(fd); break; + case 0x2b23: next=chmapif_parse_keepalive(fd); break; + case 0x2b26: next=chmapif_parse_reqauth(fd,id); break; + case 0x2b28: next=chmapif_parse_reqcharban(fd); break; //charban + case 0x2b2a: next=chmapif_parse_reqcharunban(fd); break; //charunban + //case 0x2b2c: /*free*/; break; + case 0x2b2d: next=chmapif_bonus_script_get(fd); break; //Load data + case 0x2b2e: next=chmapif_bonus_script_save(fd); break;//Save data + case 0x3008: next=chmapif_parse_fw_configstats(fd); break; + default: + { + // inter server - packet + int r = inter_parse_frommap(fd); + if (r == 1) break; // processed + if (r == 2) return 0; // need more packet + // no inter server packet. no char server packet -> disconnect + ShowError("Unknown packet 0x%04x from map server, disconnecting.\n", RFIFOW(fd,0)); + set_eof(fd); + return 0; + } } // switch if(next==0) return 0; //avoid processing rest of packet } // while diff --git a/src/map/atcommand.c b/src/map/atcommand.c index dea1f1c6a5..84a4d4be00 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -2889,8 +2889,9 @@ ACMD_FUNC(char_block) return -1; } - chrif_req_login_operation(sd->status.account_id, atcmd_player_name, 1, 0, 0, 0); // type: 1 - block - clif_displaymessage(fd, msg_txt(sd,88)); // Character name sent to char-server to ask it. + chrif_req_login_operation(sd->status.account_id, atcmd_player_name, CHRIF_OP_LOGIN_BLOCK, 0, 0, 0); // type: 1 - block + sprintf(atcmd_output, msg_txt(sd,88), "login"); // Sending request to %s server... + clif_displaymessage(fd, atcmd_output); return 0; } @@ -2903,15 +2904,15 @@ ACMD_FUNC(char_block) ACMD_FUNC(char_ban) { char * modif_p; - int32 timediff=0; //don't set this as uint as we may want to decrease banned time - int bantype=0; //2=account block, 6=char specific + int32 timediff = 0; //don't set this as uint as we may want to decrease banned time + int bantype = 0; //2=account block, 6=char specific nullpo_retr(-1, sd); memset(atcmd_output, '\0', sizeof(atcmd_output)); memset(atcmd_player_name, '\0', sizeof(atcmd_player_name)); - bantype = strcmpi(command+1,"charban")?2:6; //! FIXME this breaking alias recognition + bantype = strcmpi(command+1,"charban") ? CHRIF_OP_LOGIN_BAN : CHRIF_OP_BAN; //! FIXME this breaking alias recognition if (!message || !*message || sscanf(message, "%255s %23[^\n]", atcmd_output, atcmd_player_name) < 2) { clif_displaymessage(fd, msg_txt(sd,1022)); // Please enter ban time and a player name (usage: @charban/@ban/@banish/@charbanish