/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* 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 .
*/
#include "InspectPackets.h"
#include "AzeriteItem.h"
#include "Item.h"
#include "PacketOperators.h"
#include "Player.h"
namespace WorldPackets::Inspect
{
void Inspect::Read()
{
_worldPacket >> Target;
}
ByteBuffer& operator<<(ByteBuffer& data, InspectEnchantData const& enchantData)
{
data << uint32(enchantData.Id);
data << uint8(enchantData.Index);
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, AzeriteEssenceData const& azeriteEssenceData)
{
data << uint32(azeriteEssenceData.Index);
data << uint32(azeriteEssenceData.AzeriteEssenceID);
data << uint32(azeriteEssenceData.Rank);
data << Bits<1>(azeriteEssenceData.SlotUnlocked);
data.FlushBits();
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, InspectItemData const& itemData)
{
data << itemData.CreatorGUID;
data << uint8(itemData.Index);
data << Size(itemData.AzeritePowers);
data << Size(itemData.AzeriteEssences);
if (!itemData.AzeritePowers.empty())
data.append(itemData.AzeritePowers.data(), itemData.AzeritePowers.size());
data << itemData.Item;
data << Bits<1>(itemData.Usable);
data << BitsSize<4>(itemData.Enchants);
data << BitsSize<2>(itemData.Gems);
data.FlushBits();
for (AzeriteEssenceData const& azeriteEssenceData : itemData.AzeriteEssences)
data << azeriteEssenceData;
for (InspectEnchantData const& enchantData : itemData.Enchants)
data << enchantData;
for (Item::ItemGemData const& gem : itemData.Gems)
data << gem;
return data;
}
void PlayerModelDisplayInfo::Initialize(Player const* player)
{
GUID = player->GetGUID();
SpecializationID = AsUnderlyingType(player->GetPrimarySpecialization());
Name = player->GetName();
GenderID = player->GetNativeGender();
Race = player->GetRace();
ClassID = player->GetClass();
for (UF::ChrCustomizationChoice const& customization : player->m_playerData->Customizations)
Customizations.push_back(customization);
for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
if (::Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, i))
Items.emplace_back(item, i);
}
ByteBuffer& operator<<(ByteBuffer& data, PlayerModelDisplayInfo const& displayInfo)
{
data << displayInfo.GUID;
data << int32(displayInfo.SpecializationID);
data << Size(displayInfo.Items);
data << SizedString::BitsSize<6>(displayInfo.Name);
data << uint8(displayInfo.GenderID);
data << uint8(displayInfo.Race);
data << uint8(displayInfo.ClassID);
data << Size(displayInfo.Customizations);
data << SizedString::Data(displayInfo.Name);
for (Character::ChrCustomizationChoice const& customization : displayInfo.Customizations)
data << customization;
for (InspectItemData const& item : displayInfo.Items)
data << item;
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, InspectGuildData const& guildData)
{
data << guildData.GuildGUID;
data << int32(guildData.NumGuildMembers);
data << int32(guildData.AchievementPoints);
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, PVPBracketData const& bracket)
{
data << uint8(bracket.Bracket);
data << int32(bracket.RatingID);
data << int32(bracket.Rating);
data << int32(bracket.Rank);
data << int32(bracket.WeeklyPlayed);
data << int32(bracket.WeeklyWon);
data << int32(bracket.SeasonPlayed);
data << int32(bracket.SeasonWon);
data << int32(bracket.WeeklyBestRating);
data << int32(bracket.LastWeeksBestRating);
data << int32(bracket.Tier);
data << int32(bracket.WeeklyBestTier);
data << int32(bracket.SeasonBestRating);
data << uint8(bracket.SeasonBestTierEnum);
data << int32(bracket.RoundsSeasonPlayed);
data << int32(bracket.RoundsSeasonWon);
data << int32(bracket.RoundsWeeklyPlayed);
data << int32(bracket.RoundsWeeklyWon);
data << Bits<1>(bracket.Disqualified);
data.FlushBits();
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, TraitInspectInfo const& traits)
{
data << int32(traits.PlayerLevel);
data << int32(traits.SpecID);
data << traits.ActiveCombatTraits;
return data;
}
InspectItemData::InspectItemData(::Item const* item, uint8 index)
{
CreatorGUID = item->GetCreator();
Item.Initialize(item);
Index = index;
Usable = true; /// @todo
for (uint8 i = 0; i < MAX_ENCHANTMENT_SLOT; ++i)
if (uint32 enchId = item->GetEnchantmentId(EnchantmentSlot(i)))
Enchants.emplace_back(enchId, i);
uint8 i = 0;
for (UF::SocketedGem const& gemData : item->m_itemData->Gems)
{
if (gemData.ItemID)
{
Gems.emplace_back();
Item::ItemGemData& gem = Gems.back();
gem.Slot = i;
gem.Item.Initialize(&gemData);
}
++i;
}
if (AzeriteItem const* azeriteItem = item->ToAzeriteItem())
{
if (UF::SelectedAzeriteEssences const* essences = azeriteItem->GetSelectedAzeriteEssences())
{
for (uint8 slot = 0; slot < essences->AzeriteEssenceID.size(); ++slot)
{
AzeriteEssences.emplace_back();
AzeriteEssenceData& essence = AzeriteEssences.back();
essence.Index = slot;
essence.AzeriteEssenceID = essences->AzeriteEssenceID[slot];
if (essence.AzeriteEssenceID)
{
essence.Rank = azeriteItem->GetEssenceRank(essence.AzeriteEssenceID);
essence.SlotUnlocked = true;
}
else
essence.SlotUnlocked = azeriteItem->HasUnlockedEssenceSlot(slot);
}
}
}
}
WorldPacket const* InspectResult::Write()
{
_worldPacket << DisplayInfo;
_worldPacket << Size(Glyphs);
_worldPacket << Size(Talents);
_worldPacket << Size(PvpTalents);
_worldPacket << int32(ItemLevel);
_worldPacket << uint8(LifetimeMaxRank);
_worldPacket << uint16(TodayHK);
_worldPacket << uint16(YesterdayHK);
_worldPacket << uint32(LifetimeHK);
_worldPacket << uint32(HonorLevel);
if (!Glyphs.empty())
_worldPacket.append(Glyphs.data(), Glyphs.size());
if (!Talents.empty())
_worldPacket.append(Talents.data(), Talents.size());
if (!PvpTalents.empty())
_worldPacket.append(PvpTalents.data(), PvpTalents.size());
_worldPacket << TalentInfo;
_worldPacket << OptionalInit(GuildData);
_worldPacket << OptionalInit(AzeriteLevel);
_worldPacket.FlushBits();
for (PVPBracketData const& bracket : Bracket)
_worldPacket << bracket;
if (GuildData)
_worldPacket << *GuildData;
if (AzeriteLevel)
_worldPacket << int32(*AzeriteLevel);
_worldPacket << TraitsInfo;
return &_worldPacket;
}
void QueryInspectAchievements::Read()
{
_worldPacket >> Guid;
}
}