diff options
| author | Shauren <shauren.trinity@gmail.com> | 2015-08-18 17:45:30 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2015-08-18 17:45:30 +0200 |
| commit | 5ef84bb6995af4c2898b21bd47f87872d9a5d383 (patch) | |
| tree | 5c1d74ec7bfa2120f2833e4603d0beb217b35388 /src/server/game/Server | |
| parent | f252019764f8c70c9dda59112b974ba6305fe8f4 (diff) | |
Core/PacketIO: Updated and enabled CMSG_TRANSMOGRIFY_ITEMS
* Implemented transmogrification using void storage items as source
Diffstat (limited to 'src/server/game/Server')
| -rw-r--r-- | src/server/game/Server/Packets/ItemPackets.cpp | 56 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/ItemPackets.h | 30 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/PacketUtilities.h | 10 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.h | 3 |
5 files changed, 99 insertions, 2 deletions
diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp index 7d54ebe3ec6..80bafbba104 100644 --- a/src/server/game/Server/Packets/ItemPackets.cpp +++ b/src/server/game/Server/Packets/ItemPackets.cpp @@ -18,6 +18,17 @@ #include "ItemPackets.h" #include "Player.h" +bool WorldPackets::Item::ItemBonusInstanceData::operator==(ItemBonusInstanceData const& r) const +{ + if (Context != r.Context) + return false; + + if (BonusListIDs.size() != r.BonusListIDs.size()) + return false; + + return std::is_permutation(BonusListIDs.begin(), BonusListIDs.end(), r.BonusListIDs.begin()); +} + void WorldPackets::Item::BuyBackItem::Read() { _worldPacket >> VendorGUID @@ -228,6 +239,23 @@ void WorldPackets::Item::ItemInstance::Initialize(::VoidStorageItem const* voidI } } +bool WorldPackets::Item::ItemInstance::operator==(ItemInstance const& r) const +{ + if (ItemID != r.ItemID || RandomPropertiesID != r.RandomPropertiesID || RandomPropertiesSeed != r.RandomPropertiesSeed) + return false; + + if (ItemBonus.is_initialized() != r.ItemBonus.is_initialized() || Modifications.is_initialized() != r.Modifications.is_initialized()) + return false; + + if (Modifications.is_initialized() && *Modifications != *r.Modifications) + return false; + + if (ItemBonus.is_initialized() && *ItemBonus != *r.ItemBonus) + return false; + + return true; +} + WorldPacket const* WorldPackets::Item::InventoryChangeFailure::Write() { _worldPacket << int8(BagResult); @@ -405,3 +433,31 @@ WorldPacket const* WorldPackets::Item::ItemEnchantTimeUpdate::Write() return &_worldPacket; } + +ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::TransmogrifyItem& transmogItem) +{ + if (data.ReadBit()) + transmogItem.SrcItemGUID = boost::in_place(); + + if (data.ReadBit()) + transmogItem.SrcVoidItemGUID = boost::in_place(); + + data >> transmogItem.Item; + data >> transmogItem.Slot; + + if (transmogItem.SrcItemGUID.is_initialized()) + data >> *transmogItem.SrcItemGUID; + + if (transmogItem.SrcVoidItemGUID.is_initialized()) + data >> *transmogItem.SrcVoidItemGUID; + + return data; +} + +void WorldPackets::Item::TransmogrifyItems::Read() +{ + Items.resize(_worldPacket.read<uint32>()); + _worldPacket >> Npc; + for (TransmogrifyItem& item : Items) + _worldPacket >> item; +} diff --git a/src/server/game/Server/Packets/ItemPackets.h b/src/server/game/Server/Packets/ItemPackets.h index d179f03b041..943a681edbe 100644 --- a/src/server/game/Server/Packets/ItemPackets.h +++ b/src/server/game/Server/Packets/ItemPackets.h @@ -32,6 +32,9 @@ namespace WorldPackets { uint8 Context = 0; std::vector<int32> BonusListIDs; + + bool operator==(ItemBonusInstanceData const& r) const; + bool operator!=(ItemBonusInstanceData const& r) const { return !(*this == r); } }; struct ItemInstance @@ -45,6 +48,9 @@ namespace WorldPackets uint32 RandomPropertiesID = 0; Optional<ItemBonusInstanceData> ItemBonus; Optional<CompactArray<int32>> Modifications; + + bool operator==(ItemInstance const& r) const; + bool operator!=(ItemInstance const& r) const { return !(*this == r); } }; class BuyBackItem final : public ClientPacket @@ -398,6 +404,30 @@ namespace WorldPackets uint32 Slot = 0; }; + struct TransmogrifyItem + { + Optional<ObjectGuid> SrcItemGUID; + Optional<ObjectGuid> SrcVoidItemGUID; + ItemInstance Item; + uint32 Slot = 0; + }; + + class TransmogrifyItems final : public ClientPacket + { + public: + enum + { + MAX_TRANSMOGRIFY_ITEMS = 11 + }; + + TransmogrifyItems(WorldPacket&& packet) : ClientPacket(CMSG_TRANSMOGRIFY_ITEMS, std::move(packet)) { } + + void Read() override; + + ObjectGuid Npc; + Array<TransmogrifyItem, MAX_TRANSMOGRIFY_ITEMS> Items; + }; + ByteBuffer& operator>>(ByteBuffer& data, InvUpdate& invUpdate); } } diff --git a/src/server/game/Server/Packets/PacketUtilities.h b/src/server/game/Server/Packets/PacketUtilities.h index 4837ee9e69c..4f39e264efb 100644 --- a/src/server/game/Server/Packets/PacketUtilities.h +++ b/src/server/game/Server/Packets/PacketUtilities.h @@ -178,6 +178,16 @@ namespace WorldPackets _contents.clear(); } + bool operator==(CompactArray const& r) const + { + if (_mask != r._mask) + return false; + + return _contents == r._contents; + } + + bool operator!=(CompactArray const& r) const { return !(*this == r); } + private: uint32 _mask; std::vector<T> _contents; diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 4dcf5fe9bc4..88fdbdc3305 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -789,7 +789,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_TOY_SET_FAVORITE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_TRAINER_BUY_SPELL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::TrainerBuySpell, &WorldSession::HandleTrainerBuySpellOpcode); DEFINE_HANDLER(CMSG_TRAINER_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleTrainerListOpcode); - DEFINE_OPCODE_HANDLER_OLD(CMSG_TRANSMOGRIFY_ITEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTransmogrifyItems ); + DEFINE_HANDLER(CMSG_TRANSMOGRIFY_ITEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::TransmogrifyItems, &WorldSession::HandleTransmogrifyItems); DEFINE_HANDLER(CMSG_TURN_IN_PETITION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::TurnInPetition, &WorldSession::HandleTurnInPetition); DEFINE_HANDLER(CMSG_TUTORIAL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::TutorialSetFlag, &WorldSession::HandleTutorialFlag); DEFINE_HANDLER(CMSG_TWITTER_CHECK_STATUS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 8d31aefe48a..107a4350af6 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -319,6 +319,7 @@ namespace WorldPackets class SwapItem; class WrapItem; class CancelTempEnchantment; + class TransmogrifyItems; } namespace Loot @@ -1519,7 +1520,7 @@ class WorldSession void SendVoidStorageTransferResult(VoidTransferError result); // Transmogrification - void HandleTransmogrifyItems(WorldPacket& recvData); + void HandleTransmogrifyItems(WorldPackets::Item::TransmogrifyItems& transmogrifyItems); // Miscellaneous void HandleSpellClick(WorldPackets::Spells::SpellClick& spellClick); |
