From 02e15335dd51e1c8456074f9def2e7abe7284687 Mon Sep 17 00:00:00 2001 From: Daegaladh Date: Tue, 9 Jun 2020 22:21:00 +0200 Subject: [PATCH] Cleaned up chlogif_parse functions (#5070) *Thanks to @aleos89 --- src/char/char_clif.cpp | 13 +++++++++- src/char/char_logif.cpp | 56 +++++++++++++++++++---------------------- src/char/char_logif.hpp | 18 ++++++------- 3 files changed, 47 insertions(+), 40 deletions(-) diff --git a/src/char/char_clif.cpp b/src/char/char_clif.cpp index ef5f298a36..7f357ee2f2 100644 --- a/src/char/char_clif.cpp +++ b/src/char/char_clif.cpp @@ -811,13 +811,24 @@ int chclif_parse_charselect(int fd, struct char_session_data* sd,uint32 ipl){ char* data; uint32 char_id; struct auth_node* node; - int i, map_fd; + int i, map_fd, server_id; DBMap *auth_db = char_get_authdb(); DBMap *char_db_ = char_get_chardb(); int slot = RFIFOB(fd,2); RFIFOSKIP(fd,3); + ARR_FIND( 0, ARRAYLENGTH(map_server), server_id, map_server[server_id].fd > 0 && map_server[server_id].map[0] ); + // Map-server not available, tell the client to wait (client wont close, char select will respawn) + if (server_id == ARRAYLENGTH(map_server)) { + WFIFOHEAD(fd, 24); + WFIFOW(fd, 0) = 0x840; + WFIFOW(fd, 2) = 24; + memcpy(WFIFOP(fd, 4), "0", 20); // we can't send it empty (otherwise the list will pop up) + WFIFOSET(fd, 24); + return 1; + } + // Check if the character exists and is not scheduled for deletion if ( SQL_SUCCESS != Sql_Query(sql_handle, "SELECT `char_id` FROM `%s` WHERE `account_id`='%d' AND `char_num`='%d' AND `delete_date` = 0", schema_config.char_db, sd->account_id, slot) || SQL_SUCCESS != Sql_NextRow(sql_handle) diff --git a/src/char/char_logif.cpp b/src/char/char_logif.cpp index 4e1630cb01..fdba8e0565 100644 --- a/src/char/char_logif.cpp +++ b/src/char/char_logif.cpp @@ -179,12 +179,12 @@ void chlogif_prepsend_global_accreg(void) { } void chlogif_send_global_accreg(const char *key, unsigned int index, int64 int_value, const char* string_value, bool is_string) { - int nlen = WFIFOW(login_fd, 2); - size_t len; - if (!chlogif_isconnected()) return; + int nlen = WFIFOW(login_fd, 2); + size_t len; + len = strlen(key)+1; WFIFOB(login_fd, nlen) = (unsigned char)len; // won't be higher; the column size is 32 @@ -275,7 +275,7 @@ void chlogif_send_setaccoffline(int fd, int aid){ WFIFOSET(fd,6); } -int chlogif_parse_ackconnect(int fd, struct char_session_data* sd){ +int chlogif_parse_ackconnect(int fd){ if (RFIFOREST(fd) < 3) return 0; @@ -295,10 +295,11 @@ int chlogif_parse_ackconnect(int fd, struct char_session_data* sd){ return 1; } -int chlogif_parse_ackaccreq(int fd, struct char_session_data* sd){ +int chlogif_parse_ackaccreq(int fd){ if (RFIFOREST(fd) < 21) return 0; { + struct char_session_data* sd; uint32 account_id = RFIFOL(fd,2); uint32 login_id1 = RFIFOL(fd,6); uint32 login_id2 = RFIFOL(fd,10); @@ -332,16 +333,16 @@ int chlogif_parse_ackaccreq(int fd, struct char_session_data* sd){ * Receive account data from login-server * AH 0x2717 .L .40B .L .B .11B .5B .L .B .B .B **/ -int chlogif_parse_reqaccdata(int fd, struct char_session_data* sd){ - int u_fd; //user fd +int chlogif_parse_reqaccdata(int fd){ if (RFIFOREST(fd) < 75) return 0; + int u_fd; //user fd + struct char_session_data* sd; // find the authenticated session with this account id ARR_FIND( 0, fd_max, u_fd, session[u_fd] && (sd = (struct char_session_data*)session[u_fd]->session_data) && sd->auth && sd->account_id == RFIFOL(fd,2) ); if( u_fd < fd_max ) { - int server_id; memcpy(sd->email, RFIFOP(fd,6), 40); sd->expiration_time = (time_t)RFIFOL(fd,46); sd->group_id = RFIFOB(fd,50); @@ -357,12 +358,10 @@ int chlogif_parse_reqaccdata(int fd, struct char_session_data* sd){ 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 - (((charserv_config.max_connect_user == 0 || charserv_config.char_maintenance == 1) || + if(((charserv_config.max_connect_user == 0 || charserv_config.char_maintenance == 1) || (charserv_config.max_connect_user > 0 && char_count_users() >= charserv_config.max_connect_user)) && - sd->group_id < charserv_config.gm_allow_group)) { + sd->group_id < charserv_config.gm_allow_group) { // refuse connection (over populated) chclif_reject(u_fd,0); } else { @@ -377,7 +376,7 @@ int chlogif_parse_reqaccdata(int fd, struct char_session_data* sd){ return 1; } -int chlogif_parse_keepalive(int fd, struct char_session_data* sd){ +int chlogif_parse_keepalive(int fd){ if (RFIFOREST(fd) < 2) return 0; RFIFOSKIP(fd,2); @@ -425,7 +424,7 @@ void chlogif_parse_change_sex_sub(int sex, int acc, int char_id, int class_, int inter_guild_sex_changed(guild_id, acc, char_id, sex); } -int chlogif_parse_ackchangesex(int fd, struct char_session_data* sd) +int chlogif_parse_ackchangesex(int fd) { if (RFIFOREST(fd) < 7) return 0; @@ -519,7 +518,7 @@ int chlogif_parse_ackchangecharsex(int char_id, int sex) return 0; } -int chlogif_parse_ack_global_accreg(int fd, struct char_session_data* sd){ +int chlogif_parse_ack_global_accreg(int fd){ if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2)) return 0; else { //Receive account_reg2 registry, forward to map servers. @@ -530,7 +529,7 @@ int chlogif_parse_ack_global_accreg(int fd, struct char_session_data* sd){ return 1; } -int chlogif_parse_accbannotification(int fd, struct char_session_data* sd){ +int chlogif_parse_accbannotification(int fd){ if (RFIFOREST(fd) < 11) return 0; else { // send to all map-servers to disconnect the player @@ -547,7 +546,7 @@ int chlogif_parse_accbannotification(int fd, struct char_session_data* sd){ return 1; } -int chlogif_parse_askkick(int fd, struct char_session_data* sd){ +int chlogif_parse_askkick(int fd){ if (RFIFOREST(fd) < 6) return 0; else { @@ -583,7 +582,7 @@ int chlogif_parse_askkick(int fd, struct char_session_data* sd){ return 1; } -int chlogif_parse_updip(int fd, struct char_session_data* sd){ +int chlogif_parse_updip(int fd){ unsigned char buf[2]; uint32 new_ip = 0; @@ -700,7 +699,6 @@ int chlogif_parse_AccInfoAck(int fd) { int chlogif_parse(int fd) { - struct char_session_data* sd = NULL; // only process data from the login-server if( fd != login_fd ) { @@ -727,8 +725,6 @@ int chlogif_parse(int fd) { } } - sd = (struct char_session_data*)session[fd]->session_data; - while(RFIFOREST(fd) >= 2) { // -1: Login server is not connected // 0: Avoid processing followup packets (prev was probably incomplete) packet @@ -736,16 +732,16 @@ int chlogif_parse(int fd) { int next = 1; uint16 command = RFIFOW(fd,0); switch( command ) { - case 0x2711: next = chlogif_parse_ackconnect(fd,sd); break; - case 0x2713: next = chlogif_parse_ackaccreq(fd, sd); break; - case 0x2717: next = chlogif_parse_reqaccdata(fd, sd); break; - case 0x2718: next = chlogif_parse_keepalive(fd, sd); break; + case 0x2711: next = chlogif_parse_ackconnect(fd); break; + case 0x2713: next = chlogif_parse_ackaccreq(fd); break; + case 0x2717: next = chlogif_parse_reqaccdata(fd); break; + case 0x2718: next = chlogif_parse_keepalive(fd); break; case 0x2721: next = chlogif_parse_AccInfoAck(fd); break; - case 0x2723: next = chlogif_parse_ackchangesex(fd, sd); break; - case 0x2726: next = chlogif_parse_ack_global_accreg(fd, sd); break; - case 0x2731: next = chlogif_parse_accbannotification(fd, sd); break; - case 0x2734: next = chlogif_parse_askkick(fd,sd); break; - case 0x2735: next = chlogif_parse_updip(fd,sd); break; + case 0x2723: next = chlogif_parse_ackchangesex(fd); break; + case 0x2726: next = chlogif_parse_ack_global_accreg(fd); break; + case 0x2731: next = chlogif_parse_accbannotification(fd); break; + case 0x2734: next = chlogif_parse_askkick(fd); break; + case 0x2735: next = chlogif_parse_updip(fd); break; case 0x2743: next = chlogif_parse_vipack(fd); break; default: ShowError("Unknown packet 0x%04x received from login-server, disconnecting.\n", command); diff --git a/src/char/char_logif.hpp b/src/char/char_logif.hpp index 721ab4e58e..dc1a9b6e88 100644 --- a/src/char/char_logif.hpp +++ b/src/char/char_logif.hpp @@ -26,17 +26,17 @@ void chlogif_send_setacconline(int aid); void chlogif_send_setallaccoffline(int fd); 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); -int chlogif_parse_keepalive(int fd, struct char_session_data* sd); +int chlogif_parse_ackconnect(int fd); +int chlogif_parse_ackaccreq(int fd); +int chlogif_parse_reqaccdata(int fd); +int chlogif_parse_keepalive(int fd); 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_ackchangesex(int fd); int chlogif_parse_ackchangecharsex(int char_id, int sex); -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); +int chlogif_parse_ack_global_accreg(int fd); +int chlogif_parse_accbannotification(int fd); +int chlogif_parse_askkick(int fd); +int chlogif_parse_updip(int fd); int chlogif_parse_vipack(int fd); int chlogif_reqvipdata(uint32 aid, uint8 flag, int32 timediff, int mapfd);