diff options
author | Subv <subv2112@gmail.com> | 2014-06-17 15:22:13 -0500 |
---|---|---|
committer | Subv <subv2112@gmail.com> | 2014-06-17 15:22:30 -0500 |
commit | 6e35288d5cc72c8607588c0531c14f456dd55a4d (patch) | |
tree | d97826ade25f0be6e36acee11cfce722c44d5f59 | |
parent | fe8e904dead393968dfa674281931b408e926053 (diff) |
Core/Packets: Named some unks and implemented some stuff in SMSG_TRADE_STATUS
-rw-r--r-- | src/server/game/Handlers/TradeHandler.cpp | 36 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 2 |
2 files changed, 25 insertions, 13 deletions
diff --git a/src/server/game/Handlers/TradeHandler.cpp b/src/server/game/Handlers/TradeHandler.cpp index fc6062773a1..862c6a6204e 100644 --- a/src/server/game/Handlers/TradeHandler.cpp +++ b/src/server/game/Handlers/TradeHandler.cpp @@ -30,40 +30,45 @@ #include "Language.h" #include "AccountMgr.h" -void WorldSession::SendTradeStatus(TradeStatus status) +void WorldSession::SendTradeStatus(TradeStatus status, int8 clearSlot) { WorldPacket data; + Player* trader = GetPlayer()->GetTrader(); + data.Initialize(SMSG_TRADE_STATUS, 1+4+4); - data.WriteBit(0); // unk bit, usually 0 + 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(status, 5); switch (status) { case TRADE_STATUS_BEGIN_TRADE: - data.WriteBits(0, 8); // zero guid + data.WriteBits(0, 8); // Trader Guid data.FlushBits(); break; case TRADE_STATUS_OPEN_WINDOW: data.FlushBits(); - data << uint32(0); // unk + data << uint32(0); // Trade Id break; case TRADE_STATUS_CLOSE_WINDOW: - data.WriteBit(0); // unk + data.WriteBit(0); // Error bool (0 = Target, 1 = Self) data.FlushBits(); - data << uint32(0); // unk - data << uint32(0); // unk + data << uint32(0); // Error Item (Relevant item to the error) + data << uint32(0); // InventoryResult break; - case TRADE_STATUS_ONLY_CONJURED: - case TRADE_STATUS_NOT_ELIGIBLE: + case TRADE_STATUS_ONLY_CONJURED: // Not Implemented + case TRADE_STATUS_NOT_ELIGIBLE: + // Used when trading loot soulbound items with people that are not eligible (TRADE_STATUS_NOT_ELIGIBLE), + // and when trying to trade items with players in other realms when in a cross realm BG, you can only trade conjured goods with them (TRADE_STATUS_ONLY_CONJURED) data.FlushBits(); - data << uint8(0); // unk + data << int8(clearSlot); // Trade slot to clear, -1 = Clear the money amount 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.FlushBits(); - data << uint32(0); // unk - data << uint32(0); // unk + data << uint32(0); // Trading Currency Id + data << uint32(0); // Trading Currency Amount default: data.FlushBits(); break; @@ -828,6 +833,13 @@ void WorldSession::HandleSetTradeItemOpcode(WorldPacket& recvPacket) return; } + if (item->IsBindedNotWith(GetPlayer()->GetTrader())) + { + // The item is BOP tradeable but the trader wasn't eligible to get it. + SendTradeStatus(TRADE_STATUS_NOT_ELIGIBLE, tradeSlot); + return; + } + my_trade->SetItem(TradeSlots(tradeSlot), item); } diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 97bc0d7c4c9..1145a631594 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -303,7 +303,7 @@ class WorldSession void SendBattleGroundList(uint64 guid, BattlegroundTypeId bgTypeId = BATTLEGROUND_RB); - void SendTradeStatus(TradeStatus status); + void SendTradeStatus(TradeStatus status, int8 clearSlot = 0); void SendUpdateTrade(bool trader_data = true); void SendCancelTrade(); |