diff --git a/src/server/game/Handlers/TradeHandler.cpp b/src/server/game/Handlers/TradeHandler.cpp index 6d0b69fb62..169f434a2e 100644 --- a/src/server/game/Handlers/TradeHandler.cpp +++ b/src/server/game/Handlers/TradeHandler.cpp @@ -41,14 +41,12 @@ void WorldSession::SendTradeStatus(WorldPackets::Trade::TradeStatus& info) SendPacket(info.Write()); } -void WorldSession::HandleIgnoreTradeOpcode(WorldPacket& /*recvPacket*/) +void WorldSession::HandleIgnoreTradeOpcode(WorldPackets::Trade::IgnoreTrade& /*ignoreTrade*/) { - TC_LOG_DEBUG("network", "WORLD: Ignore Trade %u", _player->GetGUID().GetCounter()); } -void WorldSession::HandleBusyTradeOpcode(WorldPacket& /*recvPacket*/) +void WorldSession::HandleBusyTradeOpcode(WorldPackets::Trade::BusyTrade& /*busyTRade*/) { - TC_LOG_DEBUG("network", "WORLD: Busy Trade %u", _player->GetGUID().GetCounter()); } void WorldSession::SendUpdateTrade(bool trader_data /*= true*/) @@ -530,7 +528,7 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPackets::Trade::AcceptTrade& acc } } -void WorldSession::HandleUnacceptTradeOpcode(WorldPacket& /*recvPacket*/) +void WorldSession::HandleUnacceptTradeOpcode(WorldPackets::Trade::UnacceptTrade& /*unacceptTrade*/) { TradeData* my_trade = _player->GetTradeData(); if (!my_trade) @@ -539,7 +537,7 @@ void WorldSession::HandleUnacceptTradeOpcode(WorldPacket& /*recvPacket*/) my_trade->SetAccepted(false, true); } -void WorldSession::HandleBeginTradeOpcode(WorldPacket& /*recvPacket*/) +void WorldSession::HandleBeginTradeOpcode(WorldPackets::Trade::BeginTrade& /*beginTrade*/) { TradeData* my_trade = _player->m_trade; if (!my_trade) @@ -561,7 +559,7 @@ void WorldSession::SendCancelTrade() SendTradeStatus(info); } -void WorldSession::HandleCancelTradeOpcode(WorldPacket& /*recvPacket*/) +void WorldSession::HandleCancelTradeOpcode(WorldPackets::Trade::CancelTrade& /*cancelTrade*/) { // sent also after LOGOUT COMPLETE if (_player) // needed because STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT @@ -690,37 +688,25 @@ void WorldSession::HandleInitiateTradeOpcode(WorldPackets::Trade::InitiateTrade& pOther->GetSession()->SendTradeStatus(info); } -void WorldSession::HandleSetTradeGoldOpcode(WorldPacket& recvPacket) +void WorldSession::HandleSetTradeGoldOpcode(WorldPackets::Trade::SetTradeGold& setTradeGold) { - uint64 gold; - recvPacket >> gold; - TradeData* my_trade = _player->GetTradeData(); if (!my_trade) return; my_trade->UpdateClientStateIndex(); - my_trade->SetMoney(gold); + my_trade->SetMoney(setTradeGold.Coinage); } -void WorldSession::HandleSetTradeItemOpcode(WorldPacket& recvPacket) +void WorldSession::HandleSetTradeItemOpcode(WorldPackets::Trade::SetTradeItem& setTradeItem) { - // send update - uint8 tradeSlot; - uint8 bag; - uint8 slot; - - recvPacket >> slot; - recvPacket >> tradeSlot; - recvPacket >> bag; - TradeData* my_trade = _player->GetTradeData(); if (!my_trade) return; WorldPackets::Trade::TradeStatus info; // invalid slot number - if (tradeSlot >= TRADE_SLOT_COUNT) + if (setTradeItem.TradeSlot >= TRADE_SLOT_COUNT) { info.Status = TRADE_STATUS_TRADE_CANCELED; SendTradeStatus(info); @@ -728,8 +714,8 @@ void WorldSession::HandleSetTradeItemOpcode(WorldPacket& recvPacket) } // check cheating, can't fail with correct client operations - Item* item = _player->GetItemByPos(bag, slot); - if (!item || (tradeSlot != TRADE_SLOT_NONTRADED && !item->CanBeTraded(false, true))) + Item* item = _player->GetItemByPos(setTradeItem.PackSlot, setTradeItem.ItemSlotInPack); + if (!item || (setTradeItem.TradeSlot != TRADE_SLOT_NONTRADED && !item->CanBeTraded(false, true))) { info.Status = TRADE_STATUS_TRADE_CANCELED; SendTradeStatus(info); @@ -749,22 +735,19 @@ void WorldSession::HandleSetTradeItemOpcode(WorldPacket& recvPacket) my_trade->UpdateClientStateIndex(); - if (tradeSlot != TRADE_SLOT_NONTRADED && item->IsBindedNotWith(my_trade->GetTrader())) + if (setTradeItem.TradeSlot != TRADE_SLOT_NONTRADED && item->IsBindedNotWith(my_trade->GetTrader())) { info.Status = TRADE_STATUS_NOT_ON_TAPLIST; - info.TradeSlot = tradeSlot; + info.TradeSlot = setTradeItem.TradeSlot; SendTradeStatus(info); return; } - my_trade->SetItem(TradeSlots(tradeSlot), item); + my_trade->SetItem(TradeSlots(setTradeItem.TradeSlot), item); } -void WorldSession::HandleClearTradeItemOpcode(WorldPacket& recvPacket) +void WorldSession::HandleClearTradeItemOpcode(WorldPackets::Trade::ClearTradeItem& clearTradeItem) { - uint8 tradeSlot; - recvPacket >> tradeSlot; - TradeData* my_trade = _player->m_trade; if (!my_trade) return; @@ -772,8 +755,8 @@ void WorldSession::HandleClearTradeItemOpcode(WorldPacket& recvPacket) my_trade->UpdateClientStateIndex(); // invalid slot number - if (tradeSlot >= TRADE_SLOT_COUNT) + if (clearTradeItem.TradeSlot >= TRADE_SLOT_COUNT) return; - my_trade->SetItem(TradeSlots(tradeSlot), nullptr); + my_trade->SetItem(TradeSlots(clearTradeItem.TradeSlot), nullptr); } diff --git a/src/server/game/Server/Packets/TradePackets.cpp b/src/server/game/Server/Packets/TradePackets.cpp index 4971050bc0..b2bba51f16 100644 --- a/src/server/game/Server/Packets/TradePackets.cpp +++ b/src/server/game/Server/Packets/TradePackets.cpp @@ -193,3 +193,20 @@ void WorldPackets::Trade::AcceptTrade::Read() { _worldPacket >> StateIndex; } + +void WorldPackets::Trade::ClearTradeItem::Read() +{ + _worldPacket >> TradeSlot; +} + +void WorldPackets::Trade::SetTradeItem::Read() +{ + _worldPacket >> ItemSlotInPack; + _worldPacket >> TradeSlot; + _worldPacket >> PackSlot; +} + +void WorldPackets::Trade::SetTradeGold::Read() +{ + _worldPacket >> Coinage; +} diff --git a/src/server/game/Server/Packets/TradePackets.h b/src/server/game/Server/Packets/TradePackets.h index dc7b0f6adc..d993e40ff5 100644 --- a/src/server/game/Server/Packets/TradePackets.h +++ b/src/server/game/Server/Packets/TradePackets.h @@ -106,6 +106,78 @@ namespace WorldPackets uint32 StateIndex = 0; }; + + class ClearTradeItem final : public ClientPacket + { + public: + ClearTradeItem(WorldPacket&& packet) : ClientPacket(CMSG_CLEAR_TRADE_ITEM, std::move(packet)) { } + + void Read() override; + + uint8 TradeSlot = 0; + }; + + class SetTradeItem final : public ClientPacket + { + public: + SetTradeItem(WorldPacket&& packet) : ClientPacket(CMSG_SET_TRADE_ITEM, std::move(packet)) { } + + void Read() override; + + uint8 TradeSlot = 0; + uint8 ItemSlotInPack = 0; + uint8 PackSlot = 0; + }; + + class SetTradeGold final : public ClientPacket + { + public: + SetTradeGold(WorldPacket&& packet) : ClientPacket(CMSG_SET_TRADE_GOLD, std::move(packet)) { } + + void Read() override; + + uint64 Coinage = 0; + }; + + class CancelTrade final : public ClientPacket + { + public: + CancelTrade(WorldPacket&& packet) : ClientPacket(CMSG_CANCEL_TRADE, std::move(packet)) { } + + void Read() override { } + }; + + class BeginTrade final : public ClientPacket + { + public: + BeginTrade(WorldPacket&& packet) : ClientPacket(CMSG_BEGIN_TRADE, std::move(packet)) { } + + void Read() override { } + }; + + class BusyTrade final : public ClientPacket + { + public: + BusyTrade(WorldPacket&& packet) : ClientPacket(CMSG_BUSY_TRADE, std::move(packet)) { } + + void Read() override { } + }; + + class IgnoreTrade final : public ClientPacket + { + public: + IgnoreTrade(WorldPacket&& packet) : ClientPacket(CMSG_IGNORE_TRADE, std::move(packet)) { } + + void Read() override { } + }; + + class UnacceptTrade final : public ClientPacket + { + public: + UnacceptTrade(WorldPacket&& packet) : ClientPacket(CMSG_UNACCEPT_TRADE, std::move(packet)) { } + + void Read() override { } + }; } } diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 719e9e7c78..9baac7a3e7 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -211,8 +211,16 @@ namespace WorldPackets namespace Trade { class AcceptTrade; + class BeginTrade; + class BusyTrade; + class CancelTrade; + class ClearTradeItem; + class IgnoreTrade; class InitiateTrade; + class SetTradeGold; + class SetTradeItem; class TradeStatus; + class UnacceptTrade; } namespace Who @@ -885,15 +893,15 @@ class TC_GAME_API WorldSession void HandleDuelCancelledOpcode(WorldPacket& recvPacket); void HandleAcceptTradeOpcode(WorldPackets::Trade::AcceptTrade& packet); - void HandleBeginTradeOpcode(WorldPacket& recvPacket); - void HandleBusyTradeOpcode(WorldPacket& recvPacket); - void HandleCancelTradeOpcode(WorldPacket& recvPacket); - void HandleClearTradeItemOpcode(WorldPacket& recvPacket); - void HandleIgnoreTradeOpcode(WorldPacket& recvPacket); + void HandleBeginTradeOpcode(WorldPackets::Trade::BeginTrade& packet); + void HandleBusyTradeOpcode(WorldPackets::Trade::BusyTrade& packet); + void HandleCancelTradeOpcode(WorldPackets::Trade::CancelTrade& packet); + void HandleClearTradeItemOpcode(WorldPackets::Trade::ClearTradeItem& packet); + void HandleIgnoreTradeOpcode(WorldPackets::Trade::IgnoreTrade& packet); void HandleInitiateTradeOpcode(WorldPackets::Trade::InitiateTrade& packet); - void HandleSetTradeGoldOpcode(WorldPacket& recvPacket); - void HandleSetTradeItemOpcode(WorldPacket& recvPacket); - void HandleUnacceptTradeOpcode(WorldPacket& recvPacket); + void HandleSetTradeGoldOpcode(WorldPackets::Trade::SetTradeGold& packet); + void HandleSetTradeItemOpcode(WorldPackets::Trade::SetTradeItem& packet); + void HandleUnacceptTradeOpcode(WorldPackets::Trade::UnacceptTrade& packet); void HandleAuctionHelloOpcode(WorldPacket& recvPacket); void HandleAuctionListItems(WorldPacket& recvData);