From 1c987de71da32da4ee404d07322e62809a0a1fe5 Mon Sep 17 00:00:00 2001 From: Lemongrass3110 Date: Thu, 20 Dec 2018 17:56:13 +0100 Subject: [PATCH] Fixed unknown map in character select (#3761) Fixes #1145 Credits to @4144 for finding this! Thanks to @RadianFord for reporting. --- src/char/char.cpp | 6 +++++- src/char/char.hpp | 2 +- src/char/char_clif.cpp | 13 ++++++++++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/char/char.cpp b/src/char/char.cpp index f2988d881b..9d03d3ccc0 100644 --- a/src/char/char.cpp +++ b/src/char/char.cpp @@ -899,7 +899,7 @@ int char_mmo_char_tobuf(uint8* buf, struct mmo_charstatus* p); //===================================================================================================== // Loads the basic character rooster for the given account. Returns total buffer used. -int char_mmo_chars_fromsql(struct char_session_data* sd, uint8* buf) { +int char_mmo_chars_fromsql(struct char_session_data* sd, uint8* buf, uint8* count ) { SqlStmt* stmt; struct mmo_charstatus p; int j = 0, i; @@ -992,6 +992,10 @@ int char_mmo_chars_fromsql(struct char_session_data* sd, uint8* buf) { sd->char_moves[p.slot] = p.character_moves; } + if( count != nullptr ){ + *count = i; + } + memset(sd->new_name,0,sizeof(sd->new_name)); SqlStmt_Free(stmt); diff --git a/src/char/char.hpp b/src/char/char.hpp index 02a869eae1..655428dd3e 100644 --- a/src/char/char.hpp +++ b/src/char/char.hpp @@ -286,7 +286,7 @@ int char_mmo_gender(const struct char_session_data *sd, const struct mmo_charsta int char_mmo_char_tobuf(uint8* buffer, struct mmo_charstatus* p); int char_mmo_char_tosql(uint32 char_id, struct mmo_charstatus* p); int char_mmo_char_fromsql(uint32 char_id, struct mmo_charstatus* p, bool load_everything); -int char_mmo_chars_fromsql(struct char_session_data* sd, uint8* buf); +int char_mmo_chars_fromsql(struct char_session_data* sd, uint8* buf, uint8* count = nullptr); enum e_char_del_response char_delete(struct char_session_data* sd, uint32 char_id); int char_rename_char_sql(struct char_session_data *sd, uint32 char_id); int char_divorce_char_sql(int partner_id1, int partner_id2); diff --git a/src/char/char_clif.cpp b/src/char/char_clif.cpp index 1806ebf820..bf88b3b449 100644 --- a/src/char/char_clif.cpp +++ b/src/char/char_clif.cpp @@ -372,10 +372,21 @@ void chclif_mmo_send082d(int fd, struct char_session_data* sd) { } void chclif_mmo_send099d(int fd, struct char_session_data *sd) { + uint8 count = 0; + WFIFOHEAD(fd,4 + (MAX_CHARS*MAX_CHAR_BUF)); WFIFOW(fd,0) = 0x99d; - WFIFOW(fd,2) = char_mmo_chars_fromsql(sd, WFIFOP(fd,4)) + 4; + WFIFOW(fd,2) = char_mmo_chars_fromsql(sd, WFIFOP(fd,4), &count) + 4; WFIFOSET(fd,WFIFOW(fd,2)); + + // This is something special Gravity came up with. + // The client triggers some finalization code only if count is != 3. + if( count == 3 ){ + WFIFOHEAD(fd,4); + WFIFOW(fd,0) = 0x99d; + WFIFOW(fd,2) = 4; + WFIFOSET(fd,4); + } }