From 9b6a023d381aaa5416bef238b9b12006476b4fd5 Mon Sep 17 00:00:00 2001 From: Martin Michelsen Date: Sun, 26 Nov 2023 22:37:26 -0800 Subject: [PATCH] preserve original disp if client is v1 or v2 --- src/Player.hh | 3 +++ src/PlayerSubordinates.hh | 3 +-- src/ReceiveCommands.cc | 7 +++++++ src/SendCommands.cc | 8 ++++++-- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/Player.hh b/src/Player.hh index b8b1d40e..d0ad7705 100644 --- a/src/Player.hh +++ b/src/Player.hh @@ -39,6 +39,9 @@ public: std::array blocked_senders; + // This is only used if the client is v1 or v2 + std::unique_ptr last_reported_disp_v1_v2; + // Null unless the client is within the trade sequence (D0-D4 or EE commands) std::unique_ptr pending_item_trade; std::unique_ptr pending_card_trade; diff --git a/src/PlayerSubordinates.hh b/src/PlayerSubordinates.hh index 51031fa9..150afc5f 100644 --- a/src/PlayerSubordinates.hh +++ b/src/PlayerSubordinates.hh @@ -473,8 +473,7 @@ DestT convert_player_disp_data(const SrcT&, uint8_t, uint8_t) { } template <> -inline PlayerDispDataDCPCV3 convert_player_disp_data( - const PlayerDispDataDCPCV3& src, uint8_t, uint8_t) { +inline PlayerDispDataDCPCV3 convert_player_disp_data(const PlayerDispDataDCPCV3& src, uint8_t, uint8_t) { return src; } diff --git a/src/ReceiveCommands.cc b/src/ReceiveCommands.cc index b83ccc42..fd5842a0 100644 --- a/src/ReceiveCommands.cc +++ b/src/ReceiveCommands.cc @@ -2780,12 +2780,14 @@ static void on_61_98(shared_ptr c, uint16_t command, uint32_t flag, stri case Version::DC_V1_12_2000_PROTOTYPE: case Version::DC_V1: { const auto& cmd = check_size_t(data); + c->game_data.last_reported_disp_v1_v2.reset(new PlayerDispDataDCPCV3(cmd.disp)); player->inventory = cmd.inventory; player->disp = cmd.disp.to_bb(player->inventory.language, player->inventory.language); break; } case Version::DC_V2: { const auto& cmd = check_size_t(data, 0xFFFF); + c->game_data.last_reported_disp_v1_v2.reset(new PlayerDispDataDCPCV3(cmd.disp)); player->inventory = cmd.inventory; player->disp = cmd.disp.to_bb(player->inventory.language, player->inventory.language); player->battle_records = cmd.records.battle; @@ -2795,6 +2797,7 @@ static void on_61_98(shared_ptr c, uint16_t command, uint32_t flag, stri } case Version::PC_V2: { const auto& cmd = check_size_t(data, 0xFFFF); + c->game_data.last_reported_disp_v1_v2.reset(new PlayerDispDataDCPCV3(cmd.disp)); player->inventory = cmd.inventory; player->disp = cmd.disp.to_bb(player->inventory.language, player->inventory.language); player->battle_records = cmd.records.battle; @@ -2843,6 +2846,10 @@ static void on_61_98(shared_ptr c, uint16_t command, uint32_t flag, stri cmd = &check_size_t(data, 0xFFFF); } + if (c->version() == Version::GC_NTE) { + c->game_data.last_reported_disp_v1_v2.reset(new PlayerDispDataDCPCV3(cmd->disp)); + } + auto s = c->require_server_state(); // We use the flag field in this command to differentiate between Ep3 diff --git a/src/SendCommands.cc b/src/SendCommands.cc index e8a2dea8..59033316 100644 --- a/src/SendCommands.cc +++ b/src/SendCommands.cc @@ -1869,8 +1869,12 @@ void send_join_lobby_t(shared_ptr c, shared_ptr l, shared_ptrinventory; e.inventory.encode_for_client(c); - e.disp = convert_player_disp_data(lp->disp, c->language(), lp->inventory.language); - e.disp.enforce_lobby_join_limits_for_client(c); + if ((lc == c) && is_v1_or_v2(c->version()) && lc->game_data.last_reported_disp_v1_v2) { + e.disp = convert_player_disp_data(*lc->game_data.last_reported_disp_v1_v2, c->language(), lp->inventory.language); + } else { + e.disp = convert_player_disp_data(lp->disp, c->language(), lp->inventory.language); + e.disp.enforce_lobby_join_limits_for_client(c); + } } send_command(c, command, used_entries, &cmd, cmd.size(used_entries));