/*
* 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 "UpdateFields.h"
#include "AreaTrigger.h"
#include "ByteBuffer.h"
#include "Corpse.h"
#include "DynamicObject.h"
#include "PacketOperators.h"
#include "Player.h"
#include "ViewerDependentValues.h"
// This file is automatically generated, DO NOT EDIT
#if TRINITY_COMPILER == TRINITY_COMPILER_GNU
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
#else
#pragma warning(push)
#pragma warning(disable: 4100)
#endif
namespace UF
{
void ObjectData::WriteCreate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, Object const* owner, Player const* receiver) const
{
data << int32(ViewerDependentValue::GetValue(this, owner, receiver));
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
data << float(Scale);
}
void ObjectData::WriteUpdate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, Object const* owner, Player const* receiver) const
{
WriteUpdate(data, _changesMask, false, owner, receiver);
}
void ObjectData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, Object const* owner, Player const* receiver) const
{
data.WriteBits(changesMask.GetBlock(0), 4);
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
data << int32(ViewerDependentValue::GetValue(this, owner, receiver));
}
if (changesMask[2])
{
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
}
if (changesMask[3])
{
data << float(Scale);
}
}
}
void ObjectData::ClearChangesMask()
{
Base::ClearChangesMask(EntryID);
Base::ClearChangesMask(DynamicFlags);
Base::ClearChangesMask(Scale);
_changesMask.ResetAll();
}
void ItemEnchantment::WriteCreate(ByteBuffer& data, Item const* owner, Player const* receiver) const
{
data << int32(ID);
data << uint32(Duration);
data << int16(Charges);
data << uint16(Inactive);
}
void ItemEnchantment::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Item const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 5);
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
data << int32(ID);
}
if (changesMask[2])
{
data << uint32(Duration);
}
if (changesMask[3])
{
data << int16(Charges);
}
if (changesMask[4])
{
data << uint16(Inactive);
}
}
}
void ItemEnchantment::ClearChangesMask()
{
Base::ClearChangesMask(ID);
Base::ClearChangesMask(Duration);
Base::ClearChangesMask(Charges);
Base::ClearChangesMask(Inactive);
_changesMask.ResetAll();
}
void ItemMod::WriteCreate(ByteBuffer& data, Item const* owner, Player const* receiver) const
{
data << uint8(Type);
data << int32(Value);
}
void ItemMod::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Item const* owner, Player const* receiver) const
{
data << uint8(Type);
data << int32(Value);
}
bool ItemMod::operator==(ItemMod const& right) const
{
return Type == right.Type
&& Value == right.Value;
}
void ItemModList::WriteCreate(ByteBuffer& data, Item const* owner, Player const* receiver) const
{
data.WriteBits(Values.size(), 6);
for (uint32 i = 0; i < Values.size(); ++i)
{
Values[i].WriteCreate(data, owner, receiver);
}
data.FlushBits();
}
void ItemModList::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Item const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 1);
if (changesMask[0])
{
if (!ignoreChangesMask)
Values.WriteUpdateMask(data, 6);
else
WriteCompleteDynamicFieldUpdateMask(Values.size(), data, 6);
}
data.FlushBits();
if (changesMask[0])
{
for (uint32 i = 0; i < Values.size(); ++i)
{
if (Values.HasChanged(i) || ignoreChangesMask)
{
Values[i].WriteUpdate(data, ignoreChangesMask, owner, receiver);
}
}
}
data.FlushBits();
}
void ItemModList::ClearChangesMask()
{
Base::ClearChangesMask(Values);
_changesMask.ResetAll();
}
void ArtifactPower::WriteCreate(ByteBuffer& data, Item const* owner, Player const* receiver) const
{
data << int16(ArtifactPowerID);
data << uint8(PurchasedRank);
data << uint8(CurrentRankWithBonus);
}
void ArtifactPower::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Item const* owner, Player const* receiver) const
{
data << int16(ArtifactPowerID);
data << uint8(PurchasedRank);
data << uint8(CurrentRankWithBonus);
}
bool ArtifactPower::operator==(ArtifactPower const& right) const
{
return ArtifactPowerID == right.ArtifactPowerID
&& PurchasedRank == right.PurchasedRank
&& CurrentRankWithBonus == right.CurrentRankWithBonus;
}
void SocketedGem::WriteCreate(ByteBuffer& data, Item const* owner, Player const* receiver) const
{
data << int32(ItemID);
for (uint32 i = 0; i < 16; ++i)
{
data << uint16(BonusListIDs[i]);
}
data << uint8(Context);
}
void SocketedGem::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Item const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlocksMask(0), 1);
if (changesMask.GetBlock(0))
data.WriteBits(changesMask.GetBlock(0), 32);
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
data << int32(ItemID);
}
if (changesMask[2])
{
data << uint8(Context);
}
}
if (changesMask[3])
{
for (uint32 i = 0; i < 16; ++i)
{
if (changesMask[4 + i])
{
data << uint16(BonusListIDs[i]);
}
}
}
}
void SocketedGem::ClearChangesMask()
{
Base::ClearChangesMask(ItemID);
Base::ClearChangesMask(Context);
Base::ClearChangesMask(BonusListIDs);
_changesMask.ResetAll();
}
void ItemData::WriteCreate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, Item const* owner, Player const* receiver) const
{
data << *Owner;
data << *ContainedIn;
data << *Creator;
data << *GiftCreator;
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
{
data << uint32(StackCount);
data << uint32(Expiration);
for (uint32 i = 0; i < 5; ++i)
{
data << int32(SpellCharges[i]);
}
}
data << uint32(DynamicFlags);
for (uint32 i = 0; i < 13; ++i)
{
Enchantment[i].WriteCreate(data, owner, receiver);
}
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
{
data << uint32(Durability);
data << uint32(MaxDurability);
}
data << uint32(CreatePlayedTime);
data << uint8(Context);
data << int64(CreateTime);
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
{
data << uint64(ArtifactXP);
data << uint8(ItemAppearanceModID);
}
data << uint32(ArtifactPowers.size());
data << uint32(Gems.size());
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
{
data << uint32(ZoneFlags);
}
data << *ItemBonusKey;
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
{
data << uint16(DEBUGItemLevel);
}
for (uint32 i = 0; i < ArtifactPowers.size(); ++i)
{
ArtifactPowers[i].WriteCreate(data, owner, receiver);
}
for (uint32 i = 0; i < Gems.size(); ++i)
{
Gems[i].WriteCreate(data, owner, receiver);
}
Modifiers->WriteCreate(data, owner, receiver);
}
static constexpr void ItemDataAppendAllowedFieldsMaskForFlag(ItemData::Mask& allowedMaskForTarget, EnumFlag fieldVisibilityFlags)
{
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
allowedMaskForTarget |= std::array{ 0x07F58D80u, 0x00000000u };
}
void ItemData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag fieldVisibilityFlags)
{
ItemDataAppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
}
void ItemData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag fieldVisibilityFlags)
{
Mask allowedMaskForTarget({ 0xF80A727Fu, 0x000001FFu });
ItemDataAppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
changesMask &= allowedMaskForTarget;
}
void ItemData::WriteUpdate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, Item const* owner, Player const* receiver) const
{
Mask allowedMaskForTarget({ 0xF80A727Fu, 0x000001FFu });
ItemDataAppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver);
}
void ItemData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, Item const* owner, Player const* receiver) const
{
data.WriteBits(changesMask.GetBlocksMask(0), 2);
for (uint32 i = 0; i < 2; ++i)
if (changesMask.GetBlock(i))
data.WriteBits(changesMask.GetBlock(i), 32);
if (changesMask[0])
{
if (changesMask[1])
{
if (!ignoreNestedChangesMask)
ArtifactPowers.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ArtifactPowers.size(), data);
}
if (changesMask[2])
{
if (!ignoreNestedChangesMask)
Gems.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Gems.size(), data);
}
}
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
for (uint32 i = 0; i < ArtifactPowers.size(); ++i)
{
if (ArtifactPowers.HasChanged(i) || ignoreNestedChangesMask)
{
ArtifactPowers[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[2])
{
for (uint32 i = 0; i < Gems.size(); ++i)
{
if (Gems.HasChanged(i) || ignoreNestedChangesMask)
{
Gems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[3])
{
data << *Owner;
}
if (changesMask[4])
{
data << *ContainedIn;
}
if (changesMask[5])
{
data << *Creator;
}
if (changesMask[6])
{
data << *GiftCreator;
}
if (changesMask[7])
{
data << uint32(StackCount);
}
if (changesMask[8])
{
data << uint32(Expiration);
}
if (changesMask[9])
{
data << uint32(DynamicFlags);
}
if (changesMask[10])
{
data << uint32(Durability);
}
if (changesMask[11])
{
data << uint32(MaxDurability);
}
if (changesMask[12])
{
data << uint32(CreatePlayedTime);
}
if (changesMask[13])
{
data << uint8(Context);
}
if (changesMask[14])
{
data << int64(CreateTime);
}
if (changesMask[15])
{
data << uint64(ArtifactXP);
}
if (changesMask[16])
{
data << uint8(ItemAppearanceModID);
}
if (changesMask[18])
{
data << uint32(ZoneFlags);
}
if (changesMask[19])
{
data << *ItemBonusKey;
}
if (changesMask[20])
{
data << uint16(DEBUGItemLevel);
}
if (changesMask[17])
{
Modifiers->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
if (changesMask[21])
{
for (uint32 i = 0; i < 5; ++i)
{
if (changesMask[22 + i])
{
data << int32(SpellCharges[i]);
}
}
}
if (changesMask[27])
{
for (uint32 i = 0; i < 13; ++i)
{
if (changesMask[28 + i])
{
Enchantment[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
}
void ItemData::ClearChangesMask()
{
Base::ClearChangesMask(ArtifactPowers);
Base::ClearChangesMask(Gems);
Base::ClearChangesMask(Owner);
Base::ClearChangesMask(ContainedIn);
Base::ClearChangesMask(Creator);
Base::ClearChangesMask(GiftCreator);
Base::ClearChangesMask(StackCount);
Base::ClearChangesMask(Expiration);
Base::ClearChangesMask(DynamicFlags);
Base::ClearChangesMask(Durability);
Base::ClearChangesMask(MaxDurability);
Base::ClearChangesMask(CreatePlayedTime);
Base::ClearChangesMask(Context);
Base::ClearChangesMask(CreateTime);
Base::ClearChangesMask(ArtifactXP);
Base::ClearChangesMask(ItemAppearanceModID);
Base::ClearChangesMask(Modifiers);
Base::ClearChangesMask(ZoneFlags);
Base::ClearChangesMask(ItemBonusKey);
Base::ClearChangesMask(DEBUGItemLevel);
Base::ClearChangesMask(SpellCharges);
Base::ClearChangesMask(Enchantment);
_changesMask.ResetAll();
}
void ContainerData::WriteCreate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, Bag const* owner, Player const* receiver) const
{
for (uint32 i = 0; i < 98; ++i)
{
data << Slots[i];
}
data << uint32(NumSlots);
}
void ContainerData::WriteUpdate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, Bag const* owner, Player const* receiver) const
{
WriteUpdate(data, _changesMask, false, owner, receiver);
}
void ContainerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, Bag const* owner, Player const* receiver) const
{
data.WriteBits(changesMask.GetBlocksMask(0), 4);
for (uint32 i = 0; i < 4; ++i)
if (changesMask.GetBlock(i))
data.WriteBits(changesMask.GetBlock(i), 32);
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
data << uint32(NumSlots);
}
}
if (changesMask[2])
{
for (uint32 i = 0; i < 98; ++i)
{
if (changesMask[3 + i])
{
data << Slots[i];
}
}
}
}
void ContainerData::ClearChangesMask()
{
Base::ClearChangesMask(NumSlots);
Base::ClearChangesMask(Slots);
_changesMask.ResetAll();
}
void AzeriteEmpoweredItemData::WriteCreate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, AzeriteEmpoweredItem const* owner, Player const* receiver) const
{
for (uint32 i = 0; i < 5; ++i)
{
data << int32(Selections[i]);
}
}
void AzeriteEmpoweredItemData::WriteUpdate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, AzeriteEmpoweredItem const* owner, Player const* receiver) const
{
WriteUpdate(data, _changesMask, false, owner, receiver);
}
void AzeriteEmpoweredItemData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, AzeriteEmpoweredItem const* owner, Player const* receiver) const
{
data.WriteBits(changesMask.GetBlocksMask(0), 1);
if (changesMask.GetBlock(0))
data.WriteBits(changesMask.GetBlock(0), 32);
data.FlushBits();
if (changesMask[0])
{
for (uint32 i = 0; i < 5; ++i)
{
if (changesMask[1 + i])
{
data << int32(Selections[i]);
}
}
}
}
void AzeriteEmpoweredItemData::ClearChangesMask()
{
Base::ClearChangesMask(Selections);
_changesMask.ResetAll();
}
void UnlockedAzeriteEssence::WriteCreate(ByteBuffer& data, AzeriteItem const* owner, Player const* receiver) const
{
data << uint32(AzeriteEssenceID);
data << uint32(Rank);
}
void UnlockedAzeriteEssence::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AzeriteItem const* owner, Player const* receiver) const
{
data << uint32(AzeriteEssenceID);
data << uint32(Rank);
}
bool UnlockedAzeriteEssence::operator==(UnlockedAzeriteEssence const& right) const
{
return AzeriteEssenceID == right.AzeriteEssenceID
&& Rank == right.Rank;
}
void SelectedAzeriteEssences::WriteCreate(ByteBuffer& data, AzeriteItem const* owner, Player const* receiver) const
{
for (uint32 i = 0; i < 4; ++i)
{
data << uint32(AzeriteEssenceID[i]);
}
data << uint32(SpecializationID);
data.WriteBit(Enabled);
data.FlushBits();
}
void SelectedAzeriteEssences::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AzeriteItem const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlocksMask(0), 1);
if (changesMask.GetBlock(0))
data.WriteBits(changesMask.GetBlock(0), 32);
if (changesMask[0])
{
if (changesMask[1])
{
data.WriteBit(Enabled);
}
}
data.FlushBits();
if (changesMask[0])
{
if (changesMask[2])
{
data << uint32(SpecializationID);
}
}
if (changesMask[3])
{
for (uint32 i = 0; i < 4; ++i)
{
if (changesMask[4 + i])
{
data << uint32(AzeriteEssenceID[i]);
}
}
}
data.FlushBits();
}
void SelectedAzeriteEssences::ClearChangesMask()
{
Base::ClearChangesMask(Enabled);
Base::ClearChangesMask(SpecializationID);
Base::ClearChangesMask(AzeriteEssenceID);
_changesMask.ResetAll();
}
void AzeriteItemData::WriteCreate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, AzeriteItem const* owner, Player const* receiver) const
{
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
{
data << uint64(Xp);
data << uint32(Level);
data << uint32(AuraLevel);
data << uint32(KnowledgeLevel);
data << int32(DEBUGknowledgeWeek);
}
data << uint32(UnlockedEssences.size());
data << uint32(SelectedEssences.size());
data << uint32(UnlockedEssenceMilestones.size());
for (uint32 i = 0; i < UnlockedEssences.size(); ++i)
{
UnlockedEssences[i].WriteCreate(data, owner, receiver);
}
for (uint32 i = 0; i < UnlockedEssenceMilestones.size(); ++i)
{
data << uint32(UnlockedEssenceMilestones[i]);
}
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
{
data.WriteBit(Enabled);
}
for (uint32 i = 0; i < SelectedEssences.size(); ++i)
{
SelectedEssences[i].WriteCreate(data, owner, receiver);
}
data.FlushBits();
}
static constexpr void AzeriteItemDataAppendAllowedFieldsMaskForFlag(AzeriteItemData::Mask& allowedMaskForTarget, EnumFlag fieldVisibilityFlags)
{
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
allowedMaskForTarget |= std::array{ 0x000003E2u };
}
void AzeriteItemData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag fieldVisibilityFlags)
{
AzeriteItemDataAppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
}
void AzeriteItemData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag fieldVisibilityFlags)
{
Mask allowedMaskForTarget({ 0x0000001Du });
AzeriteItemDataAppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
changesMask &= allowedMaskForTarget;
}
void AzeriteItemData::WriteUpdate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, AzeriteItem const* owner, Player const* receiver) const
{
Mask allowedMaskForTarget({ 0x0000001Du });
AzeriteItemDataAppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver);
}
void AzeriteItemData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, AzeriteItem const* owner, Player const* receiver) const
{
data.WriteBits(changesMask.GetBlock(0), 10);
if (changesMask[0])
{
if (changesMask[1])
{
data.WriteBit(Enabled);
}
if (changesMask[2])
{
if (!ignoreNestedChangesMask)
UnlockedEssences.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(UnlockedEssences.size(), data);
}
if (changesMask[3])
{
if (!ignoreNestedChangesMask)
SelectedEssences.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(SelectedEssences.size(), data);
}
if (changesMask[4])
{
if (!ignoreNestedChangesMask)
UnlockedEssenceMilestones.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(UnlockedEssenceMilestones.size(), data);
}
}
data.FlushBits();
if (changesMask[0])
{
if (changesMask[2])
{
for (uint32 i = 0; i < UnlockedEssences.size(); ++i)
{
if (UnlockedEssences.HasChanged(i) || ignoreNestedChangesMask)
{
UnlockedEssences[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[4])
{
for (uint32 i = 0; i < UnlockedEssenceMilestones.size(); ++i)
{
if (UnlockedEssenceMilestones.HasChanged(i) || ignoreNestedChangesMask)
{
data << uint32(UnlockedEssenceMilestones[i]);
}
}
}
if (changesMask[3])
{
for (uint32 i = 0; i < SelectedEssences.size(); ++i)
{
if (SelectedEssences.HasChanged(i) || ignoreNestedChangesMask)
{
SelectedEssences[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[5])
{
data << uint64(Xp);
}
if (changesMask[6])
{
data << uint32(Level);
}
if (changesMask[7])
{
data << uint32(AuraLevel);
}
if (changesMask[8])
{
data << uint32(KnowledgeLevel);
}
if (changesMask[9])
{
data << int32(DEBUGknowledgeWeek);
}
}
data.FlushBits();
}
void AzeriteItemData::ClearChangesMask()
{
Base::ClearChangesMask(Enabled);
Base::ClearChangesMask(UnlockedEssences);
Base::ClearChangesMask(UnlockedEssenceMilestones);
Base::ClearChangesMask(SelectedEssences);
Base::ClearChangesMask(Xp);
Base::ClearChangesMask(Level);
Base::ClearChangesMask(AuraLevel);
Base::ClearChangesMask(KnowledgeLevel);
Base::ClearChangesMask(DEBUGknowledgeWeek);
_changesMask.ResetAll();
}
void SpellCastVisual::WriteCreate(ByteBuffer& data, Object const* owner, Player const* receiver) const
{
data << int32(SpellXSpellVisualID);
data << int32(ScriptVisualID);
}
void SpellCastVisual::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Object const* owner, Player const* receiver) const
{
data << int32(SpellXSpellVisualID);
data << int32(ScriptVisualID);
}
bool SpellCastVisual::operator==(SpellCastVisual const& right) const
{
return SpellXSpellVisualID == right.SpellXSpellVisualID
&& ScriptVisualID == right.ScriptVisualID;
}
void UnitChannel::WriteCreate(ByteBuffer& data, Unit const* owner, Player const* receiver) const
{
data << int32(SpellID);
SpellVisual.WriteCreate(data, owner, receiver);
data << uint32(StartTimeMs);
data << uint32(Duration);
}
void UnitChannel::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit const* owner, Player const* receiver) const
{
data << int32(SpellID);
SpellVisual.WriteUpdate(data, ignoreChangesMask, owner, receiver);
data << uint32(StartTimeMs);
data << uint32(Duration);
}
bool UnitChannel::operator==(UnitChannel const& right) const
{
return SpellID == right.SpellID
&& SpellVisual == right.SpellVisual
&& StartTimeMs == right.StartTimeMs
&& Duration == right.Duration;
}
void VisibleItem::WriteCreate(ByteBuffer& data, Unit const* owner, Player const* receiver) const
{
data << int32(ItemID);
data << int32(SecondaryItemModifiedAppearanceID);
data << int32(ConditionalItemAppearanceID);
data << uint16(ItemAppearanceModID);
data << uint16(ItemVisual);
}
void VisibleItem::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 6);
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
data << int32(ItemID);
}
if (changesMask[2])
{
data << int32(SecondaryItemModifiedAppearanceID);
}
if (changesMask[3])
{
data << int32(ConditionalItemAppearanceID);
}
if (changesMask[4])
{
data << uint16(ItemAppearanceModID);
}
if (changesMask[5])
{
data << uint16(ItemVisual);
}
}
}
void VisibleItem::ClearChangesMask()
{
Base::ClearChangesMask(ItemID);
Base::ClearChangesMask(SecondaryItemModifiedAppearanceID);
Base::ClearChangesMask(ConditionalItemAppearanceID);
Base::ClearChangesMask(ItemAppearanceModID);
Base::ClearChangesMask(ItemVisual);
_changesMask.ResetAll();
}
void PassiveSpellHistory::WriteCreate(ByteBuffer& data, Unit const* owner, Player const* receiver) const
{
data << int32(SpellID);
data << int32(AuraSpellID);
}
void PassiveSpellHistory::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit const* owner, Player const* receiver) const
{
data << int32(SpellID);
data << int32(AuraSpellID);
}
bool PassiveSpellHistory::operator==(PassiveSpellHistory const& right) const
{
return SpellID == right.SpellID
&& AuraSpellID == right.AuraSpellID;
}
void UnitAssistActionData::WriteCreate(ByteBuffer& data, Unit const* owner, Player const* receiver) const
{
data << uint8(Type);
data << uint32(VirtualRealmAddress);
data.WriteBits(PlayerName->size(), 6);
data.FlushBits();
data << WorldPackets::SizedString::Data(*PlayerName);
}
void UnitAssistActionData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Unit const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 4);
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
data << uint8(Type);
}
if (changesMask[3])
{
data << uint32(VirtualRealmAddress);
}
if (changesMask[2])
{
data.WriteBits(PlayerName->size(), 6);
data.FlushBits();
data << WorldPackets::SizedString::Data(*PlayerName);
}
}
}
void UnitAssistActionData::ClearChangesMask()
{
Base::ClearChangesMask(Type);
Base::ClearChangesMask(PlayerName);
Base::ClearChangesMask(VirtualRealmAddress);
_changesMask.ResetAll();
}
void UnitData::WriteCreate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, Unit const* owner, Player const* receiver) const
{
ViewerDependentValue::value_type stateWorldEffectIDs = {};
data << int32(ViewerDependentValue::GetValue(this, owner, receiver));
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
stateWorldEffectIDs = ViewerDependentValue::GetValue(this, owner, receiver);
data << uint32(stateWorldEffectIDs->size());
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
data << int32(SpellOverrideNameID);
for (uint32 i = 0; i < stateWorldEffectIDs->size(); ++i)
{
data << uint32((*stateWorldEffectIDs)[i]);
}
data << *Charm;
data << *Summon;
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
{
data << *Critter;
}
data << *CharmedBy;
data << *SummonedBy;
data << *CreatedBy;
data << *DemonCreator;
data << *LookAtControllerTarget;
data << *Target;
data << *BattlePetCompanionGUID;
data << uint64(BattlePetDBID);
ChannelData->WriteCreate(data, owner, receiver);
data << int8(SpellEmpowerStage);
data << uint32(SummonedByHomeRealm);
data << uint8(Race);
data << uint8(ClassId);
data << uint8(PlayerClassId);
data << uint8(Sex);
data << uint8(DisplayPower);
data << uint32(OverrideDisplayPowerID);
data << int64(Health);
for (uint32 i = 0; i < 10; ++i)
{
data << int32(Power[i]);
data << int32(MaxPower[i]);
}
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner | UpdateFieldFlag::UnitAll))
{
for (uint32 i = 0; i < 10; ++i)
{
data << float(PowerRegenFlatModifier[i]);
data << float(PowerRegenInterruptedFlatModifier[i]);
}
}
data << int64(MaxHealth);
data << int32(Level);
data << int32(EffectiveLevel);
data << int32(ContentTuningID);
data << int32(ScalingLevelMin);
data << int32(ScalingLevelMax);
data << int32(ScalingLevelDelta);
data << uint8(ScalingFactionGroup);
data << int32(ViewerDependentValue::GetValue(this, owner, receiver));
for (uint32 i = 0; i < 3; ++i)
{
VirtualItems[i].WriteCreate(data, owner, receiver);
}
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
for (uint32 i = 0; i < 2; ++i)
{
data << uint32(AttackRoundBaseTime[i]);
}
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
{
data << uint32(RangedAttackRoundBaseTime);
}
data << float(BoundingRadius);
data << float(CombatReach);
data << float(DisplayScale);
data << int32(CreatureFamily);
data << uint8(CreatureType);
data << int32(NativeDisplayID);
data << float(NativeXDisplayScale);
data << int32(MountDisplayID);
data << int32(CosmeticMountDisplayID);
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner | UpdateFieldFlag::Empath))
{
data << float(MinDamage);
data << float(MaxDamage);
data << float(MinOffHandDamage);
data << float(MaxOffHandDamage);
}
data << uint8(StandState);
data << uint8(PetTalentPoints);
data << uint8(VisFlags);
data << uint8(AnimTier);
data << uint32(PetNumber);
data << uint32(PetNameTimestamp);
data << uint32(PetExperience);
data << uint32(PetNextLevelExperience);
data << float(ModCastingSpeed);
data << float(ModCastingSpeedNeg);
data << float(ModSpellHaste);
data << float(ModHaste);
data << float(ModRangedHaste);
data << float(ModHasteRegen);
data << float(ModTimeRate);
data << int32(CreatedBySpell);
data << int32(EmoteState);
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
{
for (uint32 i = 0; i < 4; ++i)
{
data << int32(Stats[i]);
data << int32(StatPosBuff[i]);
data << int32(StatNegBuff[i]);
data << int32(StatSupportBuff[i]);
}
}
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner | UpdateFieldFlag::Empath))
{
for (uint32 i = 0; i < 7; ++i)
{
data << int32(Resistances[i]);
}
}
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
{
for (uint32 i = 0; i < 7; ++i)
{
data << int32(BonusResistanceMods[i]);
data << int32(ManaCostModifier[i]);
}
}
data << int32(BaseMana);
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
{
data << int32(BaseHealth);
}
data << uint8(SheatheState);
data << uint8(ViewerDependentValue::GetValue(this, owner, receiver));
data << uint8(PetFlags);
data << uint8(ShapeshiftForm);
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
{
data << int32(AttackPower);
data << int32(AttackPowerModPos);
data << int32(AttackPowerModNeg);
data << float(AttackPowerMultiplier);
data << int32(AttackPowerModSupport);
data << int32(RangedAttackPower);
data << int32(RangedAttackPowerModPos);
data << int32(RangedAttackPowerModNeg);
data << float(RangedAttackPowerMultiplier);
data << int32(RangedAttackPowerModSupport);
data << int32(MainHandWeaponAttackPower);
data << int32(OffHandWeaponAttackPower);
data << int32(RangedWeaponAttackPower);
data << int32(SetAttackSpeedAura);
data << float(Lifesteal);
data << float(MinRangedDamage);
data << float(MaxRangedDamage);
data << float(ManaCostMultiplier);
}
data << float(MaxHealthModifier);
data << float(HoverHeight);
data << int32(MinItemLevelCutoff);
data << int32(MinItemLevel);
data << int32(MaxItemLevel);
data << int32(AzeriteItemLevel);
data << int32(WildBattlePetLevel);
data << int32(BattlePetCompanionExperience);
data << uint32(BattlePetCompanionNameTimestamp);
data << int32(ViewerDependentValue::GetValue(this, owner, receiver));
data << int32(ScaleDuration);
data << int32(LooksLikeMountID);
data << int32(LooksLikeCreatureID);
data << int32(LookAtControllerID);
data << int32(PerksVendorItemID);
data << int32(TaxiNodesID);
data << *GuildGUID;
data << uint32(PassiveSpells.size());
data << uint32(WorldEffects.size());
data << uint32(ChannelObjects.size());
data << int32(FlightCapabilityID);
data << float(GlideEventSpeedDivisor);
data << int32(DriveCapabilityID);
data << int32(MaxHealthModifierFlatNeg);
data << int32(MaxHealthModifierFlatPos);
data << uint32(SilencedSchoolMask);
data << uint32(CurrentAreaID);
data << float(Field_31C);
data << float(Field_320);
data << *NameplateAttachToGUID;
for (uint32 i = 0; i < PassiveSpells.size(); ++i)
{
PassiveSpells[i].WriteCreate(data, owner, receiver);
}
for (uint32 i = 0; i < WorldEffects.size(); ++i)
{
data << int32(WorldEffects[i]);
}
for (uint32 i = 0; i < ChannelObjects.size(); ++i)
{
data << ChannelObjects[i];
}
data.FlushBits();
data.WriteBit(Field_314);
data.WriteBits(AssistActionData.has_value(), 1);
if (AssistActionData.has_value())
{
AssistActionData->WriteCreate(data, owner, receiver);
}
data.FlushBits();
}
static constexpr void UnitDataAppendAllowedFieldsMaskForFlag(UnitData::Mask& allowedMaskForTarget, EnumFlag fieldVisibilityFlags)
{
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
allowedMaskForTarget |= std::array{ 0x00010000u, 0xF0040000u, 0xFF080000u, 0x000007FEu, 0xE0000100u, 0xFF01FFFFu, 0x7FFFFFFFu };
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::UnitAll))
allowedMaskForTarget |= std::array{ 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xE0000100u, 0x0001FFFFu, 0x00000000u };
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Empath))
allowedMaskForTarget |= std::array{ 0x00000000u, 0xF0000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x0001FE00u };
}
void UnitData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag fieldVisibilityFlags)
{
UnitDataAppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
}
void UnitData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag fieldVisibilityFlags)
{
Mask allowedMaskForTarget({ 0xFFFEFFFFu, 0x0FFBFFFFu, 0x00F7FFFFu, 0xFFFFF801u, 0x1FFFFFFFu, 0x00FE0000u, 0x00000000u });
UnitDataAppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
changesMask &= allowedMaskForTarget;
}
void UnitData::WriteUpdate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, Unit const* owner, Player const* receiver) const
{
Mask allowedMaskForTarget({ 0xFFFEFFFFu, 0x0FFBFFFFu, 0x00F7FFFFu, 0xFFFFF801u, 0x1FFFFFFFu, 0x00FE0000u, 0x00000000u });
UnitDataAppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver);
}
void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, Unit const* owner, Player const* receiver) const
{
data.WriteBits(changesMask.GetBlocksMask(0), 7);
for (uint32 i = 0; i < 7; ++i)
if (changesMask.GetBlock(i))
data.WriteBits(changesMask.GetBlock(i), 32);
ViewerDependentValue::value_type stateWorldEffectIDs = {};
if (changesMask[0])
{
if (changesMask[1])
{
data.WriteBit(Field_314);
}
if (changesMask[2])
{
stateWorldEffectIDs = ViewerDependentValue::GetValue(this, owner, receiver);
data.WriteBits(stateWorldEffectIDs->size(), 32);
for (uint32 i = 0; i < stateWorldEffectIDs->size(); ++i)
{
data << uint32((*stateWorldEffectIDs)[i]);
}
}
}
data.FlushBits();
if (changesMask[0])
{
if (changesMask[3])
{
if (!ignoreNestedChangesMask)
PassiveSpells.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(PassiveSpells.size(), data);
}
if (changesMask[4])
{
if (!ignoreNestedChangesMask)
WorldEffects.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(WorldEffects.size(), data);
}
if (changesMask[5])
{
if (!ignoreNestedChangesMask)
ChannelObjects.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ChannelObjects.size(), data);
}
}
data.FlushBits();
if (changesMask[0])
{
if (changesMask[3])
{
for (uint32 i = 0; i < PassiveSpells.size(); ++i)
{
if (PassiveSpells.HasChanged(i) || ignoreNestedChangesMask)
{
PassiveSpells[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[4])
{
for (uint32 i = 0; i < WorldEffects.size(); ++i)
{
if (WorldEffects.HasChanged(i) || ignoreNestedChangesMask)
{
data << int32(WorldEffects[i]);
}
}
}
if (changesMask[5])
{
for (uint32 i = 0; i < ChannelObjects.size(); ++i)
{
if (ChannelObjects.HasChanged(i) || ignoreNestedChangesMask)
{
data << ChannelObjects[i];
}
}
}
if (changesMask[6])
{
data << int32(ViewerDependentValue::GetValue(this, owner, receiver));
}
if (changesMask[7])
{
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
}
if (changesMask[8])
{
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
}
if (changesMask[9])
{
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
}
if (changesMask[10])
{
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
}
if (changesMask[11])
{
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
}
if (changesMask[12])
{
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
}
if (changesMask[13])
{
data << int32(SpellOverrideNameID);
}
if (changesMask[14])
{
data << *Charm;
}
if (changesMask[15])
{
data << *Summon;
}
if (changesMask[16])
{
data << *Critter;
}
if (changesMask[17])
{
data << *CharmedBy;
}
if (changesMask[18])
{
data << *SummonedBy;
}
if (changesMask[19])
{
data << *CreatedBy;
}
if (changesMask[20])
{
data << *DemonCreator;
}
if (changesMask[21])
{
data << *LookAtControllerTarget;
}
if (changesMask[22])
{
data << *Target;
}
if (changesMask[23])
{
data << *BattlePetCompanionGUID;
}
if (changesMask[24])
{
data << uint64(BattlePetDBID);
}
if (changesMask[25])
{
ChannelData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (changesMask[26])
{
data << int8(SpellEmpowerStage);
}
if (changesMask[27])
{
data << uint32(SummonedByHomeRealm);
}
if (changesMask[28])
{
data << uint8(Race);
}
if (changesMask[29])
{
data << uint8(ClassId);
}
if (changesMask[30])
{
data << uint8(PlayerClassId);
}
if (changesMask[31])
{
data << uint8(Sex);
}
}
if (changesMask[32])
{
if (changesMask[33])
{
data << uint8(DisplayPower);
}
if (changesMask[34])
{
data << uint32(OverrideDisplayPowerID);
}
if (changesMask[35])
{
data << int64(Health);
}
if (changesMask[36])
{
data << int64(MaxHealth);
}
if (changesMask[37])
{
data << int32(Level);
}
if (changesMask[38])
{
data << int32(EffectiveLevel);
}
if (changesMask[39])
{
data << int32(ContentTuningID);
}
if (changesMask[40])
{
data << int32(ScalingLevelMin);
}
if (changesMask[41])
{
data << int32(ScalingLevelMax);
}
if (changesMask[42])
{
data << int32(ScalingLevelDelta);
}
if (changesMask[43])
{
data << uint8(ScalingFactionGroup);
}
if (changesMask[44])
{
data << int32(ViewerDependentValue::GetValue(this, owner, receiver));
}
if (changesMask[45])
{
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
}
if (changesMask[46])
{
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
}
if (changesMask[47])
{
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
}
if (changesMask[48])
{
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
}
if (changesMask[49])
{
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
}
if (changesMask[50])
{
data << uint32(RangedAttackRoundBaseTime);
}
if (changesMask[51])
{
data << float(BoundingRadius);
}
if (changesMask[52])
{
data << float(CombatReach);
}
if (changesMask[53])
{
data << float(DisplayScale);
}
if (changesMask[54])
{
data << int32(CreatureFamily);
}
if (changesMask[55])
{
data << uint8(CreatureType);
}
if (changesMask[56])
{
data << int32(NativeDisplayID);
}
if (changesMask[57])
{
data << float(NativeXDisplayScale);
}
if (changesMask[58])
{
data << int32(MountDisplayID);
}
if (changesMask[59])
{
data << int32(CosmeticMountDisplayID);
}
if (changesMask[60])
{
data << float(MinDamage);
}
if (changesMask[61])
{
data << float(MaxDamage);
}
if (changesMask[62])
{
data << float(MinOffHandDamage);
}
if (changesMask[63])
{
data << float(MaxOffHandDamage);
}
}
if (changesMask[64])
{
if (changesMask[65])
{
data << uint8(StandState);
}
if (changesMask[66])
{
data << uint8(PetTalentPoints);
}
if (changesMask[67])
{
data << uint8(VisFlags);
}
if (changesMask[68])
{
data << uint8(AnimTier);
}
if (changesMask[69])
{
data << uint32(PetNumber);
}
if (changesMask[70])
{
data << uint32(PetNameTimestamp);
}
if (changesMask[71])
{
data << uint32(PetExperience);
}
if (changesMask[72])
{
data << uint32(PetNextLevelExperience);
}
if (changesMask[73])
{
data << float(ModCastingSpeed);
}
if (changesMask[74])
{
data << float(ModCastingSpeedNeg);
}
if (changesMask[75])
{
data << float(ModSpellHaste);
}
if (changesMask[76])
{
data << float(ModHaste);
}
if (changesMask[77])
{
data << float(ModRangedHaste);
}
if (changesMask[78])
{
data << float(ModHasteRegen);
}
if (changesMask[79])
{
data << float(ModTimeRate);
}
if (changesMask[80])
{
data << int32(CreatedBySpell);
}
if (changesMask[81])
{
data << int32(EmoteState);
}
if (changesMask[82])
{
data << int32(BaseMana);
}
if (changesMask[83])
{
data << int32(BaseHealth);
}
if (changesMask[84])
{
data << uint8(SheatheState);
}
if (changesMask[85])
{
data << uint8(ViewerDependentValue::GetValue(this, owner, receiver));
}
if (changesMask[86])
{
data << uint8(PetFlags);
}
if (changesMask[87])
{
data << uint8(ShapeshiftForm);
}
if (changesMask[88])
{
data << int32(AttackPower);
}
if (changesMask[89])
{
data << int32(AttackPowerModPos);
}
if (changesMask[90])
{
data << int32(AttackPowerModNeg);
}
if (changesMask[91])
{
data << float(AttackPowerMultiplier);
}
if (changesMask[92])
{
data << int32(AttackPowerModSupport);
}
if (changesMask[93])
{
data << int32(RangedAttackPower);
}
if (changesMask[94])
{
data << int32(RangedAttackPowerModPos);
}
if (changesMask[95])
{
data << int32(RangedAttackPowerModNeg);
}
}
if (changesMask[96])
{
if (changesMask[97])
{
data << float(RangedAttackPowerMultiplier);
}
if (changesMask[98])
{
data << int32(RangedAttackPowerModSupport);
}
if (changesMask[99])
{
data << int32(MainHandWeaponAttackPower);
}
if (changesMask[100])
{
data << int32(OffHandWeaponAttackPower);
}
if (changesMask[101])
{
data << int32(RangedWeaponAttackPower);
}
if (changesMask[102])
{
data << int32(SetAttackSpeedAura);
}
if (changesMask[103])
{
data << float(Lifesteal);
}
if (changesMask[104])
{
data << float(MinRangedDamage);
}
if (changesMask[105])
{
data << float(MaxRangedDamage);
}
if (changesMask[106])
{
data << float(ManaCostMultiplier);
}
if (changesMask[107])
{
data << float(MaxHealthModifier);
}
if (changesMask[108])
{
data << float(HoverHeight);
}
if (changesMask[109])
{
data << int32(MinItemLevelCutoff);
}
if (changesMask[110])
{
data << int32(MinItemLevel);
}
if (changesMask[111])
{
data << int32(MaxItemLevel);
}
if (changesMask[112])
{
data << int32(AzeriteItemLevel);
}
if (changesMask[113])
{
data << int32(WildBattlePetLevel);
}
if (changesMask[114])
{
data << int32(BattlePetCompanionExperience);
}
if (changesMask[115])
{
data << uint32(BattlePetCompanionNameTimestamp);
}
if (changesMask[116])
{
data << int32(ViewerDependentValue::GetValue(this, owner, receiver));
}
if (changesMask[117])
{
data << int32(ScaleDuration);
}
if (changesMask[118])
{
data << int32(LooksLikeMountID);
}
if (changesMask[119])
{
data << int32(LooksLikeCreatureID);
}
if (changesMask[120])
{
data << int32(LookAtControllerID);
}
if (changesMask[121])
{
data << int32(PerksVendorItemID);
}
if (changesMask[122])
{
data << int32(TaxiNodesID);
}
if (changesMask[123])
{
data << *GuildGUID;
}
if (changesMask[124])
{
data << int32(FlightCapabilityID);
}
if (changesMask[125])
{
data << float(GlideEventSpeedDivisor);
}
if (changesMask[126])
{
data << int32(DriveCapabilityID);
}
if (changesMask[127])
{
data << int32(MaxHealthModifierFlatNeg);
}
}
if (changesMask[128])
{
if (changesMask[129])
{
data << int32(MaxHealthModifierFlatPos);
}
if (changesMask[130])
{
data << uint32(SilencedSchoolMask);
}
if (changesMask[131])
{
data << uint32(CurrentAreaID);
}
if (changesMask[132])
{
data << float(Field_31C);
}
if (changesMask[133])
{
data << float(Field_320);
}
if (changesMask[134])
{
data << *NameplateAttachToGUID;
}
data.WriteBits(AssistActionData.has_value(), 1);
data.FlushBits();
if (changesMask[135])
{
if (AssistActionData.has_value())
{
AssistActionData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[136])
{
for (uint32 i = 0; i < 10; ++i)
{
if (changesMask[137 + i])
{
data << int32(Power[i]);
}
if (changesMask[147 + i])
{
data << int32(MaxPower[i]);
}
if (changesMask[157 + i])
{
data << float(PowerRegenFlatModifier[i]);
}
if (changesMask[167 + i])
{
data << float(PowerRegenInterruptedFlatModifier[i]);
}
}
}
if (changesMask[177])
{
for (uint32 i = 0; i < 3; ++i)
{
if (changesMask[178 + i])
{
VirtualItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[181])
{
for (uint32 i = 0; i < 2; ++i)
{
if (changesMask[182 + i])
{
data << uint32(AttackRoundBaseTime[i]);
}
}
}
if (changesMask[184])
{
for (uint32 i = 0; i < 4; ++i)
{
if (changesMask[185 + i])
{
data << int32(Stats[i]);
}
if (changesMask[189 + i])
{
data << int32(StatPosBuff[i]);
}
if (changesMask[193 + i])
{
data << int32(StatNegBuff[i]);
}
if (changesMask[197 + i])
{
data << int32(StatSupportBuff[i]);
}
}
}
if (changesMask[201])
{
for (uint32 i = 0; i < 7; ++i)
{
if (changesMask[202 + i])
{
data << int32(Resistances[i]);
}
if (changesMask[209 + i])
{
data << int32(BonusResistanceMods[i]);
}
if (changesMask[216 + i])
{
data << int32(ManaCostModifier[i]);
}
}
}
data.FlushBits();
}
void UnitData::ClearChangesMask()
{
Base::ClearChangesMask(Field_314);
Base::ClearChangesMask(StateWorldEffectIDs);
Base::ClearChangesMask(PassiveSpells);
Base::ClearChangesMask(WorldEffects);
Base::ClearChangesMask(ChannelObjects);
Base::ClearChangesMask(DisplayID);
Base::ClearChangesMask(NpcFlags);
Base::ClearChangesMask(NpcFlags2);
Base::ClearChangesMask(StateSpellVisualID);
Base::ClearChangesMask(StateAnimID);
Base::ClearChangesMask(StateAnimKitID);
Base::ClearChangesMask(StateWorldEffectsQuestObjectiveID);
Base::ClearChangesMask(SpellOverrideNameID);
Base::ClearChangesMask(Charm);
Base::ClearChangesMask(Summon);
Base::ClearChangesMask(Critter);
Base::ClearChangesMask(CharmedBy);
Base::ClearChangesMask(SummonedBy);
Base::ClearChangesMask(CreatedBy);
Base::ClearChangesMask(DemonCreator);
Base::ClearChangesMask(LookAtControllerTarget);
Base::ClearChangesMask(Target);
Base::ClearChangesMask(BattlePetCompanionGUID);
Base::ClearChangesMask(BattlePetDBID);
Base::ClearChangesMask(ChannelData);
Base::ClearChangesMask(SpellEmpowerStage);
Base::ClearChangesMask(SummonedByHomeRealm);
Base::ClearChangesMask(Race);
Base::ClearChangesMask(ClassId);
Base::ClearChangesMask(PlayerClassId);
Base::ClearChangesMask(Sex);
Base::ClearChangesMask(DisplayPower);
Base::ClearChangesMask(OverrideDisplayPowerID);
Base::ClearChangesMask(Health);
Base::ClearChangesMask(MaxHealth);
Base::ClearChangesMask(Level);
Base::ClearChangesMask(EffectiveLevel);
Base::ClearChangesMask(ContentTuningID);
Base::ClearChangesMask(ScalingLevelMin);
Base::ClearChangesMask(ScalingLevelMax);
Base::ClearChangesMask(ScalingLevelDelta);
Base::ClearChangesMask(ScalingFactionGroup);
Base::ClearChangesMask(FactionTemplate);
Base::ClearChangesMask(Flags);
Base::ClearChangesMask(Flags2);
Base::ClearChangesMask(Flags3);
Base::ClearChangesMask(Flags4);
Base::ClearChangesMask(AuraState);
Base::ClearChangesMask(RangedAttackRoundBaseTime);
Base::ClearChangesMask(BoundingRadius);
Base::ClearChangesMask(CombatReach);
Base::ClearChangesMask(DisplayScale);
Base::ClearChangesMask(CreatureFamily);
Base::ClearChangesMask(CreatureType);
Base::ClearChangesMask(NativeDisplayID);
Base::ClearChangesMask(NativeXDisplayScale);
Base::ClearChangesMask(MountDisplayID);
Base::ClearChangesMask(CosmeticMountDisplayID);
Base::ClearChangesMask(MinDamage);
Base::ClearChangesMask(MaxDamage);
Base::ClearChangesMask(MinOffHandDamage);
Base::ClearChangesMask(MaxOffHandDamage);
Base::ClearChangesMask(StandState);
Base::ClearChangesMask(PetTalentPoints);
Base::ClearChangesMask(VisFlags);
Base::ClearChangesMask(AnimTier);
Base::ClearChangesMask(PetNumber);
Base::ClearChangesMask(PetNameTimestamp);
Base::ClearChangesMask(PetExperience);
Base::ClearChangesMask(PetNextLevelExperience);
Base::ClearChangesMask(ModCastingSpeed);
Base::ClearChangesMask(ModCastingSpeedNeg);
Base::ClearChangesMask(ModSpellHaste);
Base::ClearChangesMask(ModHaste);
Base::ClearChangesMask(ModRangedHaste);
Base::ClearChangesMask(ModHasteRegen);
Base::ClearChangesMask(ModTimeRate);
Base::ClearChangesMask(CreatedBySpell);
Base::ClearChangesMask(EmoteState);
Base::ClearChangesMask(BaseMana);
Base::ClearChangesMask(BaseHealth);
Base::ClearChangesMask(SheatheState);
Base::ClearChangesMask(PvpFlags);
Base::ClearChangesMask(PetFlags);
Base::ClearChangesMask(ShapeshiftForm);
Base::ClearChangesMask(AttackPower);
Base::ClearChangesMask(AttackPowerModPos);
Base::ClearChangesMask(AttackPowerModNeg);
Base::ClearChangesMask(AttackPowerMultiplier);
Base::ClearChangesMask(AttackPowerModSupport);
Base::ClearChangesMask(RangedAttackPower);
Base::ClearChangesMask(RangedAttackPowerModPos);
Base::ClearChangesMask(RangedAttackPowerModNeg);
Base::ClearChangesMask(RangedAttackPowerMultiplier);
Base::ClearChangesMask(RangedAttackPowerModSupport);
Base::ClearChangesMask(MainHandWeaponAttackPower);
Base::ClearChangesMask(OffHandWeaponAttackPower);
Base::ClearChangesMask(RangedWeaponAttackPower);
Base::ClearChangesMask(SetAttackSpeedAura);
Base::ClearChangesMask(Lifesteal);
Base::ClearChangesMask(MinRangedDamage);
Base::ClearChangesMask(MaxRangedDamage);
Base::ClearChangesMask(ManaCostMultiplier);
Base::ClearChangesMask(MaxHealthModifier);
Base::ClearChangesMask(HoverHeight);
Base::ClearChangesMask(MinItemLevelCutoff);
Base::ClearChangesMask(MinItemLevel);
Base::ClearChangesMask(MaxItemLevel);
Base::ClearChangesMask(AzeriteItemLevel);
Base::ClearChangesMask(WildBattlePetLevel);
Base::ClearChangesMask(BattlePetCompanionExperience);
Base::ClearChangesMask(BattlePetCompanionNameTimestamp);
Base::ClearChangesMask(InteractSpellID);
Base::ClearChangesMask(ScaleDuration);
Base::ClearChangesMask(LooksLikeMountID);
Base::ClearChangesMask(LooksLikeCreatureID);
Base::ClearChangesMask(LookAtControllerID);
Base::ClearChangesMask(PerksVendorItemID);
Base::ClearChangesMask(TaxiNodesID);
Base::ClearChangesMask(GuildGUID);
Base::ClearChangesMask(FlightCapabilityID);
Base::ClearChangesMask(GlideEventSpeedDivisor);
Base::ClearChangesMask(DriveCapabilityID);
Base::ClearChangesMask(MaxHealthModifierFlatNeg);
Base::ClearChangesMask(MaxHealthModifierFlatPos);
Base::ClearChangesMask(SilencedSchoolMask);
Base::ClearChangesMask(CurrentAreaID);
Base::ClearChangesMask(Field_31C);
Base::ClearChangesMask(Field_320);
Base::ClearChangesMask(NameplateAttachToGUID);
Base::ClearChangesMask(AssistActionData);
Base::ClearChangesMask(Power);
Base::ClearChangesMask(MaxPower);
Base::ClearChangesMask(PowerRegenFlatModifier);
Base::ClearChangesMask(PowerRegenInterruptedFlatModifier);
Base::ClearChangesMask(VirtualItems);
Base::ClearChangesMask(AttackRoundBaseTime);
Base::ClearChangesMask(Stats);
Base::ClearChangesMask(StatPosBuff);
Base::ClearChangesMask(StatNegBuff);
Base::ClearChangesMask(StatSupportBuff);
Base::ClearChangesMask(Resistances);
Base::ClearChangesMask(BonusResistanceMods);
Base::ClearChangesMask(ManaCostModifier);
_changesMask.ResetAll();
}
void ChrCustomizationChoice::WriteCreate(ByteBuffer& data, Object const* owner, Player const* receiver) const
{
data << uint32(ChrCustomizationOptionID);
data << uint32(ChrCustomizationChoiceID);
}
void ChrCustomizationChoice::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Object const* owner, Player const* receiver) const
{
data << uint32(ChrCustomizationOptionID);
data << uint32(ChrCustomizationChoiceID);
}
bool ChrCustomizationChoice::operator==(ChrCustomizationChoice const& right) const
{
return ChrCustomizationOptionID == right.ChrCustomizationOptionID
&& ChrCustomizationChoiceID == right.ChrCustomizationChoiceID;
}
void QuestLog::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int64(EndTime);
data << int32(QuestID);
data << uint32(StateFlags);
data << uint32(ObjectiveFlags);
for (uint32 i = 0; i < 24; ++i)
{
data << int16(ObjectiveProgress[i]);
}
}
void QuestLog::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlocksMask(0), 1);
if (changesMask.GetBlock(0))
data.WriteBits(changesMask.GetBlock(0), 32);
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
data << int64(EndTime);
}
if (changesMask[2])
{
data << int32(QuestID);
}
if (changesMask[3])
{
data << uint32(StateFlags);
}
if (changesMask[4])
{
data << uint32(ObjectiveFlags);
}
}
if (changesMask[5])
{
for (uint32 i = 0; i < 24; ++i)
{
if (changesMask[6 + i])
{
data << int16(ObjectiveProgress[i]);
}
}
}
}
void QuestLog::ClearChangesMask()
{
Base::ClearChangesMask(EndTime);
Base::ClearChangesMask(QuestID);
Base::ClearChangesMask(StateFlags);
Base::ClearChangesMask(ObjectiveFlags);
Base::ClearChangesMask(ObjectiveProgress);
_changesMask.ResetAll();
}
void ArenaCooldown::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int32(SpellID);
data << int32(Charges);
data << uint32(Flags);
data << uint32(StartTime);
data << uint32(EndTime);
data << uint32(NextChargeTime);
data << uint8(MaxCharges);
}
void ArenaCooldown::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 8);
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
data << int32(SpellID);
}
if (changesMask[2])
{
data << int32(Charges);
}
if (changesMask[3])
{
data << uint32(Flags);
}
if (changesMask[4])
{
data << uint32(StartTime);
}
if (changesMask[5])
{
data << uint32(EndTime);
}
if (changesMask[6])
{
data << uint32(NextChargeTime);
}
if (changesMask[7])
{
data << uint8(MaxCharges);
}
}
}
void ArenaCooldown::ClearChangesMask()
{
Base::ClearChangesMask(SpellID);
Base::ClearChangesMask(Charges);
Base::ClearChangesMask(Flags);
Base::ClearChangesMask(StartTime);
Base::ClearChangesMask(EndTime);
Base::ClearChangesMask(NextChargeTime);
Base::ClearChangesMask(MaxCharges);
_changesMask.ResetAll();
}
void ZonePlayerForcedReaction::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int32(FactionID);
data << int32(Reaction);
}
void ZonePlayerForcedReaction::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 3);
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
data << int32(FactionID);
}
if (changesMask[2])
{
data << int32(Reaction);
}
}
}
void ZonePlayerForcedReaction::ClearChangesMask()
{
Base::ClearChangesMask(FactionID);
Base::ClearChangesMask(Reaction);
_changesMask.ResetAll();
}
void PetCreatureName::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << uint32(CreatureID);
data.WriteBits(Name->size(), 8);
data << WorldPackets::SizedString::Data(*Name);
data.FlushBits();
}
void PetCreatureName::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 3);
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
data << uint32(CreatureID);
}
if (changesMask[2])
{
data.WriteBits(Name->size(), 8);
data << WorldPackets::SizedString::Data(*Name);
}
}
data.FlushBits();
}
void PetCreatureName::ClearChangesMask()
{
Base::ClearChangesMask(CreatureID);
Base::ClearChangesMask(Name);
_changesMask.ResetAll();
}
void CTROptions::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << uint32(ConditionalFlags);
data << uint8(FactionGroup);
data << uint32(ChromieTimeExpansionMask);
}
void CTROptions::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
data << uint32(ConditionalFlags);
data << uint8(FactionGroup);
data << uint32(ChromieTimeExpansionMask);
}
bool CTROptions::operator==(CTROptions const& right) const
{
return ConditionalFlags == right.ConditionalFlags
&& FactionGroup == right.FactionGroup
&& ChromieTimeExpansionMask == right.ChromieTimeExpansionMask;
}
void LeaverInfo::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << BnetAccountGUID;
data << float(LeaveScore);
data << uint32(SeasonID);
data << uint32(TotalLeaves);
data << uint32(TotalSuccesses);
data << int32(ConsecutiveSuccesses);
data << int64(LastPenaltyTime);
data << int64(LeaverExpirationTime);
data << int32(Unknown_1120);
data.WriteBits(LeaverStatus, 1);
data.FlushBits();
}
void LeaverInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
data << BnetAccountGUID;
data << float(LeaveScore);
data << uint32(SeasonID);
data << uint32(TotalLeaves);
data << uint32(TotalSuccesses);
data << int32(ConsecutiveSuccesses);
data << int64(LastPenaltyTime);
data << int64(LeaverExpirationTime);
data << int32(Unknown_1120);
data.WriteBits(LeaverStatus, 1);
data.FlushBits();
}
bool LeaverInfo::operator==(LeaverInfo const& right) const
{
return BnetAccountGUID == right.BnetAccountGUID
&& LeaveScore == right.LeaveScore
&& SeasonID == right.SeasonID
&& TotalLeaves == right.TotalLeaves
&& TotalSuccesses == right.TotalSuccesses
&& ConsecutiveSuccesses == right.ConsecutiveSuccesses
&& LastPenaltyTime == right.LastPenaltyTime
&& LeaverExpirationTime == right.LeaverExpirationTime
&& Unknown_1120 == right.Unknown_1120
&& LeaverStatus == right.LeaverStatus;
}
void DeclinedNames::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
for (uint32 i = 0; i < 5; ++i)
{
data.WriteBits(Name[i].size(), 10);
}
for (uint32 i = 0; i < 5; ++i)
{
data << WorldPackets::SizedString::Data(Name[i]);
}
data.FlushBits();
}
void DeclinedNames::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlocksMask(0), 1);
if (changesMask.GetBlock(0))
data.WriteBits(changesMask.GetBlock(0), 32);
if (changesMask[0])
{
for (uint32 i = 0; i < 5; ++i)
{
if (changesMask[1 + i])
{
data.WriteBits(Name[i].size(), 10);
}
}
}
data.FlushBits();
if (changesMask[0])
{
for (uint32 i = 0; i < 5; ++i)
{
if (changesMask[1 + i])
{
data << WorldPackets::SizedString::Data(Name[i]);
}
}
}
data.FlushBits();
}
void DeclinedNames::ClearChangesMask()
{
Base::ClearChangesMask(Name);
_changesMask.ResetAll();
}
void CustomTabardInfo::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int32(EmblemStyle);
data << int32(EmblemColor);
data << int32(BorderStyle);
data << int32(BorderColor);
data << int32(BackgroundColor);
}
void CustomTabardInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 6);
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
data << int32(EmblemStyle);
}
if (changesMask[2])
{
data << int32(EmblemColor);
}
if (changesMask[3])
{
data << int32(BorderStyle);
}
if (changesMask[4])
{
data << int32(BorderColor);
}
if (changesMask[5])
{
data << int32(BackgroundColor);
}
}
}
void CustomTabardInfo::ClearChangesMask()
{
Base::ClearChangesMask(EmblemStyle);
Base::ClearChangesMask(EmblemColor);
Base::ClearChangesMask(BorderStyle);
Base::ClearChangesMask(BorderColor);
Base::ClearChangesMask(BackgroundColor);
_changesMask.ResetAll();
}
void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, Player const* owner, Player const* receiver) const
{
data << *DuelArbiter;
data << *WowAccount;
data << *BnetAccount;
data << uint64(GuildClubMemberID);
data << *LootTargetGUID;
data << uint32(PlayerFlags);
data << uint32(PlayerFlagsEx);
data << uint32(GuildRankID);
data << uint32(GuildDeleteDate);
data << int32(GuildLevel);
data << uint32(Customizations.size());
data << uint32(QaCustomizations.size());
for (uint32 i = 0; i < 2; ++i)
{
data << uint8(PartyType[i]);
}
data << uint8(NativeSex);
data << uint8(Inebriation);
data << uint8(PvpTitle);
data << uint8(ArenaFaction);
data << uint32(DuelTeam);
data << int32(GuildTimeStamp);
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::PartyMember))
{
for (uint32 i = 0; i < 175; ++i)
{
QuestLog[i].WriteCreate(data, owner, receiver);
}
data << uint32(QuestSessionQuestLog.size());
}
for (uint32 i = 0; i < 19; ++i)
{
VisibleItems[i].WriteCreate(data, owner, receiver);
}
data << int32(PlayerTitle);
data << int32(FakeInebriation);
data << uint32(VirtualPlayerRealm);
data << uint32(CurrentSpecID);
data << int32(CurrentCombatTraitConfigSubTreeID);
data << int32(TaxiMountAnimKitID);
for (uint32 i = 0; i < 6; ++i)
{
data << float(AvgItemLevel[i]);
}
data << uint8(CurrentBattlePetBreedQuality);
data << int32(HonorLevel);
data << int64(LogoutTime);
data << uint32(ArenaCooldowns.size());
for (uint32 i = 0; i < 32; ++i)
{
ForcedReactions[i].WriteCreate(data, owner, receiver);
}
data << int32(Field_1AC);
data << int32(Field_1B0);
data << int32(CurrentBattlePetSpeciesID);
data << uint32(PetNames.size());
CtrOptions->WriteCreate(data, owner, receiver);
data << int32(CovenantID);
data << int32(SoulbindID);
data << *SpectateTarget;
data << int32(Field_200);
data << uint32(VisualItemReplacements.size());
for (uint32 i = 0; i < 19; ++i)
{
data << uint32(Field_3120[i]);
}
PersonalTabard->WriteCreate(data, owner, receiver);
for (uint32 i = 0; i < Customizations.size(); ++i)
{
Customizations[i].WriteCreate(data, owner, receiver);
}
for (uint32 i = 0; i < QaCustomizations.size(); ++i)
{
QaCustomizations[i].WriteCreate(data, owner, receiver);
}
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::PartyMember))
{
for (uint32 i = 0; i < QuestSessionQuestLog.size(); ++i)
{
QuestSessionQuestLog[i].WriteCreate(data, owner, receiver);
}
}
for (uint32 i = 0; i < ArenaCooldowns.size(); ++i)
{
ArenaCooldowns[i].WriteCreate(data, owner, receiver);
}
for (uint32 i = 0; i < VisualItemReplacements.size(); ++i)
{
data << int32(VisualItemReplacements[i]);
}
data.FlushBits();
data.WriteBits(Name->size(), 6);
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::PartyMember))
{
data.WriteBit(HasQuestSession);
}
data.WriteBit(HasLevelLink);
data.WriteBits(DeclinedNames.has_value(), 1);
data << *DungeonScore;
data << WorldPackets::SizedString::Data(*Name);
LeaverInfo->WriteCreate(data, owner, receiver);
for (uint32 i = 0; i < 16; ++i)
{
data << VisibleEquipableSpells[i];
}
for (uint32 i = 0; i < PetNames.size(); ++i)
{
PetNames[i].WriteCreate(data, owner, receiver);
}
if (DeclinedNames.has_value())
{
DeclinedNames->WriteCreate(data, owner, receiver);
}
data.FlushBits();
}
static constexpr void PlayerDataAppendAllowedFieldsMaskForFlag(PlayerData::Mask& allowedMaskForTarget, EnumFlag fieldVisibilityFlags)
{
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::PartyMember))
allowedMaskForTarget |= std::array{ 0x00000022u, 0xFFF80000u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000007u, 0x00000000u, 0x00000000u, 0x00000000u };
}
void PlayerData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag fieldVisibilityFlags)
{
PlayerDataAppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
}
void PlayerData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag fieldVisibilityFlags)
{
Mask allowedMaskForTarget({ 0xFFFFFFDDu, 0x0007FFFFu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFFFFFF8u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x0000000Fu });
PlayerDataAppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
changesMask &= allowedMaskForTarget;
}
void PlayerData::WriteUpdate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, Player const* owner, Player const* receiver) const
{
Mask allowedMaskForTarget({ 0xFFFFFFDDu, 0x0007FFFFu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFFFFFF8u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x0000000Fu });
PlayerDataAppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver);
}
void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, Player const* owner, Player const* receiver) const
{
data.WriteBits(changesMask.GetBlocksMask(0), 11);
for (uint32 i = 0; i < 11; ++i)
if (changesMask.GetBlock(i))
data.WriteBits(changesMask.GetBlock(i), 32);
bool noQuestLogChangesMask = data.WriteBit(IsQuestLogChangesMaskSkipped());
if (changesMask[0])
{
if (changesMask[1])
{
data.WriteBit(HasQuestSession);
}
if (changesMask[2])
{
data.WriteBit(HasLevelLink);
}
if (changesMask[3])
{
if (!ignoreNestedChangesMask)
Customizations.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Customizations.size(), data);
}
if (changesMask[4])
{
if (!ignoreNestedChangesMask)
QaCustomizations.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(QaCustomizations.size(), data);
}
if (changesMask[5])
{
if (!ignoreNestedChangesMask)
QuestSessionQuestLog.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(QuestSessionQuestLog.size(), data);
}
if (changesMask[6])
{
if (!ignoreNestedChangesMask)
ArenaCooldowns.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ArenaCooldowns.size(), data);
}
if (changesMask[7])
{
if (!ignoreNestedChangesMask)
PetNames.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(PetNames.size(), data);
}
if (changesMask[8])
{
if (!ignoreNestedChangesMask)
VisualItemReplacements.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(VisualItemReplacements.size(), data);
}
}
data.FlushBits();
if (changesMask[0])
{
if (changesMask[3])
{
for (uint32 i = 0; i < Customizations.size(); ++i)
{
if (Customizations.HasChanged(i) || ignoreNestedChangesMask)
{
Customizations[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[4])
{
for (uint32 i = 0; i < QaCustomizations.size(); ++i)
{
if (QaCustomizations.HasChanged(i) || ignoreNestedChangesMask)
{
QaCustomizations[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[5])
{
for (uint32 i = 0; i < QuestSessionQuestLog.size(); ++i)
{
if (QuestSessionQuestLog.HasChanged(i) || ignoreNestedChangesMask)
{
if (noQuestLogChangesMask)
QuestSessionQuestLog[i].WriteCreate(data, owner, receiver);
else
QuestSessionQuestLog[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[6])
{
for (uint32 i = 0; i < ArenaCooldowns.size(); ++i)
{
if (ArenaCooldowns.HasChanged(i) || ignoreNestedChangesMask)
{
ArenaCooldowns[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[8])
{
for (uint32 i = 0; i < VisualItemReplacements.size(); ++i)
{
if (VisualItemReplacements.HasChanged(i) || ignoreNestedChangesMask)
{
data << int32(VisualItemReplacements[i]);
}
}
}
if (changesMask[7])
{
for (uint32 i = 0; i < PetNames.size(); ++i)
{
if (PetNames.HasChanged(i) || ignoreNestedChangesMask)
{
PetNames[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[9])
{
data << *DuelArbiter;
}
if (changesMask[10])
{
data << *WowAccount;
}
if (changesMask[11])
{
data << *BnetAccount;
}
if (changesMask[12])
{
data << uint64(GuildClubMemberID);
}
if (changesMask[13])
{
data << *LootTargetGUID;
}
if (changesMask[14])
{
data << uint32(PlayerFlags);
}
if (changesMask[15])
{
data << uint32(PlayerFlagsEx);
}
if (changesMask[16])
{
data << uint32(GuildRankID);
}
if (changesMask[17])
{
data << uint32(GuildDeleteDate);
}
if (changesMask[18])
{
data << int32(GuildLevel);
}
if (changesMask[19])
{
data << uint8(NativeSex);
}
if (changesMask[20])
{
data << uint8(Inebriation);
}
if (changesMask[21])
{
data << uint8(PvpTitle);
}
if (changesMask[22])
{
data << uint8(ArenaFaction);
}
if (changesMask[23])
{
data << uint32(DuelTeam);
}
if (changesMask[24])
{
data << int32(GuildTimeStamp);
}
if (changesMask[25])
{
data << int32(PlayerTitle);
}
if (changesMask[26])
{
data << int32(FakeInebriation);
}
if (changesMask[27])
{
data << uint32(VirtualPlayerRealm);
}
if (changesMask[28])
{
data << uint32(CurrentSpecID);
}
if (changesMask[29])
{
data << int32(CurrentCombatTraitConfigSubTreeID);
}
if (changesMask[30])
{
data << int32(TaxiMountAnimKitID);
}
if (changesMask[31])
{
data << uint8(CurrentBattlePetBreedQuality);
}
}
if (changesMask[32])
{
if (changesMask[33])
{
data << int32(HonorLevel);
}
if (changesMask[34])
{
data << int64(LogoutTime);
}
if (changesMask[36])
{
data << int32(Field_1AC);
}
if (changesMask[37])
{
data << int32(Field_1B0);
}
if (changesMask[38])
{
data << int32(CurrentBattlePetSpeciesID);
}
if (changesMask[39])
{
CtrOptions->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (changesMask[40])
{
data << int32(CovenantID);
}
if (changesMask[41])
{
data << int32(SoulbindID);
}
if (changesMask[44])
{
data << *SpectateTarget;
}
if (changesMask[45])
{
data << int32(Field_200);
}
if (changesMask[47])
{
PersonalTabard->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (changesMask[35])
{
data.WriteBits(Name->size(), 6);
}
data.WriteBits(DeclinedNames.has_value(), 1);
data.FlushBits();
if (changesMask[42])
{
data << *DungeonScore;
}
if (changesMask[35])
{
data << WorldPackets::SizedString::Data(*Name);
}
if (changesMask[43])
{
LeaverInfo->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (changesMask[46])
{
if (DeclinedNames.has_value())
{
DeclinedNames->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[48])
{
for (uint32 i = 0; i < 2; ++i)
{
if (changesMask[49 + i])
{
data << uint8(PartyType[i]);
}
}
}
if (changesMask[51])
{
for (uint32 i = 0; i < 175; ++i)
{
if (changesMask[52 + i])
{
if (noQuestLogChangesMask)
QuestLog[i].WriteCreate(data, owner, receiver);
else
QuestLog[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[227])
{
for (uint32 i = 0; i < 19; ++i)
{
if (changesMask[228 + i])
{
VisibleItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[247])
{
for (uint32 i = 0; i < 6; ++i)
{
if (changesMask[248 + i])
{
data << float(AvgItemLevel[i]);
}
}
}
if (changesMask[254])
{
for (uint32 i = 0; i < 32; ++i)
{
if (changesMask[255 + i])
{
ForcedReactions[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[304])
{
for (uint32 i = 0; i < 19; ++i)
{
if (changesMask[305 + i])
{
data << uint32(Field_3120[i]);
}
}
}
if (changesMask[287])
{
for (uint32 i = 0; i < 16; ++i)
{
if (changesMask[288 + i])
{
data << VisibleEquipableSpells[i];
}
}
}
data.FlushBits();
}
void PlayerData::ClearChangesMask()
{
Base::ClearChangesMask(HasQuestSession);
Base::ClearChangesMask(HasLevelLink);
Base::ClearChangesMask(Customizations);
Base::ClearChangesMask(QaCustomizations);
Base::ClearChangesMask(QuestSessionQuestLog);
Base::ClearChangesMask(ArenaCooldowns);
Base::ClearChangesMask(VisualItemReplacements);
Base::ClearChangesMask(PetNames);
Base::ClearChangesMask(DuelArbiter);
Base::ClearChangesMask(WowAccount);
Base::ClearChangesMask(BnetAccount);
Base::ClearChangesMask(GuildClubMemberID);
Base::ClearChangesMask(LootTargetGUID);
Base::ClearChangesMask(PlayerFlags);
Base::ClearChangesMask(PlayerFlagsEx);
Base::ClearChangesMask(GuildRankID);
Base::ClearChangesMask(GuildDeleteDate);
Base::ClearChangesMask(GuildLevel);
Base::ClearChangesMask(NativeSex);
Base::ClearChangesMask(Inebriation);
Base::ClearChangesMask(PvpTitle);
Base::ClearChangesMask(ArenaFaction);
Base::ClearChangesMask(DuelTeam);
Base::ClearChangesMask(GuildTimeStamp);
Base::ClearChangesMask(PlayerTitle);
Base::ClearChangesMask(FakeInebriation);
Base::ClearChangesMask(VirtualPlayerRealm);
Base::ClearChangesMask(CurrentSpecID);
Base::ClearChangesMask(CurrentCombatTraitConfigSubTreeID);
Base::ClearChangesMask(TaxiMountAnimKitID);
Base::ClearChangesMask(CurrentBattlePetBreedQuality);
Base::ClearChangesMask(HonorLevel);
Base::ClearChangesMask(LogoutTime);
Base::ClearChangesMask(Name);
Base::ClearChangesMask(Field_1AC);
Base::ClearChangesMask(Field_1B0);
Base::ClearChangesMask(CurrentBattlePetSpeciesID);
Base::ClearChangesMask(CtrOptions);
Base::ClearChangesMask(CovenantID);
Base::ClearChangesMask(SoulbindID);
Base::ClearChangesMask(DungeonScore);
Base::ClearChangesMask(LeaverInfo);
Base::ClearChangesMask(SpectateTarget);
Base::ClearChangesMask(Field_200);
Base::ClearChangesMask(DeclinedNames);
Base::ClearChangesMask(PersonalTabard);
Base::ClearChangesMask(PartyType);
Base::ClearChangesMask(QuestLog);
Base::ClearChangesMask(VisibleItems);
Base::ClearChangesMask(AvgItemLevel);
Base::ClearChangesMask(ForcedReactions);
Base::ClearChangesMask(VisibleEquipableSpells);
Base::ClearChangesMask(Field_3120);
_changesMask.ResetAll();
}
void SkillInfo::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
for (uint32 i = 0; i < 256; ++i)
{
data << uint16(SkillLineID[i]);
data << uint16(SkillStep[i]);
data << uint16(SkillRank[i]);
data << uint16(SkillStartingRank[i]);
data << uint16(SkillMaxRank[i]);
data << int16(SkillTempBonus[i]);
data << uint16(SkillPermBonus[i]);
}
}
void SkillInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
for (uint32 i = 0; i < 1; ++i)
data << uint32(changesMask.GetBlocksMask(i));
data.WriteBits(changesMask.GetBlocksMask(1), 25);
for (uint32 i = 0; i < 57; ++i)
if (changesMask.GetBlock(i))
data.WriteBits(changesMask.GetBlock(i), 32);
data.FlushBits();
if (changesMask[0])
{
for (uint32 i = 0; i < 256; ++i)
{
if (changesMask[1 + i])
{
data << uint16(SkillLineID[i]);
}
if (changesMask[257 + i])
{
data << uint16(SkillStep[i]);
}
if (changesMask[513 + i])
{
data << uint16(SkillRank[i]);
}
if (changesMask[769 + i])
{
data << uint16(SkillStartingRank[i]);
}
if (changesMask[1025 + i])
{
data << uint16(SkillMaxRank[i]);
}
if (changesMask[1281 + i])
{
data << int16(SkillTempBonus[i]);
}
if (changesMask[1537 + i])
{
data << uint16(SkillPermBonus[i]);
}
}
}
}
void SkillInfo::ClearChangesMask()
{
Base::ClearChangesMask(SkillLineID);
Base::ClearChangesMask(SkillStep);
Base::ClearChangesMask(SkillRank);
Base::ClearChangesMask(SkillStartingRank);
Base::ClearChangesMask(SkillMaxRank);
Base::ClearChangesMask(SkillTempBonus);
Base::ClearChangesMask(SkillPermBonus);
_changesMask.ResetAll();
}
void BitVector::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << uint32(Values.size());
for (uint32 i = 0; i < Values.size(); ++i)
{
data << uint64(Values[i]);
}
}
void BitVector::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 2);
if (changesMask[0])
{
if (changesMask[1])
{
if (!ignoreChangesMask)
Values.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Values.size(), data);
}
}
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
for (uint32 i = 0; i < Values.size(); ++i)
{
if (Values.HasChanged(i) || ignoreChangesMask)
{
data << uint64(Values[i]);
}
}
}
}
}
void BitVector::ClearChangesMask()
{
Base::ClearChangesMask(Values);
_changesMask.ResetAll();
}
void BitVectors::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
for (uint32 i = 0; i < 13; ++i)
{
Values[i].WriteCreate(data, owner, receiver);
}
}
void BitVectors::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlocksMask(0), 1);
if (changesMask.GetBlock(0))
data.WriteBits(changesMask.GetBlock(0), 32);
data.FlushBits();
if (changesMask[0])
{
for (uint32 i = 0; i < 13; ++i)
{
if (changesMask[1 + i])
{
Values[i].WriteUpdate(data, ignoreChangesMask, owner, receiver);
}
}
}
}
void BitVectors::ClearChangesMask()
{
Base::ClearChangesMask(Values);
_changesMask.ResetAll();
}
void PlayerDataElement::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << uint32(Type);
if (Type == 1)
{
data << float(FloatValue);
}
if (Type == 0)
{
data << int64(Int64Value);
}
}
void PlayerDataElement::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
data << uint32(Type);
if (Type == 1)
{
data << float(FloatValue);
}
if (Type == 0)
{
data << int64(Int64Value);
}
}
bool PlayerDataElement::operator==(PlayerDataElement const& right) const
{
return Type == right.Type
&& FloatValue == right.FloatValue
&& Int64Value == right.Int64Value;
}
void RestInfo::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << uint32(Threshold);
data << uint8(StateID);
}
void RestInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 3);
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
data << uint32(Threshold);
}
if (changesMask[2])
{
data << uint8(StateID);
}
}
}
void RestInfo::ClearChangesMask()
{
Base::ClearChangesMask(Threshold);
Base::ClearChangesMask(StateID);
_changesMask.ResetAll();
}
void PVPInfo::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int8(Bracket);
data << int32(PvpRatingID);
data << uint32(WeeklyPlayed);
data << uint32(WeeklyWon);
data << uint32(SeasonPlayed);
data << uint32(SeasonWon);
data << uint32(Rating);
data << uint32(WeeklyBestRating);
data << uint32(SeasonBestRating);
data << uint32(PvpTierID);
data << uint32(WeeklyBestWinPvpTierID);
data << uint32(Field_28);
data << uint32(Field_2C);
data << uint32(WeeklyRoundsPlayed);
data << uint32(WeeklyRoundsWon);
data << uint32(SeasonRoundsPlayed);
data << uint32(SeasonRoundsWon);
data.WriteBit(Disqualified);
data.FlushBits();
}
void PVPInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 19);
if (changesMask[0])
{
if (changesMask[1])
{
data.WriteBit(Disqualified);
}
}
data.FlushBits();
if (changesMask[0])
{
if (changesMask[2])
{
data << int8(Bracket);
}
if (changesMask[3])
{
data << int32(PvpRatingID);
}
if (changesMask[4])
{
data << uint32(WeeklyPlayed);
}
if (changesMask[5])
{
data << uint32(WeeklyWon);
}
if (changesMask[6])
{
data << uint32(SeasonPlayed);
}
if (changesMask[7])
{
data << uint32(SeasonWon);
}
if (changesMask[8])
{
data << uint32(Rating);
}
if (changesMask[9])
{
data << uint32(WeeklyBestRating);
}
if (changesMask[10])
{
data << uint32(SeasonBestRating);
}
if (changesMask[11])
{
data << uint32(PvpTierID);
}
if (changesMask[12])
{
data << uint32(WeeklyBestWinPvpTierID);
}
if (changesMask[13])
{
data << uint32(Field_28);
}
if (changesMask[14])
{
data << uint32(Field_2C);
}
if (changesMask[15])
{
data << uint32(WeeklyRoundsPlayed);
}
if (changesMask[16])
{
data << uint32(WeeklyRoundsWon);
}
if (changesMask[17])
{
data << uint32(SeasonRoundsPlayed);
}
if (changesMask[18])
{
data << uint32(SeasonRoundsWon);
}
}
data.FlushBits();
}
void PVPInfo::ClearChangesMask()
{
Base::ClearChangesMask(Disqualified);
Base::ClearChangesMask(Bracket);
Base::ClearChangesMask(PvpRatingID);
Base::ClearChangesMask(WeeklyPlayed);
Base::ClearChangesMask(WeeklyWon);
Base::ClearChangesMask(SeasonPlayed);
Base::ClearChangesMask(SeasonWon);
Base::ClearChangesMask(Rating);
Base::ClearChangesMask(WeeklyBestRating);
Base::ClearChangesMask(SeasonBestRating);
Base::ClearChangesMask(PvpTierID);
Base::ClearChangesMask(WeeklyBestWinPvpTierID);
Base::ClearChangesMask(Field_28);
Base::ClearChangesMask(Field_2C);
Base::ClearChangesMask(WeeklyRoundsPlayed);
Base::ClearChangesMask(WeeklyRoundsWon);
Base::ClearChangesMask(SeasonRoundsPlayed);
Base::ClearChangesMask(SeasonRoundsWon);
_changesMask.ResetAll();
}
void CharacterRestriction::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int32(Field_0);
data << int32(Field_4);
data << int32(Field_8);
data.WriteBits(Type, 5);
data.FlushBits();
}
void CharacterRestriction::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
data << int32(Field_0);
data << int32(Field_4);
data << int32(Field_8);
data.WriteBits(Type, 5);
data.FlushBits();
}
bool CharacterRestriction::operator==(CharacterRestriction const& right) const
{
return Field_0 == right.Field_0
&& Field_4 == right.Field_4
&& Field_8 == right.Field_8
&& Type == right.Type;
}
void SpellPctModByLabel::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int32(ModIndex);
data << float(ModifierValue);
data << int32(LabelID);
}
void SpellPctModByLabel::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
data << int32(ModIndex);
data << float(ModifierValue);
data << int32(LabelID);
}
bool SpellPctModByLabel::operator==(SpellPctModByLabel const& right) const
{
return ModIndex == right.ModIndex
&& ModifierValue == right.ModifierValue
&& LabelID == right.LabelID;
}
void SpellFlatModByLabel::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int32(ModIndex);
data << int32(ModifierValue);
data << int32(LabelID);
}
void SpellFlatModByLabel::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
data << int32(ModIndex);
data << int32(ModifierValue);
data << int32(LabelID);
}
bool SpellFlatModByLabel::operator==(SpellFlatModByLabel const& right) const
{
return ModIndex == right.ModIndex
&& ModifierValue == right.ModifierValue
&& LabelID == right.LabelID;
}
void CompletedProject::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int64(FirstCompleted);
data << uint32(ProjectID);
data << uint32(CompletionCount);
}
void CompletedProject::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 4);
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
data << int64(FirstCompleted);
}
if (changesMask[2])
{
data << uint32(ProjectID);
}
if (changesMask[3])
{
data << uint32(CompletionCount);
}
}
}
void CompletedProject::ClearChangesMask()
{
Base::ClearChangesMask(ProjectID);
Base::ClearChangesMask(FirstCompleted);
Base::ClearChangesMask(CompletionCount);
_changesMask.ResetAll();
}
void ResearchHistory::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << uint32(CompletedProjects.size());
for (uint32 i = 0; i < CompletedProjects.size(); ++i)
{
CompletedProjects[i].WriteCreate(data, owner, receiver);
}
}
void ResearchHistory::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 2);
if (changesMask[0])
{
if (changesMask[1])
{
if (!ignoreChangesMask)
CompletedProjects.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(CompletedProjects.size(), data);
}
}
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
for (uint32 i = 0; i < CompletedProjects.size(); ++i)
{
if (CompletedProjects.HasChanged(i) || ignoreChangesMask)
{
CompletedProjects[i].WriteUpdate(data, ignoreChangesMask, owner, receiver);
}
}
}
}
}
void ResearchHistory::ClearChangesMask()
{
Base::ClearChangesMask(CompletedProjects);
_changesMask.ResetAll();
}
void MawPower::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int32(SpellID);
data << int32(MawPowerID);
data << int32(Stacks);
}
void MawPower::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
data << int32(SpellID);
data << int32(MawPowerID);
data << int32(Stacks);
}
bool MawPower::operator==(MawPower const& right) const
{
return SpellID == right.SpellID
&& MawPowerID == right.MawPowerID
&& Stacks == right.Stacks;
}
void MultiFloorExplore::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << uint32(WorldMapOverlayIDs.size());
for (uint32 i = 0; i < WorldMapOverlayIDs.size(); ++i)
{
data << int32(WorldMapOverlayIDs[i]);
}
}
void MultiFloorExplore::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
data << uint32(WorldMapOverlayIDs.size());
for (uint32 i = 0; i < WorldMapOverlayIDs.size(); ++i)
{
data << int32(WorldMapOverlayIDs[i]);
}
data.FlushBits();
}
bool MultiFloorExplore::operator==(MultiFloorExplore const& right) const
{
return WorldMapOverlayIDs == right.WorldMapOverlayIDs;
}
void RecipeProgressionInfo::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << uint16(RecipeProgressionGroupID);
data << uint16(Experience);
}
void RecipeProgressionInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
data << uint16(RecipeProgressionGroupID);
data << uint16(Experience);
}
bool RecipeProgressionInfo::operator==(RecipeProgressionInfo const& right) const
{
return RecipeProgressionGroupID == right.RecipeProgressionGroupID
&& Experience == right.Experience;
}
void ActivePlayerUnk901::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << *Field_0;
data << int32(Field_10);
}
void ActivePlayerUnk901::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 3);
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
data << *Field_0;
}
if (changesMask[2])
{
data << int32(Field_10);
}
}
}
void ActivePlayerUnk901::ClearChangesMask()
{
Base::ClearChangesMask(Field_0);
Base::ClearChangesMask(Field_10);
_changesMask.ResetAll();
}
void QuestSession::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << *Owner;
QuestCompleted->WriteCreate(data, owner, receiver);
}
void QuestSession::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 3);
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
data << *Owner;
}
if (changesMask[2])
{
QuestCompleted->WriteUpdate(data, ignoreChangesMask, owner, receiver);
}
}
}
void QuestSession::ClearChangesMask()
{
Base::ClearChangesMask(Owner);
Base::ClearChangesMask(QuestCompleted);
_changesMask.ResetAll();
}
void ReplayedQuest::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int32(QuestID);
data << uint32(ReplayTime);
}
void ReplayedQuest::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 3);
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
data << int32(QuestID);
}
if (changesMask[2])
{
data << uint32(ReplayTime);
}
}
}
void ReplayedQuest::ClearChangesMask()
{
Base::ClearChangesMask(QuestID);
Base::ClearChangesMask(ReplayTime);
_changesMask.ResetAll();
}
void TraitEntry::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int32(TraitNodeID);
data << int32(TraitNodeEntryID);
data << int32(Rank);
data << int32(GrantedRanks);
data << int32(BonusRanks);
}
void TraitEntry::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
data << int32(TraitNodeID);
data << int32(TraitNodeEntryID);
data << int32(Rank);
data << int32(GrantedRanks);
data << int32(BonusRanks);
}
bool TraitEntry::operator==(TraitEntry const& right) const
{
return TraitNodeID == right.TraitNodeID
&& TraitNodeEntryID == right.TraitNodeEntryID
&& Rank == right.Rank
&& GrantedRanks == right.GrantedRanks
&& BonusRanks == right.BonusRanks;
}
void TraitSubTreeCache::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int32(TraitSubTreeID);
data << uint32(Entries.size());
for (uint32 i = 0; i < Entries.size(); ++i)
{
Entries[i].WriteCreate(data, owner, receiver);
}
data.WriteBits(Active, 1);
data.FlushBits();
}
void TraitSubTreeCache::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
data << int32(TraitSubTreeID);
data << uint32(Entries.size());
for (uint32 i = 0; i < Entries.size(); ++i)
{
Entries[i].WriteUpdate(data, ignoreChangesMask, owner, receiver);
}
data.FlushBits();
data.WriteBits(Active, 1);
data.FlushBits();
}
bool TraitSubTreeCache::operator==(TraitSubTreeCache const& right) const
{
return Entries == right.Entries
&& TraitSubTreeID == right.TraitSubTreeID
&& Active == right.Active;
}
void TraitConfig::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int32(ID);
data << int32(Type);
data << uint32(Entries.size());
data << uint32(SubTrees.size());
if (Type == 2)
{
data << int32(SkillLineID);
}
if (Type == 1)
{
data << int32(ChrSpecializationID);
data << int32(CombatConfigFlags);
data << int32(LocalIdentifier);
}
if (Type == 3)
{
data << int32(TraitSystemID);
}
for (uint32 i = 0; i < Entries.size(); ++i)
{
Entries[i].WriteCreate(data, owner, receiver);
}
data.WriteBits(Name->size(), 9);
for (uint32 i = 0; i < SubTrees.size(); ++i)
{
SubTrees[i].WriteCreate(data, owner, receiver);
}
data << WorldPackets::SizedString::Data(*Name);
data.FlushBits();
}
void TraitConfig::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 14);
if (changesMask[0])
{
if (changesMask[1])
{
if (!ignoreChangesMask)
Entries.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Entries.size(), data);
}
if (changesMask[2])
{
if (!ignoreChangesMask)
SubTrees.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(SubTrees.size(), data);
}
}
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
for (uint32 i = 0; i < Entries.size(); ++i)
{
if (Entries.HasChanged(i) || ignoreChangesMask)
{
Entries[i].WriteUpdate(data, ignoreChangesMask, owner, receiver);
}
}
}
if (changesMask[2])
{
for (uint32 i = 0; i < SubTrees.size(); ++i)
{
if (SubTrees.HasChanged(i) || ignoreChangesMask)
{
SubTrees[i].WriteUpdate(data, ignoreChangesMask, owner, receiver);
}
}
}
if (changesMask[3])
{
data << int32(ID);
}
}
if (changesMask[4])
{
if (changesMask[6])
{
data << int32(Type);
}
if (changesMask[7])
{
if (Type == 2)
{
data << int32(SkillLineID);
}
}
}
if (changesMask[8])
{
if (changesMask[9])
{
if (Type == 1)
{
data << int32(ChrSpecializationID);
}
}
if (changesMask[10])
{
if (Type == 1)
{
data << int32(CombatConfigFlags);
}
}
if (changesMask[11])
{
if (Type == 1)
{
data << int32(LocalIdentifier);
}
}
}
if (changesMask[12])
{
if (changesMask[13])
{
if (Type == 3)
{
data << int32(TraitSystemID);
}
}
}
if (changesMask[4])
{
if (changesMask[5])
{
data.WriteBits(Name->size(), 9);
data << WorldPackets::SizedString::Data(*Name);
}
}
data.FlushBits();
}
void TraitConfig::ClearChangesMask()
{
Base::ClearChangesMask(Entries);
Base::ClearChangesMask(SubTrees);
Base::ClearChangesMask(ID);
Base::ClearChangesMask(Name);
Base::ClearChangesMask(Type);
Base::ClearChangesMask(SkillLineID);
Base::ClearChangesMask(ChrSpecializationID);
Base::ClearChangesMask(CombatConfigFlags);
Base::ClearChangesMask(LocalIdentifier);
Base::ClearChangesMask(TraitSystemID);
_changesMask.ResetAll();
}
void CraftingOrderItem::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << uint64(Field_0);
data << *ItemGUID;
data << *OwnerGUID;
data << int32(ItemID);
data << uint32(Quantity);
data << int32(ReagentQuality);
data.WriteBits(DataSlotIndex.has_value(), 1);
data.FlushBits();
if (DataSlotIndex.has_value())
{
data << uint8(DataSlotIndex);
}
}
void CraftingOrderItem::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 7);
data.FlushBits();
if (changesMask[0])
{
data << uint64(Field_0);
}
if (changesMask[1])
{
data << *ItemGUID;
}
if (changesMask[2])
{
data << *OwnerGUID;
}
if (changesMask[3])
{
data << int32(ItemID);
}
if (changesMask[4])
{
data << uint32(Quantity);
}
if (changesMask[5])
{
data << int32(ReagentQuality);
}
data.WriteBits(DataSlotIndex.has_value(), 1);
data.FlushBits();
if (changesMask[6])
{
if (DataSlotIndex.has_value())
{
data << uint8(DataSlotIndex);
}
}
}
void CraftingOrderItem::ClearChangesMask()
{
Base::ClearChangesMask(Field_0);
Base::ClearChangesMask(ItemGUID);
Base::ClearChangesMask(OwnerGUID);
Base::ClearChangesMask(ItemID);
Base::ClearChangesMask(Quantity);
Base::ClearChangesMask(ReagentQuality);
Base::ClearChangesMask(DataSlotIndex);
_changesMask.ResetAll();
}
void CraftingOrderCustomer::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << *CustomerGUID;
data << *CustomerAccountGUID;
}
void CraftingOrderCustomer::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 2);
data.FlushBits();
if (changesMask[0])
{
data << *CustomerGUID;
}
if (changesMask[1])
{
data << *CustomerAccountGUID;
}
}
void CraftingOrderCustomer::ClearChangesMask()
{
Base::ClearChangesMask(CustomerGUID);
Base::ClearChangesMask(CustomerAccountGUID);
_changesMask.ResetAll();
}
void CraftingOrderNpcCustomer::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int64(NpcCraftingOrderCustomerID);
data << int32(Field_8);
}
void CraftingOrderNpcCustomer::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 2);
data.FlushBits();
if (changesMask[0])
{
data << int64(NpcCraftingOrderCustomerID);
}
if (changesMask[1])
{
data << int32(Field_8);
}
}
void CraftingOrderNpcCustomer::ClearChangesMask()
{
Base::ClearChangesMask(NpcCraftingOrderCustomerID);
Base::ClearChangesMask(Field_8);
_changesMask.ResetAll();
}
void CraftingOrderData::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int32(Field_0);
data << uint64(OrderID);
data << int32(SkillLineAbilityID);
data << int32(OrderState);
data << uint8(OrderType);
data << uint8(MinQuality);
data << int64(ExpirationTime);
data << int64(ClaimEndTime);
data << int64(TipAmount);
data << int64(ConsortiumCut);
data << uint32(Flags);
data << *CrafterGUID;
data << *PersonalCrafterGUID;
data << int32(NpcCraftingOrderSetID);
data << int32(NpcTreasureID);
data << uint32(Reagents.size());
data.WriteBits(CustomerNotes->size(), 10);
data.WriteBits(Customer.has_value(), 1);
data.WriteBits(NpcCustomer.has_value(), 1);
data.WriteBits(OutputItem.has_value(), 1);
data.WriteBits(OutputItemData.has_value(), 1);
data.FlushBits();
for (uint32 i = 0; i < Reagents.size(); ++i)
{
Reagents[i].WriteCreate(data, owner, receiver);
}
data << WorldPackets::SizedString::Data(*CustomerNotes);
if (Customer.has_value())
{
Customer->WriteCreate(data, owner, receiver);
}
if (NpcCustomer.has_value())
{
NpcCustomer->WriteCreate(data, owner, receiver);
}
if (OutputItem.has_value())
{
OutputItem->WriteCreate(data, owner, receiver);
}
if (OutputItemData.has_value())
{
data << *OutputItemData;
}
data.FlushBits();
}
void CraftingOrderData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 26);
if (changesMask[0])
{
if (changesMask[1])
{
if (!ignoreChangesMask)
Reagents.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Reagents.size(), data);
}
}
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
for (uint32 i = 0; i < Reagents.size(); ++i)
{
if (Reagents.HasChanged(i) || ignoreChangesMask)
{
Reagents[i].WriteUpdate(data, ignoreChangesMask, owner, receiver);
}
}
}
if (changesMask[2])
{
data << int32(Field_0);
}
if (changesMask[3])
{
data << uint64(OrderID);
}
if (changesMask[4])
{
data << int32(SkillLineAbilityID);
}
if (changesMask[5])
{
data << int32(OrderState);
}
}
if (changesMask[6])
{
if (changesMask[7])
{
data << uint8(OrderType);
}
if (changesMask[8])
{
data << uint8(MinQuality);
}
if (changesMask[9])
{
data << int64(ExpirationTime);
}
if (changesMask[10])
{
data << int64(ClaimEndTime);
}
if (changesMask[11])
{
data << int64(TipAmount);
}
}
if (changesMask[12])
{
if (changesMask[13])
{
data << int64(ConsortiumCut);
}
if (changesMask[14])
{
data << uint32(Flags);
}
if (changesMask[15])
{
data << *CrafterGUID;
}
if (changesMask[16])
{
data << *PersonalCrafterGUID;
}
if (changesMask[17])
{
data << int32(NpcCraftingOrderSetID);
}
}
if (changesMask[18])
{
if (changesMask[19])
{
data << int32(NpcTreasureID);
}
if (changesMask[20])
{
data.WriteBits(CustomerNotes->size(), 10);
}
data.WriteBits(Customer.has_value(), 1);
data.WriteBits(NpcCustomer.has_value(), 1);
data.WriteBits(OutputItem.has_value(), 1);
}
if (changesMask[24])
{
data.WriteBits(OutputItemData.has_value(), 1);
}
if (changesMask[18])
{
if (changesMask[20])
{
data << WorldPackets::SizedString::Data(*CustomerNotes);
}
if (changesMask[21])
{
if (Customer.has_value())
{
Customer->WriteUpdate(data, ignoreChangesMask, owner, receiver);
}
}
if (changesMask[22])
{
if (NpcCustomer.has_value())
{
NpcCustomer->WriteUpdate(data, ignoreChangesMask, owner, receiver);
}
}
if (changesMask[23])
{
if (OutputItem.has_value())
{
OutputItem->WriteUpdate(data, ignoreChangesMask, owner, receiver);
}
}
}
if (changesMask[24])
{
if (changesMask[25])
{
if (OutputItemData.has_value())
{
data << *OutputItemData;
}
}
}
data.FlushBits();
}
void CraftingOrderData::ClearChangesMask()
{
Base::ClearChangesMask(Reagents);
Base::ClearChangesMask(Field_0);
Base::ClearChangesMask(OrderID);
Base::ClearChangesMask(SkillLineAbilityID);
Base::ClearChangesMask(OrderState);
Base::ClearChangesMask(OrderType);
Base::ClearChangesMask(MinQuality);
Base::ClearChangesMask(ExpirationTime);
Base::ClearChangesMask(ClaimEndTime);
Base::ClearChangesMask(TipAmount);
Base::ClearChangesMask(ConsortiumCut);
Base::ClearChangesMask(Flags);
Base::ClearChangesMask(CrafterGUID);
Base::ClearChangesMask(PersonalCrafterGUID);
Base::ClearChangesMask(NpcCraftingOrderSetID);
Base::ClearChangesMask(NpcTreasureID);
Base::ClearChangesMask(CustomerNotes);
Base::ClearChangesMask(Customer);
Base::ClearChangesMask(NpcCustomer);
Base::ClearChangesMask(OutputItem);
Base::ClearChangesMask(OutputItemData);
_changesMask.ResetAll();
}
void CraftingOrder::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
Data->WriteCreate(data, owner, receiver);
data.WriteBits(RecraftItemInfo.has_value(), 1);
data.WriteBits(Enchantments.size(), 4);
data.WriteBits(Gems.size(), 2);
data.FlushBits();
if (RecraftItemInfo.has_value())
{
data << *RecraftItemInfo;
}
for (uint32 i = 0; i < Enchantments.size(); ++i)
{
data << Enchantments[i];
}
for (uint32 i = 0; i < Gems.size(); ++i)
{
data << Gems[i];
}
data.FlushBits();
}
void CraftingOrder::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 4);
if (changesMask[0])
{
if (!ignoreChangesMask)
Enchantments.WriteUpdateMask(data, 4);
else
WriteCompleteDynamicFieldUpdateMask(Enchantments.size(), data, 4);
}
if (changesMask[1])
{
if (!ignoreChangesMask)
Gems.WriteUpdateMask(data, 2);
else
WriteCompleteDynamicFieldUpdateMask(Gems.size(), data, 2);
}
data.FlushBits();
if (changesMask[0])
{
for (uint32 i = 0; i < Enchantments.size(); ++i)
{
if (Enchantments.HasChanged(i) || ignoreChangesMask)
{
data << Enchantments[i];
}
}
}
if (changesMask[1])
{
for (uint32 i = 0; i < Gems.size(); ++i)
{
if (Gems.HasChanged(i) || ignoreChangesMask)
{
data << Gems[i];
}
}
}
if (changesMask[2])
{
Data->WriteUpdate(data, ignoreChangesMask, owner, receiver);
}
data.WriteBits(RecraftItemInfo.has_value(), 1);
data.FlushBits();
if (changesMask[3])
{
if (RecraftItemInfo.has_value())
{
data << *RecraftItemInfo;
}
}
data.FlushBits();
}
void CraftingOrder::ClearChangesMask()
{
Base::ClearChangesMask(Enchantments);
Base::ClearChangesMask(Gems);
Base::ClearChangesMask(Data);
Base::ClearChangesMask(RecraftItemInfo);
_changesMask.ResetAll();
}
void PersonalCraftingOrderCount::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int32(ProfessionID);
data << uint32(Count);
}
void PersonalCraftingOrderCount::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 2);
data.FlushBits();
if (changesMask[0])
{
data << int32(ProfessionID);
}
if (changesMask[1])
{
data << uint32(Count);
}
}
void PersonalCraftingOrderCount::ClearChangesMask()
{
Base::ClearChangesMask(ProfessionID);
Base::ClearChangesMask(Count);
_changesMask.ResetAll();
}
void NPCCraftingOrderInfo::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << uint64(OrderID);
data << int32(NpcCraftingOrderSetID);
data << int32(NpcTreasureID);
data << int32(NpcCraftingOrderCustomerID);
}
void NPCCraftingOrderInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 4);
data.FlushBits();
if (changesMask[0])
{
data << uint64(OrderID);
}
if (changesMask[1])
{
data << int32(NpcCraftingOrderSetID);
}
if (changesMask[2])
{
data << int32(NpcTreasureID);
}
if (changesMask[3])
{
data << int32(NpcCraftingOrderCustomerID);
}
}
void NPCCraftingOrderInfo::ClearChangesMask()
{
Base::ClearChangesMask(OrderID);
Base::ClearChangesMask(NpcCraftingOrderSetID);
Base::ClearChangesMask(NpcTreasureID);
Base::ClearChangesMask(NpcCraftingOrderCustomerID);
_changesMask.ResetAll();
}
void CategoryCooldownMod::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int32(SpellCategoryID);
data << int32(ModCooldown);
}
void CategoryCooldownMod::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
data << int32(SpellCategoryID);
data << int32(ModCooldown);
}
bool CategoryCooldownMod::operator==(CategoryCooldownMod const& right) const
{
return SpellCategoryID == right.SpellCategoryID
&& ModCooldown == right.ModCooldown;
}
void WeeklySpellUse::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int32(SpellCategoryID);
data << uint8(Uses);
}
void WeeklySpellUse::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
data << int32(SpellCategoryID);
data << uint8(Uses);
}
bool WeeklySpellUse::operator==(WeeklySpellUse const& right) const
{
return SpellCategoryID == right.SpellCategoryID
&& Uses == right.Uses;
}
void StablePetInfo::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << uint32(PetSlot);
data << uint32(PetNumber);
data << uint32(CreatureID);
data << uint32(DisplayID);
data << uint32(ExperienceLevel);
data << uint8(PetFlags);
data << uint32(Specialization);
data.WriteBits(Name->size(), 8);
data << WorldPackets::SizedString::Data(*Name);
data.FlushBits();
}
void StablePetInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 9);
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
data << uint32(PetSlot);
}
if (changesMask[2])
{
data << uint32(PetNumber);
}
if (changesMask[3])
{
data << uint32(CreatureID);
}
if (changesMask[4])
{
data << uint32(DisplayID);
}
if (changesMask[5])
{
data << uint32(ExperienceLevel);
}
if (changesMask[7])
{
data << uint8(PetFlags);
}
if (changesMask[8])
{
data << uint32(Specialization);
}
if (changesMask[6])
{
data.WriteBits(Name->size(), 8);
data << WorldPackets::SizedString::Data(*Name);
}
}
data.FlushBits();
}
void StablePetInfo::ClearChangesMask()
{
Base::ClearChangesMask(PetSlot);
Base::ClearChangesMask(PetNumber);
Base::ClearChangesMask(CreatureID);
Base::ClearChangesMask(DisplayID);
Base::ClearChangesMask(ExperienceLevel);
Base::ClearChangesMask(Name);
Base::ClearChangesMask(PetFlags);
Base::ClearChangesMask(Specialization);
_changesMask.ResetAll();
}
void StableInfo::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << uint32(Pets.size());
data << *StableMaster;
for (uint32 i = 0; i < Pets.size(); ++i)
{
Pets[i].WriteCreate(data, owner, receiver);
}
}
void StableInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 3);
if (changesMask[0])
{
if (changesMask[1])
{
if (!ignoreChangesMask)
Pets.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Pets.size(), data);
}
}
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
for (uint32 i = 0; i < Pets.size(); ++i)
{
if (Pets.HasChanged(i) || ignoreChangesMask)
{
Pets[i].WriteUpdate(data, ignoreChangesMask, owner, receiver);
}
}
}
if (changesMask[2])
{
data << *StableMaster;
}
}
}
void StableInfo::ClearChangesMask()
{
Base::ClearChangesMask(Pets);
Base::ClearChangesMask(StableMaster);
_changesMask.ResetAll();
}
void CollectableSourceTrackedData::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int32(TargetType);
data << int32(TargetID);
data << int32(CollectableSourceInfoID);
}
void CollectableSourceTrackedData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 4);
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
data << int32(TargetType);
}
if (changesMask[2])
{
data << int32(TargetID);
}
if (changesMask[3])
{
data << int32(CollectableSourceInfoID);
}
}
}
void CollectableSourceTrackedData::ClearChangesMask()
{
Base::ClearChangesMask(TargetType);
Base::ClearChangesMask(TargetID);
Base::ClearChangesMask(CollectableSourceInfoID);
_changesMask.ResetAll();
}
void BankTabSettings::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data.WriteBits(Name->size(), 7);
data.WriteBits(Icon->size(), 9);
data.WriteBits(Description->size(), 14);
data << int32(DepositFlags);
data << WorldPackets::SizedString::Data(*Name);
data << WorldPackets::SizedString::Data(*Icon);
data << WorldPackets::SizedString::Data(*Description);
data.FlushBits();
}
void BankTabSettings::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 4);
if (changesMask[0])
{
data.WriteBits(Name->size(), 7);
}
if (changesMask[1])
{
data.WriteBits(Icon->size(), 9);
}
if (changesMask[2])
{
data.WriteBits(Description->size(), 14);
}
data.FlushBits();
if (changesMask[3])
{
data << int32(DepositFlags);
}
if (changesMask[0])
{
data << WorldPackets::SizedString::Data(*Name);
}
if (changesMask[1])
{
data << WorldPackets::SizedString::Data(*Icon);
}
if (changesMask[2])
{
data << WorldPackets::SizedString::Data(*Description);
}
data.FlushBits();
}
void BankTabSettings::ClearChangesMask()
{
Base::ClearChangesMask(Name);
Base::ClearChangesMask(Icon);
Base::ClearChangesMask(Description);
Base::ClearChangesMask(DepositFlags);
_changesMask.ResetAll();
}
void WalkInData::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int32(MapID);
data << int64(Field_8);
data << Field_18;
data.WriteBits(Type, 1);
data.FlushBits();
}
void WalkInData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
data << int32(MapID);
data << int64(Field_8);
data << Field_18;
data.WriteBits(Type, 1);
data.FlushBits();
}
bool WalkInData::operator==(WalkInData const& right) const
{
return MapID == right.MapID
&& Field_8 == right.Field_8
&& Type == right.Type
&& Field_18 == right.Field_18;
}
void DelveData::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int32(Field_0);
data << uint64(Field_8);
data << int32(Field_10);
data << int32(SpellID);
data << uint32(Owners.size());
for (uint32 i = 0; i < Owners.size(); ++i)
{
data << Owners[i];
}
data.WriteBits(Started, 1);
data.FlushBits();
}
void DelveData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
data.FlushBits();
data << int32(Field_0);
data << uint64(Field_8);
data << int32(Field_10);
data << int32(SpellID);
data << uint32(Owners.size());
for (uint32 i = 0; i < Owners.size(); ++i)
{
data << Owners[i];
}
data.WriteBits(Started, 1);
data.FlushBits();
}
bool DelveData::operator==(DelveData const& right) const
{
return Owners == right.Owners
&& Field_0 == right.Field_0
&& Field_8 == right.Field_8
&& Field_10 == right.Field_10
&& SpellID == right.SpellID
&& Started == right.Started;
}
void ChallengeModeData::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int32(Unknown_1120_1);
data << int32(Unknown_1120_2);
data << uint64(Unknown_1120_3);
data << int64(Unknown_1120_4);
data << KeystoneOwnerGUID;
data << LeaverGUID;
data.WriteBits(IsActive, 1);
data.WriteBits(HasRestrictions, 1);
data.WriteBits(CanVoteAbandon, 1);
data.FlushBits();
}
void ChallengeModeData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
data << int32(Unknown_1120_1);
data << int32(Unknown_1120_2);
data << uint64(Unknown_1120_3);
data << int64(Unknown_1120_4);
data << KeystoneOwnerGUID;
data << LeaverGUID;
data.WriteBits(IsActive, 1);
data.WriteBits(HasRestrictions, 1);
data.WriteBits(CanVoteAbandon, 1);
data.FlushBits();
}
bool ChallengeModeData::operator==(ChallengeModeData const& right) const
{
return Unknown_1120_1 == right.Unknown_1120_1
&& Unknown_1120_2 == right.Unknown_1120_2
&& Unknown_1120_3 == right.Unknown_1120_3
&& Unknown_1120_4 == right.Unknown_1120_4
&& KeystoneOwnerGUID == right.KeystoneOwnerGUID
&& LeaverGUID == right.LeaverGUID
&& IsActive == right.IsActive
&& HasRestrictions == right.HasRestrictions
&& CanVoteAbandon == right.CanVoteAbandon;
}
void Research::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int16(ResearchProjectID);
}
void Research::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
data << int16(ResearchProjectID);
}
bool Research::operator==(Research const& right) const
{
return ResearchProjectID == right.ResearchProjectID;
}
void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, Player const* owner, Player const* receiver) const
{
for (uint32 i = 0; i < 105; ++i)
{
data << InvSlots[i];
}
data << *FarsightObject;
data << *SummonedBattlePetGUID;
data << uint32(KnownTitles.size());
data << uint64(Coinage);
data << uint64(AccountBankCoinage);
data << int32(XP);
data << int32(NextLevelXP);
data << int32(TrialXP);
Skill->WriteCreate(data, owner, receiver);
data << int32(CharacterPoints);
data << int32(MaxTalentTiers);
data << uint32(TrackCreatureMask);
data << float(MainhandExpertise);
data << float(OffhandExpertise);
data << float(RangedExpertise);
data << float(CombatRatingExpertise);
data << float(BlockPercentage);
data << float(DodgePercentage);
data << float(DodgePercentageFromAttribute);
data << float(ParryPercentage);
data << float(ParryPercentageFromAttribute);
data << float(CritPercentage);
data << float(RangedCritPercentage);
data << float(OffhandCritPercentage);
data << float(SpellCritPercentage);
data << int32(ShieldBlock);
data << float(ShieldBlockCritPercentage);
data << float(Mastery);
data << float(Speed);
data << float(Avoidance);
data << float(Sturdiness);
data << int32(Versatility);
data << float(VersatilityBonus);
data << float(PvpPowerDamage);
data << float(PvpPowerHealing);
BitVectors->WriteCreate(data, owner, receiver);
data << uint32(CharacterDataElements.size());
data << uint32(AccountDataElements.size());
for (uint32 i = 0; i < 2; ++i)
{
RestInfo[i].WriteCreate(data, owner, receiver);
}
for (uint32 i = 0; i < 7; ++i)
{
data << int32(ModDamageDonePos[i]);
data << int32(ModDamageDoneNeg[i]);
data << float(ModDamageDonePercent[i]);
data << float(ModHealingDonePercent[i]);
}
data << int32(ModHealingDonePos);
data << float(ModHealingPercent);
data << float(ModPeriodicHealingDonePercent);
for (uint32 i = 0; i < 3; ++i)
{
data << float(WeaponDmgMultipliers[i]);
data << float(WeaponAtkSpeedMultipliers[i]);
}
data << float(ModSpellPowerPercent);
data << float(ModResiliencePercent);
data << float(OverrideSpellPowerByAPPercent);
data << float(OverrideAPBySpellPowerPercent);
data << int32(ModTargetResistance);
data << int32(ModTargetPhysicalResistance);
data << uint32(LocalFlags);
data << uint8(GrantableLevels);
data << uint8(MultiActionBars);
data << uint8(LifetimeMaxRank);
data << uint8(NumRespecs);
data << uint32(PvpMedals);
for (uint32 i = 0; i < 12; ++i)
{
data << uint32(BuybackPrice[i]);
data << int64(BuybackTimestamp[i]);
}
data << uint16(TodayHonorableKills);
data << uint16(YesterdayHonorableKills);
data << uint32(LifetimeHonorableKills);
data << int32(WatchedFactionIndex);
for (uint32 i = 0; i < 32; ++i)
{
data << int32(CombatRatings[i]);
}
data << uint32(PvpInfo.size());
data << int32(MaxLevel);
data << int32(ScalingPlayerLevelDelta);
data << int32(MaxCreatureScalingLevel);
for (uint32 i = 0; i < 4; ++i)
{
data << uint32(NoReagentCostMask[i]);
}
data << int32(PetSpellPower);
for (uint32 i = 0; i < 2; ++i)
{
data << int32(ProfessionSkillLine[i]);
}
data << float(UiHitModifier);
data << float(UiSpellHitModifier);
data << int32(HomeRealmTimeOffset);
data << float(ModPetHaste);
data << int8(JailersTowerLevelMax);
data << int8(JailersTowerLevel);
data << uint8(LocalRegenFlags);
data << uint8(AuraVision);
data << uint8(NumBackpackSlots);
data << int32(OverrideSpellsID);
data << uint16(LootSpecID);
data << uint32(OverrideZonePVPType);
for (uint32 i = 0; i < 5; ++i)
{
data << uint32(BagSlotFlags[i]);
}
data << int32(Honor);
data << int32(HonorNextLevel);
data << int32(PerksProgramCurrency);
data << uint8(NumBankSlots);
data << uint8(NumCharacterBankTabs);
data << uint8(NumAccountBankTabs);
for (uint32 i = 0; i < 1; ++i)
{
data << uint32(ResearchSites[i].size());
data << uint32(ResearchSiteProgress[i].size());
data << uint32(Research[i].size());
for (uint32 j = 0; j < ResearchSites[i].size(); ++j)
{
data << uint16(ResearchSites[i][j]);
}
for (uint32 j = 0; j < ResearchSiteProgress[i].size(); ++j)
{
data << uint32(ResearchSiteProgress[i][j]);
}
for (uint32 j = 0; j < Research[i].size(); ++j)
{
Research[i][j].WriteCreate(data, owner, receiver);
}
}
data << uint32(DailyQuestsCompleted.size());
data << uint32(Field_1328.size());
data << uint32(AvailableQuestLineXQuestIDs.size());
data << uint32(Heirlooms.size());
data << uint32(HeirloomFlags.size());
data << uint32(Toys.size());
data << uint32(ToyFlags.size());
data << uint32(Transmog.size());
data << uint32(ConditionalTransmog.size());
data << uint32(SelfResSpells.size());
data << uint32(RuneforgePowers.size());
data << uint32(TransmogIllusions.size());
data << uint32(WarbandScenes.size());
data << uint32(CharacterRestrictions.size());
data << uint32(SpellPctModByLabel.size());
data << uint32(SpellFlatModByLabel.size());
data << uint32(MawPowers.size());
data << uint32(MultiFloorExploration.size());
data << uint32(RecipeProgression.size());
data << uint32(ReplayedQuests.size());
data << uint32(TaskQuests.size());
data << uint32(DisabledSpells.size());
data << int32(UiChromieTimeExpansionID);
data << int32(TimerunningSeasonID);
data << int32(TransportServerTime);
data << uint32(WeeklyRewardsPeriodSinceOrigin);
data << int16(DEBUGSoulbindConduitRank);
data << uint32(TraitConfigs.size());
data << uint32(ActiveCombatTraitConfigID);
data << uint32(CraftingOrders.size());
data << uint32(PersonalCraftingOrderCounts.size());
data << uint32(NpcCraftingOrders.size());
data << uint32(CategoryCooldownMods.size());
data << uint32(WeeklySpellUses.size());
for (uint32 i = 0; i < 17; ++i)
{
data << float(ItemUpgradeHighWatermark[i]);
}
data << int32(ItemUpgradeHighOnehandWeaponItemID);
data << int32(ItemUpgradeHighFingerItemID);
data << float(ItemUpgradeHighFingerWatermark);
data << int32(ItemUpgradeHighTrinketItemID);
data << float(ItemUpgradeHighTrinketWatermark);
data << uint64(LootHistoryInstanceID);
data << uint32(TrackedCollectableSources.size());
data << uint8(RequiredMountCapabilityFlags);
for (uint32 i = 0; i < KnownTitles.size(); ++i)
{
data << uint64(KnownTitles[i]);
}
for (uint32 i = 0; i < CharacterDataElements.size(); ++i)
{
CharacterDataElements[i].WriteCreate(data, owner, receiver);
}
for (uint32 i = 0; i < AccountDataElements.size(); ++i)
{
AccountDataElements[i].WriteCreate(data, owner, receiver);
}
for (uint32 i = 0; i < DailyQuestsCompleted.size(); ++i)
{
data << int32(DailyQuestsCompleted[i]);
}
for (uint32 i = 0; i < Field_1328.size(); ++i)
{
data << int32(Field_1328[i]);
}
for (uint32 i = 0; i < AvailableQuestLineXQuestIDs.size(); ++i)
{
data << int32(AvailableQuestLineXQuestIDs[i]);
}
for (uint32 i = 0; i < Heirlooms.size(); ++i)
{
data << int32(Heirlooms[i]);
}
for (uint32 i = 0; i < HeirloomFlags.size(); ++i)
{
data << uint32(HeirloomFlags[i]);
}
for (uint32 i = 0; i < Toys.size(); ++i)
{
data << int32(Toys[i]);
}
for (uint32 i = 0; i < ToyFlags.size(); ++i)
{
data << uint32(ToyFlags[i]);
}
for (uint32 i = 0; i < Transmog.size(); ++i)
{
data << uint32(Transmog[i]);
}
for (uint32 i = 0; i < ConditionalTransmog.size(); ++i)
{
data << int32(ConditionalTransmog[i]);
}
for (uint32 i = 0; i < SelfResSpells.size(); ++i)
{
data << int32(SelfResSpells[i]);
}
for (uint32 i = 0; i < RuneforgePowers.size(); ++i)
{
data << uint32(RuneforgePowers[i]);
}
for (uint32 i = 0; i < TransmogIllusions.size(); ++i)
{
data << uint32(TransmogIllusions[i]);
}
for (uint32 i = 0; i < WarbandScenes.size(); ++i)
{
data << uint32(WarbandScenes[i]);
}
for (uint32 i = 0; i < SpellPctModByLabel.size(); ++i)
{
SpellPctModByLabel[i].WriteCreate(data, owner, receiver);
}
for (uint32 i = 0; i < SpellFlatModByLabel.size(); ++i)
{
SpellFlatModByLabel[i].WriteCreate(data, owner, receiver);
}
for (uint32 i = 0; i < MawPowers.size(); ++i)
{
MawPowers[i].WriteCreate(data, owner, receiver);
}
for (uint32 i = 0; i < MultiFloorExploration.size(); ++i)
{
MultiFloorExploration[i].WriteCreate(data, owner, receiver);
}
for (uint32 i = 0; i < RecipeProgression.size(); ++i)
{
RecipeProgression[i].WriteCreate(data, owner, receiver);
}
for (uint32 i = 0; i < ReplayedQuests.size(); ++i)
{
ReplayedQuests[i].WriteCreate(data, owner, receiver);
}
for (uint32 i = 0; i < TaskQuests.size(); ++i)
{
TaskQuests[i].WriteCreate(data, owner, receiver);
}
for (uint32 i = 0; i < DisabledSpells.size(); ++i)
{
data << int32(DisabledSpells[i]);
}
for (uint32 i = 0; i < PersonalCraftingOrderCounts.size(); ++i)
{
PersonalCraftingOrderCounts[i].WriteCreate(data, owner, receiver);
}
for (uint32 i = 0; i < NpcCraftingOrders.size(); ++i)
{
NpcCraftingOrders[i].WriteCreate(data, owner, receiver);
}
for (uint32 i = 0; i < CategoryCooldownMods.size(); ++i)
{
CategoryCooldownMods[i].WriteCreate(data, owner, receiver);
}
for (uint32 i = 0; i < WeeklySpellUses.size(); ++i)
{
WeeklySpellUses[i].WriteCreate(data, owner, receiver);
}
for (uint32 i = 0; i < TrackedCollectableSources.size(); ++i)
{
TrackedCollectableSources[i].WriteCreate(data, owner, receiver);
}
data.FlushBits();
data.WriteBit(BackpackAutoSortDisabled);
data.WriteBit(BackpackSellJunkDisabled);
data.WriteBit(BankAutoSortDisabled);
data.WriteBit(SortBagsRightToLeft);
data.WriteBit(InsertItemsLeftToRight);
data.WriteBit(HasPerksProgramPendingReward);
data.WriteBits(QuestSession.has_value(), 1);
data.WriteBits(PetStable.has_value(), 1);
data.WriteBits(CharacterBankTabSettings.size(), 3);
data.WriteBits(AccountBankTabSettings.size(), 3);
data.WriteBits(WalkInData.has_value(), 1);
data.WriteBits(DelveData.has_value(), 1);
data.WriteBits(ChallengeModeData.has_value(), 1);
data.FlushBits();
ResearchHistory->WriteCreate(data, owner, receiver);
if (QuestSession.has_value())
{
QuestSession->WriteCreate(data, owner, receiver);
}
data << *FrozenPerksVendorItem;
Field_1410->WriteCreate(data, owner, receiver);
data << *DungeonScore;
for (uint32 i = 0; i < PvpInfo.size(); ++i)
{
PvpInfo[i].WriteCreate(data, owner, receiver);
}
for (uint32 i = 0; i < CharacterRestrictions.size(); ++i)
{
CharacterRestrictions[i].WriteCreate(data, owner, receiver);
}
for (uint32 i = 0; i < TraitConfigs.size(); ++i)
{
TraitConfigs[i].WriteCreate(data, owner, receiver);
}
for (uint32 i = 0; i < CraftingOrders.size(); ++i)
{
CraftingOrders[i].WriteCreate(data, owner, receiver);
}
if (PetStable.has_value())
{
PetStable->WriteCreate(data, owner, receiver);
}
for (uint32 i = 0; i < CharacterBankTabSettings.size(); ++i)
{
CharacterBankTabSettings[i].WriteCreate(data, owner, receiver);
}
for (uint32 i = 0; i < AccountBankTabSettings.size(); ++i)
{
AccountBankTabSettings[i].WriteCreate(data, owner, receiver);
}
if (WalkInData.has_value())
{
WalkInData->WriteCreate(data, owner, receiver);
}
if (DelveData.has_value())
{
DelveData->WriteCreate(data, owner, receiver);
}
if (ChallengeModeData.has_value())
{
ChallengeModeData->WriteCreate(data, owner, receiver);
}
data.FlushBits();
}
void ActivePlayerData::WriteUpdate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, Player const* owner, Player const* receiver) const
{
WriteUpdate(data, _changesMask, false, owner, receiver);
}
void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, Player const* owner, Player const* receiver) const
{
data.WriteBits(changesMask.GetBlocksMask(0), 13);
for (uint32 i = 0; i < 13; ++i)
if (changesMask.GetBlock(i))
data.WriteBits(changesMask.GetBlock(i), 32);
if (changesMask[0])
{
if (changesMask[1])
{
data.WriteBit(BackpackAutoSortDisabled);
}
if (changesMask[2])
{
data.WriteBit(BackpackSellJunkDisabled);
}
if (changesMask[3])
{
data.WriteBit(BankAutoSortDisabled);
}
if (changesMask[4])
{
data.WriteBit(SortBagsRightToLeft);
}
if (changesMask[5])
{
data.WriteBit(InsertItemsLeftToRight);
}
if (changesMask[6])
{
data.WriteBit(HasPerksProgramPendingReward);
}
if (changesMask[7])
{
if (!ignoreNestedChangesMask)
KnownTitles.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(KnownTitles.size(), data);
}
if (changesMask[8])
{
if (!ignoreNestedChangesMask)
CharacterDataElements.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(CharacterDataElements.size(), data);
}
if (changesMask[9])
{
if (!ignoreNestedChangesMask)
AccountDataElements.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(AccountDataElements.size(), data);
}
if (changesMask[10])
{
if (!ignoreNestedChangesMask)
PvpInfo.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(PvpInfo.size(), data);
}
}
if (changesMask[43])
{
for (uint32 i = 0; i < 1; ++i)
{
if (changesMask[44])
{
if (!ignoreNestedChangesMask)
ResearchSites[i].WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ResearchSites[i].size(), data);
}
}
}
if (changesMask[45])
{
for (uint32 i = 0; i < 1; ++i)
{
if (changesMask[46])
{
if (!ignoreNestedChangesMask)
ResearchSiteProgress[i].WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ResearchSiteProgress[i].size(), data);
}
}
}
if (changesMask[47])
{
for (uint32 i = 0; i < 1; ++i)
{
if (changesMask[48])
{
if (!ignoreNestedChangesMask)
Research[i].WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Research[i].size(), data);
}
}
}
if (changesMask[43])
{
for (uint32 i = 0; i < 1; ++i)
{
if (changesMask[44])
{
for (uint32 j = 0; j < ResearchSites[i].size(); ++j)
{
if (ResearchSites[i].HasChanged(j) || ignoreNestedChangesMask)
{
data << uint16(ResearchSites[i][j]);
}
}
}
}
}
if (changesMask[45])
{
for (uint32 i = 0; i < 1; ++i)
{
if (changesMask[46])
{
for (uint32 j = 0; j < ResearchSiteProgress[i].size(); ++j)
{
if (ResearchSiteProgress[i].HasChanged(j) || ignoreNestedChangesMask)
{
data << uint32(ResearchSiteProgress[i][j]);
}
}
}
}
}
if (changesMask[47])
{
for (uint32 i = 0; i < 1; ++i)
{
if (changesMask[48])
{
for (uint32 j = 0; j < Research[i].size(); ++j)
{
if (Research[i].HasChanged(j) || ignoreNestedChangesMask)
{
Research[i][j].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
}
}
data.FlushBits();
if (changesMask[0])
{
if (changesMask[11])
{
if (!ignoreNestedChangesMask)
DailyQuestsCompleted.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(DailyQuestsCompleted.size(), data);
}
if (changesMask[12])
{
if (!ignoreNestedChangesMask)
Field_1328.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Field_1328.size(), data);
}
if (changesMask[13])
{
if (!ignoreNestedChangesMask)
AvailableQuestLineXQuestIDs.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(AvailableQuestLineXQuestIDs.size(), data);
}
if (changesMask[14])
{
if (!ignoreNestedChangesMask)
Heirlooms.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Heirlooms.size(), data);
}
if (changesMask[15])
{
if (!ignoreNestedChangesMask)
HeirloomFlags.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(HeirloomFlags.size(), data);
}
if (changesMask[16])
{
if (!ignoreNestedChangesMask)
Toys.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Toys.size(), data);
}
if (changesMask[17])
{
if (!ignoreNestedChangesMask)
ToyFlags.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ToyFlags.size(), data);
}
if (changesMask[18])
{
if (!ignoreNestedChangesMask)
Transmog.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Transmog.size(), data);
}
if (changesMask[19])
{
if (!ignoreNestedChangesMask)
ConditionalTransmog.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ConditionalTransmog.size(), data);
}
if (changesMask[20])
{
if (!ignoreNestedChangesMask)
SelfResSpells.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(SelfResSpells.size(), data);
}
if (changesMask[21])
{
if (!ignoreNestedChangesMask)
RuneforgePowers.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(RuneforgePowers.size(), data);
}
if (changesMask[22])
{
if (!ignoreNestedChangesMask)
TransmogIllusions.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(TransmogIllusions.size(), data);
}
if (changesMask[23])
{
if (!ignoreNestedChangesMask)
WarbandScenes.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(WarbandScenes.size(), data);
}
if (changesMask[24])
{
if (!ignoreNestedChangesMask)
CharacterRestrictions.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(CharacterRestrictions.size(), data);
}
if (changesMask[25])
{
if (!ignoreNestedChangesMask)
SpellPctModByLabel.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(SpellPctModByLabel.size(), data);
}
if (changesMask[26])
{
if (!ignoreNestedChangesMask)
SpellFlatModByLabel.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(SpellFlatModByLabel.size(), data);
}
if (changesMask[27])
{
if (!ignoreNestedChangesMask)
MawPowers.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(MawPowers.size(), data);
}
if (changesMask[28])
{
if (!ignoreNestedChangesMask)
MultiFloorExploration.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(MultiFloorExploration.size(), data);
}
if (changesMask[29])
{
if (!ignoreNestedChangesMask)
RecipeProgression.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(RecipeProgression.size(), data);
}
if (changesMask[30])
{
if (!ignoreNestedChangesMask)
ReplayedQuests.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ReplayedQuests.size(), data);
}
if (changesMask[31])
{
if (!ignoreNestedChangesMask)
TaskQuests.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(TaskQuests.size(), data);
}
}
if (changesMask[32])
{
if (changesMask[33])
{
if (!ignoreNestedChangesMask)
DisabledSpells.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(DisabledSpells.size(), data);
}
if (changesMask[34])
{
if (!ignoreNestedChangesMask)
TraitConfigs.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(TraitConfigs.size(), data);
}
if (changesMask[35])
{
if (!ignoreNestedChangesMask)
CraftingOrders.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(CraftingOrders.size(), data);
}
if (changesMask[36])
{
if (!ignoreNestedChangesMask)
PersonalCraftingOrderCounts.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(PersonalCraftingOrderCounts.size(), data);
}
if (changesMask[37])
{
if (!ignoreNestedChangesMask)
NpcCraftingOrders.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(NpcCraftingOrders.size(), data);
}
if (changesMask[38])
{
if (!ignoreNestedChangesMask)
CategoryCooldownMods.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(CategoryCooldownMods.size(), data);
}
if (changesMask[39])
{
if (!ignoreNestedChangesMask)
WeeklySpellUses.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(WeeklySpellUses.size(), data);
}
if (changesMask[40])
{
if (!ignoreNestedChangesMask)
TrackedCollectableSources.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(TrackedCollectableSources.size(), data);
}
}
data.FlushBits();
if (changesMask[0])
{
if (changesMask[7])
{
for (uint32 i = 0; i < KnownTitles.size(); ++i)
{
if (KnownTitles.HasChanged(i) || ignoreNestedChangesMask)
{
data << uint64(KnownTitles[i]);
}
}
}
if (changesMask[8])
{
for (uint32 i = 0; i < CharacterDataElements.size(); ++i)
{
if (CharacterDataElements.HasChanged(i) || ignoreNestedChangesMask)
{
CharacterDataElements[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[9])
{
for (uint32 i = 0; i < AccountDataElements.size(); ++i)
{
if (AccountDataElements.HasChanged(i) || ignoreNestedChangesMask)
{
AccountDataElements[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[11])
{
for (uint32 i = 0; i < DailyQuestsCompleted.size(); ++i)
{
if (DailyQuestsCompleted.HasChanged(i) || ignoreNestedChangesMask)
{
data << int32(DailyQuestsCompleted[i]);
}
}
}
if (changesMask[12])
{
for (uint32 i = 0; i < Field_1328.size(); ++i)
{
if (Field_1328.HasChanged(i) || ignoreNestedChangesMask)
{
data << int32(Field_1328[i]);
}
}
}
if (changesMask[13])
{
for (uint32 i = 0; i < AvailableQuestLineXQuestIDs.size(); ++i)
{
if (AvailableQuestLineXQuestIDs.HasChanged(i) || ignoreNestedChangesMask)
{
data << int32(AvailableQuestLineXQuestIDs[i]);
}
}
}
if (changesMask[14])
{
for (uint32 i = 0; i < Heirlooms.size(); ++i)
{
if (Heirlooms.HasChanged(i) || ignoreNestedChangesMask)
{
data << int32(Heirlooms[i]);
}
}
}
if (changesMask[15])
{
for (uint32 i = 0; i < HeirloomFlags.size(); ++i)
{
if (HeirloomFlags.HasChanged(i) || ignoreNestedChangesMask)
{
data << uint32(HeirloomFlags[i]);
}
}
}
if (changesMask[16])
{
for (uint32 i = 0; i < Toys.size(); ++i)
{
if (Toys.HasChanged(i) || ignoreNestedChangesMask)
{
data << int32(Toys[i]);
}
}
}
if (changesMask[17])
{
for (uint32 i = 0; i < ToyFlags.size(); ++i)
{
if (ToyFlags.HasChanged(i) || ignoreNestedChangesMask)
{
data << uint32(ToyFlags[i]);
}
}
}
if (changesMask[18])
{
for (uint32 i = 0; i < Transmog.size(); ++i)
{
if (Transmog.HasChanged(i) || ignoreNestedChangesMask)
{
data << uint32(Transmog[i]);
}
}
}
if (changesMask[19])
{
for (uint32 i = 0; i < ConditionalTransmog.size(); ++i)
{
if (ConditionalTransmog.HasChanged(i) || ignoreNestedChangesMask)
{
data << int32(ConditionalTransmog[i]);
}
}
}
if (changesMask[20])
{
for (uint32 i = 0; i < SelfResSpells.size(); ++i)
{
if (SelfResSpells.HasChanged(i) || ignoreNestedChangesMask)
{
data << int32(SelfResSpells[i]);
}
}
}
if (changesMask[21])
{
for (uint32 i = 0; i < RuneforgePowers.size(); ++i)
{
if (RuneforgePowers.HasChanged(i) || ignoreNestedChangesMask)
{
data << uint32(RuneforgePowers[i]);
}
}
}
if (changesMask[22])
{
for (uint32 i = 0; i < TransmogIllusions.size(); ++i)
{
if (TransmogIllusions.HasChanged(i) || ignoreNestedChangesMask)
{
data << uint32(TransmogIllusions[i]);
}
}
}
if (changesMask[23])
{
for (uint32 i = 0; i < WarbandScenes.size(); ++i)
{
if (WarbandScenes.HasChanged(i) || ignoreNestedChangesMask)
{
data << uint32(WarbandScenes[i]);
}
}
}
if (changesMask[25])
{
for (uint32 i = 0; i < SpellPctModByLabel.size(); ++i)
{
if (SpellPctModByLabel.HasChanged(i) || ignoreNestedChangesMask)
{
SpellPctModByLabel[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[26])
{
for (uint32 i = 0; i < SpellFlatModByLabel.size(); ++i)
{
if (SpellFlatModByLabel.HasChanged(i) || ignoreNestedChangesMask)
{
SpellFlatModByLabel[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[27])
{
for (uint32 i = 0; i < MawPowers.size(); ++i)
{
if (MawPowers.HasChanged(i) || ignoreNestedChangesMask)
{
MawPowers[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[28])
{
for (uint32 i = 0; i < MultiFloorExploration.size(); ++i)
{
if (MultiFloorExploration.HasChanged(i) || ignoreNestedChangesMask)
{
MultiFloorExploration[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[29])
{
for (uint32 i = 0; i < RecipeProgression.size(); ++i)
{
if (RecipeProgression.HasChanged(i) || ignoreNestedChangesMask)
{
RecipeProgression[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[30])
{
for (uint32 i = 0; i < ReplayedQuests.size(); ++i)
{
if (ReplayedQuests.HasChanged(i) || ignoreNestedChangesMask)
{
ReplayedQuests[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[31])
{
for (uint32 i = 0; i < TaskQuests.size(); ++i)
{
if (TaskQuests.HasChanged(i) || ignoreNestedChangesMask)
{
TaskQuests[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
}
if (changesMask[32])
{
if (changesMask[33])
{
for (uint32 i = 0; i < DisabledSpells.size(); ++i)
{
if (DisabledSpells.HasChanged(i) || ignoreNestedChangesMask)
{
data << int32(DisabledSpells[i]);
}
}
}
if (changesMask[36])
{
for (uint32 i = 0; i < PersonalCraftingOrderCounts.size(); ++i)
{
if (PersonalCraftingOrderCounts.HasChanged(i) || ignoreNestedChangesMask)
{
PersonalCraftingOrderCounts[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[37])
{
for (uint32 i = 0; i < NpcCraftingOrders.size(); ++i)
{
if (NpcCraftingOrders.HasChanged(i) || ignoreNestedChangesMask)
{
NpcCraftingOrders[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[38])
{
for (uint32 i = 0; i < CategoryCooldownMods.size(); ++i)
{
if (CategoryCooldownMods.HasChanged(i) || ignoreNestedChangesMask)
{
CategoryCooldownMods[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[39])
{
for (uint32 i = 0; i < WeeklySpellUses.size(); ++i)
{
if (WeeklySpellUses.HasChanged(i) || ignoreNestedChangesMask)
{
WeeklySpellUses[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[40])
{
for (uint32 i = 0; i < TrackedCollectableSources.size(); ++i)
{
if (TrackedCollectableSources.HasChanged(i) || ignoreNestedChangesMask)
{
TrackedCollectableSources[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
}
data.FlushBits();
if (changesMask[32])
{
if (changesMask[41])
{
if (!ignoreNestedChangesMask)
CharacterBankTabSettings.WriteUpdateMask(data, 3);
else
WriteCompleteDynamicFieldUpdateMask(CharacterBankTabSettings.size(), data, 3);
}
if (changesMask[42])
{
if (!ignoreNestedChangesMask)
AccountBankTabSettings.WriteUpdateMask(data, 3);
else
WriteCompleteDynamicFieldUpdateMask(AccountBankTabSettings.size(), data, 3);
}
}
data.FlushBits();
if (changesMask[0])
{
if (changesMask[10])
{
for (uint32 i = 0; i < PvpInfo.size(); ++i)
{
if (PvpInfo.HasChanged(i) || ignoreNestedChangesMask)
{
PvpInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[24])
{
for (uint32 i = 0; i < CharacterRestrictions.size(); ++i)
{
if (CharacterRestrictions.HasChanged(i) || ignoreNestedChangesMask)
{
CharacterRestrictions[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
}
if (changesMask[32])
{
if (changesMask[34])
{
for (uint32 i = 0; i < TraitConfigs.size(); ++i)
{
if (TraitConfigs.HasChanged(i) || ignoreNestedChangesMask)
{
TraitConfigs[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[35])
{
for (uint32 i = 0; i < CraftingOrders.size(); ++i)
{
if (CraftingOrders.HasChanged(i) || ignoreNestedChangesMask)
{
CraftingOrders[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[41])
{
for (uint32 i = 0; i < CharacterBankTabSettings.size(); ++i)
{
if (CharacterBankTabSettings.HasChanged(i) || ignoreNestedChangesMask)
{
CharacterBankTabSettings[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[42])
{
for (uint32 i = 0; i < AccountBankTabSettings.size(); ++i)
{
if (AccountBankTabSettings.HasChanged(i) || ignoreNestedChangesMask)
{
AccountBankTabSettings[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[49])
{
data << *FarsightObject;
}
if (changesMask[50])
{
data << *SummonedBattlePetGUID;
}
if (changesMask[51])
{
data << uint64(Coinage);
}
if (changesMask[52])
{
data << uint64(AccountBankCoinage);
}
if (changesMask[53])
{
data << int32(XP);
}
if (changesMask[54])
{
data << int32(NextLevelXP);
}
if (changesMask[55])
{
data << int32(TrialXP);
}
if (changesMask[56])
{
Skill->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (changesMask[57])
{
data << int32(CharacterPoints);
}
if (changesMask[58])
{
data << int32(MaxTalentTiers);
}
if (changesMask[59])
{
data << uint32(TrackCreatureMask);
}
if (changesMask[60])
{
data << float(MainhandExpertise);
}
if (changesMask[61])
{
data << float(OffhandExpertise);
}
if (changesMask[62])
{
data << float(RangedExpertise);
}
if (changesMask[63])
{
data << float(CombatRatingExpertise);
}
if (changesMask[64])
{
data << float(BlockPercentage);
}
if (changesMask[65])
{
data << float(DodgePercentage);
}
if (changesMask[66])
{
data << float(DodgePercentageFromAttribute);
}
if (changesMask[67])
{
data << float(ParryPercentage);
}
if (changesMask[68])
{
data << float(ParryPercentageFromAttribute);
}
if (changesMask[69])
{
data << float(CritPercentage);
}
}
if (changesMask[70])
{
if (changesMask[71])
{
data << float(RangedCritPercentage);
}
if (changesMask[72])
{
data << float(OffhandCritPercentage);
}
if (changesMask[73])
{
data << float(SpellCritPercentage);
}
if (changesMask[74])
{
data << int32(ShieldBlock);
}
if (changesMask[75])
{
data << float(ShieldBlockCritPercentage);
}
if (changesMask[76])
{
data << float(Mastery);
}
if (changesMask[77])
{
data << float(Speed);
}
if (changesMask[78])
{
data << float(Avoidance);
}
if (changesMask[79])
{
data << float(Sturdiness);
}
if (changesMask[80])
{
data << int32(Versatility);
}
if (changesMask[81])
{
data << float(VersatilityBonus);
}
if (changesMask[82])
{
data << float(PvpPowerDamage);
}
if (changesMask[83])
{
data << float(PvpPowerHealing);
}
if (changesMask[84])
{
BitVectors->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (changesMask[85])
{
data << int32(ModHealingDonePos);
}
if (changesMask[86])
{
data << float(ModHealingPercent);
}
if (changesMask[87])
{
data << float(ModPeriodicHealingDonePercent);
}
if (changesMask[88])
{
data << float(ModSpellPowerPercent);
}
if (changesMask[89])
{
data << float(ModResiliencePercent);
}
if (changesMask[90])
{
data << float(OverrideSpellPowerByAPPercent);
}
if (changesMask[91])
{
data << float(OverrideAPBySpellPowerPercent);
}
if (changesMask[92])
{
data << int32(ModTargetResistance);
}
if (changesMask[93])
{
data << int32(ModTargetPhysicalResistance);
}
if (changesMask[94])
{
data << uint32(LocalFlags);
}
if (changesMask[95])
{
data << uint8(GrantableLevels);
}
if (changesMask[96])
{
data << uint8(MultiActionBars);
}
if (changesMask[97])
{
data << uint8(LifetimeMaxRank);
}
if (changesMask[98])
{
data << uint8(NumRespecs);
}
if (changesMask[99])
{
data << uint32(PvpMedals);
}
if (changesMask[100])
{
data << uint16(TodayHonorableKills);
}
if (changesMask[101])
{
data << uint16(YesterdayHonorableKills);
}
}
if (changesMask[102])
{
if (changesMask[103])
{
data << uint32(LifetimeHonorableKills);
}
if (changesMask[104])
{
data << int32(WatchedFactionIndex);
}
if (changesMask[105])
{
data << int32(MaxLevel);
}
if (changesMask[106])
{
data << int32(ScalingPlayerLevelDelta);
}
if (changesMask[107])
{
data << int32(MaxCreatureScalingLevel);
}
if (changesMask[108])
{
data << int32(PetSpellPower);
}
if (changesMask[109])
{
data << float(UiHitModifier);
}
if (changesMask[110])
{
data << float(UiSpellHitModifier);
}
if (changesMask[111])
{
data << int32(HomeRealmTimeOffset);
}
if (changesMask[112])
{
data << float(ModPetHaste);
}
if (changesMask[113])
{
data << int8(JailersTowerLevelMax);
}
if (changesMask[114])
{
data << int8(JailersTowerLevel);
}
if (changesMask[115])
{
data << uint8(LocalRegenFlags);
}
if (changesMask[116])
{
data << uint8(AuraVision);
}
if (changesMask[117])
{
data << uint8(NumBackpackSlots);
}
if (changesMask[118])
{
data << int32(OverrideSpellsID);
}
if (changesMask[119])
{
data << uint16(LootSpecID);
}
if (changesMask[120])
{
data << uint32(OverrideZonePVPType);
}
if (changesMask[121])
{
data << int32(Honor);
}
if (changesMask[122])
{
data << int32(HonorNextLevel);
}
if (changesMask[123])
{
data << int32(PerksProgramCurrency);
}
if (changesMask[124])
{
data << uint8(NumBankSlots);
}
if (changesMask[125])
{
data << uint8(NumCharacterBankTabs);
}
if (changesMask[126])
{
data << uint8(NumAccountBankTabs);
}
if (changesMask[131])
{
data << int32(UiChromieTimeExpansionID);
}
if (changesMask[132])
{
data << int32(TimerunningSeasonID);
}
if (changesMask[133])
{
data << int32(TransportServerTime);
}
}
if (changesMask[134])
{
if (changesMask[135])
{
data << uint32(WeeklyRewardsPeriodSinceOrigin);
}
if (changesMask[136])
{
data << int16(DEBUGSoulbindConduitRank);
}
if (changesMask[138])
{
data << uint32(ActiveCombatTraitConfigID);
}
if (changesMask[139])
{
data << int32(ItemUpgradeHighOnehandWeaponItemID);
}
if (changesMask[140])
{
data << int32(ItemUpgradeHighFingerItemID);
}
if (changesMask[141])
{
data << float(ItemUpgradeHighFingerWatermark);
}
if (changesMask[142])
{
data << int32(ItemUpgradeHighTrinketItemID);
}
if (changesMask[143])
{
data << float(ItemUpgradeHighTrinketWatermark);
}
if (changesMask[144])
{
data << uint64(LootHistoryInstanceID);
}
if (changesMask[146])
{
data << uint8(RequiredMountCapabilityFlags);
}
}
if (changesMask[102])
{
data.WriteBits(QuestSession.has_value(), 1);
}
if (changesMask[134])
{
data.WriteBits(PetStable.has_value(), 1);
data.WriteBits(WalkInData.has_value(), 1);
data.WriteBits(DelveData.has_value(), 1);
data.WriteBits(ChallengeModeData.has_value(), 1);
}
data.FlushBits();
if (changesMask[102])
{
if (changesMask[127])
{
ResearchHistory->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (changesMask[129])
{
if (QuestSession.has_value())
{
QuestSession->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
if (changesMask[128])
{
data << *FrozenPerksVendorItem;
}
if (changesMask[130])
{
Field_1410->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
if (changesMask[134])
{
if (changesMask[137])
{
data << *DungeonScore;
}
if (changesMask[145])
{
if (PetStable.has_value())
{
PetStable->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
if (changesMask[147])
{
if (WalkInData.has_value())
{
WalkInData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
if (changesMask[148])
{
if (DelveData.has_value())
{
DelveData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
if (changesMask[149])
{
if (ChallengeModeData.has_value())
{
ChallengeModeData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[150])
{
for (uint32 i = 0; i < 105; ++i)
{
if (changesMask[151 + i])
{
data << InvSlots[i];
}
}
}
if (changesMask[256])
{
for (uint32 i = 0; i < 2; ++i)
{
if (changesMask[257 + i])
{
RestInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[259])
{
for (uint32 i = 0; i < 7; ++i)
{
if (changesMask[260 + i])
{
data << int32(ModDamageDonePos[i]);
}
if (changesMask[267 + i])
{
data << int32(ModDamageDoneNeg[i]);
}
if (changesMask[274 + i])
{
data << float(ModDamageDonePercent[i]);
}
if (changesMask[281 + i])
{
data << float(ModHealingDonePercent[i]);
}
}
}
if (changesMask[288])
{
for (uint32 i = 0; i < 3; ++i)
{
if (changesMask[289 + i])
{
data << float(WeaponDmgMultipliers[i]);
}
if (changesMask[292 + i])
{
data << float(WeaponAtkSpeedMultipliers[i]);
}
}
}
if (changesMask[295])
{
for (uint32 i = 0; i < 12; ++i)
{
if (changesMask[296 + i])
{
data << uint32(BuybackPrice[i]);
}
if (changesMask[308 + i])
{
data << int64(BuybackTimestamp[i]);
}
}
}
if (changesMask[320])
{
for (uint32 i = 0; i < 32; ++i)
{
if (changesMask[321 + i])
{
data << int32(CombatRatings[i]);
}
}
}
if (changesMask[353])
{
for (uint32 i = 0; i < 4; ++i)
{
if (changesMask[354 + i])
{
data << uint32(NoReagentCostMask[i]);
}
}
}
if (changesMask[358])
{
for (uint32 i = 0; i < 2; ++i)
{
if (changesMask[359 + i])
{
data << int32(ProfessionSkillLine[i]);
}
}
}
if (changesMask[361])
{
for (uint32 i = 0; i < 5; ++i)
{
if (changesMask[362 + i])
{
data << uint32(BagSlotFlags[i]);
}
}
}
if (changesMask[367])
{
for (uint32 i = 0; i < 17; ++i)
{
if (changesMask[368 + i])
{
data << float(ItemUpgradeHighWatermark[i]);
}
}
}
data.FlushBits();
}
void ActivePlayerData::ClearChangesMask()
{
Base::ClearChangesMask(BackpackAutoSortDisabled);
Base::ClearChangesMask(BackpackSellJunkDisabled);
Base::ClearChangesMask(BankAutoSortDisabled);
Base::ClearChangesMask(SortBagsRightToLeft);
Base::ClearChangesMask(InsertItemsLeftToRight);
Base::ClearChangesMask(HasPerksProgramPendingReward);
Base::ClearChangesMask(ResearchSites);
Base::ClearChangesMask(ResearchSiteProgress);
Base::ClearChangesMask(Research);
Base::ClearChangesMask(KnownTitles);
Base::ClearChangesMask(CharacterDataElements);
Base::ClearChangesMask(AccountDataElements);
Base::ClearChangesMask(DailyQuestsCompleted);
Base::ClearChangesMask(Field_1328);
Base::ClearChangesMask(AvailableQuestLineXQuestIDs);
Base::ClearChangesMask(Heirlooms);
Base::ClearChangesMask(HeirloomFlags);
Base::ClearChangesMask(Toys);
Base::ClearChangesMask(ToyFlags);
Base::ClearChangesMask(Transmog);
Base::ClearChangesMask(ConditionalTransmog);
Base::ClearChangesMask(SelfResSpells);
Base::ClearChangesMask(RuneforgePowers);
Base::ClearChangesMask(TransmogIllusions);
Base::ClearChangesMask(WarbandScenes);
Base::ClearChangesMask(SpellPctModByLabel);
Base::ClearChangesMask(SpellFlatModByLabel);
Base::ClearChangesMask(MawPowers);
Base::ClearChangesMask(MultiFloorExploration);
Base::ClearChangesMask(RecipeProgression);
Base::ClearChangesMask(ReplayedQuests);
Base::ClearChangesMask(TaskQuests);
Base::ClearChangesMask(DisabledSpells);
Base::ClearChangesMask(PersonalCraftingOrderCounts);
Base::ClearChangesMask(NpcCraftingOrders);
Base::ClearChangesMask(CategoryCooldownMods);
Base::ClearChangesMask(WeeklySpellUses);
Base::ClearChangesMask(TrackedCollectableSources);
Base::ClearChangesMask(PvpInfo);
Base::ClearChangesMask(CharacterRestrictions);
Base::ClearChangesMask(TraitConfigs);
Base::ClearChangesMask(CraftingOrders);
Base::ClearChangesMask(CharacterBankTabSettings);
Base::ClearChangesMask(AccountBankTabSettings);
Base::ClearChangesMask(FarsightObject);
Base::ClearChangesMask(SummonedBattlePetGUID);
Base::ClearChangesMask(Coinage);
Base::ClearChangesMask(AccountBankCoinage);
Base::ClearChangesMask(XP);
Base::ClearChangesMask(NextLevelXP);
Base::ClearChangesMask(TrialXP);
Base::ClearChangesMask(Skill);
Base::ClearChangesMask(CharacterPoints);
Base::ClearChangesMask(MaxTalentTiers);
Base::ClearChangesMask(TrackCreatureMask);
Base::ClearChangesMask(MainhandExpertise);
Base::ClearChangesMask(OffhandExpertise);
Base::ClearChangesMask(RangedExpertise);
Base::ClearChangesMask(CombatRatingExpertise);
Base::ClearChangesMask(BlockPercentage);
Base::ClearChangesMask(DodgePercentage);
Base::ClearChangesMask(DodgePercentageFromAttribute);
Base::ClearChangesMask(ParryPercentage);
Base::ClearChangesMask(ParryPercentageFromAttribute);
Base::ClearChangesMask(CritPercentage);
Base::ClearChangesMask(RangedCritPercentage);
Base::ClearChangesMask(OffhandCritPercentage);
Base::ClearChangesMask(SpellCritPercentage);
Base::ClearChangesMask(ShieldBlock);
Base::ClearChangesMask(ShieldBlockCritPercentage);
Base::ClearChangesMask(Mastery);
Base::ClearChangesMask(Speed);
Base::ClearChangesMask(Avoidance);
Base::ClearChangesMask(Sturdiness);
Base::ClearChangesMask(Versatility);
Base::ClearChangesMask(VersatilityBonus);
Base::ClearChangesMask(PvpPowerDamage);
Base::ClearChangesMask(PvpPowerHealing);
Base::ClearChangesMask(BitVectors);
Base::ClearChangesMask(ModHealingDonePos);
Base::ClearChangesMask(ModHealingPercent);
Base::ClearChangesMask(ModPeriodicHealingDonePercent);
Base::ClearChangesMask(ModSpellPowerPercent);
Base::ClearChangesMask(ModResiliencePercent);
Base::ClearChangesMask(OverrideSpellPowerByAPPercent);
Base::ClearChangesMask(OverrideAPBySpellPowerPercent);
Base::ClearChangesMask(ModTargetResistance);
Base::ClearChangesMask(ModTargetPhysicalResistance);
Base::ClearChangesMask(LocalFlags);
Base::ClearChangesMask(GrantableLevels);
Base::ClearChangesMask(MultiActionBars);
Base::ClearChangesMask(LifetimeMaxRank);
Base::ClearChangesMask(NumRespecs);
Base::ClearChangesMask(PvpMedals);
Base::ClearChangesMask(TodayHonorableKills);
Base::ClearChangesMask(YesterdayHonorableKills);
Base::ClearChangesMask(LifetimeHonorableKills);
Base::ClearChangesMask(WatchedFactionIndex);
Base::ClearChangesMask(MaxLevel);
Base::ClearChangesMask(ScalingPlayerLevelDelta);
Base::ClearChangesMask(MaxCreatureScalingLevel);
Base::ClearChangesMask(PetSpellPower);
Base::ClearChangesMask(UiHitModifier);
Base::ClearChangesMask(UiSpellHitModifier);
Base::ClearChangesMask(HomeRealmTimeOffset);
Base::ClearChangesMask(ModPetHaste);
Base::ClearChangesMask(JailersTowerLevelMax);
Base::ClearChangesMask(JailersTowerLevel);
Base::ClearChangesMask(LocalRegenFlags);
Base::ClearChangesMask(AuraVision);
Base::ClearChangesMask(NumBackpackSlots);
Base::ClearChangesMask(OverrideSpellsID);
Base::ClearChangesMask(LootSpecID);
Base::ClearChangesMask(OverrideZonePVPType);
Base::ClearChangesMask(Honor);
Base::ClearChangesMask(HonorNextLevel);
Base::ClearChangesMask(PerksProgramCurrency);
Base::ClearChangesMask(NumBankSlots);
Base::ClearChangesMask(NumCharacterBankTabs);
Base::ClearChangesMask(NumAccountBankTabs);
Base::ClearChangesMask(ResearchHistory);
Base::ClearChangesMask(FrozenPerksVendorItem);
Base::ClearChangesMask(Field_1410);
Base::ClearChangesMask(QuestSession);
Base::ClearChangesMask(UiChromieTimeExpansionID);
Base::ClearChangesMask(TimerunningSeasonID);
Base::ClearChangesMask(TransportServerTime);
Base::ClearChangesMask(WeeklyRewardsPeriodSinceOrigin);
Base::ClearChangesMask(DEBUGSoulbindConduitRank);
Base::ClearChangesMask(DungeonScore);
Base::ClearChangesMask(ActiveCombatTraitConfigID);
Base::ClearChangesMask(ItemUpgradeHighOnehandWeaponItemID);
Base::ClearChangesMask(ItemUpgradeHighFingerItemID);
Base::ClearChangesMask(ItemUpgradeHighFingerWatermark);
Base::ClearChangesMask(ItemUpgradeHighTrinketItemID);
Base::ClearChangesMask(ItemUpgradeHighTrinketWatermark);
Base::ClearChangesMask(LootHistoryInstanceID);
Base::ClearChangesMask(PetStable);
Base::ClearChangesMask(RequiredMountCapabilityFlags);
Base::ClearChangesMask(WalkInData);
Base::ClearChangesMask(DelveData);
Base::ClearChangesMask(ChallengeModeData);
Base::ClearChangesMask(InvSlots);
Base::ClearChangesMask(RestInfo);
Base::ClearChangesMask(ModDamageDonePos);
Base::ClearChangesMask(ModDamageDoneNeg);
Base::ClearChangesMask(ModDamageDonePercent);
Base::ClearChangesMask(ModHealingDonePercent);
Base::ClearChangesMask(WeaponDmgMultipliers);
Base::ClearChangesMask(WeaponAtkSpeedMultipliers);
Base::ClearChangesMask(BuybackPrice);
Base::ClearChangesMask(BuybackTimestamp);
Base::ClearChangesMask(CombatRatings);
Base::ClearChangesMask(NoReagentCostMask);
Base::ClearChangesMask(ProfessionSkillLine);
Base::ClearChangesMask(BagSlotFlags);
Base::ClearChangesMask(ItemUpgradeHighWatermark);
_changesMask.ResetAll();
}
void GameObjectAssistActionData::WriteCreate(ByteBuffer& data, GameObject const* owner, Player const* receiver) const
{
data.WriteBits(PlayerName.size(), 6);
data.WriteBits(MonsterName.size() + 1, 11);
data << uint32(VirtualRealmAddress);
data << uint8(Sex);
data << int64(Time);
data << int32(DelveTier);
data << WorldPackets::SizedString::Data(PlayerName);
data << WorldPackets::SizedCString::Data(MonsterName);
}
void GameObjectAssistActionData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, GameObject const* owner, Player const* receiver) const
{
data.WriteBits(PlayerName.size(), 6);
data.WriteBits(MonsterName.size() + 1, 11);
data << uint32(VirtualRealmAddress);
data << uint8(Sex);
data << int64(Time);
data << int32(DelveTier);
data << WorldPackets::SizedString::Data(PlayerName);
data << WorldPackets::SizedCString::Data(MonsterName);
}
bool GameObjectAssistActionData::operator==(GameObjectAssistActionData const& right) const
{
return PlayerName == right.PlayerName
&& MonsterName == right.MonsterName
&& VirtualRealmAddress == right.VirtualRealmAddress
&& Sex == right.Sex
&& Time == right.Time
&& DelveTier == right.DelveTier;
}
void GameObjectData::WriteCreate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, GameObject const* owner, Player const* receiver) const
{
ViewerDependentValue::value_type stateWorldEffectIDs = {};
data << int32(DisplayID);
data << uint32(SpellVisualID);
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
stateWorldEffectIDs = ViewerDependentValue::GetValue(this, owner, receiver);
data << uint32(stateWorldEffectIDs->size());
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
for (uint32 i = 0; i < stateWorldEffectIDs->size(); ++i)
{
data << uint32((*stateWorldEffectIDs)[i]);
}
data << *CreatedBy;
data << *GuildGUID;
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
data << float(ParentRotation->x);
data << float(ParentRotation->y);
data << float(ParentRotation->z);
data << float(ParentRotation->w);
data << int32(FactionTemplate);
data << int8(ViewerDependentValue::GetValue(this, owner, receiver));
data << int8(TypeID);
data << uint8(PercentHealth);
data << uint32(ArtKit);
data << uint32(EnableDoodadSets.size());
data << uint32(CustomParam);
data << int32(Level);
data << uint32(AnimGroupInstance);
data << uint32(UiWidgetItemID);
data << uint32(UiWidgetItemQuality);
data << uint32(UiWidgetItemUnknown1000);
data << uint32(WorldEffects.size());
for (uint32 i = 0; i < EnableDoodadSets.size(); ++i)
{
data << int32(EnableDoodadSets[i]);
}
for (uint32 i = 0; i < WorldEffects.size(); ++i)
{
data << int32(WorldEffects[i]);
}
data.WriteBits(AssistActionData.has_value(), 1);
data.FlushBits();
if (AssistActionData.has_value())
{
AssistActionData->WriteCreate(data, owner, receiver);
}
}
void GameObjectData::WriteUpdate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, GameObject const* owner, Player const* receiver) const
{
WriteUpdate(data, _changesMask, false, owner, receiver);
}
void GameObjectData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, GameObject const* owner, Player const* receiver) const
{
data.WriteBits(changesMask.GetBlock(0), 26);
ViewerDependentValue::value_type stateWorldEffectIDs = {};
if (changesMask[0])
{
if (changesMask[1])
{
stateWorldEffectIDs = ViewerDependentValue::GetValue(this, owner, receiver);
data.WriteBits(stateWorldEffectIDs->size(), 32);
for (uint32 i = 0; i < stateWorldEffectIDs->size(); ++i)
{
data << uint32((*stateWorldEffectIDs)[i]);
}
}
}
data.FlushBits();
if (changesMask[0])
{
if (changesMask[2])
{
if (!ignoreNestedChangesMask)
EnableDoodadSets.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(EnableDoodadSets.size(), data);
}
if (changesMask[3])
{
if (!ignoreNestedChangesMask)
WorldEffects.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(WorldEffects.size(), data);
}
}
data.FlushBits();
if (changesMask[0])
{
if (changesMask[2])
{
for (uint32 i = 0; i < EnableDoodadSets.size(); ++i)
{
if (EnableDoodadSets.HasChanged(i) || ignoreNestedChangesMask)
{
data << int32(EnableDoodadSets[i]);
}
}
}
if (changesMask[3])
{
for (uint32 i = 0; i < WorldEffects.size(); ++i)
{
if (WorldEffects.HasChanged(i) || ignoreNestedChangesMask)
{
data << int32(WorldEffects[i]);
}
}
}
if (changesMask[4])
{
data << int32(DisplayID);
}
if (changesMask[5])
{
data << uint32(SpellVisualID);
}
if (changesMask[6])
{
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
}
if (changesMask[7])
{
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
}
if (changesMask[8])
{
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
}
if (changesMask[9])
{
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
}
if (changesMask[10])
{
data << *CreatedBy;
}
if (changesMask[11])
{
data << *GuildGUID;
}
if (changesMask[12])
{
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
}
if (changesMask[13])
{
data << float(ParentRotation->x);
data << float(ParentRotation->y);
data << float(ParentRotation->z);
data << float(ParentRotation->w);
}
if (changesMask[14])
{
data << int32(FactionTemplate);
}
if (changesMask[15])
{
data << int8(ViewerDependentValue::GetValue(this, owner, receiver));
}
if (changesMask[16])
{
data << int8(TypeID);
}
if (changesMask[17])
{
data << uint8(PercentHealth);
}
if (changesMask[18])
{
data << uint32(ArtKit);
}
if (changesMask[19])
{
data << uint32(CustomParam);
}
if (changesMask[20])
{
data << int32(Level);
}
if (changesMask[21])
{
data << uint32(AnimGroupInstance);
}
if (changesMask[22])
{
data << uint32(UiWidgetItemID);
}
if (changesMask[23])
{
data << uint32(UiWidgetItemQuality);
}
if (changesMask[24])
{
data << uint32(UiWidgetItemUnknown1000);
}
data.WriteBits(AssistActionData.has_value(), 1);
data.FlushBits();
if (changesMask[25])
{
if (AssistActionData.has_value())
{
AssistActionData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
}
void GameObjectData::ClearChangesMask()
{
Base::ClearChangesMask(StateWorldEffectIDs);
Base::ClearChangesMask(EnableDoodadSets);
Base::ClearChangesMask(WorldEffects);
Base::ClearChangesMask(DisplayID);
Base::ClearChangesMask(SpellVisualID);
Base::ClearChangesMask(StateSpellVisualID);
Base::ClearChangesMask(SpawnTrackingStateAnimID);
Base::ClearChangesMask(SpawnTrackingStateAnimKitID);
Base::ClearChangesMask(StateWorldEffectsQuestObjectiveID);
Base::ClearChangesMask(CreatedBy);
Base::ClearChangesMask(GuildGUID);
Base::ClearChangesMask(Flags);
Base::ClearChangesMask(ParentRotation);
Base::ClearChangesMask(FactionTemplate);
Base::ClearChangesMask(State);
Base::ClearChangesMask(TypeID);
Base::ClearChangesMask(PercentHealth);
Base::ClearChangesMask(ArtKit);
Base::ClearChangesMask(CustomParam);
Base::ClearChangesMask(Level);
Base::ClearChangesMask(AnimGroupInstance);
Base::ClearChangesMask(UiWidgetItemID);
Base::ClearChangesMask(UiWidgetItemQuality);
Base::ClearChangesMask(UiWidgetItemUnknown1000);
Base::ClearChangesMask(AssistActionData);
_changesMask.ResetAll();
}
void DynamicObjectData::WriteCreate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, DynamicObject const* owner, Player const* receiver) const
{
data << *Caster;
data << uint8(Type);
SpellVisual->WriteCreate(data, owner, receiver);
data << int32(SpellID);
data << float(Radius);
data << uint32(CastTime);
}
void DynamicObjectData::WriteUpdate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, DynamicObject const* owner, Player const* receiver) const
{
WriteUpdate(data, _changesMask, false, owner, receiver);
}
void DynamicObjectData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, DynamicObject const* owner, Player const* receiver) const
{
data.WriteBits(changesMask.GetBlock(0), 7);
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
data << *Caster;
}
if (changesMask[2])
{
data << uint8(Type);
}
if (changesMask[3])
{
SpellVisual->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (changesMask[4])
{
data << int32(SpellID);
}
if (changesMask[5])
{
data << float(Radius);
}
if (changesMask[6])
{
data << uint32(CastTime);
}
}
}
void DynamicObjectData::ClearChangesMask()
{
Base::ClearChangesMask(Caster);
Base::ClearChangesMask(Type);
Base::ClearChangesMask(SpellVisual);
Base::ClearChangesMask(SpellID);
Base::ClearChangesMask(Radius);
Base::ClearChangesMask(CastTime);
_changesMask.ResetAll();
}
void CorpseData::WriteCreate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, Corpse const* owner, Player const* receiver) const
{
data << uint32(DynamicFlags);
data << *Owner;
data << *PartyGUID;
data << *GuildGUID;
data << uint32(DisplayID);
for (uint32 i = 0; i < 19; ++i)
{
data << uint32(Items[i]);
}
data << uint8(RaceID);
data << uint8(Sex);
data << uint8(Class);
data << uint32(Customizations.size());
data << uint32(Flags);
data << int32(FactionTemplate);
data << uint32(StateSpellVisualKitID);
for (uint32 i = 0; i < Customizations.size(); ++i)
{
Customizations[i].WriteCreate(data, owner, receiver);
}
}
void CorpseData::WriteUpdate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, Corpse const* owner, Player const* receiver) const
{
WriteUpdate(data, _changesMask, false, owner, receiver);
}
void CorpseData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, Corpse const* owner, Player const* receiver) const
{
data.WriteBits(changesMask.GetBlocksMask(0), 2);
for (uint32 i = 0; i < 2; ++i)
if (changesMask.GetBlock(i))
data.WriteBits(changesMask.GetBlock(i), 32);
if (changesMask[0])
{
if (changesMask[1])
{
if (!ignoreNestedChangesMask)
Customizations.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Customizations.size(), data);
}
}
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
for (uint32 i = 0; i < Customizations.size(); ++i)
{
if (Customizations.HasChanged(i) || ignoreNestedChangesMask)
{
Customizations[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[2])
{
data << uint32(DynamicFlags);
}
if (changesMask[3])
{
data << *Owner;
}
if (changesMask[4])
{
data << *PartyGUID;
}
if (changesMask[5])
{
data << *GuildGUID;
}
if (changesMask[6])
{
data << uint32(DisplayID);
}
if (changesMask[7])
{
data << uint8(RaceID);
}
if (changesMask[8])
{
data << uint8(Sex);
}
if (changesMask[9])
{
data << uint8(Class);
}
if (changesMask[10])
{
data << uint32(Flags);
}
if (changesMask[11])
{
data << int32(FactionTemplate);
}
if (changesMask[12])
{
data << uint32(StateSpellVisualKitID);
}
}
if (changesMask[13])
{
for (uint32 i = 0; i < 19; ++i)
{
if (changesMask[14 + i])
{
data << uint32(Items[i]);
}
}
}
}
void CorpseData::ClearChangesMask()
{
Base::ClearChangesMask(Customizations);
Base::ClearChangesMask(DynamicFlags);
Base::ClearChangesMask(Owner);
Base::ClearChangesMask(PartyGUID);
Base::ClearChangesMask(GuildGUID);
Base::ClearChangesMask(DisplayID);
Base::ClearChangesMask(RaceID);
Base::ClearChangesMask(Sex);
Base::ClearChangesMask(Class);
Base::ClearChangesMask(Flags);
Base::ClearChangesMask(FactionTemplate);
Base::ClearChangesMask(StateSpellVisualKitID);
Base::ClearChangesMask(Items);
_changesMask.ResetAll();
}
void ScaleCurve::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const
{
data << uint32(StartTimeOffset);
for (uint32 i = 0; i < 2; ++i)
{
data << Points[i];
}
data << uint32(ParameterCurve);
data.WriteBit(OverrideActive);
data.FlushBits();
}
void ScaleCurve::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 7);
if (changesMask[0])
{
if (changesMask[1])
{
data.WriteBit(OverrideActive);
}
}
data.FlushBits();
if (changesMask[0])
{
if (changesMask[2])
{
data << uint32(StartTimeOffset);
}
if (changesMask[3])
{
data << uint32(ParameterCurve);
}
}
if (changesMask[4])
{
for (uint32 i = 0; i < 2; ++i)
{
if (changesMask[5 + i])
{
data << Points[i];
}
}
}
data.FlushBits();
}
void ScaleCurve::ClearChangesMask()
{
Base::ClearChangesMask(OverrideActive);
Base::ClearChangesMask(StartTimeOffset);
Base::ClearChangesMask(ParameterCurve);
Base::ClearChangesMask(Points);
_changesMask.ResetAll();
}
void VisualAnim::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const
{
data << uint32(AnimationDataID);
data << uint32(AnimKitID);
data << uint32(AnimProgress);
data.WriteBit(IsDecay);
data.FlushBits();
}
void VisualAnim::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 5);
if (changesMask[0])
{
if (changesMask[1])
{
data.WriteBit(IsDecay);
}
}
data.FlushBits();
if (changesMask[0])
{
if (changesMask[2])
{
data << uint32(AnimationDataID);
}
if (changesMask[3])
{
data << uint32(AnimKitID);
}
if (changesMask[4])
{
data << uint32(AnimProgress);
}
}
data.FlushBits();
}
void VisualAnim::ClearChangesMask()
{
Base::ClearChangesMask(IsDecay);
Base::ClearChangesMask(AnimationDataID);
Base::ClearChangesMask(AnimKitID);
Base::ClearChangesMask(AnimProgress);
_changesMask.ResetAll();
}
void ForceSetAreaTriggerPositionAndRotation::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const
{
data << TriggerGUID;
data << Position;
data << float(Rotation.x);
data << float(Rotation.y);
data << float(Rotation.z);
data << float(Rotation.w);
}
void ForceSetAreaTriggerPositionAndRotation::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const
{
data << TriggerGUID;
data << Position;
data << float(Rotation.x);
data << float(Rotation.y);
data << float(Rotation.z);
data << float(Rotation.w);
}
bool ForceSetAreaTriggerPositionAndRotation::operator==(ForceSetAreaTriggerPositionAndRotation const& right) const
{
return TriggerGUID == right.TriggerGUID
&& Position == right.Position
&& Rotation == right.Rotation;
}
void AreaTriggerSplineCalculator::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const
{
data.WriteBits(Points.size(), 16);
data.WriteBit(Catmullrom);
for (uint32 i = 0; i < Points.size(); ++i)
{
data << Points[i];
}
data.FlushBits();
}
void AreaTriggerSplineCalculator::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 3);
if (changesMask[0])
{
if (changesMask[1])
{
data.WriteBit(Catmullrom);
}
if (changesMask[2])
{
if (!ignoreChangesMask)
Points.WriteUpdateMask(data, 16);
else
WriteCompleteDynamicFieldUpdateMask(Points.size(), data, 16);
}
}
data.FlushBits();
if (changesMask[0])
{
if (changesMask[2])
{
for (uint32 i = 0; i < Points.size(); ++i)
{
if (Points.HasChanged(i) || ignoreChangesMask)
{
data << Points[i];
}
}
}
}
data.FlushBits();
}
void AreaTriggerSplineCalculator::ClearChangesMask()
{
Base::ClearChangesMask(Catmullrom);
Base::ClearChangesMask(Points);
_changesMask.ResetAll();
}
void AreaTriggerOrbit::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const
{
data << *Center;
data << float(Radius);
data << float(InitialAngle);
data << float(BlendFromRadius);
data << int32(ExtraTimeForBlending);
data.WriteBit(CounterClockwise);
data.FlushBits();
}
void AreaTriggerOrbit::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 7);
if (changesMask[0])
{
if (changesMask[1])
{
data.WriteBit(CounterClockwise);
}
}
data.FlushBits();
if (changesMask[0])
{
if (changesMask[2])
{
data << *Center;
}
if (changesMask[3])
{
data << float(Radius);
}
if (changesMask[4])
{
data << float(InitialAngle);
}
if (changesMask[5])
{
data << float(BlendFromRadius);
}
if (changesMask[6])
{
data << int32(ExtraTimeForBlending);
}
}
data.FlushBits();
}
void AreaTriggerOrbit::ClearChangesMask()
{
Base::ClearChangesMask(CounterClockwise);
Base::ClearChangesMask(Center);
Base::ClearChangesMask(Radius);
Base::ClearChangesMask(InitialAngle);
Base::ClearChangesMask(BlendFromRadius);
Base::ClearChangesMask(ExtraTimeForBlending);
_changesMask.ResetAll();
}
void AreaTriggerMovementScript::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const
{
data << int32(SpellScriptID);
data << *Center;
data << uint32(CreationTime);
}
void AreaTriggerMovementScript::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 4);
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
data << int32(SpellScriptID);
}
if (changesMask[2])
{
data << *Center;
}
if (changesMask[3])
{
data << uint32(CreationTime);
}
}
}
void AreaTriggerMovementScript::ClearChangesMask()
{
Base::ClearChangesMask(SpellScriptID);
Base::ClearChangesMask(Center);
Base::ClearChangesMask(CreationTime);
_changesMask.ResetAll();
}
void AreaTriggerSphere::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const
{
data << float(Radius);
data << float(RadiusTarget);
}
void AreaTriggerSphere::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 3);
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
data << float(Radius);
}
if (changesMask[2])
{
data << float(RadiusTarget);
}
}
}
void AreaTriggerSphere::ClearChangesMask()
{
Base::ClearChangesMask(Radius);
Base::ClearChangesMask(RadiusTarget);
_changesMask.ResetAll();
}
void AreaTriggerBox::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const
{
data << *Extents;
data << *ExtentsTarget;
}
void AreaTriggerBox::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 3);
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
data << *Extents;
}
if (changesMask[2])
{
data << *ExtentsTarget;
}
}
}
void AreaTriggerBox::ClearChangesMask()
{
Base::ClearChangesMask(Extents);
Base::ClearChangesMask(ExtentsTarget);
_changesMask.ResetAll();
}
void AreaTriggerPolygon::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const
{
data << uint32(Vertices.size());
data << uint32(VerticesTarget.size());
data << float(Height);
data << float(HeightTarget);
for (uint32 i = 0; i < Vertices.size(); ++i)
{
data << Vertices[i];
}
for (uint32 i = 0; i < VerticesTarget.size(); ++i)
{
data << VerticesTarget[i];
}
}
void AreaTriggerPolygon::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 5);
if (changesMask[0])
{
if (changesMask[1])
{
if (!ignoreChangesMask)
Vertices.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Vertices.size(), data);
}
if (changesMask[2])
{
if (!ignoreChangesMask)
VerticesTarget.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(VerticesTarget.size(), data);
}
}
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
for (uint32 i = 0; i < Vertices.size(); ++i)
{
if (Vertices.HasChanged(i) || ignoreChangesMask)
{
data << Vertices[i];
}
}
}
if (changesMask[2])
{
for (uint32 i = 0; i < VerticesTarget.size(); ++i)
{
if (VerticesTarget.HasChanged(i) || ignoreChangesMask)
{
data << VerticesTarget[i];
}
}
}
if (changesMask[3])
{
data << float(Height);
}
if (changesMask[4])
{
data << float(HeightTarget);
}
}
}
void AreaTriggerPolygon::ClearChangesMask()
{
Base::ClearChangesMask(Vertices);
Base::ClearChangesMask(VerticesTarget);
Base::ClearChangesMask(Height);
Base::ClearChangesMask(HeightTarget);
_changesMask.ResetAll();
}
void AreaTriggerCylinder::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const
{
data << float(Radius);
data << float(RadiusTarget);
data << float(Height);
data << float(HeightTarget);
data << float(LocationZOffset);
data << float(LocationZOffsetTarget);
}
void AreaTriggerCylinder::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 7);
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
data << float(Radius);
}
if (changesMask[2])
{
data << float(RadiusTarget);
}
if (changesMask[3])
{
data << float(Height);
}
if (changesMask[4])
{
data << float(HeightTarget);
}
if (changesMask[5])
{
data << float(LocationZOffset);
}
if (changesMask[6])
{
data << float(LocationZOffsetTarget);
}
}
}
void AreaTriggerCylinder::ClearChangesMask()
{
Base::ClearChangesMask(Radius);
Base::ClearChangesMask(RadiusTarget);
Base::ClearChangesMask(Height);
Base::ClearChangesMask(HeightTarget);
Base::ClearChangesMask(LocationZOffset);
Base::ClearChangesMask(LocationZOffsetTarget);
_changesMask.ResetAll();
}
void AreaTriggerDisk::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const
{
data << float(InnerRadius);
data << float(InnerRadiusTarget);
data << float(OuterRadius);
data << float(OuterRadiusTarget);
data << float(Height);
data << float(HeightTarget);
data << float(LocationZOffset);
data << float(LocationZOffsetTarget);
}
void AreaTriggerDisk::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 9);
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
data << float(InnerRadius);
}
if (changesMask[2])
{
data << float(InnerRadiusTarget);
}
if (changesMask[3])
{
data << float(OuterRadius);
}
if (changesMask[4])
{
data << float(OuterRadiusTarget);
}
if (changesMask[5])
{
data << float(Height);
}
if (changesMask[6])
{
data << float(HeightTarget);
}
if (changesMask[7])
{
data << float(LocationZOffset);
}
if (changesMask[8])
{
data << float(LocationZOffsetTarget);
}
}
}
void AreaTriggerDisk::ClearChangesMask()
{
Base::ClearChangesMask(InnerRadius);
Base::ClearChangesMask(InnerRadiusTarget);
Base::ClearChangesMask(OuterRadius);
Base::ClearChangesMask(OuterRadiusTarget);
Base::ClearChangesMask(Height);
Base::ClearChangesMask(HeightTarget);
Base::ClearChangesMask(LocationZOffset);
Base::ClearChangesMask(LocationZOffsetTarget);
_changesMask.ResetAll();
}
void AreaTriggerBoundedPlane::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const
{
data << *Extents;
data << *ExtentsTarget;
}
void AreaTriggerBoundedPlane::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const
{
Mask changesMask = _changesMask;
if (ignoreChangesMask)
changesMask.SetAll();
data.WriteBits(changesMask.GetBlock(0), 3);
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
data << *Extents;
}
if (changesMask[2])
{
data << *ExtentsTarget;
}
}
}
void AreaTriggerBoundedPlane::ClearChangesMask()
{
Base::ClearChangesMask(Extents);
Base::ClearChangesMask(ExtentsTarget);
_changesMask.ResetAll();
}
void AreaTriggerData::WriteCreate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const
{
OverrideScaleCurve->WriteCreate(data, owner, receiver);
data << *Caster;
data << uint32(Duration);
data << uint32(TimeToTarget);
data << uint32(TimeToTargetScale);
data << uint32(TimeToTargetExtraScale);
data << uint32(TimeToTargetPos);
data << int32(SpellID);
data << int32(SpellForVisuals);
SpellVisual->WriteCreate(data, owner, receiver);
data << float(BoundsRadius2D);
data << uint32(DecalPropertiesID);
data << *CreatingEffectGUID;
data << *OrbitPathTarget;
data << *RollPitchYaw;
data << int32(PositionalSoundKitID);
data << uint32(MovementStartTime);
data << uint32(CreationTime);
data << float(ZOffset);
data << uint32(Flags);
data << uint32(ScaleCurveId);
data << uint32(FacingCurveId);
data << uint32(MorphCurveId);
data << uint32(MoveCurveId);
data << float(Facing);
data << int32(PathType);
data << uint8(ShapeType);
if (PathType == 3)
{
PathData.Get()->WriteCreate(data, owner, receiver);
}
if (ShapeType == 0)
{
ShapeData.Get()->WriteCreate(data, owner, receiver);
}
if (ShapeType == 1)
{
ShapeData.Get()->WriteCreate(data, owner, receiver);
}
if (ShapeType == 2 || ShapeType == 3 || ShapeType == 5 || ShapeType == 6)
{
ShapeData.Get()->WriteCreate(data, owner, receiver);
}
if (ShapeType == 4)
{
ShapeData.Get()->WriteCreate(data, owner, receiver);
}
if (ShapeType == 7)
{
ShapeData.Get()->WriteCreate(data, owner, receiver);
}
if (ShapeType == 8)
{
ShapeData.Get()->WriteCreate(data, owner, receiver);
}
ExtraScaleCurve->WriteCreate(data, owner, receiver);
data.FlushBits();
data.WriteBits(TargetRollPitchYaw.has_value(), 1);
data.WriteBits(ForcedPositionAndRotation.has_value(), 1);
OverrideMoveCurveX->WriteCreate(data, owner, receiver);
if (TargetRollPitchYaw.has_value())
{
data << *TargetRollPitchYaw;
}
if (ForcedPositionAndRotation.has_value())
{
ForcedPositionAndRotation->WriteCreate(data, owner, receiver);
}
OverrideMoveCurveY->WriteCreate(data, owner, receiver);
OverrideMoveCurveZ->WriteCreate(data, owner, receiver);
VisualAnim->WriteCreate(data, owner, receiver);
if (PathType == 0)
{
PathData.Get()->WriteCreate(data, owner, receiver);
}
if (PathType == 1)
{
PathData.Get()->WriteCreate(data, owner, receiver);
}
}
void AreaTriggerData::WriteUpdate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const
{
WriteUpdate(data, _changesMask, false, owner, receiver);
}
void AreaTriggerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, AreaTrigger const* owner, Player const* receiver) const
{
data << uint32(changesMask.GetBlock(0));
data.WriteBits(changesMask.GetBlock(1), 4);
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
OverrideScaleCurve->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (changesMask[6])
{
data << *Caster;
}
if (changesMask[7])
{
data << uint32(Duration);
}
if (changesMask[8])
{
data << uint32(TimeToTarget);
}
if (changesMask[9])
{
data << uint32(TimeToTargetScale);
}
if (changesMask[10])
{
data << uint32(TimeToTargetExtraScale);
}
if (changesMask[11])
{
data << uint32(TimeToTargetPos);
}
if (changesMask[12])
{
data << int32(SpellID);
}
if (changesMask[13])
{
data << int32(SpellForVisuals);
}
if (changesMask[14])
{
SpellVisual->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (changesMask[15])
{
data << float(BoundsRadius2D);
}
if (changesMask[16])
{
data << uint32(DecalPropertiesID);
}
if (changesMask[17])
{
data << *CreatingEffectGUID;
}
if (changesMask[18])
{
data << *OrbitPathTarget;
}
if (changesMask[19])
{
data << *RollPitchYaw;
}
if (changesMask[20])
{
data << int32(PositionalSoundKitID);
}
if (changesMask[21])
{
data << uint32(MovementStartTime);
}
if (changesMask[22])
{
data << uint32(CreationTime);
}
if (changesMask[23])
{
data << float(ZOffset);
}
if (changesMask[25])
{
data << uint32(Flags);
}
if (changesMask[27])
{
data << uint32(ScaleCurveId);
}
if (changesMask[28])
{
data << uint32(FacingCurveId);
}
if (changesMask[29])
{
data << uint32(MorphCurveId);
}
if (changesMask[30])
{
data << uint32(MoveCurveId);
}
if (changesMask[31])
{
data << float(Facing);
}
}
if (changesMask[32])
{
if (changesMask[34])
{
data << int32(PathType);
}
if (changesMask[35])
{
data << uint8(ShapeType);
}
if (changesMask[34])
{
if (PathType == 3)
{
PathData.Get()->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
if (changesMask[35])
{
if (ShapeType == 0)
{
ShapeData.Get()->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (ShapeType == 1)
{
ShapeData.Get()->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (ShapeType == 2 || ShapeType == 3 || ShapeType == 5 || ShapeType == 6)
{
ShapeData.Get()->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (ShapeType == 4)
{
ShapeData.Get()->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (ShapeType == 7)
{
ShapeData.Get()->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (ShapeType == 8)
{
ShapeData.Get()->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[0])
{
if (changesMask[2])
{
ExtraScaleCurve->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
data.FlushBits();
if (changesMask[0])
{
data.WriteBits(TargetRollPitchYaw.has_value(), 1);
}
if (changesMask[32])
{
data.WriteBits(ForcedPositionAndRotation.has_value(), 1);
}
data.FlushBits();
if (changesMask[0])
{
if (changesMask[3])
{
OverrideMoveCurveX->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (changesMask[24])
{
if (TargetRollPitchYaw.has_value())
{
data << *TargetRollPitchYaw;
}
}
}
if (changesMask[32])
{
if (changesMask[33])
{
if (ForcedPositionAndRotation.has_value())
{
ForcedPositionAndRotation->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[0])
{
if (changesMask[4])
{
OverrideMoveCurveY->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (changesMask[5])
{
OverrideMoveCurveZ->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (changesMask[26])
{
VisualAnim->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
if (changesMask[32])
{
if (changesMask[34])
{
if (PathType == 0)
{
PathData.Get()->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (PathType == 1)
{
PathData.Get()->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
}
void AreaTriggerData::ClearChangesMask()
{
Base::ClearChangesMask(OverrideScaleCurve);
Base::ClearChangesMask(ExtraScaleCurve);
Base::ClearChangesMask(OverrideMoveCurveX);
Base::ClearChangesMask(OverrideMoveCurveY);
Base::ClearChangesMask(OverrideMoveCurveZ);
Base::ClearChangesMask(Caster);
Base::ClearChangesMask(Duration);
Base::ClearChangesMask(TimeToTarget);
Base::ClearChangesMask(TimeToTargetScale);
Base::ClearChangesMask(TimeToTargetExtraScale);
Base::ClearChangesMask(TimeToTargetPos);
Base::ClearChangesMask(SpellID);
Base::ClearChangesMask(SpellForVisuals);
Base::ClearChangesMask(SpellVisual);
Base::ClearChangesMask(BoundsRadius2D);
Base::ClearChangesMask(DecalPropertiesID);
Base::ClearChangesMask(CreatingEffectGUID);
Base::ClearChangesMask(OrbitPathTarget);
Base::ClearChangesMask(RollPitchYaw);
Base::ClearChangesMask(PositionalSoundKitID);
Base::ClearChangesMask(MovementStartTime);
Base::ClearChangesMask(CreationTime);
Base::ClearChangesMask(ZOffset);
Base::ClearChangesMask(TargetRollPitchYaw);
Base::ClearChangesMask(Flags);
Base::ClearChangesMask(VisualAnim);
Base::ClearChangesMask(ScaleCurveId);
Base::ClearChangesMask(FacingCurveId);
Base::ClearChangesMask(MorphCurveId);
Base::ClearChangesMask(MoveCurveId);
Base::ClearChangesMask(Facing);
Base::ClearChangesMask(ForcedPositionAndRotation);
Base::ClearChangesMask(PathType);
Base::ClearChangesMask(ShapeType);
Base::ClearChangesMask(PathData);
Base::ClearChangesMask(ShapeData);
_changesMask.ResetAll();
}
void SceneObjectData::WriteCreate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, Object const* owner, Player const* receiver) const
{
data << int32(ScriptPackageID);
data << uint32(RndSeedVal);
data << *CreatedBy;
data << uint32(SceneType);
}
void SceneObjectData::WriteUpdate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, Object const* owner, Player const* receiver) const
{
WriteUpdate(data, _changesMask, false, owner, receiver);
}
void SceneObjectData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, Object const* owner, Player const* receiver) const
{
data.WriteBits(changesMask.GetBlock(0), 5);
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
data << int32(ScriptPackageID);
}
if (changesMask[2])
{
data << uint32(RndSeedVal);
}
if (changesMask[3])
{
data << *CreatedBy;
}
if (changesMask[4])
{
data << uint32(SceneType);
}
}
}
void SceneObjectData::ClearChangesMask()
{
Base::ClearChangesMask(ScriptPackageID);
Base::ClearChangesMask(RndSeedVal);
Base::ClearChangesMask(CreatedBy);
Base::ClearChangesMask(SceneType);
_changesMask.ResetAll();
}
void ConversationLine::WriteCreate(ByteBuffer& data, Conversation const* owner, Player const* receiver) const
{
data << int32(ConversationLineID);
data << int32(BroadcastTextID);
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
data << int32(UiCameraID);
data << uint8(ActorIndex);
data << uint8(Flags);
data << uint8(ChatType);
}
void ConversationLine::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Conversation const* owner, Player const* receiver) const
{
data << int32(ConversationLineID);
data << int32(BroadcastTextID);
data << uint32(ViewerDependentValue::GetValue(this, owner, receiver));
data << int32(UiCameraID);
data << uint8(ActorIndex);
data << uint8(Flags);
data << uint8(ChatType);
}
bool ConversationLine::operator==(ConversationLine const& right) const
{
return ConversationLineID == right.ConversationLineID
&& BroadcastTextID == right.BroadcastTextID
&& StartTime == right.StartTime
&& UiCameraID == right.UiCameraID
&& ActorIndex == right.ActorIndex
&& Flags == right.Flags
&& ChatType == right.ChatType;
}
void ConversationActor::WriteCreate(ByteBuffer& data, Conversation const* owner, Player const* receiver) const
{
data << uint32(CreatureID);
data << uint32(CreatureDisplayInfoID);
data << ActorGUID;
data << int32(Id);
data.WriteBits(Type, 1);
data.WriteBits(NoActorObject, 1);
data.FlushBits();
}
void ConversationActor::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Conversation const* owner, Player const* receiver) const
{
data << uint32(CreatureID);
data << uint32(CreatureDisplayInfoID);
data << ActorGUID;
data << int32(Id);
data.WriteBits(Type, 1);
data.WriteBits(NoActorObject, 1);
data.FlushBits();
}
bool ConversationActor::operator==(ConversationActor const& right) const
{
return CreatureID == right.CreatureID
&& CreatureDisplayInfoID == right.CreatureDisplayInfoID
&& ActorGUID == right.ActorGUID
&& Id == right.Id
&& Type == right.Type
&& NoActorObject == right.NoActorObject;
}
void ConversationData::WriteCreate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, Conversation const* owner, Player const* receiver) const
{
data << uint32(Lines->size());
data << int32(ViewerDependentValue::GetValue(this, owner, receiver));
data << uint32(Progress);
for (uint32 i = 0; i < Lines->size(); ++i)
{
(*Lines)[i].WriteCreate(data, owner, receiver);
}
data.WriteBit(DontPlayBroadcastTextSounds);
data << uint32(Actors.size());
data << uint32(Flags);
for (uint32 i = 0; i < Actors.size(); ++i)
{
Actors[i].WriteCreate(data, owner, receiver);
}
data.FlushBits();
}
void ConversationData::WriteUpdate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, Conversation const* owner, Player const* receiver) const
{
WriteUpdate(data, _changesMask, false, owner, receiver);
}
void ConversationData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, Conversation const* owner, Player const* receiver) const
{
data.WriteBits(changesMask.GetBlock(0), 7);
if (changesMask[0])
{
if (changesMask[1])
{
data.WriteBit(DontPlayBroadcastTextSounds);
}
if (changesMask[2])
{
data.WriteBits(Lines->size(), 32);
for (uint32 i = 0; i < Lines->size(); ++i)
{
(*Lines)[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
data.FlushBits();
if (changesMask[0])
{
if (changesMask[3])
{
if (!ignoreNestedChangesMask)
Actors.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Actors.size(), data);
}
}
data.FlushBits();
if (changesMask[0])
{
if (changesMask[3])
{
for (uint32 i = 0; i < Actors.size(); ++i)
{
if (Actors.HasChanged(i) || ignoreNestedChangesMask)
{
Actors[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
if (changesMask[4])
{
data << int32(ViewerDependentValue::GetValue(this, owner, receiver));
}
if (changesMask[5])
{
data << uint32(Progress);
}
if (changesMask[6])
{
data << uint32(Flags);
}
}
data.FlushBits();
}
void ConversationData::ClearChangesMask()
{
Base::ClearChangesMask(DontPlayBroadcastTextSounds);
Base::ClearChangesMask(Lines);
Base::ClearChangesMask(Actors);
Base::ClearChangesMask(LastLineEndTime);
Base::ClearChangesMask(Progress);
Base::ClearChangesMask(Flags);
_changesMask.ResetAll();
}
void VendorData::WriteCreate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, Creature const* owner, Player const* receiver) const
{
data << int32(Flags);
}
void VendorData::WriteUpdate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, Creature const* owner, Player const* receiver) const
{
WriteUpdate(data, _changesMask, false, owner, receiver);
}
void VendorData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, Creature const* owner, Player const* receiver) const
{
data.WriteBits(changesMask.GetBlock(0), 2);
data.FlushBits();
if (changesMask[0])
{
if (changesMask[1])
{
data << int32(Flags);
}
}
}
void VendorData::ClearChangesMask()
{
Base::ClearChangesMask(Flags);
_changesMask.ResetAll();
}
}
#if TRINITY_COMPILER == TRINITY_COMPILER_GNU
#pragma GCC diagnostic pop
#else
#pragma warning(pop)
#endif