preserve original disp if client is v1 or v2

This commit is contained in:
Martin Michelsen
2023-11-26 22:37:26 -08:00
parent ea83935dc4
commit 9b6a023d38
4 changed files with 17 additions and 4 deletions
+3
View File
@@ -39,6 +39,9 @@ public:
std::array<uint32_t, 30> blocked_senders;
// This is only used if the client is v1 or v2
std::unique_ptr<PlayerDispDataDCPCV3> last_reported_disp_v1_v2;
// Null unless the client is within the trade sequence (D0-D4 or EE commands)
std::unique_ptr<PendingItemTrade> pending_item_trade;
std::unique_ptr<PendingCardTrade> pending_card_trade;
+1 -2
View File
@@ -473,8 +473,7 @@ DestT convert_player_disp_data(const SrcT&, uint8_t, uint8_t) {
}
template <>
inline PlayerDispDataDCPCV3 convert_player_disp_data<PlayerDispDataDCPCV3>(
const PlayerDispDataDCPCV3& src, uint8_t, uint8_t) {
inline PlayerDispDataDCPCV3 convert_player_disp_data<PlayerDispDataDCPCV3>(const PlayerDispDataDCPCV3& src, uint8_t, uint8_t) {
return src;
}
+7
View File
@@ -2780,12 +2780,14 @@ static void on_61_98(shared_ptr<Client> 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<C_CharacterData_DCv1_61_98>(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<C_CharacterData_DCv2_61_98>(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<Client> c, uint16_t command, uint32_t flag, stri
}
case Version::PC_V2: {
const auto& cmd = check_size_t<C_CharacterData_PC_61_98>(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<Client> c, uint16_t command, uint32_t flag, stri
cmd = &check_size_t<C_CharacterData_V3_61_98>(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
+6 -2
View File
@@ -1869,8 +1869,12 @@ void send_join_lobby_t(shared_ptr<Client> c, shared_ptr<Lobby> l, shared_ptr<Cli
}
e.inventory = lp->inventory;
e.inventory.encode_for_client(c);
e.disp = convert_player_disp_data<DispDataT>(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<DispDataT>(*lc->game_data.last_reported_disp_v1_v2, c->language(), lp->inventory.language);
} else {
e.disp = convert_player_disp_data<DispDataT>(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));