aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2015-08-18 17:45:30 +0200
committerShauren <shauren.trinity@gmail.com>2015-08-18 17:45:30 +0200
commit5ef84bb6995af4c2898b21bd47f87872d9a5d383 (patch)
tree5c1d74ec7bfa2120f2833e4603d0beb217b35388 /src/server/game/Server
parentf252019764f8c70c9dda59112b974ba6305fe8f4 (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.cpp56
-rw-r--r--src/server/game/Server/Packets/ItemPackets.h30
-rw-r--r--src/server/game/Server/Packets/PacketUtilities.h10
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
-rw-r--r--src/server/game/Server/WorldSession.h3
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);