diff --git a/distribution/changelog.txt b/distribution/changelog.txt index 46e81b634f..92455e8dcb 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -1,5 +1,6 @@ 0.4.7 (in development) ------------------------------------------------------------------------ +- Fix: [#20737] Spent money in player window underflows when getting refunds. 0.4.6 (2023-09-03) ------------------------------------------------------------------------ diff --git a/src/openrct2/actions/GameAction.cpp b/src/openrct2/actions/GameAction.cpp index 637a61520f..efaebc3321 100644 --- a/src/openrct2/actions/GameAction.cpp +++ b/src/openrct2/actions/GameAction.cpp @@ -387,7 +387,8 @@ namespace GameActions playerIndex != -1, "Unable to find player %u for game action %u", playerId, action->GetType()); NetworkSetPlayerLastAction(playerIndex, action->GetType()); - if (result.Cost != 0) + NetworkIncrementPlayerNumCommands(playerIndex); + if (result.Cost > 0) { NetworkAddPlayerMoneySpent(playerIndex, result.Cost); } diff --git a/src/openrct2/network/NetworkBase.cpp b/src/openrct2/network/NetworkBase.cpp index 038f24ce7d..e205bdb61a 100644 --- a/src/openrct2/network/NetworkBase.cpp +++ b/src/openrct2/network/NetworkBase.cpp @@ -3352,6 +3352,14 @@ std::string NetworkGetPlayerPublicKeyHash(uint32_t id) return {}; } +void NetworkIncrementPlayerNumCommands(uint32_t playerIndex) +{ + auto& network = OpenRCT2::GetContext()->GetNetwork(); + Guard::IndexInRange(playerIndex, network.player_list); + + network.player_list[playerIndex]->IncrementNumCommands(); +} + void NetworkAddPlayerMoneySpent(uint32_t index, money64 cost) { auto& network = OpenRCT2::GetContext()->GetNetwork(); @@ -4090,6 +4098,9 @@ std::string NetworkGetPlayerPublicKeyHash(uint32_t id) { return {}; } +void NetworkIncrementPlayerNumCommands(uint32_t playerIndex) +{ +} void NetworkAddPlayerMoneySpent(uint32_t index, money64 cost) { } diff --git a/src/openrct2/network/NetworkPlayer.cpp b/src/openrct2/network/NetworkPlayer.cpp index 19459f829b..03783a1f42 100644 --- a/src/openrct2/network/NetworkPlayer.cpp +++ b/src/openrct2/network/NetworkPlayer.cpp @@ -36,11 +36,16 @@ void NetworkPlayer::Write(NetworkPacket& packet) << CommandsRan; } -void NetworkPlayer::AddMoneySpent(money64 cost) +void NetworkPlayer::IncrementNumCommands() { - MoneySpent += cost; CommandsRan++; WindowInvalidateByNumber(WindowClass::Player, Id); } +void NetworkPlayer::AddMoneySpent(money64 cost) +{ + MoneySpent += cost; + WindowInvalidateByNumber(WindowClass::Player, Id); +} + #endif diff --git a/src/openrct2/network/NetworkPlayer.h b/src/openrct2/network/NetworkPlayer.h index 17d965429b..a292d36e7a 100644 --- a/src/openrct2/network/NetworkPlayer.h +++ b/src/openrct2/network/NetworkPlayer.h @@ -45,5 +45,6 @@ public: void Read(NetworkPacket& packet); void Write(NetworkPacket& packet); + void IncrementNumCommands(); void AddMoneySpent(money64 cost); }; diff --git a/src/openrct2/network/network.h b/src/openrct2/network/network.h index 988374fc3b..9d98e1c4a8 100644 --- a/src/openrct2/network/network.h +++ b/src/openrct2/network/network.h @@ -64,6 +64,7 @@ void NetworkFlush(); [[nodiscard]] money64 NetworkGetPlayerMoneySpent(uint32_t index); [[nodiscard]] std::string NetworkGetPlayerIPAddress(uint32_t id); [[nodiscard]] std::string NetworkGetPlayerPublicKeyHash(uint32_t id); +void NetworkIncrementPlayerNumCommands(uint32_t playerIndex); void NetworkAddPlayerMoneySpent(uint32_t index, money64 cost); [[nodiscard]] int32_t NetworkGetPlayerLastAction(uint32_t index, int32_t time); void NetworkSetPlayerLastAction(uint32_t index, GameCommand command);