diff options
Diffstat (limited to 'src/char')
-rw-r--r-- | src/char/char.c | 13 | ||||
-rw-r--r-- | src/char/char.h | 2 | ||||
-rw-r--r-- | src/char/pincode.c | 31 | ||||
-rw-r--r-- | src/char/pincode.h | 6 |
4 files changed, 49 insertions, 3 deletions
diff --git a/src/char/char.c b/src/char/char.c index 92b0209b2..6e0193780 100644 --- a/src/char/char.c +++ b/src/char/char.c @@ -4436,7 +4436,7 @@ void char_parse_char_connect(int fd, struct char_session_data* sd, uint32 ipl) } } -void char_send_map_info(int fd, int i, uint32 subnet_map_ip, struct mmo_charstatus *cd) +void char_send_map_info(int fd, int i, uint32 subnet_map_ip, struct mmo_charstatus *cd, char *dnsHost) { #if PACKETVER < 20170329 const int cmd = 0x71; @@ -4452,6 +4452,15 @@ void char_send_map_info(int fd, int i, uint32 subnet_map_ip, struct mmo_charstat mapindex->getmapname_ext(mapindex_id2name(cd->last_point.map), WFIFOP(fd, 6)); WFIFOL(fd, 22) = htonl((subnet_map_ip) ? subnet_map_ip : chr->server[i].ip); WFIFOW(fd, 26) = sockt->ntows(htons(chr->server[i].port)); // [!] LE byte order here [!] +#if PACKETVER < 20170329 + memset(WFIFOP(fd, 28), 0, 128); +#else + if (dnsHost != NULL) { + safestrncpy(WFIFOP(fd, 28), dnsHost, 128); + } else { + memset(WFIFOP(fd, 28), 0, 128); + } +#endif WFIFOSET(fd, len); } @@ -4612,7 +4621,7 @@ void char_parse_char_select(int fd, struct char_session_data* sd, uint32 ipl) subnet_map_ip = chr->lan_subnet_check(ipl); //Send player to map - chr->send_map_info(fd, i, subnet_map_ip, cd); + chr->send_map_info(fd, i, subnet_map_ip, cd, NULL); // create temporary auth entry CREATE(node, struct char_auth_node, 1); diff --git a/src/char/char.h b/src/char/char.h index 93b236966..a644f11ab 100644 --- a/src/char/char.h +++ b/src/char/char.h @@ -240,7 +240,7 @@ struct char_interface { void (*delete2_cancel) (int fd, struct char_session_data* sd); void (*send_account_id) (int fd, int account_id); void (*parse_char_connect) (int fd, struct char_session_data* sd, uint32 ipl); - void (*send_map_info) (int fd, int i, uint32 subnet_map_ip, struct mmo_charstatus *cd); + void (*send_map_info) (int fd, int i, uint32 subnet_map_ip, struct mmo_charstatus *cd, char *dnsHost); void (*send_wait_char_server) (int fd); int (*search_default_maps_mapserver) (struct mmo_charstatus *cd); void (*parse_char_select) (int fd, struct char_session_data* sd, uint32 ipl); diff --git a/src/char/pincode.c b/src/char/pincode.c index 9f78444a1..8fc4e6c36 100644 --- a/src/char/pincode.c +++ b/src/char/pincode.c @@ -95,7 +95,11 @@ void pincode_check(int fd, struct char_session_data* sd) character->pincode_enable = pincode->charselect * 2; pincode->loginstate(fd, sd, PINCODE_LOGIN_OK); } else { +#if PACKETVER_MAIN_NUM >= 20180124 || PACKETVER_RE_NUM >= 20180124 || PACKETVER_ZERO_NUM >= 20180131 + pincode->loginstate2(fd, sd, PINCODE_LOGIN_WRONG, PINCODE_LOGIN_FLAG_WRONG); +#else pincode->loginstate(fd, sd, PINCODE_LOGIN_WRONG); +#endif } } @@ -250,6 +254,32 @@ void pincode_loginstate(int fd, struct char_session_data* sd, enum pincode_login WFIFOSET(fd, 12); } +// 0 = pin is correct +// 1 = ask for pin - client sends 0x8b8 +// 2 = create new pin - client sends 0x8ba +// 3 = pin must be changed - client 0x8be +// 4 = create new pin ?? - client sends 0x8ba +// 5 = client shows msgstr(1896) +// 6 = client shows msgstr(1897) Unable to use your KSSN number +// 7 = char select window shows a button - client sends 0x8c5 +// 8 = pincode was incorrect +// [4144] pincode_loginstate2 can replace pincode_loginstate, +// but kro using pincode_loginstate2 only for send wrong pin error or locked after 3 pins wrong +void pincode_loginstate2(int fd, struct char_session_data* sd, enum pincode_login_response state, enum pincode_login_response2 flag) +{ +#if PACKETVER_MAIN_NUM >= 20180124 || PACKETVER_RE_NUM >= 20180124 || PACKETVER_ZERO_NUM >= 20180131 + nullpo_retv(sd); + + WFIFOHEAD(fd, 13); + WFIFOW(fd, 0) = 0xae9; + WFIFOL(fd, 2) = sd->pincode_seed = rnd() % 0xFFFF; + WFIFOL(fd, 6) = sd->account_id; + WFIFOW(fd, 10) = state; + WFIFOW(fd, 12) = flag; + WFIFOSET(fd, 13); +#endif +} + void pincode_notifyLoginPinUpdate(int account_id, char* pin) { nullpo_retv(pin); @@ -431,6 +461,7 @@ void pincode_defaults(void) pincode->makestate = pincode_makestate; pincode->editstate = pincode_editstate; pincode->loginstate = pincode_loginstate; + pincode->loginstate2 = pincode_loginstate2; pincode->setnew = pincode_setnew; pincode->change = pincode_change; pincode->isBlacklisted = pincode_isBlacklisted; diff --git a/src/char/pincode.h b/src/char/pincode.h index cfa6e83e6..699758179 100644 --- a/src/char/pincode.h +++ b/src/char/pincode.h @@ -53,6 +53,11 @@ enum pincode_login_response { PINCODE_LOGIN_WRONG = 8, }; +enum pincode_login_response2 { + PINCODE_LOGIN_FLAG_LOCKED = 0, + PINCODE_LOGIN_FLAG_WRONG = 2, +}; + /** * pincode interface **/ @@ -74,6 +79,7 @@ struct pincode_interface { void (*makestate) (int fd, struct char_session_data *sd, enum pincode_make_response state); void (*editstate) (int fd, struct char_session_data *sd, enum pincode_edit_response state); void (*loginstate) (int fd, struct char_session_data *sd, enum pincode_login_response state); + void (*loginstate2) (int fd, struct char_session_data *sd, enum pincode_login_response state, enum pincode_login_response2 flag); void (*setnew) (int fd, struct char_session_data* sd); void (*change) (int fd, struct char_session_data* sd); bool (*isBlacklisted) (const char *pin); |