aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSubv <subv2112@gmail.com>2014-06-17 15:22:13 -0500
committerSubv <subv2112@gmail.com>2014-06-17 15:22:30 -0500
commit6e35288d5cc72c8607588c0531c14f456dd55a4d (patch)
treed97826ade25f0be6e36acee11cfce722c44d5f59
parentfe8e904dead393968dfa674281931b408e926053 (diff)
Core/Packets: Named some unks and implemented some stuff in SMSG_TRADE_STATUS
-rw-r--r--src/server/game/Handlers/TradeHandler.cpp36
-rw-r--r--src/server/game/Server/WorldSession.h2
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();