Cleaned up chlogif_parse functions (#5070)

*Thanks to @aleos89
This commit is contained in:
Daegaladh 2020-06-09 22:21:00 +02:00 committed by GitHub
parent 79feae3629
commit 02e15335dd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 47 additions and 40 deletions

View File

@ -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)

View File

@ -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 <aid>.L <email>.40B <expiration_time>.L <group_id>.B <birthdate>.11B <pincode>.5B <pincode_change>.L <isvip>.B <char_vip>.B <char_billing>.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);

View File

@ -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);