Update and enable CMSG_GET_MIRROR_IMAGE_DATA, SMSG_MIRROR_IMAGE_CREATURE_DATA, SMSG_MIRROR_IMAGE_COMPONENTED_DATA.

This commit is contained in:
Orion
2015-06-15 02:03:00 +03:00
committed by Rochet2
parent 3ada2ed993
commit eeb49d238a
5 changed files with 118 additions and 51 deletions

View File

@@ -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)

View File

@@ -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;
}

View File

@@ -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;
};
}
}

View File

@@ -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);

View File

@@ -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);