/*
* 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 "TalentPackets.h"
#include "PacketOperators.h"
namespace WorldPackets::Talent
{
ByteBuffer& operator>>(ByteBuffer& data, PvPTalent& pvpTalent)
{
data >> pvpTalent.PvPTalentID;
data >> pvpTalent.Slot;
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, PvPTalent const& pvpTalent)
{
data << uint16(pvpTalent.PvPTalentID);
data << uint8(pvpTalent.Slot);
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, ClassicTalentEntry const& talentEntry)
{
data << int32(talentEntry.TalentID);
data << int32(talentEntry.Rank);
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, ClassicTalentGroupInfo const& talentGroupInfo)
{
data << uint8(talentGroupInfo.NumTalents);
data << Size(talentGroupInfo.Talents);
data << uint8(talentGroupInfo.NumGlyphs);
data << Size(talentGroupInfo.GlyphIDs);
data << int8(talentGroupInfo.Role);
data << int32(talentGroupInfo.PrimarySpecialization);
for (ClassicTalentEntry const& talentEntry : talentGroupInfo.Talents)
data << talentEntry;
if (!talentGroupInfo.GlyphIDs.empty())
data.append(talentGroupInfo.GlyphIDs.data(), talentGroupInfo.GlyphIDs.size());
data.WriteBit(talentGroupInfo.Unused1125);
data.FlushBits();
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, ClassicTalentInfoUpdate const& talentInfoUpdate)
{
data << int32(talentInfoUpdate.UnspentTalentPoints);
data << uint8(talentInfoUpdate.ActiveGroup);
data << Size(talentInfoUpdate.Talents);
for (ClassicTalentGroupInfo const& talents : talentInfoUpdate.Talents)
data << talents;
data << Bits<1>(talentInfoUpdate.IsPetTalents);
data.FlushBits();
return data;
}
WorldPacket const* UpdateTalentData::Write()
{
_worldPacket << uint8(Info.ActiveGroup);
_worldPacket << uint32(Info.PrimarySpecialization);
_worldPacket << Size(Info.TalentGroups);
for (TalentGroupInfo& talentGroupInfo : Info.TalentGroups)
{
_worldPacket << uint32(talentGroupInfo.SpecID);
_worldPacket << Size(talentGroupInfo.TalentIDs);
_worldPacket << Size(talentGroupInfo.PvPTalents);
_worldPacket << Size(talentGroupInfo.GlyphIDs);
for (uint16 talent : talentGroupInfo.TalentIDs)
_worldPacket << uint16(talent);
for (PvPTalent talent : talentGroupInfo.PvPTalents)
_worldPacket << talent;
for (uint32 talent : talentGroupInfo.GlyphIDs)
_worldPacket << uint32(talent);
}
return &_worldPacket;
}
void LearnTalents::Read()
{
_worldPacket >> BitsSize<6>(Talents);
for (uint16& talent : Talents)
_worldPacket >> talent;
}
WorldPacket const* RespecWipeConfirm::Write()
{
_worldPacket << int8(RespecType);
_worldPacket << uint32(Cost);
_worldPacket << RespecMaster;
return &_worldPacket;
}
void ConfirmRespecWipe::Read()
{
_worldPacket >> RespecMaster;
_worldPacket >> RespecType;
}
WorldPacket const* LearnTalentFailed::Write()
{
_worldPacket << Bits<4>(Reason);
_worldPacket << int32(SpellID);
_worldPacket << Size(Talents);
if (!Talents.empty())
_worldPacket.append(Talents.data(), Talents.size());
return &_worldPacket;
}
ByteBuffer& operator<<(ByteBuffer& data, GlyphBinding const& glyphBinding)
{
data << uint32(glyphBinding.SpellID);
data << uint16(glyphBinding.GlyphID);
return data;
}
WorldPacket const* ActiveGlyphs::Write()
{
_worldPacket << Size(Glyphs);
for (GlyphBinding const& glyph : Glyphs)
_worldPacket << glyph;
_worldPacket << Bits<1>(IsFullUpdate);
_worldPacket.FlushBits();
return &_worldPacket;
}
void LearnPvpTalents::Read()
{
_worldPacket >> Size(Talents);
for (PvPTalent& pvpTalent : Talents)
_worldPacket >> pvpTalent;
}
WorldPacket const* LearnPvpTalentFailed::Write()
{
_worldPacket << Bits<4>(Reason);
_worldPacket << int32(SpellID);
_worldPacket << Size(Talents);
for (PvPTalent pvpTalent : Talents)
_worldPacket << pvpTalent;
return &_worldPacket;
}
}