aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2015-04-04 00:07:16 +0200
committerShauren <shauren.trinity@gmail.com>2015-04-04 00:07:16 +0200
commit89007ac1d08228c106c17cc8f51b4530531fa059 (patch)
treeae4178bfcdb4c3bc164a98aa0a63333508a4712e /src/server/game/Server
parentbe016b94aa4b6df7bef1b21cbf6df80dbb3a7bcd (diff)
Core/Players: Updated trading
* Use special Uniq ObjectGuid::TradeItem for enchanting trade items * Added additional validation of trade state * Fixed an ancient bug in trade display causing pending enchantment to never update clientside if too many operations were done in a trading session
Diffstat (limited to 'src/server/game/Server')
-rw-r--r--src/server/game/Server/Packets/TradePackets.cpp129
-rw-r--r--src/server/game/Server/Packets/TradePackets.h187
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp24
-rw-r--r--src/server/game/Server/WorldSession.h33
4 files changed, 334 insertions, 39 deletions
diff --git a/src/server/game/Server/Packets/TradePackets.cpp b/src/server/game/Server/Packets/TradePackets.cpp
new file mode 100644
index 00000000000..ef5ebb13e20
--- /dev/null
+++ b/src/server/game/Server/Packets/TradePackets.cpp
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "TradePackets.h"
+
+void WorldPackets::Trade::AcceptTrade::Read()
+{
+ _worldPacket >> StateIndex;
+}
+
+void WorldPackets::Trade::ClearTradeItem::Read()
+{
+ _worldPacket >> TradeSlot;
+}
+
+void WorldPackets::Trade::InitiateTrade::Read()
+{
+ _worldPacket >> Guid;
+}
+
+void WorldPackets::Trade::SetTradeCurrency::Read()
+{
+ _worldPacket >> Type >> Quantity;
+}
+
+void WorldPackets::Trade::SetTradeGold::Read()
+{
+ _worldPacket >> Coinage;
+}
+
+void WorldPackets::Trade::SetTradeItem::Read()
+{
+ _worldPacket >> TradeSlot >> PackSlot >> ItemSlotInPack;
+}
+
+WorldPacket const* WorldPackets::Trade::TradeStatus::Write()
+{
+ _worldPacket.WriteBit(PartnerIsSameBnetAccount);
+ _worldPacket.WriteBits(Status, 5);
+ switch (Status)
+ {
+ case TRADE_STATUS_FAILED:
+ _worldPacket.WriteBit(FailureForYou);
+ _worldPacket << int32(BagResult);
+ _worldPacket << int32(ItemID);
+ break;
+ case TRADE_STATUS_INITIATED:
+ _worldPacket << uint32(ID);
+ break;
+ case TRADE_STATUS_PROPOSED:
+ _worldPacket << Partner;
+ _worldPacket << PartnerAccount;
+ break;
+ case TRADE_STATUS_WRONG_REALM:
+ case TRADE_STATUS_NOT_ON_TAPLIST:
+ _worldPacket << uint8(TradeSlot);
+ break;
+ case TRADE_STATUS_NOT_ENOUGH_CURRENCY:
+ case TRADE_STATUS_CURRENCY_NOT_TRADABLE:
+ _worldPacket << int32(CurrencyType);
+ _worldPacket << int32(CurrencyQuantity);
+ break;
+ default:
+ _worldPacket.FlushBits();
+ break;
+ }
+
+ return &_worldPacket;
+}
+
+ByteBuffer& operator<<(ByteBuffer& buffer, WorldPackets::Trade::TradeUpdated::UnwrappedTradeItem const& unwrappedTradeItem)
+{
+ buffer << unwrappedTradeItem.Item;
+ buffer << int32(unwrappedTradeItem.EnchantID);
+ buffer << int32(unwrappedTradeItem.OnUseEnchantmentID);
+ buffer.append(unwrappedTradeItem.SocketEnchant, MAX_GEM_SOCKETS);
+ buffer << unwrappedTradeItem.Creator;
+ buffer << int32(unwrappedTradeItem.Charges);
+ buffer << uint32(unwrappedTradeItem.MaxDurability);
+ buffer << uint32(unwrappedTradeItem.Durability);
+ buffer.WriteBit(unwrappedTradeItem.Lock);
+ buffer.FlushBits();
+
+ return buffer;
+}
+
+ByteBuffer& operator<<(ByteBuffer& buffer, WorldPackets::Trade::TradeUpdated::TradeItem const& tradeItem)
+{
+ buffer << uint8(tradeItem.Slot);
+ buffer << uint32(tradeItem.EntryID);
+ buffer << uint32(tradeItem.StackCount);
+ buffer << tradeItem.GiftCreator;
+ if (buffer.WriteBit(tradeItem.Unwrapped.HasValue))
+ buffer << tradeItem.Unwrapped.Value;
+
+ return buffer;
+}
+
+WorldPacket const* WorldPackets::Trade::TradeUpdated::Write()
+{
+ _worldPacket << uint8(WhichPlayer);
+ _worldPacket << uint32(ID);
+ _worldPacket << uint32(ClientStateIndex);
+ _worldPacket << uint32(CurrentStateIndex);
+ _worldPacket << uint64(Gold);
+ _worldPacket << int32(CurrencyType);
+ _worldPacket << int32(CurrencyQuantity);
+ _worldPacket << int32(ProposedEnchantment);
+ _worldPacket << uint32(Items.size());
+
+ for (TradeItem const& item : Items)
+ _worldPacket << item;
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/TradePackets.h b/src/server/game/Server/Packets/TradePackets.h
index b964a24e6fe..8831135f4e5 100644
--- a/src/server/game/Server/Packets/TradePackets.h
+++ b/src/server/game/Server/Packets/TradePackets.h
@@ -1,29 +1,55 @@
/*
-* Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
-*
-* This program is free software; you can redistribute it and/or modify it
-* under the terms of the GNU General Public License as published by the
-* Free Software Foundation; either version 2 of the License, or (at your
-* option) any later version.
-*
-* This program is distributed in the hope that it will be useful, but WITHOUT
-* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-* more details.
-*
-* You should have received a copy of the GNU General Public License along
-* with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
#ifndef TradePackets_h__
#define TradePackets_h__
-#include "Packet.h"
+#include "ItemPackets.h"
namespace WorldPackets
{
namespace Trade
{
+ class AcceptTrade final : public ClientPacket
+ {
+ public:
+ AcceptTrade(WorldPacket&& packet) : ClientPacket(CMSG_ACCEPT_TRADE, std::move(packet)) { }
+
+ void Read() override;
+
+ uint32 StateIndex = 0;
+ };
+
+ 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 CancelTrade final : public ClientPacket
{
public:
@@ -31,6 +57,135 @@ namespace WorldPackets
void Read() override { }
};
+
+ class ClearTradeItem final : public ClientPacket
+ {
+ public:
+ ClearTradeItem(WorldPacket&& packet) : ClientPacket(CMSG_CLEAR_TRADE_ITEM, std::move(packet)) { }
+
+ void Read() override;
+
+ uint8 TradeSlot = 0;
+ };
+
+ class IgnoreTrade final : public ClientPacket
+ {
+ public:
+ IgnoreTrade(WorldPacket&& packet) : ClientPacket(CMSG_IGNORE_TRADE, std::move(packet)) { }
+
+ void Read() override { }
+ };
+
+ class InitiateTrade final : public ClientPacket
+ {
+ public:
+ InitiateTrade(WorldPacket&& packet) : ClientPacket(CMSG_INITIATE_TRADE, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid Guid;
+ };
+
+ class SetTradeCurrency final : public ClientPacket
+ {
+ public:
+ SetTradeCurrency(WorldPacket&& packet) : ClientPacket(CMSG_SET_TRADE_CURRENCY, std::move(packet)) { }
+
+ void Read() override;
+
+ uint32 Type = 0;
+ uint32 Quantity = 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 SetTradeItem final : public ClientPacket
+ {
+ public:
+ SetTradeItem(WorldPacket&& packet) : ClientPacket(CMSG_SET_TRADE_ITEM, std::move(packet)) { }
+
+ void Read() override;
+
+ uint8 TradeSlot = 0;
+ uint8 PackSlot = 0;
+ uint8 ItemSlotInPack = 0;
+ };
+
+ class UnacceptTrade final : public ClientPacket
+ {
+ public:
+ UnacceptTrade(WorldPacket&& packet) : ClientPacket(CMSG_UNACCEPT_TRADE, std::move(packet)) { }
+
+ void Read() override { }
+ };
+
+ class TradeStatus final : public ServerPacket
+ {
+ public:
+ TradeStatus() : ServerPacket(SMSG_TRADE_STATUS, 1 + 1 + 16 + 4 + 4 + 1 + 4 + 4 + 4 + 1) { }
+
+ WorldPacket const* Write() override;
+
+ ::TradeStatus Status = TRADE_STATUS_INITIATED;
+ uint8 TradeSlot = 0;
+ ObjectGuid PartnerAccount;
+ ObjectGuid Partner;
+ int32 CurrencyType = 0;
+ int32 CurrencyQuantity = 0;
+ bool FailureForYou = false;
+ int32 BagResult = 0;
+ uint32 ItemID = 0;
+ uint32 ID = 0;
+ bool PartnerIsSameBnetAccount = false;
+ };
+
+ class TradeUpdated final : public ServerPacket
+ {
+ public:
+ TradeUpdated() : ServerPacket(SMSG_TRADE_UPDATED) { }
+
+ WorldPacket const* Write() override;
+
+ struct UnwrappedTradeItem
+ {
+ WorldPackets::Item::ItemInstance Item;
+ int32 EnchantID = 0;
+ int32 OnUseEnchantmentID = 0;
+ ObjectGuid Creator;
+ int32 Charges = 0;
+ bool Lock = false;
+ uint32 MaxDurability = 0;
+ uint32 Durability = 0;
+ int32 SocketEnchant[MAX_GEM_SOCKETS] = { };
+ };
+
+ struct TradeItem
+ {
+ uint8 Slot = 0;
+ int32 EntryID = 0;
+ int32 StackCount = 0;
+ ObjectGuid GiftCreator;
+ Optional<UnwrappedTradeItem> Unwrapped;
+ };
+
+ uint64 Gold = 0;
+ uint32 CurrentStateIndex = 0;
+ uint8 WhichPlayer = 0;
+ uint32 ClientStateIndex = 0;
+ std::vector<TradeItem> Items;
+ int32 CurrencyType = 0;
+ uint32 ID = 0;
+ int32 ProposedEnchantment = 0;
+ int32 CurrencyQuantity = 0;
+ };
}
}
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index b000e29a15f..a637e8f8966 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -145,7 +145,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_ACCEPT_GUILD_INVITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::AcceptGuildInvite, &WorldSession::HandleGuildAcceptInvite);
DEFINE_OPCODE_HANDLER_OLD(CMSG_ACCEPT_LEVEL_GRANT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAcceptGrantLevel );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_ACCEPT_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAcceptTradeOpcode );
+ DEFINE_HANDLER(CMSG_ACCEPT_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::AcceptTrade, &WorldSession::HandleAcceptTradeOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_ACCEPT_WARGAME_INVITE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_ACTIVATE_TAXI, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleActivateTaxiOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_ADD_BATTLENET_FRIEND, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@@ -200,7 +200,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLE_PET_SET_FLAGS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLE_PET_SUMMON, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLE_PET_UPDATE_NOTIFY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_BEGIN_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBeginTradeOpcode );
+ DEFINE_HANDLER(CMSG_BEGIN_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::BeginTrade, &WorldSession::HandleBeginTradeOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BF_MGR_ENTRY_INVITE_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleBfEntryInviteResponse );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BF_MGR_QUEUE_EXIT_REQUEST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleBfExitRequest);
DEFINE_OPCODE_HANDLER_OLD(CMSG_BF_MGR_QUEUE_INVITE_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleBfQueueInviteResponse );
@@ -210,7 +210,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_BLACK_MARKET_OPEN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::BlackMarket::BlackMarketOpen, &WorldSession::HandleBlackMarketOpen);
DEFINE_OPCODE_HANDLER_OLD(CMSG_BLACK_MARKET_REQUEST_ITEMS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BUG_REPORT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBugReportOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_BUSY_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBusyTradeOpcode );
+ DEFINE_HANDLER(CMSG_BUSY_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::BusyTrade, &WorldSession::HandleBusyTradeOpcode);
DEFINE_HANDLER(CMSG_BUY_BACK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::BuyBackItem, &WorldSession::HandleBuybackItem);
DEFINE_HANDLER(CMSG_BUY_BANK_SLOT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Bank::BuyBankSlot, &WorldSession::HandleBuyBankSlotOpcode);
DEFINE_HANDLER(CMSG_BUY_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::BuyItem, &WorldSession::HandleBuyItemOpcode);
@@ -307,7 +307,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_CHECK_WOW_TOKEN_VETERAN_ELIGIBILITY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CHOICE_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CLEAR_RAID_MARKER, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_CLEAR_TRADE_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleClearTradeItemOpcode );
+ DEFINE_HANDLER(CMSG_CLEAR_TRADE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::ClearTradeItem, &WorldSession::HandleClearTradeItemOpcode);
DEFINE_HANDLER(CMSG_CLIENT_PORT_GRAVEYARD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Misc::PortGraveyard, &WorldSession::HandlePortGraveyard);
DEFINE_OPCODE_HANDLER_OLD(CMSG_CLOSE_INTERACTION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_COMMENTATOR_ENABLE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@@ -447,10 +447,10 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_GUILD_UPDATE_INFO_TEXT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildUpdateInfoText, &WorldSession::HandleGuildUpdateInfoText);
DEFINE_HANDLER(CMSG_GUILD_UPDATE_MOTD_TEXT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildUpdateMotdText, &WorldSession::HandleGuildUpdateMotdText);
DEFINE_OPCODE_HANDLER_OLD(CMSG_HEARTH_AND_RESURRECT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleHearthAndResurrect );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_IGNORE_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleIgnoreTradeOpcode );
+ DEFINE_HANDLER(CMSG_IGNORE_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::IgnoreTrade, &WorldSession::HandleIgnoreTradeOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_INCREASE_CAST_TIME_FOR_SPELL, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_INITIATE_ROLE_POLL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRolePollBeginOpcode);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_INITIATE_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleInitiateTradeOpcode );
+ DEFINE_HANDLER(CMSG_INITIATE_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::InitiateTrade, &WorldSession::HandleInitiateTradeOpcode);
DEFINE_HANDLER(CMSG_INSPECT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Inspect::Inspect, &WorldSession::HandleInspectOpcode);
DEFINE_HANDLER(CMSG_INSPECT_PVP, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Inspect::InspectPVPRequest, &WorldSession::HandleInspectPVP);
DEFINE_OPCODE_HANDLER_OLD(CMSG_INSTANCE_LOCK_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleInstanceLockResponse);
@@ -738,9 +738,9 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_SET_SPECIALIZATION, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Talent::SetSpecialization, &WorldSession::HandleSetSpecializationOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_TAXI_BENCHMARK_MODE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetTaxiBenchmarkOpcode );
DEFINE_HANDLER(CMSG_SET_TITLE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Character::SetTitle, &WorldSession::HandleSetTitleOpcode);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_TRADE_CURRENCY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_TRADE_GOLD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetTradeGoldOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_TRADE_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetTradeItemOpcode );
+ DEFINE_HANDLER(CMSG_SET_TRADE_CURRENCY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::SetTradeCurrency, &WorldSession::HandleSetTradeCurrencyOpcode);
+ DEFINE_HANDLER(CMSG_SET_TRADE_GOLD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::SetTradeGold, &WorldSession::HandleSetTradeGoldOpcode);
+ DEFINE_HANDLER(CMSG_SET_TRADE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::SetTradeItem, &WorldSession::HandleSetTradeItemOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_USING_PARTY_GARRISON, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_WATCHED_FACTION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetWatchedFactionOpcode );
DEFINE_HANDLER(CMSG_SHOWING_CLOAK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Character::ShowingCloak, &WorldSession::HandleShowingCloakOpcode);
@@ -792,7 +792,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_TWITTER_DISCONNECT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_TWITTER_POST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_UI_TIME_REQUEST, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Misc::UITimeRequest, &WorldSession::HandleUITimeRequest);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_UNACCEPT_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUnacceptTradeOpcode );
+ DEFINE_HANDLER(CMSG_UNACCEPT_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Trade::UnacceptTrade, &WorldSession::HandleUnacceptTradeOpcode);
DEFINE_HANDLER(CMSG_UNDELETE_CHARACTER, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::UndeleteCharacter, &WorldSession::HandleCharUndeleteOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_UNLEARN_SKILL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUnlearnSkillOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_UNLEARN_SPECIALIZATION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@@ -1675,8 +1675,8 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TOKEN_UNK1, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TOTEM_CREATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TOTEM_MOVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRADE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRADE_UPDATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRADE_STATUS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRADE_UPDATED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAINER_BUY_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAINER_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSFER_ABORTED, STATUS_NEVER, CONNECTION_TYPE_REALM);
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 8ec5af98db7..9c2457e7b5e 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -55,7 +55,6 @@ struct AuctionEntry;
struct DeclinedName;
struct ItemTemplate;
struct MovementInfo;
-struct TradeStatusInfo;
namespace lfg
{
@@ -393,7 +392,18 @@ namespace WorldPackets
namespace Trade
{
+ class AcceptTrade;
+ class BeginTrade;
+ class BusyTrade;
class CancelTrade;
+ class ClearTradeItem;
+ class IgnoreTrade;
+ class InitiateTrade;
+ class SetTradeCurrency;
+ class SetTradeGold;
+ class SetTradeItem;
+ class UnacceptTrade;
+ class TradeStatus;
}
namespace Who
@@ -658,7 +668,7 @@ class WorldSession
void SendBattleGroundList(ObjectGuid guid, BattlegroundTypeId bgTypeId = BATTLEGROUND_RB);
- void SendTradeStatus(TradeStatusInfo const& status);
+ void SendTradeStatus(WorldPackets::Trade::TradeStatus& status);
void SendUpdateTrade(bool trader_data = true);
void SendCancelTrade();
@@ -1033,16 +1043,17 @@ class WorldSession
void HandleDuelAccepted();
void HandleDuelCancelled();
- void HandleAcceptTradeOpcode(WorldPacket& recvPacket);
- void HandleBeginTradeOpcode(WorldPacket& recvPacket);
- void HandleBusyTradeOpcode(WorldPacket& recvPacket);
+ void HandleAcceptTradeOpcode(WorldPackets::Trade::AcceptTrade& acceptTrade);
+ void HandleBeginTradeOpcode(WorldPackets::Trade::BeginTrade& beginTrade);
+ void HandleBusyTradeOpcode(WorldPackets::Trade::BusyTrade& busyTrade);
void HandleCancelTradeOpcode(WorldPackets::Trade::CancelTrade& cancelTrade);
- void HandleClearTradeItemOpcode(WorldPacket& recvPacket);
- void HandleIgnoreTradeOpcode(WorldPacket& recvPacket);
- void HandleInitiateTradeOpcode(WorldPacket& recvPacket);
- void HandleSetTradeGoldOpcode(WorldPacket& recvPacket);
- void HandleSetTradeItemOpcode(WorldPacket& recvPacket);
- void HandleUnacceptTradeOpcode(WorldPacket& recvPacket);
+ void HandleClearTradeItemOpcode(WorldPackets::Trade::ClearTradeItem& clearTradeItem);
+ void HandleIgnoreTradeOpcode(WorldPackets::Trade::IgnoreTrade& ignoreTrade);
+ void HandleInitiateTradeOpcode(WorldPackets::Trade::InitiateTrade& initiateTrade);
+ void HandleSetTradeCurrencyOpcode(WorldPackets::Trade::SetTradeCurrency& setTradeCurrency);
+ void HandleSetTradeGoldOpcode(WorldPackets::Trade::SetTradeGold& setTradeGold);
+ void HandleSetTradeItemOpcode(WorldPackets::Trade::SetTradeItem& setTradeItem);
+ void HandleUnacceptTradeOpcode(WorldPackets::Trade::UnacceptTrade& unacceptTrade);
void HandleAuctionHelloOpcode(WorldPackets::AuctionHouse::AuctionHelloRequest& packet);
void HandleAuctionListItems(WorldPacket& recvData);