diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Handlers/SpellHandler.cpp | 80 | ||||
-rw-r--r-- | src/server/game/Server/Packets/SpellPackets.cpp | 36 | ||||
-rw-r--r-- | src/server/game/Server/Packets/SpellPackets.h | 44 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 3 |
5 files changed, 118 insertions, 51 deletions
diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index 2d3090825da..6d3b2a7cb5b 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -501,11 +501,9 @@ void WorldSession::HandleSpellClick(WorldPacket& recvData) unit->HandleSpellClick(_player); } -void WorldSession::HandleMirrorImageDataRequest(WorldPacket& recvData) +void WorldSession::HandleMirrorImageDataRequest(WorldPackets::Spells::GetMirrorImageData& packet) { - ObjectGuid guid; - recvData >> guid; - recvData.read_skip<uint32>(); // DisplayId ? + ObjectGuid guid = packet.UnitGUID; // Get unit for which data is needed by client Unit* unit = ObjectAccessor::GetUnit(*_player, guid); @@ -520,27 +518,25 @@ void WorldSession::HandleMirrorImageDataRequest(WorldPacket& recvData) if (!creator) return; - WorldPacket data(SMSG_MIRROR_IMAGE_COMPONENTED_DATA, 68); - data << guid; - data << uint32(creator->GetDisplayId()); - data << uint8(creator->getRace()); - data << uint8(creator->getGender()); - data << uint8(creator->getClass()); - - if (creator->GetTypeId() == TYPEID_PLAYER) + if (Player* player = creator->ToPlayer()) { - Player* player = creator->ToPlayer(); - Guild* guild = NULL; + WorldPackets::Spells::MirrorImageComponentedData packet; + packet.UnitGUID = guid; + packet.DisplayID = creator->GetDisplayId(); + packet.RaceID = creator->getRace(); + packet.Gender = creator->getGender(); + packet.ClassID = creator->getClass(); - if (ObjectGuid::LowType guildId = player->GetGuildId()) - guild = sGuildMgr->GetGuildById(guildId); + Guild* guild = player->GetGuild(); - data << uint8(player->GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_SKIN_ID)); - data << uint8(player->GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_FACE_ID)); - data << uint8(player->GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_HAIR_STYLE_ID)); - data << uint8(player->GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_HAIR_COLOR_ID)); - data << uint8(player->GetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_FACIAL_STYLE)); - data << (guild ? guild->GetGUID() : ObjectGuid::Empty); + packet.SkinColor = player->GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_SKIN_ID); + packet.FaceVariation = player->GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_FACE_ID); + packet.HairVariation = player->GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_HAIR_STYLE_ID); + packet.HairColor = player->GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_HAIR_COLOR_ID); + packet.BeardVariation = player->GetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_FACIAL_STYLE); + packet.GuildGUID = (guild ? guild->GetGUID() : ObjectGuid::Empty); + + packet.ItemDisplayID.reserve(11); static EquipmentSlots const itemSlots[] = { @@ -559,38 +555,28 @@ void WorldSession::HandleMirrorImageDataRequest(WorldPacket& recvData) }; // Display items in visible slots - for (EquipmentSlots const* itr = &itemSlots[0]; *itr != EQUIPMENT_SLOT_END; ++itr) + for (auto const& slot : itemSlots) { - if (*itr == EQUIPMENT_SLOT_HEAD && player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_HELM)) - data << uint32(0); - else if (*itr == EQUIPMENT_SLOT_BACK && player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_CLOAK)) - data << uint32(0); - else if (Item const* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, *itr)) - data << uint32(item->GetDisplayId()); + uint32 itemDisplayId; + if ((slot == EQUIPMENT_SLOT_HEAD && player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_HELM)) || + (slot == EQUIPMENT_SLOT_BACK && player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_CLOAK))) + itemDisplayId = 0; + else if (Item const* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, slot)) + itemDisplayId = item->GetDisplayId(); else - data << uint32(0); + itemDisplayId = 0; + + packet.ItemDisplayID.push_back(itemDisplayId); } + SendPacket(packet.Write()); } else { - // Skip player data for creatures - data << uint8(0); - data << uint32(0); - data << uint32(0); - data << uint32(0); - data << uint32(0); - data << uint32(0); - data << uint32(0); - data << uint32(0); - data << uint32(0); - data << uint32(0); - data << uint32(0); - data << uint32(0); - data << uint32(0); - data << uint32(0); + WorldPackets::Spells::MirrorImageCreatureData packet; + packet.UnitGUID = guid; + packet.DisplayID = creator->GetDisplayId(); + SendPacket(packet.Write()); } - - SendPacket(&data); } void WorldSession::HandleUpdateProjectilePosition(WorldPacket& recvPacket) diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp index 421a2e9a46c..832dfc82b06 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -706,3 +706,39 @@ void WorldPackets::Spells::UnlearnSkill::Read() { _worldPacket >> SkillLine; } + +void WorldPackets::Spells::GetMirrorImageData::Read() +{ + _worldPacket >> UnitGUID; + _worldPacket >> DisplayID; +} + +WorldPacket const* WorldPackets::Spells::MirrorImageComponentedData::Write() +{ + _worldPacket << UnitGUID; + _worldPacket << DisplayID; + _worldPacket << RaceID; + _worldPacket << Gender; + _worldPacket << ClassID; + _worldPacket << SkinColor; + _worldPacket << FaceVariation; + _worldPacket << HairVariation; + _worldPacket << HairColor; + _worldPacket << BeardVariation; + _worldPacket << GuildGUID; + + _worldPacket << uint32(ItemDisplayID.size()); + + for (auto const& itemDisplayId : ItemDisplayID) + _worldPacket << itemDisplayId; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Spells::MirrorImageCreatureData::Write() +{ + _worldPacket << UnitGUID; + _worldPacket << DisplayID; + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index 9408ac13398..a3fa6c10925 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -694,6 +694,50 @@ namespace WorldPackets void Read() override { } }; + + class GetMirrorImageData final : public ClientPacket + { + public: + GetMirrorImageData(WorldPacket&& packet) : ClientPacket(CMSG_GET_MIRROR_IMAGE_DATA, std::move(packet)) {} + + void Read() override; + + ObjectGuid UnitGUID; + uint32 DisplayID = 0; + }; + + class MirrorImageComponentedData final : public ServerPacket + { + public: + MirrorImageComponentedData() : ServerPacket(SMSG_MIRROR_IMAGE_COMPONENTED_DATA, 8 + 4 + 8 * 1 + 8 + 11 * 4) { } + + WorldPacket const* Write() override; + + ObjectGuid UnitGUID; + uint32 DisplayID = 0; + uint8 RaceID = 0; + uint8 Gender = 0; + uint8 ClassID = 0; + uint8 SkinColor = 0; + uint8 FaceVariation = 0; + uint8 HairVariation = 0; + uint8 HairColor = 0; + uint8 BeardVariation = 0; + ObjectGuid GuildGUID; + + std::vector<uint32> ItemDisplayID; + }; + + class MirrorImageCreatureData final : public ServerPacket + { + public: + MirrorImageCreatureData() : ServerPacket(SMSG_MIRROR_IMAGE_CREATURE_DATA, 8 + 4) { } + + WorldPacket const* Write() override; + + ObjectGuid UnitGUID; + uint32 DisplayID = 0; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 45071d14cd4..e149b0602d4 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -394,7 +394,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_GET_CHALLENGE_MODE_REWARDS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GET_GARRISON_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Garrison::GetGarrisonInfo, &WorldSession::HandleGetGarrisonInfo); DEFINE_HANDLER(CMSG_GET_ITEM_PURCHASE_DATA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::GetItemPurchaseData, &WorldSession::HandleGetItemPurchaseData); - DEFINE_OPCODE_HANDLER_OLD(CMSG_GET_MIRROR_IMAGE_DATA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMirrorImageDataRequest ); + DEFINE_HANDLER(CMSG_GET_MIRROR_IMAGE_DATA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::GetMirrorImageData, &WorldSession::HandleMirrorImageDataRequest); DEFINE_HANDLER(CMSG_GET_PVP_OPTIONS_ENABLED, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Battleground::GetPVPOptionsEnabled, &WorldSession::HandleGetPVPOptionsEnabled); DEFINE_HANDLER(CMSG_GET_REMAINING_GAME_TIME, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GET_TROPHY_LIST, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -1329,8 +1329,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MASTER_LOOT_CANDIDATE_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MESSAGE_BOX, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MINIMAP_PING, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MIRROR_IMAGE_COMPONENTED_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MIRROR_IMAGE_CREATURE_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MIRROR_IMAGE_COMPONENTED_DATA, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MIRROR_IMAGE_CREATURE_DATA, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MISSILE_CANCEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MODIFY_COOLDOWN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOTD, STATUS_NEVER, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index d0242b86440..b46afe6378a 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -498,6 +498,7 @@ namespace WorldPackets class SetActionButton; class UnlearnSkill; class SelfRes; + class GetMirrorImageData; } namespace Talent @@ -1496,7 +1497,7 @@ class WorldSession // Miscellaneous void HandleSpellClick(WorldPacket& recvData); - void HandleMirrorImageDataRequest(WorldPacket& recvData); + void HandleMirrorImageDataRequest(WorldPackets::Spells::GetMirrorImageData& packet); void HandleRemoveGlyph(WorldPacket& recvData); void HandleGuildSetFocusedAchievement(WorldPackets::Achievement::GuildSetFocusedAchievement& setFocusedAchievement); void HandleEquipmentSetSave(WorldPackets::EquipmentSet::SaveEquipmentSet& packet); |