int chlogif_parse_ackaccreq(int fd, struct char_session_data* sd){ if (RFIFOREST(fd) < 21) return 0; { uint32 account_id = RFIFOL(fd,2); uint32 login_id1 = RFIFOL(fd,6); uint32 login_id2 = RFIFOL(fd,10); uint8 sex = RFIFOB(fd,14); uint8 result = RFIFOB(fd,15); int request_id = RFIFOL(fd,16); uint8 clienttype = RFIFOB(fd,20); RFIFOSKIP(fd,21); if( session_isActive(request_id) && (sd=(struct char_session_data*)session[request_id]->session_data) && !sd->auth && sd->account_id == account_id && sd->login_id1 == login_id1 && sd->login_id2 == login_id2 && sd->sex == sex ) { int client_fd = request_id; sd->clienttype = clienttype; switch( result ) { case 0:// ok char_auth_ok(client_fd, sd); break; case 1:// auth failed chclif_reject(client_fd,0); // rejected from server break; } } } return 1; }
/** * 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 if (RFIFOREST(fd) < 75) return 0; // 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); sd->char_slots = RFIFOB(fd,51); if( sd->char_slots > MAX_CHARS ) { ShowError("Account '%d' `character_slots` column is higher than supported MAX_CHARS (%d), update MAX_CHARS in mmo.hpp! capping to MAX_CHARS...\n",sd->account_id,sd->char_slots); sd->char_slots = MAX_CHARS;/* cap to maximum */ } else if ( !sd->char_slots )/* no value aka 0 in sql */ sd->char_slots = MIN_CHARS;/* cap to minimum */ safestrncpy(sd->birthdate, RFIFOCP(fd,52), sizeof(sd->birthdate)); safestrncpy(sd->pincode, RFIFOCP(fd,63), sizeof(sd->pincode)); sd->pincode_change = (time_t)RFIFOL(fd,68); 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) || (charserv_config.max_connect_user > 0 && char_count_users() >= charserv_config.max_connect_user)) && sd->group_id < charserv_config.gm_allow_group)) { // refuse connection (over populated) chclif_reject(u_fd,0); } else { // send characters to player chclif_mmo_char_send(u_fd, sd); #if PACKETVER_SUPPORTS_PINCODE chlogif_pincode_start(u_fd,sd); #endif } } RFIFOSKIP(fd,75); return 1; }
int chlogif_parse_ackaccreq(int fd, struct char_session_data* sd){ if (RFIFOREST(fd) < 25) return 0; { uint32 account_id = RFIFOL(fd,2); uint32 login_id1 = RFIFOL(fd,6); uint32 login_id2 = RFIFOL(fd,10); uint8 sex = RFIFOB(fd,14); uint8 result = RFIFOB(fd,15); int request_id = RFIFOL(fd,16); uint32 version = RFIFOL(fd,20); uint8 clienttype = RFIFOB(fd,24); RFIFOSKIP(fd,25); if( session_isActive(request_id) && (sd=(struct char_session_data*)session[request_id]->session_data) && !sd->auth && sd->account_id == account_id && sd->login_id1 == login_id1 && sd->login_id2 == login_id2 && sd->sex == sex ) { int client_fd = request_id; sd->version = version; sd->clienttype = clienttype; if(sd->version != date2version(PACKETVER)) ShowWarning("s aid=%d has an incorect version=%d in clientinfo. Server compiled for %d\n", sd->account_id,sd->version,date2version(PACKETVER)); switch( result ) { case 0:// ok char_auth_ok(client_fd, sd); break; case 1:// auth failed chclif_reject(client_fd,0); // rejected from server break; } } } return 1; }