diff --git a/dGame/TradingManager.cpp b/dGame/TradingManager.cpp index c7143354..43d1c98a 100644 --- a/dGame/TradingManager.cpp +++ b/dGame/TradingManager.cpp @@ -10,6 +10,11 @@ #include "CharacterComponent.h" #include "MissionComponent.h" #include "eMissionTaskType.h" +#include + +namespace { + std::unique_ptr g_EmptyTrade; +} TradingManager* TradingManager::m_Address = nullptr; @@ -233,55 +238,38 @@ void Trade::SendUpdateToOther(LWOOBJID participant) { GameMessages::SendServerTradeUpdate(other->GetObjectID(), coins, items, other->GetSystemAddress()); } -TradingManager::TradingManager() { -} - -TradingManager::~TradingManager() { - for (const auto& pair : trades) { - delete pair.second; - } - - trades.clear(); -} - -Trade* TradingManager::GetTrade(LWOOBJID tradeId) const { +const std::unique_ptr& TradingManager::GetTrade(LWOOBJID tradeId) const { const auto& pair = trades.find(tradeId); - if (pair == trades.end()) return nullptr; + if (pair == trades.end()) return g_EmptyTrade; return pair->second; } -Trade* TradingManager::GetPlayerTrade(LWOOBJID playerId) const { - for (const auto& pair : trades) { - if (pair.second->IsParticipant(playerId)) { - return pair.second; +const std::unique_ptr& TradingManager::GetPlayerTrade(LWOOBJID playerId) const { + for (const auto& trade : trades | std::views::values) { + if (trade->IsParticipant(playerId)) { + return trade; } } - return nullptr; + return g_EmptyTrade; } void TradingManager::CancelTrade(const LWOOBJID canceller, LWOOBJID tradeId, const bool sendCancelMessage) { - auto* trade = GetTrade(tradeId); + const auto& trade = GetTrade(tradeId); if (trade == nullptr) return; if (sendCancelMessage) trade->Cancel(canceller); - delete trade; - trades.erase(tradeId); } -Trade* TradingManager::NewTrade(LWOOBJID participantA, LWOOBJID participantB) { +void TradingManager::NewTrade(LWOOBJID participantA, LWOOBJID participantB) { const LWOOBJID tradeId = ObjectIDManager::GenerateObjectID(); - auto* trade = new Trade(tradeId, participantA, participantB); - - trades[tradeId] = trade; + trades.insert_or_assign(tradeId, std::make_unique(tradeId, participantA, participantB)); LOG("Created new trade between (%llu) <-> (%llu)", participantA, participantB); - - return trade; } diff --git a/dGame/TradingManager.h b/dGame/TradingManager.h index fa55aa9d..d9984a5b 100644 --- a/dGame/TradingManager.h +++ b/dGame/TradingManager.h @@ -2,15 +2,16 @@ #include "Entity.h" -struct TradeItem -{ +#include +#include + +struct TradeItem { LWOOBJID itemId; LOT itemLot; uint32_t itemCount; }; -class Trade -{ +class Trade { public: explicit Trade(LWOOBJID tradeId, LWOOBJID participantA, LWOOBJID participantB); ~Trade(); @@ -50,8 +51,7 @@ private: }; -class TradingManager -{ +class TradingManager { public: static TradingManager* Instance() { if (!m_Address) { @@ -61,16 +61,13 @@ public: return m_Address; } - explicit TradingManager(); - ~TradingManager(); - - Trade* GetTrade(LWOOBJID tradeId) const; - Trade* GetPlayerTrade(LWOOBJID playerId) const; + const std::unique_ptr& GetTrade(LWOOBJID tradeId) const; + const std::unique_ptr& GetPlayerTrade(LWOOBJID playerId) const; void CancelTrade(const LWOOBJID canceller, LWOOBJID tradeId, const bool sendCancelMessage = true); - Trade* NewTrade(LWOOBJID participantA, LWOOBJID participantB); + void NewTrade(LWOOBJID participantA, LWOOBJID participantB); private: static TradingManager* m_Address; //For singleton method - std::unordered_map trades; + std::unordered_map> trades; }; diff --git a/dGame/dGameMessages/GameMessages.cpp b/dGame/dGameMessages/GameMessages.cpp index 3af6cb48..5edd47f2 100644 --- a/dGame/dGameMessages/GameMessages.cpp +++ b/dGame/dGameMessages/GameMessages.cpp @@ -3221,7 +3221,7 @@ void GameMessages::HandleClientTradeRequest(RakNet::BitStream& inStream, Entity* LOG("Trade request to (%llu)", i64Invitee); - auto* trade = TradingManager::Instance()->GetPlayerTrade(entity->GetObjectID()); + const auto& trade = TradingManager::Instance()->GetPlayerTrade(entity->GetObjectID()); if (trade != nullptr) { if (!trade->IsParticipant(i64Invitee)) { @@ -3244,7 +3244,7 @@ void GameMessages::HandleClientTradeRequest(RakNet::BitStream& inStream, Entity* } void GameMessages::HandleClientTradeCancel(RakNet::BitStream& inStream, Entity* entity, const SystemAddress& sysAddr) { - auto* trade = TradingManager::Instance()->GetPlayerTrade(entity->GetObjectID()); + const auto& trade = TradingManager::Instance()->GetPlayerTrade(entity->GetObjectID()); if (trade == nullptr) return; @@ -3258,7 +3258,7 @@ void GameMessages::HandleClientTradeAccept(RakNet::BitStream& inStream, Entity* LOG("Trade accepted from (%llu) -> (%d)", entity->GetObjectID(), bFirst); - auto* trade = TradingManager::Instance()->GetPlayerTrade(entity->GetObjectID()); + const auto& trade = TradingManager::Instance()->GetPlayerTrade(entity->GetObjectID()); if (trade == nullptr) return; @@ -3324,7 +3324,7 @@ void GameMessages::HandleClientTradeUpdate(RakNet::BitStream& inStream, Entity* LOG("Trade item from (%llu) -> (%llu)/(%llu), (%i), (%llu), (%i), (%i)", entity->GetObjectID(), itemId, itemId2, lot, unknown1, unknown2, unknown3); } - auto* trade = TradingManager::Instance()->GetPlayerTrade(entity->GetObjectID()); + const auto& trade = TradingManager::Instance()->GetPlayerTrade(entity->GetObjectID()); if (trade == nullptr) return;