diff options
Diffstat (limited to 'src/server/game/Server')
| -rw-r--r-- | src/server/game/Server/Packets/AllPackets.h | 1 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/ItemPackets.cpp | 30 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/ItemPackets.h | 24 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/TransmogrificationPackets.cpp | 54 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/TransmogrificationPackets.h | 78 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 6 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.cpp | 11 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.h | 10 |
8 files changed, 155 insertions, 59 deletions
diff --git a/src/server/game/Server/Packets/AllPackets.h b/src/server/game/Server/Packets/AllPackets.h index 2c2aa528bb1..932b38bbd5e 100644 --- a/src/server/game/Server/Packets/AllPackets.h +++ b/src/server/game/Server/Packets/AllPackets.h @@ -70,6 +70,7 @@ #include "TotemPackets.h" #include "ToyPackets.h" #include "TradePackets.h" +#include "TransmogrificationPackets.h" #include "VehiclePackets.h" #include "VoicePackets.h" #include "VoidStoragePackets.h" diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp index ffaa7f0a88b..3ae94dfb84a 100644 --- a/src/server/game/Server/Packets/ItemPackets.cpp +++ b/src/server/game/Server/Packets/ItemPackets.cpp @@ -503,36 +503,6 @@ 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; - - CurrentSpecOnly = _worldPacket.ReadBit(); -} - void WorldPackets::Item::UseCritterItem::Read() { _worldPacket >> ItemGuid; diff --git a/src/server/game/Server/Packets/ItemPackets.h b/src/server/game/Server/Packets/ItemPackets.h index df2e5c9e1d0..384ba7eea5b 100644 --- a/src/server/game/Server/Packets/ItemPackets.h +++ b/src/server/game/Server/Packets/ItemPackets.h @@ -474,30 +474,6 @@ 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; - }; - class UseCritterItem final : public ClientPacket { public: diff --git a/src/server/game/Server/Packets/TransmogrificationPackets.cpp b/src/server/game/Server/Packets/TransmogrificationPackets.cpp new file mode 100644 index 00000000000..55d4cec7c98 --- /dev/null +++ b/src/server/game/Server/Packets/TransmogrificationPackets.cpp @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "TransmogrificationPackets.h" + +ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Transmogrification::TransmogrifyItem& transmogItem) +{ + data >> transmogItem.ItemModifiedAppearanceID; + data >> transmogItem.Slot; + data >> transmogItem.SpellItemEnchantmentID; + + return data; +} + +void WorldPackets::Transmogrification::TransmogrifyItems::Read() +{ + Items.resize(_worldPacket.read<uint32>()); + _worldPacket >> Npc; + for (TransmogrifyItem& item : Items) + _worldPacket >> item; + + CurrentSpecOnly = _worldPacket.ReadBit(); +} + +void WorldPackets::Transmogrification::TransmogAppearanceSetFavorite::Read() +{ + _worldPacket >> ItemModifiedAppearanceID; + IsFavorite = _worldPacket.ReadBit(); +} + +WorldPacket const* WorldPackets::Transmogrification::TransmogCollectionUpdate::Write() +{ + _worldPacket.WriteBit(IsFullUpdate); + _worldPacket.WriteBit(IsSetFavorite); + _worldPacket << uint32(FavoriteAppearances.size()); + for (uint32 itemModifiedAppearanceId : FavoriteAppearances) + _worldPacket << uint32(itemModifiedAppearanceId); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/TransmogrificationPackets.h b/src/server/game/Server/Packets/TransmogrificationPackets.h new file mode 100644 index 00000000000..93305b1e0bf --- /dev/null +++ b/src/server/game/Server/Packets/TransmogrificationPackets.h @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef TransmogrificationPackets_h__ +#define TransmogrificationPackets_h__ + +#include "Packet.h" +#include "ObjectGuid.h" +#include "PacketUtilities.h" + +namespace WorldPackets +{ + namespace Transmogrification + { + struct TransmogrifyItem + { + int32 ItemModifiedAppearanceID = 0; + uint32 Slot = 0; + int32 SpellItemEnchantmentID = 0; + }; + + class TransmogrifyItems final : public ClientPacket + { + public: + enum + { + MAX_TRANSMOGRIFY_ITEMS = 13 + }; + + TransmogrifyItems(WorldPacket&& packet) : ClientPacket(CMSG_TRANSMOGRIFY_ITEMS, std::move(packet)) { } + + void Read() override; + + ObjectGuid Npc; + Array<TransmogrifyItem, MAX_TRANSMOGRIFY_ITEMS> Items; + bool CurrentSpecOnly = false; + }; + + class TransmogAppearanceSetFavorite final : public ClientPacket + { + public: + TransmogAppearanceSetFavorite(WorldPacket&& packet) : ClientPacket(CMSG_TRANSMOG_APPEARANCE_SET_FAVORITE, std::move(packet)) { } + + void Read() override; + + uint32 ItemModifiedAppearanceID = 0; + bool IsFavorite = false; + }; + + class TransmogCollectionUpdate final : public ServerPacket + { + public: + TransmogCollectionUpdate() : ServerPacket(SMSG_TRANSMOG_COLLECTION_UPDATE) { } + + WorldPacket const* Write() override; + + bool IsFullUpdate = false; + bool IsSetFavorite = false; + std::vector<uint32> FavoriteAppearances; + }; + } +} + +#endif // TransmogrificationPackets_h__ diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index ac47130dcee..777f69c1c17 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -774,8 +774,8 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_TRADE_SKILL_SET_FAVORITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, 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_HANDLER(CMSG_TRANSMOGRIFY_ITEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::TransmogrifyItems, &WorldSession::HandleTransmogrifyItems); - DEFINE_HANDLER(CMSG_TRANSMOG_APPEARANCE_SET_FAVORITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Null, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_TRANSMOGRIFY_ITEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Transmogrification::TransmogrifyItems, &WorldSession::HandleTransmogrifyItems); + DEFINE_HANDLER(CMSG_TRANSMOG_APPEARANCE_SET_FAVORITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Transmogrification::TransmogAppearanceSetFavorite, &WorldSession::HandleTransmogAppearanceSetFavorite); 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); @@ -1710,7 +1710,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAINER_LIST, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSFER_ABORTED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSFER_PENDING, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSMOG_COLLECTION_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSMOG_COLLECTION_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRIGGER_CINEMATIC, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRIGGER_MOVIE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TURN_IN_PETITION_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 937961ad571..a013d8bd662 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -1079,6 +1079,8 @@ public: BATTLE_PET_SLOTS, GLOBAL_ACCOUNT_HEIRLOOMS, GLOBAL_REALM_CHARACTER_COUNTS, + ITEM_APPEARANCES, + ITEM_FAVORITE_APPEARANCES, MAX_QUERIES }; @@ -1109,6 +1111,14 @@ public: stmt->setUInt32(0, accountId); ok = SetPreparedQuery(GLOBAL_REALM_CHARACTER_COUNTS, stmt) && ok; + stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_BNET_ITEM_APPEARANCES); + stmt->setUInt32(0, battlenetAccountId); + ok = SetPreparedQuery(ITEM_APPEARANCES, stmt) && ok; + + stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_BNET_ITEM_FAVORITE_APPEARANCES); + stmt->setUInt32(0, battlenetAccountId); + ok = SetPreparedQuery(ITEM_FAVORITE_APPEARANCES, stmt) && ok; + return ok; } }; @@ -1142,6 +1152,7 @@ void WorldSession::InitializeSessionCallback(SQLQueryHolder* realmHolder, SQLQue LoadTutorialsData(realmHolder->GetPreparedResult(AccountInfoQueryHolderPerRealm::TUTORIALS)); _collectionMgr->LoadAccountToys(holder->GetPreparedResult(AccountInfoQueryHolder::GLOBAL_ACCOUNT_TOYS)); _collectionMgr->LoadAccountHeirlooms(holder->GetPreparedResult(AccountInfoQueryHolder::GLOBAL_ACCOUNT_HEIRLOOMS)); + _collectionMgr->LoadAccountItemAppearances(holder->GetPreparedResult(AccountInfoQueryHolder::ITEM_APPEARANCES), holder->GetPreparedResult(AccountInfoQueryHolder::ITEM_FAVORITE_APPEARANCES)); if (!m_inQueue) SendAuthResponse(ERROR_OK, false); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 5f155420ff4..02ba3d182ec 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -366,7 +366,6 @@ namespace WorldPackets class SwapItem; class WrapItem; class CancelTempEnchantment; - class TransmogrifyItems; class UseCritterItem; class SocketGems; struct ItemInstance; @@ -666,6 +665,12 @@ namespace WorldPackets class TradeStatus; } + namespace Transmogrification + { + class TransmogrifyItems; + class TransmogAppearanceSetFavorite; + } + namespace Vehicle { class MoveDismissVehicle; @@ -1642,7 +1647,8 @@ class TC_GAME_API WorldSession void SendVoidStorageTransferResult(VoidTransferError result); // Transmogrification - void HandleTransmogrifyItems(WorldPackets::Item::TransmogrifyItems& transmogrifyItems); + void HandleTransmogrifyItems(WorldPackets::Transmogrification::TransmogrifyItems& transmogrifyItems); + void HandleTransmogAppearanceSetFavorite(WorldPackets::Transmogrification::TransmogAppearanceSetFavorite& transmogAppearanceSetFavorite); // Miscellaneous void HandleSpellClick(WorldPackets::Spells::SpellClick& spellClick); |
