From 017cfb7b4bf17417a9e9564e2fc75fb6ac143bdc Mon Sep 17 00:00:00 2001 From: Mykhailo Redko Date: Mon, 10 Feb 2025 18:12:38 +0200 Subject: [PATCH] fix(Core/PacketIO): Implemented CMSG_BUSY_TRADE and CMSG_IGNORE_TRADE. (#21385) --- src/server/game/Entities/Player/Player.h | 2 +- .../game/Entities/Player/PlayerStorage.cpp | 6 +++--- .../game/Entities/Player/PlayerUpdates.cpp | 2 +- src/server/game/Handlers/TradeHandler.cpp | 16 ++++------------ src/server/game/Server/WorldSession.h | 2 +- 5 files changed, 10 insertions(+), 18 deletions(-) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index f12a50b05..3c3b5781d 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1385,7 +1385,7 @@ public: [[nodiscard]] Player* GetTrader() const { return m_trade ? m_trade->GetTrader() : nullptr; } [[nodiscard]] TradeData* GetTradeData() const { return m_trade; } - void TradeCancel(bool sendback); + void TradeCancel(bool sendback, TradeStatus status = TRADE_STATUS_TRADE_CANCELED); CinematicMgr* GetCinematicMgr() const { return _cinematicMgr; } diff --git a/src/server/game/Entities/Player/PlayerStorage.cpp b/src/server/game/Entities/Player/PlayerStorage.cpp index 875cf58b4..4b3a28cc3 100644 --- a/src/server/game/Entities/Player/PlayerStorage.cpp +++ b/src/server/game/Entities/Player/PlayerStorage.cpp @@ -4085,7 +4085,7 @@ void Player::SendSellError(SellResult msg, Creature* creature, ObjectGuid guid, GetSession()->SendPacket(&data); } -void Player::TradeCancel(bool sendback) +void Player::TradeCancel(bool sendback, TradeStatus status /*= TRADE_STATUS_TRADE_CANCELED*/) { if (m_trade) { @@ -4093,9 +4093,9 @@ void Player::TradeCancel(bool sendback) // send yellow "Trade canceled" message to both traders if (sendback) - GetSession()->SendCancelTrade(); + GetSession()->SendCancelTrade(status); - trader->GetSession()->SendCancelTrade(); + trader->GetSession()->SendCancelTrade(status); // cleanup delete m_trade; diff --git a/src/server/game/Entities/Player/PlayerUpdates.cpp b/src/server/game/Entities/Player/PlayerUpdates.cpp index 5bb641fa1..b2a0b46a1 100644 --- a/src/server/game/Entities/Player/PlayerUpdates.cpp +++ b/src/server/game/Entities/Player/PlayerUpdates.cpp @@ -1165,7 +1165,7 @@ bool Player::UpdatePosition(float x, float y, float z, float orientation, SetGroupUpdateFlag(GROUP_UPDATE_FLAG_POSITION); if (GetTrader() && !IsWithinDistInMap(GetTrader(), INTERACTION_DISTANCE)) - GetSession()->SendCancelTrade(); + GetSession()->SendCancelTrade(TRADE_STATUS_TRADE_CANCELED); CheckAreaExploreAndOutdoor(); diff --git a/src/server/game/Handlers/TradeHandler.cpp b/src/server/game/Handlers/TradeHandler.cpp index 1de3e182e..3197e0982 100644 --- a/src/server/game/Handlers/TradeHandler.cpp +++ b/src/server/game/Handlers/TradeHandler.cpp @@ -70,14 +70,12 @@ void WorldSession::SendTradeStatus(TradeStatus status) void WorldSession::HandleIgnoreTradeOpcode(WorldPacket& /*recvPacket*/) { - LOG_DEBUG("network", "WORLD: Ignore Trade {}", _player->GetGUID().ToString()); - // recvPacket.print_storage(); + _player->TradeCancel(true, TRADE_STATUS_IGNORE_YOU); } void WorldSession::HandleBusyTradeOpcode(WorldPacket& /*recvPacket*/) { - LOG_DEBUG("network", "WORLD: Busy Trade {}", _player->GetGUID().ToString()); - // recvPacket.print_storage(); + _player->TradeCancel(true, TRADE_STATUS_BUSY); } void WorldSession::SendUpdateTrade(bool trader_data /*= true*/) @@ -526,12 +524,12 @@ void WorldSession::HandleBeginTradeOpcode(WorldPacket& /*recvPacket*/) SendTradeStatus(TRADE_STATUS_OPEN_WINDOW); } -void WorldSession::SendCancelTrade() +void WorldSession::SendCancelTrade(TradeStatus status) { if (PlayerRecentlyLoggedOut() || PlayerLogout()) return; - SendTradeStatus(TRADE_STATUS_TRADE_CANCELED); + SendTradeStatus(status); } void WorldSession::HandleCancelTradeOpcode(WorldPacket& /*recvPacket*/) @@ -620,12 +618,6 @@ void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket) return; } - if (pOther->GetSocial()->HasIgnore(GetPlayer()->GetGUID())) - { - SendTradeStatus(TRADE_STATUS_IGNORE_YOU); - return; - } - if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_TRADE) && pOther->GetTeamId() != _player->GetTeamId()) { SendTradeStatus(TRADE_STATUS_WRONG_FACTION); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 4f1314ce3..dca054f15 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -446,7 +446,7 @@ public: void SendTradeStatus(TradeStatus status); void SendUpdateTrade(bool trader_data = true); - void SendCancelTrade(); + void SendCancelTrade(TradeStatus status); void SendPetitionQueryOpcode(ObjectGuid petitionguid);