/*
* 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 "TraitPacketsCommon.h"
#include "DBCEnums.h"
#include "PacketOperators.h"
#include "UpdateFields.h"
namespace WorldPackets::Traits
{
TraitEntry::TraitEntry() = default;
TraitEntry::TraitEntry(UF::TraitEntry const& ufEntry)
{
TraitNodeID = ufEntry.TraitNodeID;
TraitNodeEntryID = ufEntry.TraitNodeEntryID;
Rank = ufEntry.Rank;
GrantedRanks = ufEntry.GrantedRanks;
BonusRanks = ufEntry.BonusRanks;
}
TraitSubTreeCache::TraitSubTreeCache() = default;
TraitSubTreeCache::TraitSubTreeCache(UF::TraitSubTreeCache const& ufSubTreeCache)
{
TraitSubTreeID = ufSubTreeCache.TraitSubTreeID;
for (UF::TraitEntry const& ufEntry : ufSubTreeCache.Entries)
Entries.emplace_back(ufEntry);
Active = ufSubTreeCache.Active;
}
TraitConfig::TraitConfig() = default;
TraitConfig::TraitConfig(UF::TraitConfig const& ufConfig)
{
ID = ufConfig.ID;
Type = static_cast(*ufConfig.Type);
ChrSpecializationID = ufConfig.ChrSpecializationID;
CombatConfigFlags = static_cast(*ufConfig.CombatConfigFlags);
LocalIdentifier = ufConfig.LocalIdentifier;
SkillLineID = ufConfig.SkillLineID;
TraitSystemID = ufConfig.TraitSystemID;
VariationID = ufConfig.VariationID;
for (UF::TraitEntry const& ufEntry : ufConfig.Entries)
Entries.emplace_back(ufEntry);
for (UF::TraitSubTreeCache const& ufSubTree : ufConfig.SubTrees)
SubTrees.emplace_back(ufSubTree);
Name = ufConfig.Name;
}
ByteBuffer& operator>>(ByteBuffer& data, TraitEntry& traitEntry)
{
data >> traitEntry.TraitNodeID;
data >> traitEntry.TraitNodeEntryID;
data >> traitEntry.Rank;
data >> traitEntry.GrantedRanks;
data >> traitEntry.BonusRanks;
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, TraitEntry const& traitEntry)
{
data << int32(traitEntry.TraitNodeID);
data << int32(traitEntry.TraitNodeEntryID);
data << int32(traitEntry.Rank);
data << int32(traitEntry.GrantedRanks);
data << int32(traitEntry.BonusRanks);
return data;
}
ByteBuffer& operator>>(ByteBuffer& data, TraitSubTreeCache& traitSubTreeCache)
{
data >> traitSubTreeCache.TraitSubTreeID;
uint32 entriesSize = data.read();
if (entriesSize > 100)
OnInvalidArraySize(entriesSize, 100);
traitSubTreeCache.Entries.resize(entriesSize);
for (TraitEntry& traitEntry : traitSubTreeCache.Entries)
data >> traitEntry;
data >> Bits<1>(traitSubTreeCache.Active);
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, TraitSubTreeCache const& traitSubTreeCache)
{
data << int32(traitSubTreeCache.TraitSubTreeID);
data << Size(traitSubTreeCache.Entries);
for (TraitEntry const& traitEntry : traitSubTreeCache.Entries)
data << traitEntry;
data << Bits<1>(traitSubTreeCache.Active);
data.FlushBits();
return data;
}
ByteBuffer& operator>>(ByteBuffer& data, TraitConfig& traitConfig)
{
data >> traitConfig.ID;
data >> As(traitConfig.Type);
uint32 entriesSize = data.read();
if (entriesSize > 100)
OnInvalidArraySize(entriesSize, 100);
traitConfig.Entries.resize(entriesSize);
uint32 subtreesSize = data.read();
if (subtreesSize > 10)
OnInvalidArraySize(subtreesSize, 10);
traitConfig.SubTrees.resize(subtreesSize);
switch (traitConfig.Type)
{
case TraitConfigType::Combat:
data >> traitConfig.ChrSpecializationID;
data >> As(traitConfig.CombatConfigFlags);
data >> traitConfig.LocalIdentifier;
break;
case TraitConfigType::Profession:
data >> traitConfig.SkillLineID;
break;
case TraitConfigType::Generic:
data >> traitConfig.TraitSystemID;
data >> traitConfig.VariationID;
break;
default:
break;
}
for (TraitEntry& traitEntry : traitConfig.Entries)
data >> traitEntry;
data >> SizedString::BitsSize<9>(traitConfig.Name);
for (TraitSubTreeCache& traitSubTreeCache : traitConfig.SubTrees)
data >> traitSubTreeCache;
data >> SizedString::Data(traitConfig.Name);
return data;
}
ByteBuffer& operator<<(ByteBuffer& data, TraitConfig const& traitConfig)
{
data << int32(traitConfig.ID);
data << int32(traitConfig.Type);
data << Size(traitConfig.Entries);
data << Size(traitConfig.SubTrees);
switch (traitConfig.Type)
{
case TraitConfigType::Combat:
data << int32(traitConfig.ChrSpecializationID);
data << int32(traitConfig.CombatConfigFlags);
data << int32(traitConfig.LocalIdentifier);
break;
case TraitConfigType::Profession:
data << int32(traitConfig.SkillLineID);
break;
case TraitConfigType::Generic:
data << int32(traitConfig.TraitSystemID);
data << int32(traitConfig.VariationID);
break;
default:
break;
}
for (TraitEntry const& traitEntry : traitConfig.Entries)
data << traitEntry;
data << SizedString::BitsSize<9>(traitConfig.Name);
for (TraitSubTreeCache const& traitSubTreeCache : traitConfig.SubTrees)
data << traitSubTreeCache;
data.FlushBits();
data << SizedString::Data(static_cast(traitConfig.Name));
return data;
}
}