aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/TradeHandler.cpp
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/Handlers/TradeHandler.cpp
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/Handlers/TradeHandler.cpp')
-rw-r--r--src/server/game/Handlers/TradeHandler.cpp361
1 files changed, 117 insertions, 244 deletions
diff --git a/src/server/game/Handlers/TradeHandler.cpp b/src/server/game/Handlers/TradeHandler.cpp
index b06f89797cf..517d02f852a 100644
--- a/src/server/game/Handlers/TradeHandler.cpp
+++ b/src/server/game/Handlers/TradeHandler.cpp
@@ -31,65 +31,19 @@
#include "AccountMgr.h"
#include "TradePackets.h"
-void WorldSession::SendTradeStatus(TradeStatusInfo const& info)
+void WorldSession::SendTradeStatus(WorldPackets::Trade::TradeStatus& info)
{
- Player* trader = GetPlayer()->GetTrader();
-
- WorldPacket data(SMSG_TRADE_STATUS, 13);
- data.WriteBit(trader ? (trader->GetSession()->GetBattlenetAccountId() == GetBattlenetAccountId()) : 0); // IsSameBnetAccount, used for trading heirlooms and other battle.net bound items with your other accounts
- data.WriteBits(info.Status, 5);
-
- switch (info.Status)
- {
- case TRADE_STATUS_BEGIN_TRADE:
- data.WriteBit(info.TraderGuid[2]);
- data.WriteBit(info.TraderGuid[4]);
- data.WriteBit(info.TraderGuid[6]);
- data.WriteBit(info.TraderGuid[0]);
- data.WriteBit(info.TraderGuid[1]);
- data.WriteBit(info.TraderGuid[3]);
- data.WriteBit(info.TraderGuid[7]);
- data.WriteBit(info.TraderGuid[5]);
-
- data.WriteByteSeq(info.TraderGuid[4]);
- data.WriteByteSeq(info.TraderGuid[1]);
- data.WriteByteSeq(info.TraderGuid[2]);
- data.WriteByteSeq(info.TraderGuid[3]);
- data.WriteByteSeq(info.TraderGuid[0]);
- data.WriteByteSeq(info.TraderGuid[7]);
- data.WriteByteSeq(info.TraderGuid[6]);
- data.WriteByteSeq(info.TraderGuid[5]);
- break;
- case TRADE_STATUS_OPEN_WINDOW:
- data << uint32(0); // CGTradeInfo::m_tradeID
- break;
- case TRADE_STATUS_CLOSE_WINDOW:
- data.WriteBit(info.IsTargetResult); // bool isTargetError; used for: EQUIP_ERR_BAG_FULL, EQUIP_ERR_CANT_CARRY_MORE_OF_THIS, EQUIP_ERR_MISSING_REAGENT, EQUIP_ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED
- data << uint32(info.Result); // InventoryResult
- data << uint32(info.ItemLimitCategoryId); // ItemLimitCategory.dbc entry
- break;
- case TRADE_STATUS_WRONG_REALM:
- case TRADE_STATUS_NOT_ON_TAPLIST:
- data << uint8(info.Slot); // Trade slot; -1 here clears CGTradeInfo::m_tradeMoney
- break;
- case TRADE_STATUS_CURRENCY: // Not implemented
- case TRADE_STATUS_CURRENCY_NOT_TRADABLE: // Not implemented
- // Blizzard never implemented these, you can only trade currency with the field9 & 1 in CurrencyTypes.DBC, and only two test currencies have that flag
- data << uint32(0); // Trading Currency Id
- data << uint32(0); // Trading Currency Amount
- default:
- data.FlushBits();
- break;
- }
-
- SendPacket(&data);
+ info.Clear(); // reuse packet
+ Player* trader = _player->GetTrader();
+ info.PartnerIsSameBnetAccount = trader && trader->GetSession()->GetBattlenetAccountId() == GetBattlenetAccountId();
+ SendPacket(info.Write());
}
-void WorldSession::HandleIgnoreTradeOpcode(WorldPacket& /*recvPacket*/)
+void WorldSession::HandleIgnoreTradeOpcode(WorldPackets::Trade::IgnoreTrade& /*ignoreTrade*/)
{
}
-void WorldSession::HandleBusyTradeOpcode(WorldPacket& /*recvPacket*/)
+void WorldSession::HandleBusyTradeOpcode(WorldPackets::Trade::BusyTrade& /*busyTrade*/)
{
}
@@ -97,106 +51,44 @@ void WorldSession::SendUpdateTrade(bool trader_data /*= true*/)
{
TradeData* view_trade = trader_data ? _player->GetTradeData()->GetTraderData() : _player->GetTradeData();
- ByteBuffer itemData(7*2 + 7*4 + 3*4 + 3*4 + 1);
-
- uint8 count = 0;
- for (uint8 i = 0; i < TRADE_SLOT_COUNT; ++i)
- if (view_trade->GetItem(TradeSlots(i)))
- ++count;
-
- WorldPacket data(SMSG_TRADE_UPDATED, 4*6 + 8 + 1 + 3 + count * 70);
- data << uint32(0); // CGTradeInfo::m_tradeID
- data << uint32(0); // unk 2
- data << uint64(view_trade->GetMoney()); // trader gold
- data << uint32(view_trade->GetSpell()); // spell casted on lowest slot item
- data << uint32(TRADE_SLOT_COUNT); // trade slots count/number?, = next field in most cases
- data << uint32(0); // unk 5
- data << uint8(trader_data); // 1 means traders data, 0 means own
- data << uint32(TRADE_SLOT_COUNT); // trade slots count/number?, = prev field in most cases
- data.WriteBits(count, 22);
+ WorldPackets::Trade::TradeUpdated tradeUpdated;
+ tradeUpdated.WhichPlayer = trader_data;
+ tradeUpdated.ClientStateIndex = view_trade->GetClientStateIndex();
+ tradeUpdated.CurrentStateIndex = view_trade->GetServerStateIndex();
+ tradeUpdated.Gold = view_trade->GetMoney();
+ tradeUpdated.ProposedEnchantment = view_trade->GetSpell();
for (uint8 i = 0; i < TRADE_SLOT_COUNT; ++i)
{
- Item* item = view_trade->GetItem(TradeSlots(i));
- if (!item)
- continue;
-
- ObjectGuid giftCreatorGuid = item->GetGuidValue(ITEM_FIELD_GIFTCREATOR);
- ObjectGuid creatorGuid = item->GetGuidValue(ITEM_FIELD_CREATOR);
-
- data.WriteBit(giftCreatorGuid[7]);
- data.WriteBit(giftCreatorGuid[1]);
- bool notWrapped = data.WriteBit(!item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAG_WRAPPED));
- data.WriteBit(giftCreatorGuid[3]);
-
- if (notWrapped)
+ if (Item* item = view_trade->GetItem(TradeSlots(i)))
{
- data.WriteBit(creatorGuid[7]);
- data.WriteBit(creatorGuid[1]);
- data.WriteBit(creatorGuid[4]);
- data.WriteBit(creatorGuid[6]);
- data.WriteBit(creatorGuid[2]);
- data.WriteBit(creatorGuid[3]);
- data.WriteBit(creatorGuid[5]);
- data.WriteBit(item->GetTemplate()->GetLockID() != 0);
- data.WriteBit(creatorGuid[0]);
-
- itemData.WriteByteSeq(creatorGuid[1]);
-
- itemData << uint32(item->GetEnchantmentId(PERM_ENCHANTMENT_SLOT));
- for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT+MAX_GEM_SOCKETS /*3*/; ++enchant_slot)
- itemData << uint32(item->GetEnchantmentId(EnchantmentSlot(enchant_slot)));
- itemData << uint32(item->GetUInt32Value(ITEM_FIELD_MAXDURABILITY));
-
- itemData.WriteByteSeq(creatorGuid[6]);
- itemData.WriteByteSeq(creatorGuid[2]);
- itemData.WriteByteSeq(creatorGuid[7]);
- itemData.WriteByteSeq(creatorGuid[4]);
-
- itemData << uint32(item->GetUInt32Value(ITEM_FIELD_DURABILITY));
- itemData << uint32(item->GetItemRandomPropertyId());
-
- itemData.WriteByteSeq(creatorGuid[3]);
-
- itemData << uint32(0); // unk7
-
- itemData.WriteByteSeq(creatorGuid[0]);
-
- itemData << uint32(item->GetSpellCharges());
- itemData << uint32(item->GetItemSuffixFactor());
+ WorldPackets::Trade::TradeUpdated::TradeItem tradeItem;
+ tradeItem.Slot = i;
+ tradeItem.EntryID = item->GetEntry();
+ tradeItem.StackCount = item->GetCount();
+ tradeItem.GiftCreator = item->GetGuidValue(ITEM_FIELD_GIFTCREATOR);
+ if (!item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAG_WRAPPED))
+ {
+ WorldPackets::Trade::TradeUpdated::UnwrappedTradeItem* unwrappedItem = &tradeItem.Unwrapped.Value;
+ unwrappedItem->Item.Initalize(item);
+ unwrappedItem->EnchantID = item->GetEnchantmentId(PERM_ENCHANTMENT_SLOT);
+ unwrappedItem->OnUseEnchantmentID = item->GetEnchantmentId(USE_ENCHANTMENT_SLOT);
+ unwrappedItem->Creator = item->GetGuidValue(ITEM_FIELD_CREATOR);
+ unwrappedItem->Charges = item->GetSpellCharges();
+ unwrappedItem->Lock = item->GetTemplate()->GetLockID() && !item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAG_UNLOCKED);
+ unwrappedItem->MaxDurability = item->GetUInt32Value(ITEM_FIELD_MAXDURABILITY);
+ unwrappedItem->Durability = item->GetUInt32Value(ITEM_FIELD_DURABILITY);
+ for (uint32 s = SOCK_ENCHANTMENT_SLOT; s < MAX_GEM_SOCKETS; ++s)
+ unwrappedItem->SocketEnchant[s] = item->GetEnchantmentId(EnchantmentSlot(s + SOCK_ENCHANTMENT_SLOT));
+
+ tradeItem.Unwrapped.HasValue = true;
+ }
- itemData.WriteByteSeq(creatorGuid[5]);
+ tradeUpdated.Items.push_back(tradeItem);
}
-
- data.WriteBit(giftCreatorGuid[6]);
- data.WriteBit(giftCreatorGuid[4]);
- data.WriteBit(giftCreatorGuid[2]);
- data.WriteBit(giftCreatorGuid[0]);
- data.WriteBit(giftCreatorGuid[5]);
-
- itemData.WriteByteSeq(giftCreatorGuid[6]);
- itemData.WriteByteSeq(giftCreatorGuid[1]);
- itemData.WriteByteSeq(giftCreatorGuid[7]);
- itemData.WriteByteSeq(giftCreatorGuid[4]);
-
- itemData << uint32(item->GetTemplate()->GetId());
-
- itemData.WriteByteSeq(giftCreatorGuid[0]);
-
- itemData << uint32(item->GetCount());
-
- itemData.WriteByteSeq(giftCreatorGuid[5]);
-
- itemData << uint8(i);
-
- itemData.WriteByteSeq(giftCreatorGuid[2]);
- itemData.WriteByteSeq(giftCreatorGuid[3]);
}
- data.FlushBits();
- data.append(itemData);
-
- SendPacket(&data);
+ SendPacket(tradeUpdated.Write());
}
//==============================================================
@@ -328,7 +220,7 @@ static void clearAcceptTradeMode(Item* *myItems, Item* *hisItems)
}
}
-void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/)
+void WorldSession::HandleAcceptTradeOpcode(WorldPackets::Trade::AcceptTrade& acceptTrade)
{
TradeData* my_trade = _player->m_trade;
if (!my_trade)
@@ -346,10 +238,18 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/)
// set before checks for propertly undo at problems (it already set in to client)
my_trade->SetAccepted(true);
- TradeStatusInfo info;
+ WorldPackets::Trade::TradeStatus info;
+ if (his_trade->GetServerStateIndex() != acceptTrade.StateIndex)
+ {
+ info.Status = TRADE_STATUS_STATE_CHANGED;
+ SendTradeStatus(info);
+ my_trade->SetAccepted(false);
+ return;
+ }
+
if (!_player->IsWithinDistInMap(trader, TRADE_DISTANCE, false))
{
- info.Status = TRADE_STATUS_TARGET_TO_FAR;
+ info.Status = TRADE_STATUS_TOO_FAR_AWAY;
SendTradeStatus(info);
my_trade->SetAccepted(false);
return;
@@ -358,8 +258,8 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/)
// not accept case incorrect money amount
if (!_player->HasEnoughMoney(my_trade->GetMoney()))
{
- info.Status = TRADE_STATUS_CLOSE_WINDOW;
- info.Result = EQUIP_ERR_NOT_ENOUGH_MONEY;
+ info.Status = TRADE_STATUS_FAILED;
+ info.BagResult = EQUIP_ERR_NOT_ENOUGH_MONEY;
SendTradeStatus(info);
my_trade->SetAccepted(false, true);
return;
@@ -368,8 +268,8 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/)
// not accept case incorrect money amount
if (!trader->HasEnoughMoney(his_trade->GetMoney()))
{
- info.Status = TRADE_STATUS_CLOSE_WINDOW;
- info.Result = EQUIP_ERR_NOT_ENOUGH_MONEY;
+ info.Status = TRADE_STATUS_FAILED;
+ info.BagResult = EQUIP_ERR_NOT_ENOUGH_MONEY;
trader->GetSession()->SendTradeStatus(info);
his_trade->SetAccepted(false, true);
return;
@@ -377,8 +277,8 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/)
if (_player->GetMoney() >= uint64(MAX_MONEY_AMOUNT) - his_trade->GetMoney())
{
- info.Status = TRADE_STATUS_CLOSE_WINDOW;
- info.Result = EQUIP_ERR_TOO_MUCH_GOLD;
+ info.Status = TRADE_STATUS_FAILED;
+ info.BagResult = EQUIP_ERR_TOO_MUCH_GOLD;
SendTradeStatus(info);
my_trade->SetAccepted(false, true);
return;
@@ -386,8 +286,8 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/)
if (trader->GetMoney() >= uint64(MAX_MONEY_AMOUNT) - my_trade->GetMoney())
{
- info.Status = TRADE_STATUS_CLOSE_WINDOW;
- info.Result = EQUIP_ERR_TOO_MUCH_GOLD;
+ info.Status = TRADE_STATUS_FAILED;
+ info.BagResult = EQUIP_ERR_TOO_MUCH_GOLD;
trader->GetSession()->SendTradeStatus(info);
his_trade->SetAccepted(false, true);
return;
@@ -400,15 +300,15 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/)
{
if (!item->CanBeTraded(false, true))
{
- info.Status = TRADE_STATUS_TRADE_CANCELED;
+ info.Status = TRADE_STATUS_CANCELLED;
SendTradeStatus(info);
return;
}
if (item->IsBindedNotWith(trader))
{
- info.Status = TRADE_STATUS_CLOSE_WINDOW;
- info.Result = EQUIP_ERR_TRADE_BOUND_ITEM;
+ info.Status = TRADE_STATUS_FAILED;
+ info.BagResult = EQUIP_ERR_TRADE_BOUND_ITEM;
SendTradeStatus(info);
return;
}
@@ -418,7 +318,7 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/)
{
if (!item->CanBeTraded(false, true))
{
- info.Status = TRADE_STATUS_TRADE_CANCELED;
+ info.Status = TRADE_STATUS_CANCELLED;
SendTradeStatus(info);
return;
}
@@ -514,36 +414,36 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/)
}
// inform partner client
- info.Status = TRADE_STATUS_TRADE_ACCEPT;
+ info.Status = TRADE_STATUS_ACCEPTED;
trader->GetSession()->SendTradeStatus(info);
// test if item will fit in each inventory
- TradeStatusInfo myCanCompleteInfo, hisCanCompleteInfo;
- hisCanCompleteInfo.Result = trader->CanStoreItems(myItems, TRADE_SLOT_TRADED_COUNT, &hisCanCompleteInfo.ItemLimitCategoryId);
- myCanCompleteInfo.Result = _player->CanStoreItems(hisItems, TRADE_SLOT_TRADED_COUNT, &myCanCompleteInfo.ItemLimitCategoryId);
+ WorldPackets::Trade::TradeStatus myCanCompleteInfo, hisCanCompleteInfo;
+ hisCanCompleteInfo.BagResult = trader->CanStoreItems(myItems, TRADE_SLOT_TRADED_COUNT, &hisCanCompleteInfo.ItemID);
+ myCanCompleteInfo.BagResult = _player->CanStoreItems(hisItems, TRADE_SLOT_TRADED_COUNT, &myCanCompleteInfo.ItemID);
clearAcceptTradeMode(myItems, hisItems);
// in case of missing space report error
- if (myCanCompleteInfo.Result != EQUIP_ERR_OK)
+ if (myCanCompleteInfo.BagResult != EQUIP_ERR_OK)
{
clearAcceptTradeMode(my_trade, his_trade);
- myCanCompleteInfo.Status = TRADE_STATUS_CLOSE_WINDOW;
+ myCanCompleteInfo.Status = TRADE_STATUS_FAILED;
trader->GetSession()->SendTradeStatus(myCanCompleteInfo);
- myCanCompleteInfo.IsTargetResult = true;
+ myCanCompleteInfo.FailureForYou = true;
SendTradeStatus(myCanCompleteInfo);
my_trade->SetAccepted(false);
his_trade->SetAccepted(false);
return;
}
- else if (hisCanCompleteInfo.Result != EQUIP_ERR_OK)
+ else if (hisCanCompleteInfo.BagResult != EQUIP_ERR_OK)
{
clearAcceptTradeMode(my_trade, his_trade);
- hisCanCompleteInfo.Status = TRADE_STATUS_CLOSE_WINDOW;
+ hisCanCompleteInfo.Status = TRADE_STATUS_FAILED;
SendTradeStatus(hisCanCompleteInfo);
- hisCanCompleteInfo.IsTargetResult = true;
+ hisCanCompleteInfo.FailureForYou = true;
trader->GetSession()->SendTradeStatus(hisCanCompleteInfo);
my_trade->SetAccepted(false);
his_trade->SetAccepted(false);
@@ -613,18 +513,18 @@ void WorldSession::HandleAcceptTradeOpcode(WorldPacket& /*recvPacket*/)
trader->SaveInventoryAndGoldToDB(trans);
CharacterDatabase.CommitTransaction(trans);
- info.Status = TRADE_STATUS_TRADE_COMPLETE;
+ info.Status = TRADE_STATUS_COMPLETE;
trader->GetSession()->SendTradeStatus(info);
SendTradeStatus(info);
}
else
{
- info.Status = TRADE_STATUS_TRADE_ACCEPT;
+ info.Status = TRADE_STATUS_ACCEPTED;
trader->GetSession()->SendTradeStatus(info);
}
}
-void WorldSession::HandleUnacceptTradeOpcode(WorldPacket& /*recvPacket*/)
+void WorldSession::HandleUnacceptTradeOpcode(WorldPackets::Trade::UnacceptTrade& /*unacceptTrade*/)
{
TradeData* my_trade = _player->GetTradeData();
if (!my_trade)
@@ -633,14 +533,14 @@ 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)
return;
- TradeStatusInfo info;
- info.Status = TRADE_STATUS_OPEN_WINDOW;
+ WorldPackets::Trade::TradeStatus info;
+ info.Status = TRADE_STATUS_INITIATED;
my_trade->GetTrader()->GetSession()->SendTradeStatus(info);
SendTradeStatus(info);
}
@@ -650,8 +550,8 @@ void WorldSession::SendCancelTrade()
if (PlayerRecentlyLoggedOut() || PlayerLogout())
return;
- TradeStatusInfo info;
- info.Status = TRADE_STATUS_TRADE_CANCELED;
+ WorldPackets::Trade::TradeStatus info;
+ info.Status = TRADE_STATUS_CANCELLED;
SendTradeStatus(info);
}
@@ -662,56 +562,36 @@ void WorldSession::HandleCancelTradeOpcode(WorldPackets::Trade::CancelTrade& /*c
_player->TradeCancel(true);
}
-void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket)
+void WorldSession::HandleInitiateTradeOpcode(WorldPackets::Trade::InitiateTrade& initiateTrade)
{
- ObjectGuid guid;
-
- guid[0] = recvPacket.ReadBit();
- guid[3] = recvPacket.ReadBit();
- guid[5] = recvPacket.ReadBit();
- guid[1] = recvPacket.ReadBit();
- guid[4] = recvPacket.ReadBit();
- guid[6] = recvPacket.ReadBit();
- guid[7] = recvPacket.ReadBit();
- guid[2] = recvPacket.ReadBit();
-
- recvPacket.ReadByteSeq(guid[7]);
- recvPacket.ReadByteSeq(guid[4]);
- recvPacket.ReadByteSeq(guid[3]);
- recvPacket.ReadByteSeq(guid[5]);
- recvPacket.ReadByteSeq(guid[1]);
- recvPacket.ReadByteSeq(guid[2]);
- recvPacket.ReadByteSeq(guid[6]);
- recvPacket.ReadByteSeq(guid[0]);
-
if (GetPlayer()->m_trade)
return;
- TradeStatusInfo info;
+ WorldPackets::Trade::TradeStatus info;
if (!GetPlayer()->IsAlive())
{
- info.Status = TRADE_STATUS_YOU_DEAD;
+ info.Status = TRADE_STATUS_DEAD;
SendTradeStatus(info);
return;
}
if (GetPlayer()->HasUnitState(UNIT_STATE_STUNNED))
{
- info.Status = TRADE_STATUS_YOU_STUNNED;
+ info.Status = TRADE_STATUS_STUNNED;
SendTradeStatus(info);
return;
}
if (isLogingOut())
{
- info.Status = TRADE_STATUS_YOU_LOGOUT;
+ info.Status = TRADE_STATUS_LOGGING_OUT;
SendTradeStatus(info);
return;
}
if (GetPlayer()->IsInFlight())
{
- info.Status = TRADE_STATUS_TARGET_TO_FAR;
+ info.Status = TRADE_STATUS_TOO_FAR_AWAY;
SendTradeStatus(info);
return;
}
@@ -722,8 +602,7 @@ void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket)
return;
}
- Player* pOther = ObjectAccessor::FindPlayer(guid);
-
+ Player* pOther = ObjectAccessor::FindPlayer(initiateTrade.Guid);
if (!pOther)
{
info.Status = TRADE_STATUS_NO_TARGET;
@@ -733,7 +612,7 @@ void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket)
if (pOther == GetPlayer() || pOther->m_trade)
{
- info.Status = TRADE_STATUS_BUSY;
+ info.Status = TRADE_STATUS_PLAYER_BUSY;
SendTradeStatus(info);
return;
}
@@ -747,7 +626,7 @@ void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket)
if (pOther->IsInFlight())
{
- info.Status = TRADE_STATUS_TARGET_TO_FAR;
+ info.Status = TRADE_STATUS_TOO_FAR_AWAY;
SendTradeStatus(info);
return;
}
@@ -761,14 +640,14 @@ void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket)
if (pOther->GetSession()->isLogingOut())
{
- info.Status = TRADE_STATUS_TARGET_LOGOUT;
+ info.Status = TRADE_STATUS_TARGET_LOGGING_OUT;
SendTradeStatus(info);
return;
}
if (pOther->GetSocial()->HasIgnore(GetPlayer()->GetGUID()))
{
- info.Status = TRADE_STATUS_IGNORE_YOU;
+ info.Status = TRADE_STATUS_PLAYER_IGNORED;
SendTradeStatus(info);
return;
}
@@ -784,7 +663,7 @@ void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket)
if (!pOther->IsWithinDistInMap(_player, TRADE_DISTANCE, false))
{
- info.Status = TRADE_STATUS_TARGET_TO_FAR;
+ info.Status = TRADE_STATUS_TOO_FAR_AWAY;
SendTradeStatus(info);
return;
}
@@ -799,52 +678,41 @@ void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket)
_player->m_trade = new TradeData(_player, pOther);
pOther->m_trade = new TradeData(pOther, _player);
- info.Status = TRADE_STATUS_BEGIN_TRADE;
- info.TraderGuid = _player->GetGUID();
+ info.Status = TRADE_STATUS_PROPOSED;
+ info.Partner = _player->GetGUID();
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->SetMoney(gold);
+ my_trade->UpdateClientStateIndex();
+ 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;
- TradeStatusInfo info;
+ WorldPackets::Trade::TradeStatus info;
// invalid slot number
- if (tradeSlot >= TRADE_SLOT_COUNT)
+ if (setTradeItem.TradeSlot >= TRADE_SLOT_COUNT)
{
- info.Status = TRADE_STATUS_TRADE_CANCELED;
+ info.Status = TRADE_STATUS_CANCELLED;
SendTradeStatus(info);
return;
}
// 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;
+ info.Status = TRADE_STATUS_CANCELLED;
SendTradeStatus(info);
return;
}
@@ -855,34 +723,39 @@ void WorldSession::HandleSetTradeItemOpcode(WorldPacket& recvPacket)
if (my_trade->HasItem(iGUID))
{
// cheating attempt
- info.Status = TRADE_STATUS_TRADE_CANCELED;
+ info.Status = TRADE_STATUS_CANCELLED;
SendTradeStatus(info);
return;
}
- if (tradeSlot != TRADE_SLOT_NONTRADED && item->IsBindedNotWith(my_trade->GetTrader()))
+ my_trade->UpdateClientStateIndex();
+
+ if (setTradeItem.TradeSlot != TRADE_SLOT_NONTRADED && item->IsBindedNotWith(my_trade->GetTrader()))
{
info.Status = TRADE_STATUS_NOT_ON_TAPLIST;
- info.Slot = 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;
+ my_trade->UpdateClientStateIndex();
+
// invalid slot number
- if (tradeSlot >= TRADE_SLOT_COUNT)
+ if (clearTradeItem.TradeSlot >= TRADE_SLOT_COUNT)
return;
- my_trade->SetItem(TradeSlots(tradeSlot), NULL);
+ my_trade->SetItem(TradeSlots(clearTradeItem.TradeSlot), NULL);
+}
+
+void WorldSession::HandleSetTradeCurrencyOpcode(WorldPackets::Trade::SetTradeCurrency& /*setTradeCurrency*/)
+{
}