aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Handlers/SpellHandler.cpp80
-rw-r--r--src/server/game/Server/Packets/SpellPackets.cpp36
-rw-r--r--src/server/game/Server/Packets/SpellPackets.h44
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp6
-rw-r--r--src/server/game/Server/WorldSession.h3
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);