aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server
diff options
context:
space:
mode:
authorDuarte Duarte <dnpd.dd@gmail.com>2015-02-13 00:45:13 +0000
committerDuarte Duarte <dnpd.dd@gmail.com>2015-02-13 00:45:39 +0000
commitf68473aeff08920196115bab56ee47802abd2582 (patch)
treea9529c7508ac6c9e9fa3570e25ce285de62df413 /src/server/game/Server
parent40dcc170d943dafbb2330ca1fc8c005ed7a61a56 (diff)
Core/Packets: Fix and enable CMSG_BUY_ITEM, SMSG_BUY_FAILED and SMSG_BUY_SUCCEEDED
Closes #14127
Diffstat (limited to 'src/server/game/Server')
-rw-r--r--src/server/game/Server/Packets/ItemPackets.cpp76
-rw-r--r--src/server/game/Server/Packets/ItemPackets.h79
-rw-r--r--src/server/game/Server/Packets/PacketUtilities.h19
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp6
-rw-r--r--src/server/game/Server/Protocol/Opcodes.h2
-rw-r--r--src/server/game/Server/WorldSession.h3
6 files changed, 157 insertions, 28 deletions
diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp
index 8456c68ee67..dbc7ba2615a 100644
--- a/src/server/game/Server/Packets/ItemPackets.cpp
+++ b/src/server/game/Server/Packets/ItemPackets.cpp
@@ -19,8 +19,39 @@
void WorldPackets::Item::BuyBackItem::Read()
{
- _worldPacket >> VendorGUID;
- _worldPacket >> Slot;
+ _worldPacket >> VendorGUID
+ >> Slot;
+}
+
+void WorldPackets::Item::BuyItem::Read()
+{
+ _worldPacket >> VendorGUID
+ >> ContainerGUID
+ >> Item
+ >> Quantity
+ >> Muid
+ >> Slot;
+
+ ItemType = static_cast<ItemVendorType>(_worldPacket.ReadBits(2));
+}
+
+WorldPacket const* WorldPackets::Item::BuySucceeded::Write()
+{
+ _worldPacket << VendorGUID
+ << uint32(Muid)
+ << int32(NewQuantity)
+ << uint32(QuantityBought);
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Item::BuyFailed::Write()
+{
+ _worldPacket << VendorGUID
+ << uint32(Muid)
+ << uint8(Reason);
+
+ return &_worldPacket;
}
void WorldPackets::Item::GetItemPurchaseData::Read()
@@ -68,11 +99,28 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemBonusInstanceDa
return data;
}
+ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemBonusInstanceData& itemBonusInstanceData)
+{
+ uint32 bonusListIdSize;
+
+ data >> itemBonusInstanceData.Context;
+ data >> bonusListIdSize;
+
+ for (uint32 i = 0u; i < bonusListIdSize; ++i)
+ {
+ uint32 bonusId;
+ data >> bonusId;
+ itemBonusInstanceData.BonusListIDs.push_back(bonusId);
+ }
+
+ return data;
+}
+
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemInstance const& itemInstance)
{
- data << itemInstance.ItemID;
- data << itemInstance.RandomPropertiesSeed;
- data << itemInstance.RandomPropertiesID;
+ data << int32(itemInstance.ItemID);
+ data << int32(itemInstance.RandomPropertiesSeed);
+ data << int32(itemInstance.RandomPropertiesID);
data.WriteBit(itemInstance.ItemBonus.HasValue);
data.WriteBit(itemInstance.Modifications.HasValue);
@@ -87,6 +135,24 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemInstance const&
return data;
}
+ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemInstance& itemInstance)
+{
+ data >> itemInstance.ItemID;
+ data >> itemInstance.RandomPropertiesSeed;
+ data >> itemInstance.RandomPropertiesID;
+
+ itemInstance.ItemBonus.HasValue = data.ReadBit();
+ itemInstance.Modifications.HasValue = data.ReadBit();
+
+ if (itemInstance.ItemBonus.HasValue)
+ data >> itemInstance.ItemBonus.Value;
+
+ if (itemInstance.Modifications.HasValue)
+ data >> itemInstance.Modifications.Value;
+
+ return data;
+}
+
ByteBuffer& WorldPackets::Item::operator>>(ByteBuffer& data, InvUpdate& invUpdate)
{
invUpdate.Items.resize(data.ReadBits(2));
diff --git a/src/server/game/Server/Packets/ItemPackets.h b/src/server/game/Server/Packets/ItemPackets.h
index 65fdcdf3367..1645af8275a 100644
--- a/src/server/game/Server/Packets/ItemPackets.h
+++ b/src/server/game/Server/Packets/ItemPackets.h
@@ -26,6 +26,24 @@ namespace WorldPackets
{
namespace Item
{
+ struct ItemBonusInstanceData
+ {
+ uint8 Context = 0;
+ std::vector<int32> BonusListIDs;
+ };
+
+ struct ItemInstance
+ {
+ void Initalize(::Item const* item);
+ void Initalize(::LootItem const& lootItem);
+
+ uint32 ItemID = 0;
+ uint32 RandomPropertiesSeed = 0;
+ uint32 RandomPropertiesID = 0;
+ Optional<ItemBonusInstanceData> ItemBonus;
+ Optional<CompactArray<int32>> Modifications;
+ };
+
class BuyBackItem final : public ClientPacket
{
public:
@@ -37,6 +55,47 @@ namespace WorldPackets
uint32 Slot = 0;
};
+ class BuyItem final : public ClientPacket
+ {
+ public:
+ BuyItem(WorldPacket&& packet) : ClientPacket(CMSG_BUY_ITEM, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid VendorGUID;
+ ItemInstance Item;
+ uint32 Muid = 0u;
+ uint32 Slot = 0u;
+ ItemVendorType ItemType = ITEM_VENDOR_TYPE_NONE;
+ int32 Quantity = 0;
+ ObjectGuid ContainerGUID;
+ };
+
+ class BuySucceeded final : ServerPacket
+ {
+ public:
+ BuySucceeded() : ServerPacket(SMSG_BUY_SUCCEEDED, 16 + 4 + 4 + 4 + 4) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid VendorGUID;
+ uint32 Muid = 0u;
+ uint32 QuantityBought = 0u;
+ int32 NewQuantity = 0;
+ };
+
+ class BuyFailed final : ServerPacket
+ {
+ public:
+ BuyFailed() : ServerPacket(SMSG_BUY_FAILED, 16 + 4 + 1) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid VendorGUID;
+ uint32 Muid = 0u;
+ BuyResult Reason = BUY_ERR_CANT_FIND_ITEM;
+ };
+
class GetItemPurchaseData final : public ClientPacket
{
public:
@@ -93,24 +152,6 @@ namespace WorldPackets
uint8 ProficiencyClass = 0;
};
- struct ItemBonusInstanceData
- {
- uint8 Context = 0;
- std::vector<int32> BonusListIDs;
- };
-
- struct ItemInstance
- {
- void Initalize(::Item const* item);
- void Initalize(::LootItem const& lootItem);
-
- uint32 ItemID = 0;
- uint32 RandomPropertiesSeed = 0;
- uint32 RandomPropertiesID = 0;
- Optional<ItemBonusInstanceData> ItemBonus;
- Optional<CompactArray<int32>> Modifications;
- };
-
struct InvUpdate
{
struct InvItem
@@ -222,6 +263,8 @@ namespace WorldPackets
}
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemBonusInstanceData const& itemBonusInstanceData);
+ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemBonusInstanceData& itemBonusInstanceData);
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemInstance const& itemInstance);
+ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemInstance& itemInstance);
#endif // ItemPackets_h__
diff --git a/src/server/game/Server/Packets/PacketUtilities.h b/src/server/game/Server/Packets/PacketUtilities.h
index 25e6f27d1d4..6246b637a71 100644
--- a/src/server/game/Server/Packets/PacketUtilities.h
+++ b/src/server/game/Server/Packets/PacketUtilities.h
@@ -73,4 +73,23 @@ namespace WorldPackets
return data;
}
+
+ template <typename T>
+ ByteBuffer& operator>>(ByteBuffer& data, CompactArray<T>& v)
+ {
+ uint32 mask;
+ data >> mask;
+
+ for (size_t index = 0; mask != 0; mask >>= 1, ++index)
+ {
+ if ((mask & 1) != 0)
+ {
+ T value;
+ data >> value;
+ v.Insert(index, value);
+ }
+ }
+
+ return data;
+ }
}
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 00d136d9c76..e29624e90e6 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -229,7 +229,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_BUSY_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBusyTradeOpcode );
DEFINE_HANDLER(CMSG_BUY_BACK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::BuyBackItem, &WorldSession::HandleBuybackItem);
DEFINE_OPCODE_HANDLER_OLD(CMSG_BUY_BANK_SLOT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBuyBankSlotOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_BUY_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBuyItemOpcode );
+ DEFINE_HANDLER(CMSG_BUY_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::BuyItem, &WorldSession::HandleBuyItemOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_CAGE_BATTLE_PET, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_ADD_EVENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarAddEvent );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_ARENA_TEAM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarArenaTeam );
@@ -1056,8 +1056,8 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BONUS_ROLL_EMPTY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BREAK_TARGET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_BANK_SLOT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_ITEM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_SUCCEEDED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_ACTION_PENDING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_ARENA_TEAM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_CLEAR_PENDING_ACTION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h
index 6dfa72cf46b..6666b38bfc2 100644
--- a/src/server/game/Server/Protocol/Opcodes.h
+++ b/src/server/game/Server/Protocol/Opcodes.h
@@ -958,7 +958,7 @@ enum OpcodeServer : uint32
SMSG_BREAK_TARGET = 0x11A2,
SMSG_BUY_BANK_SLOT_RESULT = 0xBADD,
SMSG_BUY_FAILED = 0x013A,
- SMSG_BUY_ITEM = 0x0BD1,
+ SMSG_BUY_SUCCEEDED = 0x0BD1,
SMSG_CALENDAR_ACTION_PENDING = 0xBADD,
SMSG_CALENDAR_ARENA_TEAM = 0xBADD,
SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x1E8A,
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index d6bdc0f11fb..fe221d38a9e 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -180,6 +180,7 @@ namespace WorldPackets
{
class AutoEquipItem;
class AutoStoreBagItem;
+ class BuyItem;
class BuyBackItem;
class DestroyItem;
class GetItemPurchaseData;
@@ -984,7 +985,7 @@ class WorldSession
void HandleAutoEquipItemOpcode(WorldPackets::Item::AutoEquipItem& autoEquipItem);
void HandleSellItemOpcode(WorldPackets::Item::SellItem& packet);
void HandleBuyItemInSlotOpcode(WorldPacket& recvPacket);
- void HandleBuyItemOpcode(WorldPacket& recvPacket);
+ void HandleBuyItemOpcode(WorldPackets::Item::BuyItem& packet);
void HandleListInventoryOpcode(WorldPackets::NPC::Hello& packet);
void HandleAutoStoreBagItemOpcode(WorldPackets::Item::AutoStoreBagItem& packet);
void HandleReadItem(WorldPacket& recvPacket);