aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Object
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-08-02 13:25:41 +0200
committerShauren <shauren.trinity@gmail.com>2024-08-02 13:25:41 +0200
commite59eef5432c7b70679d33f4911c88d0f7d75fd39 (patch)
treefe9bce9c82496589facec3719b3f2943d8295e76 /src/server/game/Entities/Object
parent7fb9168d57f378075b0f6692ea7ad822c1d8e43d (diff)
Core/PacketIO: Updated to 11.0.0
Diffstat (limited to 'src/server/game/Entities/Object')
-rw-r--r--src/server/game/Entities/Object/Object.cpp2
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateField.h53
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.cpp1472
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.h737
-rw-r--r--src/server/game/Entities/Object/Updates/ViewerDependentValues.h36
5 files changed, 1493 insertions, 807 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index fd868cfc649..03d1948444c 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -663,7 +663,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe
// *data << int32(Players[i].Pets[j].Power);
// *data << int32(Players[i].Pets[j].Speed);
// *data << int32(Players[i].Pets[j].NpcTeamMemberID);
- // *data << uint16(Players[i].Pets[j].BreedQuality);
+ // *data << uint8(Players[i].Pets[j].BreedQuality);
// *data << uint16(Players[i].Pets[j].StatusFlags);
// *data << int8(Players[i].Pets[j].Slot);
diff --git a/src/server/game/Entities/Object/Updates/UpdateField.h b/src/server/game/Entities/Object/Updates/UpdateField.h
index fdad7e0d18e..a845123c3ee 100644
--- a/src/server/game/Entities/Object/Updates/UpdateField.h
+++ b/src/server/game/Entities/Object/Updates/UpdateField.h
@@ -53,7 +53,7 @@ namespace UF
template<typename T, std::size_t Size>
class UpdateFieldArrayBase;
- template<typename T, std::size_t Size, uint32 Bit, uint32 FirstElementBit>
+ template<typename T, std::size_t Size, uint32 Bit, int32 FirstElementBit>
class UpdateFieldArray;
template<typename T>
@@ -268,7 +268,7 @@ namespace UF
return { (_value.*field)._value };
}
- template<typename V, std::size_t Size, uint32 Bit, uint32 FirstElementBit, typename U = T>
+ template<typename V, std::size_t Size, uint32 Bit, int32 FirstElementBit, typename U = T>
std::enable_if_t<std::is_base_of_v<HasChangesMaskTag, U>,
std::conditional_t<std::is_base_of_v<IsUpdateFieldStructureTag, V>,
MutableFieldReference<V, PublicSet>,
@@ -278,10 +278,13 @@ namespace UF
ModifyValue(UpdateFieldArray<V, Size, Bit, FirstElementBit>(T::* field), uint32 index)
{
_value._changesMask.Set(Bit);
- if constexpr (!std::is_base_of_v<IsUpdateFieldHolderTag, V>)
- _value._changesMask.Set(FirstElementBit + index);
- else
- _value._changesMask.Set(FirstElementBit);
+ if constexpr (FirstElementBit >= 0)
+ {
+ if constexpr (!std::is_base_of_v<IsUpdateFieldHolderTag, V>)
+ _value._changesMask.Set(FirstElementBit + index);
+ else
+ _value._changesMask.Set(FirstElementBit);
+ }
return { (_value.*field)._values[index] };
}
@@ -469,7 +472,7 @@ namespace UF
template<typename T, int32 BlockBit, uint32 Bit>
friend class UpdateField;
- template<typename T, std::size_t Size, uint32 Bit, uint32 FirstElementBit>
+ template<typename T, std::size_t Size, uint32 Bit, int32 FirstElementBit>
friend class UpdateFieldArray;
template<typename T, int32 BlockBit, uint32 Bit>
@@ -486,7 +489,7 @@ namespace UF
return { (static_cast<Derived*>(this)->*field)._value };
}
- template<typename Derived, typename T, std::size_t Size, uint32 Bit, uint32 FirstElementBit>
+ template<typename Derived, typename T, std::size_t Size, uint32 Bit, int32 FirstElementBit>
MutableFieldReference<T, false> ModifyValue(UpdateFieldArray<T, Size, Bit, FirstElementBit>(Derived::* field), uint32 index)
{
MarkChanged(field, index);
@@ -534,16 +537,19 @@ namespace UF
_changesMask.Set(Bit);
}
- template<typename Derived, typename T, std::size_t Size, uint32 Bit, uint32 FirstElementBit>
+ template<typename Derived, typename T, std::size_t Size, uint32 Bit, int32 FirstElementBit>
void MarkChanged(UpdateFieldArray<T, Size, Bit, FirstElementBit>(Derived::*), uint32 index)
{
static_assert(std::is_base_of_v<Base, Derived>, "Given field argument must belong to the same structure as this HasChangesMask");
_changesMask.Set(Bit);
- if constexpr (!std::is_base_of_v<IsUpdateFieldHolderTag, T>)
- _changesMask.Set(FirstElementBit + index);
- else
- _changesMask.Set(FirstElementBit);
+ if constexpr (FirstElementBit >= 0)
+ {
+ if constexpr (!std::is_base_of_v<IsUpdateFieldHolderTag, T>)
+ _changesMask.Set(FirstElementBit + index);
+ else
+ _changesMask.Set(FirstElementBit);
+ }
}
template<typename Derived, typename T, int32 BlockBit, uint32 Bit>
@@ -576,15 +582,18 @@ namespace UF
_changesMask.Reset(Bit);
}
- template<typename Derived, typename T, std::size_t Size, uint32 Bit, uint32 FirstElementBit>
+ template<typename Derived, typename T, std::size_t Size, uint32 Bit, int32 FirstElementBit>
void ClearChanged(UpdateFieldArray<T, Size, Bit, FirstElementBit>(Derived::*), uint32 index)
{
static_assert(std::is_base_of_v<Base, Derived>, "Given field argument must belong to the same structure as this HasChangesMask");
- if constexpr (!std::is_base_of_v<IsUpdateFieldHolderTag, T>)
- _changesMask.Reset(FirstElementBit + index);
- else
- _changesMask.Reset(FirstElementBit);
+ if constexpr (FirstElementBit >= 0)
+ {
+ if constexpr (!std::is_base_of_v<IsUpdateFieldHolderTag, T>)
+ _changesMask.Reset(FirstElementBit + index);
+ else
+ _changesMask.Reset(FirstElementBit);
+ }
}
template<typename Derived, typename T, int32 BlockBit, uint32 Bit>
@@ -620,16 +629,16 @@ namespace UF
field._value.ClearChangesMask();
}
- template<typename T, std::size_t Size, uint32 Bit, uint32 FirstElementBit>
+ template<typename T, std::size_t Size, uint32 Bit, int32 FirstElementBit>
static void ClearChangesMask(UpdateFieldArray<T, Size, Bit, FirstElementBit>& field)
{
ClearChangesMask(field, std::disjunction<std::is_base_of<HasChangesMaskTag, T>, std::is_base_of<IsUpdateFieldHolderTag, T>>{});
}
- template<typename T, std::size_t Size, uint32 Bit, uint32 FirstElementBit>
+ template<typename T, std::size_t Size, uint32 Bit, int32 FirstElementBit>
static void ClearChangesMask(UpdateFieldArray<T, Size, Bit, FirstElementBit>&, std::false_type) { }
- template<typename T, std::size_t Size, uint32 Bit, uint32 FirstElementBit>
+ template<typename T, std::size_t Size, uint32 Bit, int32 FirstElementBit>
static void ClearChangesMask(UpdateFieldArray<T, Size, Bit, FirstElementBit>& field, std::true_type)
{
for (uint32 i = 0; i < Size; ++i)
@@ -804,7 +813,7 @@ namespace UF
return sizeof(typename T::value_type);
}
- template<typename T, std::size_t Size, uint32 Bit, uint32 FirstElementBit>
+ template<typename T, std::size_t Size, uint32 Bit, int32 FirstElementBit>
class UpdateFieldArray : public UpdateFieldArrayBase<T, Size>
{
};
diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp
index fa0453e412d..8b54351c6c3 100644
--- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp
+++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp
@@ -126,20 +126,20 @@ void ItemEnchantment::ClearChangesMask()
void ItemMod::WriteCreate(ByteBuffer& data, Item const* owner, Player const* receiver) const
{
- data << int32(Value);
data << uint8(Type);
+ data << int32(Value);
}
void ItemMod::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Item const* owner, Player const* receiver) const
{
- data << int32(Value);
data << uint8(Type);
+ data << int32(Value);
}
bool ItemMod::operator==(ItemMod const& right) const
{
- return Value == right.Value
- && Type == right.Type;
+ return Type == right.Type
+ && Value == right.Value;
}
void ItemModList::WriteCreate(ByteBuffer& data, Item const* owner, Player const* receiver) const
@@ -286,7 +286,7 @@ void ItemData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
data << uint32(MaxDurability);
}
data << uint32(CreatePlayedTime);
- data << int32(Context);
+ data << uint8(Context);
data << int64(CreateTime);
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
{
@@ -424,7 +424,7 @@ void ItemData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
}
if (changesMask[13])
{
- data << int32(Context);
+ data << uint8(Context);
}
if (changesMask[14])
{
@@ -506,7 +506,7 @@ void ItemData::ClearChangesMask()
void ContainerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Bag const* owner, Player const* receiver) const
{
- for (uint32 i = 0; i < 36; ++i)
+ for (uint32 i = 0; i < 98; ++i)
{
data << Slots[i];
}
@@ -520,8 +520,8 @@ void ContainerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fiel
void ContainerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, Bag const* owner, Player const* receiver) const
{
- data.WriteBits(changesMask.GetBlocksMask(0), 2);
- for (uint32 i = 0; i < 2; ++i)
+ data.WriteBits(changesMask.GetBlocksMask(0), 4);
+ for (uint32 i = 0; i < 4; ++i)
if (changesMask.GetBlock(i))
data.WriteBits(changesMask.GetBlock(i), 32);
@@ -535,7 +535,7 @@ void ContainerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool
}
if (changesMask[2])
{
- for (uint32 i = 0; i < 36; ++i)
+ for (uint32 i = 0; i < 98; ++i)
{
if (changesMask[3 + i])
{
@@ -930,10 +930,8 @@ bool PassiveSpellHistory::operator==(PassiveSpellHistory const& right) const
void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const
{
data << int32(ViewerDependentValue<DisplayIDTag>::GetValue(this, owner, receiver));
- for (uint32 i = 0; i < 2; ++i)
- {
- data << uint32(ViewerDependentValue<NpcFlagsTag>::GetValue(this, i, owner, receiver));
- }
+ data << uint32(ViewerDependentValue<NpcFlagsTag>::GetValue(this, owner, receiver));
+ data << uint32(ViewerDependentValue<NpcFlags2Tag>::GetValue(this, owner, receiver));
data << uint32(StateSpellVisualID);
data << uint32(StateAnimID);
data << uint32(StateAnimKitID);
@@ -1093,8 +1091,8 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
data << float(MinRangedDamage);
data << float(MaxRangedDamage);
data << float(ManaCostMultiplier);
- data << float(MaxHealthModifier);
}
+ data << float(MaxHealthModifier);
data << float(HoverHeight);
data << int32(MinItemLevelCutoff);
data << int32(MinItemLevel);
@@ -1116,10 +1114,12 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
data << uint32(ChannelObjects.size());
data << int32(FlightCapabilityID);
data << float(GlideEventSpeedDivisor);
- data << uint32(Field_308);
- data << uint32(Field_30C);
+ data << uint32(MaxHealthModifierFlatNeg);
+ data << uint32(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)
{
@@ -1133,11 +1133,13 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
{
data << ChannelObjects[i];
}
+ data.WriteBit(Field_314);
+ data.FlushBits();
}
void UnitData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const
{
- Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xF0FFBFFFu, 0x000F7FFFu, 0xFFFFFF01u, 0x007FFFFFu, 0x0003F800u, 0x00000000u });
+ Mask allowedMaskForTarget({ 0xFFFEFFFFu, 0x87FDFFFFu, 0x007BFFFFu, 0xFFFFFC01u, 0x03FFFFFFu, 0x001FC000u, 0x00000000u });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver);
}
@@ -1145,16 +1147,16 @@ void UnitData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
void UnitData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags)
{
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
- allowedMaskForTarget |= std::array<uint32, 7>{ 0x00002000u, 0x0F004000u, 0xFFF08000u, 0x000000FEu, 0xFF800004u, 0xFFFC07FFu, 0x01FFFFFFu };
+ allowedMaskForTarget |= std::array<uint32, 7>{ 0x00010000u, 0x78020000u, 0xFF840000u, 0x000003FEu, 0xFC000020u, 0xFFE03FFFu, 0x0FFFFFFFu };
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::UnitAll))
- allowedMaskForTarget |= std::array<uint32, 7>{ 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFF800004u, 0x000007FFu, 0x00000000u };
+ allowedMaskForTarget |= std::array<uint32, 7>{ 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFC000020u, 0x00003FFFu, 0x00000000u };
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Empath))
- allowedMaskForTarget |= std::array<uint32, 7>{ 0x00000000u, 0x0F000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x000007F8u };
+ allowedMaskForTarget |= std::array<uint32, 7>{ 0x00000000u, 0x78000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00003FC0u };
}
void UnitData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags)
{
- Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xF0FFBFFFu, 0x000F7FFFu, 0xFFFFFF01u, 0x007FFFFFu, 0x0003F800u, 0x00000000u });
+ Mask allowedMaskForTarget({ 0xFFFEFFFFu, 0x87FDFFFFu, 0x007BFFFFu, 0xFFFFFC01u, 0x03FFFFFFu, 0x001FC000u, 0x00000000u });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
changesMask &= allowedMaskForTarget;
}
@@ -1170,6 +1172,10 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
{
if (changesMask[1])
{
+ data.WriteBit(Field_314);
+ }
+ if (changesMask[2])
+ {
data.WriteBits(StateWorldEffectIDs->size(), 32);
for (uint32 i = 0; i < StateWorldEffectIDs->size(); ++i)
{
@@ -1180,21 +1186,21 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
data.FlushBits();
if (changesMask[0])
{
- if (changesMask[2])
+ if (changesMask[3])
{
if (!ignoreNestedChangesMask)
PassiveSpells.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(PassiveSpells.size(), data);
}
- if (changesMask[3])
+ if (changesMask[4])
{
if (!ignoreNestedChangesMask)
WorldEffects.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(WorldEffects.size(), data);
}
- if (changesMask[4])
+ if (changesMask[5])
{
if (!ignoreNestedChangesMask)
ChannelObjects.WriteUpdateMask(data);
@@ -1205,7 +1211,7 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
data.FlushBits();
if (changesMask[0])
{
- if (changesMask[2])
+ if (changesMask[3])
{
for (uint32 i = 0; i < PassiveSpells.size(); ++i)
{
@@ -1215,7 +1221,7 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
}
}
}
- if (changesMask[3])
+ if (changesMask[4])
{
for (uint32 i = 0; i < WorldEffects.size(); ++i)
{
@@ -1225,7 +1231,7 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
}
}
}
- if (changesMask[4])
+ if (changesMask[5])
{
for (uint32 i = 0; i < ChannelObjects.size(); ++i)
{
@@ -1235,593 +1241,606 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
}
}
}
- if (changesMask[5])
- {
- data << int32(ViewerDependentValue<DisplayIDTag>::GetValue(this, owner, receiver));
- }
if (changesMask[6])
{
- data << uint32(StateSpellVisualID);
+ data << int32(ViewerDependentValue<DisplayIDTag>::GetValue(this, owner, receiver));
}
if (changesMask[7])
{
- data << uint32(StateAnimID);
+ data << uint32(ViewerDependentValue<NpcFlagsTag>::GetValue(this, owner, receiver));
}
if (changesMask[8])
{
- data << uint32(StateAnimKitID);
+ data << uint32(ViewerDependentValue<NpcFlags2Tag>::GetValue(this, owner, receiver));
}
if (changesMask[9])
{
- data << uint32(StateWorldEffectsQuestObjectiveID);
+ data << uint32(StateSpellVisualID);
}
if (changesMask[10])
{
- data << int32(SpellOverrideNameID);
+ data << uint32(StateAnimID);
}
if (changesMask[11])
{
- data << Charm;
+ data << uint32(StateAnimKitID);
}
if (changesMask[12])
{
- data << Summon;
+ data << uint32(StateWorldEffectsQuestObjectiveID);
}
if (changesMask[13])
{
- data << Critter;
+ data << int32(SpellOverrideNameID);
}
if (changesMask[14])
{
- data << CharmedBy;
+ data << Charm;
}
if (changesMask[15])
{
- data << SummonedBy;
+ data << Summon;
}
if (changesMask[16])
{
- data << CreatedBy;
+ data << Critter;
}
if (changesMask[17])
{
- data << DemonCreator;
+ data << CharmedBy;
}
if (changesMask[18])
{
- data << LookAtControllerTarget;
+ data << SummonedBy;
}
if (changesMask[19])
{
- data << Target;
+ data << CreatedBy;
}
if (changesMask[20])
{
- data << BattlePetCompanionGUID;
+ data << DemonCreator;
}
if (changesMask[21])
{
- data << uint64(BattlePetDBID);
+ data << LookAtControllerTarget;
}
if (changesMask[22])
{
- ChannelData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ data << Target;
}
if (changesMask[23])
{
- data << int8(SpellEmpowerStage);
+ data << BattlePetCompanionGUID;
}
if (changesMask[24])
{
- data << uint32(SummonedByHomeRealm);
+ data << uint64(BattlePetDBID);
}
if (changesMask[25])
{
- data << uint8(Race);
+ ChannelData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (changesMask[26])
{
- data << uint8(ClassId);
+ data << int8(SpellEmpowerStage);
}
if (changesMask[27])
{
- data << uint8(PlayerClassId);
+ data << uint32(SummonedByHomeRealm);
}
if (changesMask[28])
{
- data << uint8(Sex);
+ data << uint8(Race);
}
if (changesMask[29])
{
- data << uint8(DisplayPower);
+ data << uint8(ClassId);
}
if (changesMask[30])
{
- data << uint32(OverrideDisplayPowerID);
+ data << uint8(PlayerClassId);
}
if (changesMask[31])
{
- data << int64(Health);
+ data << uint8(Sex);
}
}
if (changesMask[32])
{
if (changesMask[33])
{
- data << int64(MaxHealth);
+ data << uint8(DisplayPower);
}
if (changesMask[34])
{
- data << int32(Level);
+ data << uint32(OverrideDisplayPowerID);
}
if (changesMask[35])
{
- data << int32(EffectiveLevel);
+ data << int64(Health);
}
if (changesMask[36])
{
- data << int32(ContentTuningID);
+ data << int64(MaxHealth);
}
if (changesMask[37])
{
- data << int32(ScalingLevelMin);
+ data << int32(Level);
}
if (changesMask[38])
{
- data << int32(ScalingLevelMax);
+ data << int32(EffectiveLevel);
}
if (changesMask[39])
{
- data << int32(ScalingLevelDelta);
+ data << int32(ContentTuningID);
}
if (changesMask[40])
{
- data << int32(ScalingFactionGroup);
+ data << int32(ScalingLevelMin);
}
if (changesMask[41])
{
- data << int32(ViewerDependentValue<FactionTemplateTag>::GetValue(this, owner, receiver));
+ data << int32(ScalingLevelMax);
}
if (changesMask[42])
{
- data << uint32(ViewerDependentValue<FlagsTag>::GetValue(this, owner, receiver));
+ data << int32(ScalingLevelDelta);
}
if (changesMask[43])
{
- data << uint32(ViewerDependentValue<Flags2Tag>::GetValue(this, owner, receiver));
+ data << int32(ScalingFactionGroup);
}
if (changesMask[44])
{
- data << uint32(ViewerDependentValue<Flags3Tag>::GetValue(this, owner, receiver));
+ data << int32(ViewerDependentValue<FactionTemplateTag>::GetValue(this, owner, receiver));
}
if (changesMask[45])
{
- data << uint32(ViewerDependentValue<AuraStateTag>::GetValue(this, owner, receiver));
+ data << uint32(ViewerDependentValue<FlagsTag>::GetValue(this, owner, receiver));
}
if (changesMask[46])
{
- data << uint32(RangedAttackRoundBaseTime);
+ data << uint32(ViewerDependentValue<Flags2Tag>::GetValue(this, owner, receiver));
}
if (changesMask[47])
{
- data << float(BoundingRadius);
+ data << uint32(ViewerDependentValue<Flags3Tag>::GetValue(this, owner, receiver));
}
if (changesMask[48])
{
- data << float(CombatReach);
+ data << uint32(ViewerDependentValue<AuraStateTag>::GetValue(this, owner, receiver));
}
if (changesMask[49])
{
- data << float(DisplayScale);
+ data << uint32(RangedAttackRoundBaseTime);
}
if (changesMask[50])
{
- data << int32(CreatureFamily);
+ data << float(BoundingRadius);
}
if (changesMask[51])
{
- data << int32(CreatureType);
+ data << float(CombatReach);
}
if (changesMask[52])
{
- data << int32(NativeDisplayID);
+ data << float(DisplayScale);
}
if (changesMask[53])
{
- data << float(NativeXDisplayScale);
+ data << int32(CreatureFamily);
}
if (changesMask[54])
{
- data << int32(MountDisplayID);
+ data << int32(CreatureType);
}
if (changesMask[55])
{
- data << int32(CosmeticMountDisplayID);
+ data << int32(NativeDisplayID);
}
if (changesMask[56])
{
- data << float(MinDamage);
+ data << float(NativeXDisplayScale);
}
if (changesMask[57])
{
- data << float(MaxDamage);
+ data << int32(MountDisplayID);
}
if (changesMask[58])
{
- data << float(MinOffHandDamage);
+ data << int32(CosmeticMountDisplayID);
}
if (changesMask[59])
{
- data << float(MaxOffHandDamage);
+ data << float(MinDamage);
}
if (changesMask[60])
{
- data << uint8(StandState);
+ data << float(MaxDamage);
}
if (changesMask[61])
{
- data << uint8(PetTalentPoints);
+ data << float(MinOffHandDamage);
}
if (changesMask[62])
{
- data << uint8(VisFlags);
+ data << float(MaxOffHandDamage);
}
if (changesMask[63])
{
- data << uint8(AnimTier);
+ data << uint8(StandState);
}
}
if (changesMask[64])
{
if (changesMask[65])
{
- data << uint32(PetNumber);
+ data << uint8(PetTalentPoints);
}
if (changesMask[66])
{
- data << uint32(PetNameTimestamp);
+ data << uint8(VisFlags);
}
if (changesMask[67])
{
- data << uint32(PetExperience);
+ data << uint8(AnimTier);
}
if (changesMask[68])
{
- data << uint32(PetNextLevelExperience);
+ data << uint32(PetNumber);
}
if (changesMask[69])
{
- data << float(ModCastingSpeed);
+ data << uint32(PetNameTimestamp);
}
if (changesMask[70])
{
- data << float(ModCastingSpeedNeg);
+ data << uint32(PetExperience);
}
if (changesMask[71])
{
- data << float(ModSpellHaste);
+ data << uint32(PetNextLevelExperience);
}
if (changesMask[72])
{
- data << float(ModHaste);
+ data << float(ModCastingSpeed);
}
if (changesMask[73])
{
- data << float(ModRangedHaste);
+ data << float(ModCastingSpeedNeg);
}
if (changesMask[74])
{
- data << float(ModHasteRegen);
+ data << float(ModSpellHaste);
}
if (changesMask[75])
{
- data << float(ModTimeRate);
+ data << float(ModHaste);
}
if (changesMask[76])
{
- data << int32(CreatedBySpell);
+ data << float(ModRangedHaste);
}
if (changesMask[77])
{
- data << int32(EmoteState);
+ data << float(ModHasteRegen);
}
if (changesMask[78])
{
- data << int32(BaseMana);
+ data << float(ModTimeRate);
}
if (changesMask[79])
{
- data << int32(BaseHealth);
+ data << int32(CreatedBySpell);
}
if (changesMask[80])
{
- data << uint8(SheatheState);
+ data << int32(EmoteState);
}
if (changesMask[81])
{
- data << uint8(ViewerDependentValue<PvpFlagsTag>::GetValue(this, owner, receiver));
+ data << int32(BaseMana);
}
if (changesMask[82])
{
- data << uint8(PetFlags);
+ data << int32(BaseHealth);
}
if (changesMask[83])
{
- data << uint8(ShapeshiftForm);
+ data << uint8(SheatheState);
}
if (changesMask[84])
{
- data << int32(AttackPower);
+ data << uint8(ViewerDependentValue<PvpFlagsTag>::GetValue(this, owner, receiver));
}
if (changesMask[85])
{
- data << int32(AttackPowerModPos);
+ data << uint8(PetFlags);
}
if (changesMask[86])
{
- data << int32(AttackPowerModNeg);
+ data << uint8(ShapeshiftForm);
}
if (changesMask[87])
{
- data << float(AttackPowerMultiplier);
+ data << int32(AttackPower);
}
if (changesMask[88])
{
- data << int32(AttackPowerModSupport);
+ data << int32(AttackPowerModPos);
}
if (changesMask[89])
{
- data << int32(RangedAttackPower);
+ data << int32(AttackPowerModNeg);
}
if (changesMask[90])
{
- data << int32(RangedAttackPowerModPos);
+ data << float(AttackPowerMultiplier);
}
if (changesMask[91])
{
- data << int32(RangedAttackPowerModNeg);
+ data << int32(AttackPowerModSupport);
}
if (changesMask[92])
{
- data << float(RangedAttackPowerMultiplier);
+ data << int32(RangedAttackPower);
}
if (changesMask[93])
{
- data << int32(RangedAttackPowerModSupport);
+ data << int32(RangedAttackPowerModPos);
}
if (changesMask[94])
{
- data << int32(MainHandWeaponAttackPower);
+ data << int32(RangedAttackPowerModNeg);
}
if (changesMask[95])
{
- data << int32(OffHandWeaponAttackPower);
+ data << float(RangedAttackPowerMultiplier);
}
}
if (changesMask[96])
{
if (changesMask[97])
{
- data << int32(RangedWeaponAttackPower);
+ data << int32(RangedAttackPowerModSupport);
}
if (changesMask[98])
{
- data << int32(SetAttackSpeedAura);
+ data << int32(MainHandWeaponAttackPower);
}
if (changesMask[99])
{
- data << float(Lifesteal);
+ data << int32(OffHandWeaponAttackPower);
}
if (changesMask[100])
{
- data << float(MinRangedDamage);
+ data << int32(RangedWeaponAttackPower);
}
if (changesMask[101])
{
- data << float(MaxRangedDamage);
+ data << int32(SetAttackSpeedAura);
}
if (changesMask[102])
{
- data << float(ManaCostMultiplier);
+ data << float(Lifesteal);
}
if (changesMask[103])
{
- data << float(MaxHealthModifier);
+ data << float(MinRangedDamage);
}
if (changesMask[104])
{
- data << float(HoverHeight);
+ data << float(MaxRangedDamage);
}
if (changesMask[105])
{
- data << int32(MinItemLevelCutoff);
+ data << float(ManaCostMultiplier);
}
if (changesMask[106])
{
- data << int32(MinItemLevel);
+ data << float(MaxHealthModifier);
}
if (changesMask[107])
{
- data << int32(MaxItemLevel);
+ data << float(HoverHeight);
}
if (changesMask[108])
{
- data << int32(AzeriteItemLevel);
+ data << int32(MinItemLevelCutoff);
}
if (changesMask[109])
{
- data << int32(WildBattlePetLevel);
+ data << int32(MinItemLevel);
}
if (changesMask[110])
{
- data << int32(BattlePetCompanionExperience);
+ data << int32(MaxItemLevel);
}
if (changesMask[111])
{
- data << uint32(BattlePetCompanionNameTimestamp);
+ data << int32(AzeriteItemLevel);
}
if (changesMask[112])
{
- data << int32(ViewerDependentValue<InteractSpellIDTag>::GetValue(this, owner, receiver));
+ data << int32(WildBattlePetLevel);
}
if (changesMask[113])
{
- data << int32(ScaleDuration);
+ data << int32(BattlePetCompanionExperience);
}
if (changesMask[114])
{
- data << int32(LooksLikeMountID);
+ data << uint32(BattlePetCompanionNameTimestamp);
}
if (changesMask[115])
{
- data << int32(LooksLikeCreatureID);
+ data << int32(ViewerDependentValue<InteractSpellIDTag>::GetValue(this, owner, receiver));
}
if (changesMask[116])
{
- data << int32(LookAtControllerID);
+ data << int32(ScaleDuration);
}
if (changesMask[117])
{
- data << int32(PerksVendorItemID);
+ data << int32(LooksLikeMountID);
}
if (changesMask[118])
{
- data << int32(TaxiNodesID);
+ data << int32(LooksLikeCreatureID);
}
if (changesMask[119])
{
- data << GuildGUID;
+ data << int32(LookAtControllerID);
}
if (changesMask[120])
{
- data << int32(FlightCapabilityID);
+ data << int32(PerksVendorItemID);
}
if (changesMask[121])
{
- data << float(GlideEventSpeedDivisor);
+ data << int32(TaxiNodesID);
}
if (changesMask[122])
{
- data << uint32(Field_308);
+ data << GuildGUID;
}
if (changesMask[123])
{
- data << uint32(Field_30C);
+ data << int32(FlightCapabilityID);
}
if (changesMask[124])
{
- data << uint32(SilencedSchoolMask);
+ data << float(GlideEventSpeedDivisor);
}
if (changesMask[125])
{
- data << uint32(CurrentAreaID);
+ data << uint32(MaxHealthModifierFlatNeg);
}
if (changesMask[126])
{
- data << NameplateAttachToGUID;
+ data << uint32(MaxHealthModifierFlatPos);
+ }
+ if (changesMask[127])
+ {
+ data << uint32(SilencedSchoolMask);
}
}
- if (changesMask[127])
+ if (changesMask[128])
{
- for (uint32 i = 0; i < 2; ++i)
+ if (changesMask[129])
{
- if (changesMask[128 + i])
- {
- data << uint32(ViewerDependentValue<NpcFlagsTag>::GetValue(this, i, owner, receiver));
- }
+ data << uint32(CurrentAreaID);
+ }
+ if (changesMask[130])
+ {
+ data << float(Field_31C);
+ }
+ if (changesMask[131])
+ {
+ data << float(Field_320);
+ }
+ if (changesMask[132])
+ {
+ data << NameplateAttachToGUID;
}
}
- if (changesMask[130])
+ if (changesMask[133])
{
for (uint32 i = 0; i < 10; ++i)
{
- if (changesMask[131 + i])
+ if (changesMask[134 + i])
{
data << int32(Power[i]);
}
- if (changesMask[141 + i])
+ if (changesMask[144 + i])
{
data << int32(MaxPower[i]);
}
- if (changesMask[151 + i])
+ if (changesMask[154 + i])
{
data << float(PowerRegenFlatModifier[i]);
}
- if (changesMask[161 + i])
+ if (changesMask[164 + i])
{
data << float(PowerRegenInterruptedFlatModifier[i]);
}
}
}
- if (changesMask[171])
+ if (changesMask[174])
{
for (uint32 i = 0; i < 3; ++i)
{
- if (changesMask[172 + i])
+ if (changesMask[175 + i])
{
VirtualItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
- if (changesMask[175])
+ if (changesMask[178])
{
for (uint32 i = 0; i < 2; ++i)
{
- if (changesMask[176 + i])
+ if (changesMask[179 + i])
{
data << uint32(AttackRoundBaseTime[i]);
}
}
}
- if (changesMask[178])
+ if (changesMask[181])
{
for (uint32 i = 0; i < 4; ++i)
{
- if (changesMask[179 + i])
+ if (changesMask[182 + i])
{
data << int32(Stats[i]);
}
- if (changesMask[183 + i])
+ if (changesMask[186 + i])
{
data << int32(StatPosBuff[i]);
}
- if (changesMask[187 + i])
+ if (changesMask[190 + i])
{
data << int32(StatNegBuff[i]);
}
- if (changesMask[191 + i])
+ if (changesMask[194 + i])
{
data << int32(StatSupportBuff[i]);
}
}
}
- if (changesMask[195])
+ if (changesMask[198])
{
for (uint32 i = 0; i < 7; ++i)
{
- if (changesMask[196 + i])
+ if (changesMask[199 + i])
{
data << int32(Resistances[i]);
}
- if (changesMask[203 + i])
+ if (changesMask[206 + i])
{
data << int32(BonusResistanceMods[i]);
}
- if (changesMask[210 + i])
+ if (changesMask[213 + 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);
@@ -1935,12 +1954,13 @@ void UnitData::ClearChangesMask()
Base::ClearChangesMask(GuildGUID);
Base::ClearChangesMask(FlightCapabilityID);
Base::ClearChangesMask(GlideEventSpeedDivisor);
- Base::ClearChangesMask(Field_308);
- Base::ClearChangesMask(Field_30C);
+ 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(NpcFlags);
Base::ClearChangesMask(Power);
Base::ClearChangesMask(MaxPower);
Base::ClearChangesMask(PowerRegenFlatModifier);
@@ -2885,6 +2905,93 @@ void SkillInfo::ClearChangesMask()
_changesMask.ResetAll();
}
+void BitVectors::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
+{
+ for (uint32 i = 0; i < 11; ++i)
+ {
+ data << uint32(Values[i].size());
+ for (uint32 j = 0; j < Values[i].size(); ++j)
+ {
+ data << uint64(Values[i][j]);
+ }
+ }
+}
+
+void BitVectors::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
+{
+ Mask changesMask = _changesMask;
+ if (ignoreChangesMask)
+ changesMask.SetAll();
+
+ data.WriteBits(changesMask.GetBlock(0), 1);
+
+ if (changesMask[0])
+ {
+ for (uint32 i = 0; i < 11; ++i)
+ {
+ if (!ignoreChangesMask)
+ Values[i].WriteUpdateMask(data);
+ else
+ WriteCompleteDynamicFieldUpdateMask(Values[i].size(), data);
+ }
+ }
+ if (changesMask[0])
+ {
+ for (uint32 i = 0; i < 11; ++i)
+ {
+ for (uint32 j = 0; j < Values[i].size(); ++j)
+ {
+ if (Values[i].HasChanged(j) || ignoreChangesMask)
+ {
+ data << uint64(Values[i][j]);
+ }
+ }
+ }
+ }
+ data.FlushBits();
+}
+
+void BitVectors::ClearChangesMask()
+{
+ Base::ClearChangesMask(Values);
+ _changesMask.ResetAll();
+}
+
+void PlayerDataElement::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
+{
+ data.WriteBits(Type, 1);
+ if (Type == 1)
+ {
+ data << float(FloatValue);
+ }
+ if (Type == 0)
+ {
+ data << int64(Int64Value);
+ }
+ data.FlushBits();
+}
+
+void PlayerDataElement::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
+{
+ data.WriteBits(Type, 1);
+ if (Type == 1)
+ {
+ data << float(FloatValue);
+ }
+ if (Type == 0)
+ {
+ data << int64(Int64Value);
+ }
+ data.FlushBits();
+}
+
+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);
@@ -3418,11 +3525,44 @@ bool TraitEntry::operator==(TraitEntry const& right) const
&& GrantedRanks == right.GrantedRanks;
}
+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);
@@ -3442,6 +3582,10 @@ void TraitConfig::WriteCreate(ByteBuffer& data, Player const* owner, Player cons
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.WriteString(Name);
data.FlushBits();
}
@@ -3452,7 +3596,7 @@ void TraitConfig::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player c
if (ignoreChangesMask)
changesMask.SetAll();
- data.WriteBits(changesMask.GetBlock(0), 12);
+ data.WriteBits(changesMask.GetBlock(0), 14);
if (changesMask[0])
{
@@ -3463,6 +3607,13 @@ void TraitConfig::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player c
else
WriteCompleteDynamicFieldUpdateMask(Entries.size(), data);
}
+ if (changesMask[2])
+ {
+ if (!ignoreChangesMask)
+ SubTrees.WriteUpdateMask(data);
+ else
+ WriteCompleteDynamicFieldUpdateMask(SubTrees.size(), data);
+ }
}
data.FlushBits();
if (changesMask[0])
@@ -3479,47 +3630,60 @@ void TraitConfig::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player c
}
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[5])
+ if (changesMask[6])
{
data << int32(Type);
}
- if (changesMask[6])
+ if (changesMask[7])
{
if (Type == 2)
{
data << int32(SkillLineID);
}
}
- if (changesMask[7])
+ }
+ if (changesMask[8])
+ {
+ if (changesMask[9])
{
if (Type == 1)
{
data << int32(ChrSpecializationID);
}
}
- }
- if (changesMask[8])
- {
- if (changesMask[9])
+ if (changesMask[10])
{
if (Type == 1)
{
data << int32(CombatConfigFlags);
}
}
- if (changesMask[10])
+ if (changesMask[11])
{
if (Type == 1)
{
data << int32(LocalIdentifier);
}
}
- if (changesMask[11])
+ }
+ if (changesMask[12])
+ {
+ if (changesMask[13])
{
if (Type == 3)
{
@@ -3527,9 +3691,9 @@ void TraitConfig::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player c
}
}
}
- if (changesMask[0])
+ if (changesMask[4])
{
- if (changesMask[3])
+ if (changesMask[5])
{
data.WriteBits(Name->size(), 9);
data.WriteString(Name);
@@ -3541,6 +3705,7 @@ void TraitConfig::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player c
void TraitConfig::ClearChangesMask()
{
Base::ClearChangesMask(Entries);
+ Base::ClearChangesMask(SubTrees);
Base::ClearChangesMask(ID);
Base::ClearChangesMask(Name);
Base::ClearChangesMask(Type);
@@ -3624,6 +3789,70 @@ void CraftingOrderItem::ClearChangesMask()
_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);
@@ -3637,12 +3866,14 @@ void CraftingOrderData::WriteCreate(ByteBuffer& data, Player const* owner, Playe
data << int64(TipAmount);
data << int64(ConsortiumCut);
data << uint32(Flags);
- data << CustomerGUID;
- data << CustomerAccountGUID;
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();
@@ -3651,6 +3882,14 @@ void CraftingOrderData::WriteCreate(ByteBuffer& data, Player const* owner, Playe
Reagents[i].WriteCreate(data, owner, receiver);
}
data.WriteString(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);
@@ -3668,7 +3907,7 @@ void CraftingOrderData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Pl
if (ignoreChangesMask)
changesMask.SetAll();
- data.WriteBits(changesMask.GetBlock(0), 24);
+ data.WriteBits(changesMask.GetBlock(0), 26);
if (changesMask[0])
{
@@ -3705,13 +3944,13 @@ void CraftingOrderData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Pl
{
data << int32(SkillLineAbilityID);
}
- }
- if (changesMask[5])
- {
- if (changesMask[6])
+ if (changesMask[5])
{
data << uint8(OrderState);
}
+ }
+ if (changesMask[6])
+ {
if (changesMask[7])
{
data << uint8(OrderType);
@@ -3724,17 +3963,17 @@ void CraftingOrderData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Pl
{
data << int64(ExpirationTime);
}
- }
- if (changesMask[10])
- {
- if (changesMask[11])
+ if (changesMask[10])
{
data << int64(ClaimEndTime);
}
- if (changesMask[12])
+ if (changesMask[11])
{
data << int64(TipAmount);
}
+ }
+ if (changesMask[12])
+ {
if (changesMask[13])
{
data << int64(ConsortiumCut);
@@ -3743,44 +3982,68 @@ void CraftingOrderData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Pl
{
data << uint32(Flags);
}
- }
- if (changesMask[15])
- {
+ if (changesMask[15])
+ {
+ data << CrafterGUID;
+ }
if (changesMask[16])
{
- data << CustomerGUID;
+ data << PersonalCrafterGUID;
}
if (changesMask[17])
{
- data << CustomerAccountGUID;
+ data << int32(NpcCraftingOrderSetID);
}
- if (changesMask[18])
+ }
+ if (changesMask[18])
+ {
+ if (changesMask[19])
{
- data << CrafterGUID;
+ data << int32(NpcTreasureID);
}
- if (changesMask[19])
+ if (changesMask[20])
{
- data << PersonalCrafterGUID;
+ 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[20])
+ if (changesMask[24])
{
- if (changesMask[21])
+ data.WriteBits(OutputItemData.has_value(), 1);
+ }
+ if (changesMask[18])
+ {
+ if (changesMask[20])
{
- data.WriteBits(CustomerNotes->size(), 10);
data.WriteString(CustomerNotes);
}
- data.WriteBits(OutputItem.has_value(), 1);
- data.WriteBits(OutputItemData.has_value(), 1);
- data.FlushBits();
+ 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[23])
+ }
+ if (changesMask[24])
+ {
+ if (changesMask[25])
{
if (OutputItemData.has_value())
{
@@ -3805,11 +4068,13 @@ void CraftingOrderData::ClearChangesMask()
Base::ClearChangesMask(TipAmount);
Base::ClearChangesMask(ConsortiumCut);
Base::ClearChangesMask(Flags);
- Base::ClearChangesMask(CustomerGUID);
- Base::ClearChangesMask(CustomerAccountGUID);
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();
@@ -3937,6 +4202,50 @@ void PersonalCraftingOrderCount::ClearChangesMask()
_changesMask.ResetAll();
}
+void NPCCraftingOrderInfo::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
+{
+ data << uint64(Field_0);
+ data << int32(Field_8);
+ data << int32(Field_C);
+ data << int32(Field_10);
+}
+
+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(Field_0);
+ }
+ if (changesMask[1])
+ {
+ data << int32(Field_8);
+ }
+ if (changesMask[2])
+ {
+ data << int32(Field_C);
+ }
+ if (changesMask[3])
+ {
+ data << int32(Field_10);
+ }
+}
+
+void NPCCraftingOrderInfo::ClearChangesMask()
+{
+ Base::ClearChangesMask(Field_0);
+ Base::ClearChangesMask(Field_8);
+ Base::ClearChangesMask(Field_C);
+ Base::ClearChangesMask(Field_10);
+ _changesMask.ResetAll();
+}
+
void CategoryCooldownMod::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int32(SpellCategoryID);
@@ -4138,6 +4447,134 @@ void CollectableSourceTrackedData::ClearChangesMask()
_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.WriteString(Name);
+ data.WriteString(Icon);
+ data.WriteString(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);
+
+ data.FlushBits();
+ if (changesMask[0])
+ {
+ data.WriteBits(Name->size(), 7);
+ }
+ if (changesMask[1])
+ {
+ data.WriteBits(Icon->size(), 9);
+ }
+ if (changesMask[2])
+ {
+ data.WriteBits(Description->size(), 14);
+ }
+ if (changesMask[3])
+ {
+ data << int32(DepositFlags);
+ }
+ if (changesMask[0])
+ {
+ data.WriteString(Name);
+ }
+ if (changesMask[1])
+ {
+ data.WriteString(Icon);
+ }
+ if (changesMask[2])
+ {
+ data.WriteString(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 << int64(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 << int64(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 Research::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
data << int16(ResearchProjectID);
@@ -4155,7 +4592,7 @@ bool Research::operator==(Research const& right) const
void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const
{
- for (uint32 i = 0; i < 227; ++i)
+ for (uint32 i = 0; i < 232; ++i)
{
data << InvSlots[i];
}
@@ -4163,6 +4600,7 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
data << SummonedBattlePetGUID;
data << uint32(KnownTitles.size());
data << uint64(Coinage);
+ data << uint64(AccountBankCoinage);
data << int32(XP);
data << int32(NextLevelXP);
data << int32(TrialXP);
@@ -4193,14 +4631,9 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
data << float(VersatilityBonus);
data << float(PvpPowerDamage);
data << float(PvpPowerHealing);
- for (uint32 i = 0; i < 9; ++i)
- {
- data << uint32(DataFlags[i].size());
- for (uint32 j = 0; j < DataFlags[i].size(); ++j)
- {
- data << uint64(DataFlags[i][j]);
- }
- }
+ 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);
@@ -4278,7 +4711,7 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
{
data << uint32(BankBagSlotFlags[i]);
}
- for (uint32 i = 0; i < 950; ++i)
+ for (uint32 i = 0; i < 960; ++i)
{
data << uint64(QuestCompleted[i]);
}
@@ -4286,6 +4719,7 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
data << int32(HonorNextLevel);
data << int32(PerksProgramCurrency);
data << uint8(NumBankSlots);
+ data << uint8(NumAccountBankTabs);
for (uint32 i = 0; i < 1; ++i)
{
data << uint32(ResearchSites[i].size());
@@ -4333,6 +4767,7 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
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)
@@ -4431,6 +4866,10 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
{
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);
@@ -4452,6 +4891,9 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
data.WriteBit(HasPerksProgramPendingReward);
data.WriteBits(QuestSession.has_value(), 1);
data.WriteBits(PetStable.has_value(), 1);
+ data.WriteBits(AccountBankTabSettings.size(), 3);
+ data.WriteBits(WalkInData.has_value(), 1);
+ data.WriteBits(DelveData.has_value(), 1);
data.FlushBits();
ResearchHistory->WriteCreate(data, owner, receiver);
if (QuestSession.has_value())
@@ -4461,6 +4903,14 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
data << FrozenPerksVendorItem;
Field_1410->WriteCreate(data, owner, receiver);
data << DungeonScore;
+ 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 < PvpInfo.size(); ++i)
{
PvpInfo[i].WriteCreate(data, owner, receiver);
@@ -4481,6 +4931,18 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
{
PetStable->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);
+ }
data.FlushBits();
}
@@ -4493,8 +4955,8 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
{
for (uint32 i = 0; i < 1; ++i)
data << uint32(changesMask.GetBlocksMask(i));
- data.WriteBits(changesMask.GetBlocksMask(1), 14);
- for (uint32 i = 0; i < 46; ++i)
+ data.WriteBits(changesMask.GetBlocksMask(1), 15);
+ for (uint32 i = 0; i < 47; ++i)
if (changesMask.GetBlock(i))
data.WriteBits(changesMask.GetBlock(i), 32);
@@ -4531,39 +4993,21 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
else
WriteCompleteDynamicFieldUpdateMask(KnownTitles.size(), data);
}
- }
- if (changesMask[36])
- {
- for (uint32 i = 0; i < 9; ++i)
+ if (changesMask[8])
{
- if (changesMask[37])
- {
- if (!ignoreNestedChangesMask)
- DataFlags[i].WriteUpdateMask(data);
- else
- WriteCompleteDynamicFieldUpdateMask(DataFlags[i].size(), data);
- }
+ if (!ignoreNestedChangesMask)
+ CharacterDataElements.WriteUpdateMask(data);
+ else
+ WriteCompleteDynamicFieldUpdateMask(CharacterDataElements.size(), data);
}
- }
- if (changesMask[36])
- {
- for (uint32 i = 0; i < 9; ++i)
+ if (changesMask[9])
{
- if (changesMask[37])
- {
- for (uint32 j = 0; j < DataFlags[i].size(); ++j)
- {
- if (DataFlags[i].HasChanged(j) || ignoreNestedChangesMask)
- {
- data << uint64(DataFlags[i][j]);
- }
- }
- }
+ if (!ignoreNestedChangesMask)
+ AccountDataElements.WriteUpdateMask(data);
+ else
+ WriteCompleteDynamicFieldUpdateMask(AccountDataElements.size(), data);
}
- }
- if (changesMask[0])
- {
- if (changesMask[8])
+ if (changesMask[10])
{
if (!ignoreNestedChangesMask)
PvpInfo.WriteUpdateMask(data);
@@ -4571,11 +5015,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
WriteCompleteDynamicFieldUpdateMask(PvpInfo.size(), data);
}
}
- if (changesMask[38])
+ if (changesMask[40])
{
for (uint32 i = 0; i < 1; ++i)
{
- if (changesMask[39])
+ if (changesMask[41])
{
if (!ignoreNestedChangesMask)
ResearchSites[i].WriteUpdateMask(data);
@@ -4584,11 +5028,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[40])
+ if (changesMask[42])
{
for (uint32 i = 0; i < 1; ++i)
{
- if (changesMask[41])
+ if (changesMask[43])
{
if (!ignoreNestedChangesMask)
ResearchSiteProgress[i].WriteUpdateMask(data);
@@ -4597,11 +5041,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[42])
+ if (changesMask[44])
{
for (uint32 i = 0; i < 1; ++i)
{
- if (changesMask[43])
+ if (changesMask[45])
{
if (!ignoreNestedChangesMask)
Research[i].WriteUpdateMask(data);
@@ -4610,11 +5054,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[38])
+ if (changesMask[40])
{
for (uint32 i = 0; i < 1; ++i)
{
- if (changesMask[39])
+ if (changesMask[41])
{
for (uint32 j = 0; j < ResearchSites[i].size(); ++j)
{
@@ -4626,11 +5070,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[40])
+ if (changesMask[42])
{
for (uint32 i = 0; i < 1; ++i)
{
- if (changesMask[41])
+ if (changesMask[43])
{
for (uint32 j = 0; j < ResearchSiteProgress[i].size(); ++j)
{
@@ -4642,11 +5086,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[42])
+ if (changesMask[44])
{
for (uint32 i = 0; i < 1; ++i)
{
- if (changesMask[43])
+ if (changesMask[45])
{
for (uint32 j = 0; j < Research[i].size(); ++j)
{
@@ -4661,185 +5105,192 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
data.FlushBits();
if (changesMask[0])
{
- if (changesMask[9])
+ if (changesMask[11])
{
if (!ignoreNestedChangesMask)
DailyQuestsCompleted.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(DailyQuestsCompleted.size(), data);
}
- if (changesMask[10])
+ if (changesMask[12])
{
if (!ignoreNestedChangesMask)
AvailableQuestLineXQuestIDs.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(AvailableQuestLineXQuestIDs.size(), data);
}
- if (changesMask[11])
+ if (changesMask[13])
{
if (!ignoreNestedChangesMask)
Heirlooms.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Heirlooms.size(), data);
}
- if (changesMask[12])
+ if (changesMask[14])
{
if (!ignoreNestedChangesMask)
HeirloomFlags.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(HeirloomFlags.size(), data);
}
- if (changesMask[13])
+ if (changesMask[15])
{
if (!ignoreNestedChangesMask)
Toys.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Toys.size(), data);
}
- if (changesMask[14])
+ if (changesMask[16])
{
if (!ignoreNestedChangesMask)
ToyFlags.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ToyFlags.size(), data);
}
- if (changesMask[15])
+ if (changesMask[17])
{
if (!ignoreNestedChangesMask)
Transmog.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Transmog.size(), data);
}
- if (changesMask[16])
+ if (changesMask[18])
{
if (!ignoreNestedChangesMask)
ConditionalTransmog.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ConditionalTransmog.size(), data);
}
- if (changesMask[17])
+ if (changesMask[19])
{
if (!ignoreNestedChangesMask)
SelfResSpells.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(SelfResSpells.size(), data);
}
- if (changesMask[18])
+ if (changesMask[20])
{
if (!ignoreNestedChangesMask)
RuneforgePowers.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(RuneforgePowers.size(), data);
}
- if (changesMask[19])
+ if (changesMask[21])
{
if (!ignoreNestedChangesMask)
TransmogIllusions.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(TransmogIllusions.size(), data);
}
- if (changesMask[20])
+ if (changesMask[22])
{
if (!ignoreNestedChangesMask)
CharacterRestrictions.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(CharacterRestrictions.size(), data);
}
- if (changesMask[21])
+ if (changesMask[23])
{
if (!ignoreNestedChangesMask)
SpellPctModByLabel.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(SpellPctModByLabel.size(), data);
}
- if (changesMask[22])
+ if (changesMask[24])
{
if (!ignoreNestedChangesMask)
SpellFlatModByLabel.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(SpellFlatModByLabel.size(), data);
}
- if (changesMask[23])
+ if (changesMask[25])
{
if (!ignoreNestedChangesMask)
MawPowers.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(MawPowers.size(), data);
}
- if (changesMask[24])
+ if (changesMask[26])
{
if (!ignoreNestedChangesMask)
MultiFloorExploration.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(MultiFloorExploration.size(), data);
}
- if (changesMask[25])
+ if (changesMask[27])
{
if (!ignoreNestedChangesMask)
RecipeProgression.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(RecipeProgression.size(), data);
}
- if (changesMask[26])
+ if (changesMask[28])
{
if (!ignoreNestedChangesMask)
ReplayedQuests.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ReplayedQuests.size(), data);
}
- if (changesMask[27])
+ if (changesMask[29])
{
if (!ignoreNestedChangesMask)
TaskQuests.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(TaskQuests.size(), data);
}
- if (changesMask[28])
+ if (changesMask[30])
{
if (!ignoreNestedChangesMask)
DisabledSpells.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(DisabledSpells.size(), data);
}
- if (changesMask[29])
+ if (changesMask[31])
{
if (!ignoreNestedChangesMask)
TraitConfigs.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(TraitConfigs.size(), data);
}
- if (changesMask[30])
+ }
+ if (changesMask[32])
+ {
+ if (changesMask[33])
{
if (!ignoreNestedChangesMask)
CraftingOrders.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(CraftingOrders.size(), data);
}
- if (changesMask[31])
+ if (changesMask[34])
{
if (!ignoreNestedChangesMask)
PersonalCraftingOrderCounts.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(PersonalCraftingOrderCounts.size(), data);
}
- }
- if (changesMask[32])
- {
- if (changesMask[33])
+ if (changesMask[35])
+ {
+ if (!ignoreNestedChangesMask)
+ NpcCraftingOrders.WriteUpdateMask(data);
+ else
+ WriteCompleteDynamicFieldUpdateMask(NpcCraftingOrders.size(), data);
+ }
+ if (changesMask[36])
{
if (!ignoreNestedChangesMask)
CategoryCooldownMods.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(CategoryCooldownMods.size(), data);
}
- if (changesMask[34])
+ if (changesMask[37])
{
if (!ignoreNestedChangesMask)
WeeklySpellUses.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(WeeklySpellUses.size(), data);
}
- if (changesMask[35])
+ if (changesMask[38])
{
if (!ignoreNestedChangesMask)
TrackedCollectableSources.WriteUpdateMask(data);
@@ -4860,7 +5311,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[9])
+ if (changesMask[11])
{
for (uint32 i = 0; i < DailyQuestsCompleted.size(); ++i)
{
@@ -4870,7 +5321,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[10])
+ if (changesMask[12])
{
for (uint32 i = 0; i < AvailableQuestLineXQuestIDs.size(); ++i)
{
@@ -4880,7 +5331,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[11])
+ if (changesMask[13])
{
for (uint32 i = 0; i < Heirlooms.size(); ++i)
{
@@ -4890,7 +5341,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[12])
+ if (changesMask[14])
{
for (uint32 i = 0; i < HeirloomFlags.size(); ++i)
{
@@ -4900,7 +5351,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[13])
+ if (changesMask[15])
{
for (uint32 i = 0; i < Toys.size(); ++i)
{
@@ -4910,7 +5361,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[14])
+ if (changesMask[16])
{
for (uint32 i = 0; i < ToyFlags.size(); ++i)
{
@@ -4920,7 +5371,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[15])
+ if (changesMask[17])
{
for (uint32 i = 0; i < Transmog.size(); ++i)
{
@@ -4930,7 +5381,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[16])
+ if (changesMask[18])
{
for (uint32 i = 0; i < ConditionalTransmog.size(); ++i)
{
@@ -4940,7 +5391,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[17])
+ if (changesMask[19])
{
for (uint32 i = 0; i < SelfResSpells.size(); ++i)
{
@@ -4950,7 +5401,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[18])
+ if (changesMask[20])
{
for (uint32 i = 0; i < RuneforgePowers.size(); ++i)
{
@@ -4960,7 +5411,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[19])
+ if (changesMask[21])
{
for (uint32 i = 0; i < TransmogIllusions.size(); ++i)
{
@@ -4970,7 +5421,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[21])
+ if (changesMask[23])
{
for (uint32 i = 0; i < SpellPctModByLabel.size(); ++i)
{
@@ -4980,7 +5431,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[22])
+ if (changesMask[24])
{
for (uint32 i = 0; i < SpellFlatModByLabel.size(); ++i)
{
@@ -4990,7 +5441,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[23])
+ if (changesMask[25])
{
for (uint32 i = 0; i < MawPowers.size(); ++i)
{
@@ -5000,7 +5451,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[24])
+ if (changesMask[26])
{
for (uint32 i = 0; i < MultiFloorExploration.size(); ++i)
{
@@ -5010,7 +5461,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[25])
+ if (changesMask[27])
{
for (uint32 i = 0; i < RecipeProgression.size(); ++i)
{
@@ -5020,7 +5471,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[26])
+ if (changesMask[28])
{
for (uint32 i = 0; i < ReplayedQuests.size(); ++i)
{
@@ -5030,7 +5481,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[27])
+ if (changesMask[29])
{
for (uint32 i = 0; i < TaskQuests.size(); ++i)
{
@@ -5040,7 +5491,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[28])
+ if (changesMask[30])
{
for (uint32 i = 0; i < DisabledSpells.size(); ++i)
{
@@ -5050,7 +5501,10 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[31])
+ }
+ if (changesMask[32])
+ {
+ if (changesMask[34])
{
for (uint32 i = 0; i < PersonalCraftingOrderCounts.size(); ++i)
{
@@ -5060,10 +5514,17 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- }
- if (changesMask[32])
- {
- if (changesMask[33])
+ if (changesMask[35])
+ {
+ for (uint32 i = 0; i < NpcCraftingOrders.size(); ++i)
+ {
+ if (NpcCraftingOrders.HasChanged(i) || ignoreNestedChangesMask)
+ {
+ NpcCraftingOrders[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ }
+ }
+ }
+ if (changesMask[36])
{
for (uint32 i = 0; i < CategoryCooldownMods.size(); ++i)
{
@@ -5073,7 +5534,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[34])
+ if (changesMask[37])
{
for (uint32 i = 0; i < WeeklySpellUses.size(); ++i)
{
@@ -5083,7 +5544,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[35])
+ if (changesMask[38])
{
for (uint32 i = 0; i < TrackedCollectableSources.size(); ++i)
{
@@ -5093,11 +5554,38 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
+ if (changesMask[39])
+ {
+ if (!ignoreNestedChangesMask)
+ AccountBankTabSettings.WriteUpdateMask(data, 3);
+ else
+ WriteCompleteDynamicFieldUpdateMask(AccountBankTabSettings.size(), data, 3);
+ }
}
if (changesMask[0])
{
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[10])
+ {
for (uint32 i = 0; i < PvpInfo.size(); ++i)
{
if (PvpInfo.HasChanged(i) || ignoreNestedChangesMask)
@@ -5106,7 +5594,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[20])
+ if (changesMask[22])
{
for (uint32 i = 0; i < CharacterRestrictions.size(); ++i)
{
@@ -5116,7 +5604,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[29])
+ if (changesMask[31])
{
for (uint32 i = 0; i < TraitConfigs.size(); ++i)
{
@@ -5126,7 +5614,10 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[30])
+ }
+ if (changesMask[32])
+ {
+ if (changesMask[33])
{
for (uint32 i = 0; i < CraftingOrders.size(); ++i)
{
@@ -5136,533 +5627,574 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- }
- if (changesMask[32])
- {
- if (changesMask[44])
+ if (changesMask[39])
+ {
+ for (uint32 i = 0; i < AccountBankTabSettings.size(); ++i)
+ {
+ if (AccountBankTabSettings.HasChanged(i) || ignoreNestedChangesMask)
+ {
+ AccountBankTabSettings[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ }
+ }
+ }
+ if (changesMask[46])
{
data << FarsightObject;
}
- if (changesMask[45])
+ if (changesMask[47])
{
data << SummonedBattlePetGUID;
}
- if (changesMask[46])
+ if (changesMask[48])
{
data << uint64(Coinage);
}
- if (changesMask[47])
+ if (changesMask[49])
+ {
+ data << uint64(AccountBankCoinage);
+ }
+ if (changesMask[50])
{
data << int32(XP);
}
- if (changesMask[48])
+ if (changesMask[51])
{
data << int32(NextLevelXP);
}
- if (changesMask[49])
+ if (changesMask[52])
{
data << int32(TrialXP);
}
- if (changesMask[50])
+ if (changesMask[53])
{
Skill->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
- if (changesMask[51])
+ if (changesMask[54])
{
data << int32(CharacterPoints);
}
- if (changesMask[52])
+ if (changesMask[55])
{
data << int32(MaxTalentTiers);
}
- if (changesMask[53])
+ if (changesMask[56])
{
data << uint32(TrackCreatureMask);
}
- if (changesMask[54])
+ if (changesMask[57])
{
data << float(MainhandExpertise);
}
- if (changesMask[55])
+ if (changesMask[58])
{
data << float(OffhandExpertise);
}
- if (changesMask[56])
+ if (changesMask[59])
{
data << float(RangedExpertise);
}
- if (changesMask[57])
+ if (changesMask[60])
{
data << float(CombatRatingExpertise);
}
- if (changesMask[58])
+ if (changesMask[61])
{
data << float(BlockPercentage);
}
- if (changesMask[59])
+ if (changesMask[62])
{
data << float(DodgePercentage);
}
- if (changesMask[60])
+ if (changesMask[63])
{
data << float(DodgePercentageFromAttribute);
}
- if (changesMask[61])
+ if (changesMask[64])
{
data << float(ParryPercentage);
}
- if (changesMask[62])
+ if (changesMask[65])
{
data << float(ParryPercentageFromAttribute);
}
- if (changesMask[63])
+ if (changesMask[66])
{
data << float(CritPercentage);
}
- if (changesMask[64])
+ if (changesMask[67])
{
data << float(RangedCritPercentage);
}
- if (changesMask[65])
+ if (changesMask[68])
{
data << float(OffhandCritPercentage);
}
- if (changesMask[66])
+ if (changesMask[69])
{
data << float(SpellCritPercentage);
}
- if (changesMask[67])
+ }
+ if (changesMask[70])
+ {
+ if (changesMask[71])
{
data << int32(ShieldBlock);
}
- if (changesMask[68])
+ if (changesMask[72])
{
data << float(ShieldBlockCritPercentage);
}
- if (changesMask[69])
+ if (changesMask[73])
{
data << float(Mastery);
}
- if (changesMask[70])
+ if (changesMask[74])
{
data << float(Speed);
}
- if (changesMask[71])
+ if (changesMask[75])
{
data << float(Avoidance);
}
- }
- if (changesMask[72])
- {
- if (changesMask[73])
+ if (changesMask[76])
{
data << float(Sturdiness);
}
- if (changesMask[74])
+ if (changesMask[77])
{
data << int32(Versatility);
}
- if (changesMask[75])
+ if (changesMask[78])
{
data << float(VersatilityBonus);
}
- if (changesMask[76])
+ if (changesMask[79])
{
data << float(PvpPowerDamage);
}
- if (changesMask[77])
+ if (changesMask[80])
{
data << float(PvpPowerHealing);
}
- if (changesMask[78])
+ if (changesMask[81])
+ {
+ BitVectors->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ }
+ if (changesMask[82])
{
data << int32(ModHealingDonePos);
}
- if (changesMask[79])
+ if (changesMask[83])
{
data << float(ModHealingPercent);
}
- if (changesMask[80])
+ if (changesMask[84])
{
data << float(ModPeriodicHealingDonePercent);
}
- if (changesMask[81])
+ if (changesMask[85])
{
data << float(ModSpellPowerPercent);
}
- if (changesMask[82])
+ if (changesMask[86])
{
data << float(ModResiliencePercent);
}
- if (changesMask[83])
+ if (changesMask[87])
{
data << float(OverrideSpellPowerByAPPercent);
}
- if (changesMask[84])
+ if (changesMask[88])
{
data << float(OverrideAPBySpellPowerPercent);
}
- if (changesMask[85])
+ if (changesMask[89])
{
data << int32(ModTargetResistance);
}
- if (changesMask[86])
+ if (changesMask[90])
{
data << int32(ModTargetPhysicalResistance);
}
- if (changesMask[87])
+ if (changesMask[91])
{
data << uint32(LocalFlags);
}
- if (changesMask[88])
+ if (changesMask[92])
{
data << uint8(GrantableLevels);
}
- if (changesMask[89])
+ if (changesMask[93])
{
data << uint8(MultiActionBars);
}
- if (changesMask[90])
+ if (changesMask[94])
{
data << uint8(LifetimeMaxRank);
}
- if (changesMask[91])
+ if (changesMask[95])
{
data << uint8(NumRespecs);
}
- if (changesMask[92])
+ if (changesMask[96])
{
data << uint32(PvpMedals);
}
- if (changesMask[93])
+ if (changesMask[97])
{
data << uint16(TodayHonorableKills);
}
- if (changesMask[94])
+ if (changesMask[98])
{
data << uint16(YesterdayHonorableKills);
}
- if (changesMask[95])
+ if (changesMask[99])
{
data << uint32(LifetimeHonorableKills);
}
- if (changesMask[96])
+ if (changesMask[100])
{
data << int32(WatchedFactionIndex);
}
- if (changesMask[97])
+ if (changesMask[101])
{
data << int32(MaxLevel);
}
- if (changesMask[98])
+ }
+ if (changesMask[102])
+ {
+ if (changesMask[103])
{
data << int32(ScalingPlayerLevelDelta);
}
- if (changesMask[99])
+ if (changesMask[104])
{
data << int32(MaxCreatureScalingLevel);
}
- if (changesMask[100])
+ if (changesMask[105])
{
data << int32(PetSpellPower);
}
- if (changesMask[101])
+ if (changesMask[106])
{
data << float(UiHitModifier);
}
- if (changesMask[102])
+ if (changesMask[107])
{
data << float(UiSpellHitModifier);
}
- if (changesMask[103])
+ if (changesMask[108])
{
data << int32(HomeRealmTimeOffset);
}
- }
- if (changesMask[104])
- {
- if (changesMask[105])
+ if (changesMask[109])
{
data << float(ModPetHaste);
}
- if (changesMask[106])
+ if (changesMask[110])
{
data << int8(JailersTowerLevelMax);
}
- if (changesMask[107])
+ if (changesMask[111])
{
data << int8(JailersTowerLevel);
}
- if (changesMask[108])
+ if (changesMask[112])
{
data << uint8(LocalRegenFlags);
}
- if (changesMask[109])
+ if (changesMask[113])
{
data << uint8(AuraVision);
}
- if (changesMask[110])
+ if (changesMask[114])
{
data << uint8(NumBackpackSlots);
}
- if (changesMask[111])
+ if (changesMask[115])
{
data << int32(OverrideSpellsID);
}
- if (changesMask[112])
+ if (changesMask[116])
{
data << uint16(LootSpecID);
}
- if (changesMask[113])
+ if (changesMask[117])
{
data << uint32(OverrideZonePVPType);
}
- if (changesMask[114])
+ if (changesMask[118])
{
data << int32(Honor);
}
- if (changesMask[115])
+ if (changesMask[119])
{
data << int32(HonorNextLevel);
}
- if (changesMask[116])
+ if (changesMask[120])
{
data << int32(PerksProgramCurrency);
}
- if (changesMask[117])
+ if (changesMask[121])
{
data << uint8(NumBankSlots);
}
if (changesMask[122])
{
+ data << uint8(NumAccountBankTabs);
+ }
+ if (changesMask[127])
+ {
data << int32(UiChromieTimeExpansionID);
}
- if (changesMask[123])
+ if (changesMask[128])
{
data << int32(TimerunningSeasonID);
}
- if (changesMask[124])
+ if (changesMask[129])
{
data << int32(TransportServerTime);
}
- if (changesMask[125])
+ if (changesMask[130])
{
data << uint32(WeeklyRewardsPeriodSinceOrigin);
}
- if (changesMask[126])
+ if (changesMask[131])
{
data << int16(DEBUGSoulbindConduitRank);
}
- if (changesMask[128])
+ if (changesMask[133])
{
data << uint32(ActiveCombatTraitConfigID);
}
- if (changesMask[129])
+ }
+ if (changesMask[134])
+ {
+ if (changesMask[135])
{
data << int32(ItemUpgradeHighOnehandWeaponItemID);
}
- if (changesMask[130])
+ if (changesMask[136])
{
data << int32(ItemUpgradeHighFingerItemID);
}
- if (changesMask[131])
+ if (changesMask[137])
{
data << float(ItemUpgradeHighFingerWatermark);
}
- if (changesMask[132])
+ if (changesMask[138])
{
data << int32(ItemUpgradeHighTrinketItemID);
}
- if (changesMask[133])
+ if (changesMask[139])
{
data << float(ItemUpgradeHighTrinketWatermark);
}
- if (changesMask[134])
+ if (changesMask[140])
{
data << uint64(LootHistoryInstanceID);
}
- }
- if (changesMask[136])
- {
- if (changesMask[137])
+ if (changesMask[142])
{
data << uint8(RequiredMountCapabilityFlags);
}
}
- if (changesMask[104])
+ 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.FlushBits();
- if (changesMask[104])
+ if (changesMask[102])
{
- if (changesMask[118])
+ if (changesMask[123])
{
ResearchHistory->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
- if (changesMask[120])
+ if (changesMask[125])
{
if (QuestSession.has_value())
{
QuestSession->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
- if (changesMask[119])
+ if (changesMask[124])
{
data << FrozenPerksVendorItem;
}
- if (changesMask[121])
+ if (changesMask[126])
{
Field_1410->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
- if (changesMask[127])
+ if (changesMask[132])
{
data << DungeonScore;
}
- if (changesMask[135])
+ }
+ if (changesMask[134])
+ {
+ if (changesMask[141])
{
if (PetStable.has_value())
{
PetStable->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
+ if (changesMask[143])
+ {
+ if (WalkInData.has_value())
+ {
+ WalkInData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ }
+ }
+ if (changesMask[144])
+ {
+ if (DelveData.has_value())
+ {
+ DelveData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ }
+ }
}
- if (changesMask[138])
+ if (changesMask[145])
{
- for (uint32 i = 0; i < 227; ++i)
+ for (uint32 i = 0; i < 232; ++i)
{
- if (changesMask[139 + i])
+ if (changesMask[146 + i])
{
data << InvSlots[i];
}
}
}
- if (changesMask[366])
+ if (changesMask[378])
{
for (uint32 i = 0; i < 2; ++i)
{
- if (changesMask[367 + i])
+ if (changesMask[379 + i])
{
RestInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
- if (changesMask[369])
+ if (changesMask[381])
{
for (uint32 i = 0; i < 7; ++i)
{
- if (changesMask[370 + i])
+ if (changesMask[382 + i])
{
data << int32(ModDamageDonePos[i]);
}
- if (changesMask[377 + i])
+ if (changesMask[389 + i])
{
data << int32(ModDamageDoneNeg[i]);
}
- if (changesMask[384 + i])
+ if (changesMask[396 + i])
{
data << float(ModDamageDonePercent[i]);
}
- if (changesMask[391 + i])
+ if (changesMask[403 + i])
{
data << float(ModHealingDonePercent[i]);
}
}
}
- if (changesMask[398])
+ if (changesMask[410])
{
for (uint32 i = 0; i < 3; ++i)
{
- if (changesMask[399 + i])
+ if (changesMask[411 + i])
{
data << float(WeaponDmgMultipliers[i]);
}
- if (changesMask[402 + i])
+ if (changesMask[414 + i])
{
data << float(WeaponAtkSpeedMultipliers[i]);
}
}
}
- if (changesMask[405])
+ if (changesMask[417])
{
for (uint32 i = 0; i < 12; ++i)
{
- if (changesMask[406 + i])
+ if (changesMask[418 + i])
{
data << uint32(BuybackPrice[i]);
}
- if (changesMask[418 + i])
+ if (changesMask[430 + i])
{
data << int64(BuybackTimestamp[i]);
}
}
}
- if (changesMask[430])
+ if (changesMask[442])
{
for (uint32 i = 0; i < 32; ++i)
{
- if (changesMask[431 + i])
+ if (changesMask[443 + i])
{
data << int32(CombatRatings[i]);
}
}
}
- if (changesMask[463])
+ if (changesMask[475])
{
for (uint32 i = 0; i < 4; ++i)
{
- if (changesMask[464 + i])
+ if (changesMask[476 + i])
{
data << uint32(NoReagentCostMask[i]);
}
}
}
- if (changesMask[468])
+ if (changesMask[480])
{
for (uint32 i = 0; i < 2; ++i)
{
- if (changesMask[469 + i])
+ if (changesMask[481 + i])
{
data << int32(ProfessionSkillLine[i]);
}
}
}
- if (changesMask[471])
+ if (changesMask[483])
{
for (uint32 i = 0; i < 5; ++i)
{
- if (changesMask[472 + i])
+ if (changesMask[484 + i])
{
data << uint32(BagSlotFlags[i]);
}
}
}
- if (changesMask[477])
+ if (changesMask[489])
{
for (uint32 i = 0; i < 7; ++i)
{
- if (changesMask[478 + i])
+ if (changesMask[490 + i])
{
data << uint32(BankBagSlotFlags[i]);
}
}
}
- if (changesMask[485])
+ if (changesMask[497])
{
- for (uint32 i = 0; i < 950; ++i)
+ for (uint32 i = 0; i < 960; ++i)
{
- if (changesMask[486 + i])
+ if (changesMask[498 + i])
{
data << uint64(QuestCompleted[i]);
}
}
}
- if (changesMask[1436])
+ if (changesMask[1458])
{
for (uint32 i = 0; i < 17; ++i)
{
- if (changesMask[1437 + i])
+ if (changesMask[1459 + i])
{
data << float(ItemUpgradeHighWatermark[i]);
}
@@ -5679,7 +6211,6 @@ void ActivePlayerData::ClearChangesMask()
Base::ClearChangesMask(SortBagsRightToLeft);
Base::ClearChangesMask(InsertItemsLeftToRight);
Base::ClearChangesMask(HasPerksProgramPendingReward);
- Base::ClearChangesMask(DataFlags);
Base::ClearChangesMask(ResearchSites);
Base::ClearChangesMask(ResearchSiteProgress);
Base::ClearChangesMask(Research);
@@ -5704,16 +6235,21 @@ void ActivePlayerData::ClearChangesMask()
Base::ClearChangesMask(TaskQuests);
Base::ClearChangesMask(DisabledSpells);
Base::ClearChangesMask(PersonalCraftingOrderCounts);
+ Base::ClearChangesMask(NpcCraftingOrders);
Base::ClearChangesMask(CategoryCooldownMods);
Base::ClearChangesMask(WeeklySpellUses);
Base::ClearChangesMask(TrackedCollectableSources);
+ Base::ClearChangesMask(CharacterDataElements);
+ Base::ClearChangesMask(AccountDataElements);
Base::ClearChangesMask(PvpInfo);
Base::ClearChangesMask(CharacterRestrictions);
Base::ClearChangesMask(TraitConfigs);
Base::ClearChangesMask(CraftingOrders);
+ Base::ClearChangesMask(AccountBankTabSettings);
Base::ClearChangesMask(FarsightObject);
Base::ClearChangesMask(SummonedBattlePetGUID);
Base::ClearChangesMask(Coinage);
+ Base::ClearChangesMask(AccountBankCoinage);
Base::ClearChangesMask(XP);
Base::ClearChangesMask(NextLevelXP);
Base::ClearChangesMask(TrialXP);
@@ -5744,6 +6280,7 @@ void ActivePlayerData::ClearChangesMask()
Base::ClearChangesMask(VersatilityBonus);
Base::ClearChangesMask(PvpPowerDamage);
Base::ClearChangesMask(PvpPowerHealing);
+ Base::ClearChangesMask(BitVectors);
Base::ClearChangesMask(ModHealingDonePos);
Base::ClearChangesMask(ModHealingPercent);
Base::ClearChangesMask(ModPeriodicHealingDonePercent);
@@ -5783,6 +6320,7 @@ void ActivePlayerData::ClearChangesMask()
Base::ClearChangesMask(HonorNextLevel);
Base::ClearChangesMask(PerksProgramCurrency);
Base::ClearChangesMask(NumBankSlots);
+ Base::ClearChangesMask(NumAccountBankTabs);
Base::ClearChangesMask(ResearchHistory);
Base::ClearChangesMask(FrozenPerksVendorItem);
Base::ClearChangesMask(Field_1410);
@@ -5802,6 +6340,8 @@ void ActivePlayerData::ClearChangesMask()
Base::ClearChangesMask(LootHistoryInstanceID);
Base::ClearChangesMask(PetStable);
Base::ClearChangesMask(RequiredMountCapabilityFlags);
+ Base::ClearChangesMask(WalkInData);
+ Base::ClearChangesMask(DelveData);
Base::ClearChangesMask(InvSlots);
Base::ClearChangesMask(RestInfo);
Base::ClearChangesMask(ModDamageDonePos);
diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h
index 0abb78c5711..43b1c60d9a9 100644
--- a/src/server/game/Entities/Object/Updates/UpdateFields.h
+++ b/src/server/game/Entities/Object/Updates/UpdateFields.h
@@ -74,8 +74,8 @@ struct ItemEnchantment : public IsUpdateFieldStructureTag, public HasChangesMask
struct ItemMod : public IsUpdateFieldStructureTag
{
- int32 Value;
uint8 Type;
+ int32 Value;
void WriteCreate(ByteBuffer& data, Item const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Item const* owner, Player const* receiver) const;
@@ -129,7 +129,7 @@ struct ItemData : public IsUpdateFieldStructureTag, public HasChangesMask<41>
UpdateField<uint32, 0, 10> Durability;
UpdateField<uint32, 0, 11> MaxDurability;
UpdateField<uint32, 0, 12> CreatePlayedTime;
- UpdateField<int32, 0, 13> Context;
+ UpdateField<uint8, 0, 13> Context;
UpdateField<int64, 0, 14> CreateTime;
UpdateField<uint64, 0, 15> ArtifactXP;
UpdateField<uint8, 0, 16> ItemAppearanceModID;
@@ -148,10 +148,10 @@ struct ItemData : public IsUpdateFieldStructureTag, public HasChangesMask<41>
void ClearChangesMask();
};
-struct ContainerData : public IsUpdateFieldStructureTag, public HasChangesMask<39>
+struct ContainerData : public IsUpdateFieldStructureTag, public HasChangesMask<101>
{
UpdateField<uint32, 0, 1> NumSlots;
- UpdateFieldArray<ObjectGuid, 36, 2, 3> Slots;
+ UpdateFieldArray<ObjectGuid, 98, 2, 3> Slots;
void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Bag const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Bag const* owner, Player const* receiver) const;
@@ -257,154 +257,159 @@ struct PassiveSpellHistory : public IsUpdateFieldStructureTag
bool operator!=(PassiveSpellHistory const& right) const { return !(*this == right); }
};
-struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<217>
+struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<220>
{
- UpdateField<std::vector<uint32>, 0, 1> StateWorldEffectIDs;
- DynamicUpdateField<UF::PassiveSpellHistory, 0, 2> PassiveSpells;
- DynamicUpdateField<int32, 0, 3> WorldEffects;
- DynamicUpdateField<ObjectGuid, 0, 4> ChannelObjects;
- UpdateField<int32, 0, 5> DisplayID;
+ UpdateField<bool, 0, 1> Field_314;
+ UpdateField<std::vector<uint32>, 0, 2> StateWorldEffectIDs;
+ DynamicUpdateField<UF::PassiveSpellHistory, 0, 3> PassiveSpells;
+ DynamicUpdateField<int32, 0, 4> WorldEffects;
+ DynamicUpdateField<ObjectGuid, 0, 5> ChannelObjects;
+ UpdateField<int32, 0, 6> DisplayID;
struct DisplayIDTag : ViewerDependentValueTag<int32> {};
- UpdateField<uint32, 0, 6> StateSpellVisualID;
- UpdateField<uint32, 0, 7> StateAnimID;
- UpdateField<uint32, 0, 8> StateAnimKitID;
- UpdateField<uint32, 0, 9> StateWorldEffectsQuestObjectiveID;
- UpdateField<int32, 0, 10> SpellOverrideNameID;
- UpdateField<ObjectGuid, 0, 11> Charm;
- UpdateField<ObjectGuid, 0, 12> Summon;
- UpdateField<ObjectGuid, 0, 13> Critter;
- UpdateField<ObjectGuid, 0, 14> CharmedBy;
- UpdateField<ObjectGuid, 0, 15> SummonedBy;
- UpdateField<ObjectGuid, 0, 16> CreatedBy;
- UpdateField<ObjectGuid, 0, 17> DemonCreator;
- UpdateField<ObjectGuid, 0, 18> LookAtControllerTarget;
- UpdateField<ObjectGuid, 0, 19> Target;
- UpdateField<ObjectGuid, 0, 20> BattlePetCompanionGUID;
- UpdateField<uint64, 0, 21> BattlePetDBID;
- UpdateField<UF::UnitChannel, 0, 22> ChannelData;
- UpdateField<int8, 0, 23> SpellEmpowerStage;
- UpdateField<uint32, 0, 24> SummonedByHomeRealm;
- UpdateField<uint8, 0, 25> Race;
- UpdateField<uint8, 0, 26> ClassId;
- UpdateField<uint8, 0, 27> PlayerClassId;
- UpdateField<uint8, 0, 28> Sex;
- UpdateField<uint8, 0, 29> DisplayPower;
- UpdateField<uint32, 0, 30> OverrideDisplayPowerID;
- UpdateField<int64, 0, 31> Health;
- UpdateField<int64, 32, 33> MaxHealth;
- UpdateField<int32, 32, 34> Level;
- UpdateField<int32, 32, 35> EffectiveLevel;
- UpdateField<int32, 32, 36> ContentTuningID;
- UpdateField<int32, 32, 37> ScalingLevelMin;
- UpdateField<int32, 32, 38> ScalingLevelMax;
- UpdateField<int32, 32, 39> ScalingLevelDelta;
- UpdateField<int32, 32, 40> ScalingFactionGroup;
- UpdateField<int32, 32, 41> FactionTemplate;
+ UpdateField<uint32, 0, 7> NpcFlags;
+ struct NpcFlagsTag : ViewerDependentValueTag<uint32> {};
+ UpdateField<uint32, 0, 8> NpcFlags2;
+ struct NpcFlags2Tag : ViewerDependentValueTag<uint32> {};
+ UpdateField<uint32, 0, 9> StateSpellVisualID;
+ UpdateField<uint32, 0, 10> StateAnimID;
+ UpdateField<uint32, 0, 11> StateAnimKitID;
+ UpdateField<uint32, 0, 12> StateWorldEffectsQuestObjectiveID;
+ UpdateField<int32, 0, 13> SpellOverrideNameID;
+ UpdateField<ObjectGuid, 0, 14> Charm;
+ UpdateField<ObjectGuid, 0, 15> Summon;
+ UpdateField<ObjectGuid, 0, 16> Critter;
+ UpdateField<ObjectGuid, 0, 17> CharmedBy;
+ UpdateField<ObjectGuid, 0, 18> SummonedBy;
+ UpdateField<ObjectGuid, 0, 19> CreatedBy;
+ UpdateField<ObjectGuid, 0, 20> DemonCreator;
+ UpdateField<ObjectGuid, 0, 21> LookAtControllerTarget;
+ UpdateField<ObjectGuid, 0, 22> Target;
+ UpdateField<ObjectGuid, 0, 23> BattlePetCompanionGUID;
+ UpdateField<uint64, 0, 24> BattlePetDBID;
+ UpdateField<UF::UnitChannel, 0, 25> ChannelData;
+ UpdateField<int8, 0, 26> SpellEmpowerStage;
+ UpdateField<uint32, 0, 27> SummonedByHomeRealm;
+ UpdateField<uint8, 0, 28> Race;
+ UpdateField<uint8, 0, 29> ClassId;
+ UpdateField<uint8, 0, 30> PlayerClassId;
+ UpdateField<uint8, 0, 31> Sex;
+ UpdateField<uint8, 32, 33> DisplayPower;
+ UpdateField<uint32, 32, 34> OverrideDisplayPowerID;
+ UpdateField<int64, 32, 35> Health;
+ UpdateField<int64, 32, 36> MaxHealth;
+ UpdateField<int32, 32, 37> Level;
+ UpdateField<int32, 32, 38> EffectiveLevel;
+ UpdateField<int32, 32, 39> ContentTuningID;
+ UpdateField<int32, 32, 40> ScalingLevelMin;
+ UpdateField<int32, 32, 41> ScalingLevelMax;
+ UpdateField<int32, 32, 42> ScalingLevelDelta;
+ UpdateField<int32, 32, 43> ScalingFactionGroup;
+ UpdateField<int32, 32, 44> FactionTemplate;
struct FactionTemplateTag : ViewerDependentValueTag<int32> {};
- UpdateField<uint32, 32, 42> Flags;
+ UpdateField<uint32, 32, 45> Flags;
struct FlagsTag : ViewerDependentValueTag<uint32> {};
- UpdateField<uint32, 32, 43> Flags2;
+ UpdateField<uint32, 32, 46> Flags2;
struct Flags2Tag : ViewerDependentValueTag<uint32> {};
- UpdateField<uint32, 32, 44> Flags3;
+ UpdateField<uint32, 32, 47> Flags3;
struct Flags3Tag : ViewerDependentValueTag<uint32> {};
- UpdateField<uint32, 32, 45> AuraState;
+ UpdateField<uint32, 32, 48> AuraState;
struct AuraStateTag : ViewerDependentValueTag<uint32> {};
- UpdateField<uint32, 32, 46> RangedAttackRoundBaseTime;
- UpdateField<float, 32, 47> BoundingRadius;
- UpdateField<float, 32, 48> CombatReach;
- UpdateField<float, 32, 49> DisplayScale;
- UpdateField<int32, 32, 50> CreatureFamily;
- UpdateField<int32, 32, 51> CreatureType;
- UpdateField<int32, 32, 52> NativeDisplayID;
- UpdateField<float, 32, 53> NativeXDisplayScale;
- UpdateField<int32, 32, 54> MountDisplayID;
- UpdateField<int32, 32, 55> CosmeticMountDisplayID;
- UpdateField<float, 32, 56> MinDamage;
- UpdateField<float, 32, 57> MaxDamage;
- UpdateField<float, 32, 58> MinOffHandDamage;
- UpdateField<float, 32, 59> MaxOffHandDamage;
- UpdateField<uint8, 32, 60> StandState;
- UpdateField<uint8, 32, 61> PetTalentPoints;
- UpdateField<uint8, 32, 62> VisFlags;
- UpdateField<uint8, 32, 63> AnimTier;
- UpdateField<uint32, 64, 65> PetNumber;
- UpdateField<uint32, 64, 66> PetNameTimestamp;
- UpdateField<uint32, 64, 67> PetExperience;
- UpdateField<uint32, 64, 68> PetNextLevelExperience;
- UpdateField<float, 64, 69> ModCastingSpeed;
- UpdateField<float, 64, 70> ModCastingSpeedNeg;
- UpdateField<float, 64, 71> ModSpellHaste;
- UpdateField<float, 64, 72> ModHaste;
- UpdateField<float, 64, 73> ModRangedHaste;
- UpdateField<float, 64, 74> ModHasteRegen;
- UpdateField<float, 64, 75> ModTimeRate;
- UpdateField<int32, 64, 76> CreatedBySpell;
- UpdateField<int32, 64, 77> EmoteState;
- UpdateField<int32, 64, 78> BaseMana;
- UpdateField<int32, 64, 79> BaseHealth;
- UpdateField<uint8, 64, 80> SheatheState;
- UpdateField<uint8, 64, 81> PvpFlags;
+ UpdateField<uint32, 32, 49> RangedAttackRoundBaseTime;
+ UpdateField<float, 32, 50> BoundingRadius;
+ UpdateField<float, 32, 51> CombatReach;
+ UpdateField<float, 32, 52> DisplayScale;
+ UpdateField<int32, 32, 53> CreatureFamily;
+ UpdateField<int32, 32, 54> CreatureType;
+ UpdateField<int32, 32, 55> NativeDisplayID;
+ UpdateField<float, 32, 56> NativeXDisplayScale;
+ UpdateField<int32, 32, 57> MountDisplayID;
+ UpdateField<int32, 32, 58> CosmeticMountDisplayID;
+ UpdateField<float, 32, 59> MinDamage;
+ UpdateField<float, 32, 60> MaxDamage;
+ UpdateField<float, 32, 61> MinOffHandDamage;
+ UpdateField<float, 32, 62> MaxOffHandDamage;
+ UpdateField<uint8, 32, 63> StandState;
+ UpdateField<uint8, 64, 65> PetTalentPoints;
+ UpdateField<uint8, 64, 66> VisFlags;
+ UpdateField<uint8, 64, 67> AnimTier;
+ UpdateField<uint32, 64, 68> PetNumber;
+ UpdateField<uint32, 64, 69> PetNameTimestamp;
+ UpdateField<uint32, 64, 70> PetExperience;
+ UpdateField<uint32, 64, 71> PetNextLevelExperience;
+ UpdateField<float, 64, 72> ModCastingSpeed;
+ UpdateField<float, 64, 73> ModCastingSpeedNeg;
+ UpdateField<float, 64, 74> ModSpellHaste;
+ UpdateField<float, 64, 75> ModHaste;
+ UpdateField<float, 64, 76> ModRangedHaste;
+ UpdateField<float, 64, 77> ModHasteRegen;
+ UpdateField<float, 64, 78> ModTimeRate;
+ UpdateField<int32, 64, 79> CreatedBySpell;
+ UpdateField<int32, 64, 80> EmoteState;
+ UpdateField<int32, 64, 81> BaseMana;
+ UpdateField<int32, 64, 82> BaseHealth;
+ UpdateField<uint8, 64, 83> SheatheState;
+ UpdateField<uint8, 64, 84> PvpFlags;
struct PvpFlagsTag : ViewerDependentValueTag<uint8> {};
- UpdateField<uint8, 64, 82> PetFlags;
- UpdateField<uint8, 64, 83> ShapeshiftForm;
- UpdateField<int32, 64, 84> AttackPower;
- UpdateField<int32, 64, 85> AttackPowerModPos;
- UpdateField<int32, 64, 86> AttackPowerModNeg;
- UpdateField<float, 64, 87> AttackPowerMultiplier;
- UpdateField<int32, 64, 88> AttackPowerModSupport;
- UpdateField<int32, 64, 89> RangedAttackPower;
- UpdateField<int32, 64, 90> RangedAttackPowerModPos;
- UpdateField<int32, 64, 91> RangedAttackPowerModNeg;
- UpdateField<float, 64, 92> RangedAttackPowerMultiplier;
- UpdateField<int32, 64, 93> RangedAttackPowerModSupport;
- UpdateField<int32, 64, 94> MainHandWeaponAttackPower;
- UpdateField<int32, 64, 95> OffHandWeaponAttackPower;
- UpdateField<int32, 96, 97> RangedWeaponAttackPower;
- UpdateField<int32, 96, 98> SetAttackSpeedAura;
- UpdateField<float, 96, 99> Lifesteal;
- UpdateField<float, 96, 100> MinRangedDamage;
- UpdateField<float, 96, 101> MaxRangedDamage;
- UpdateField<float, 96, 102> ManaCostMultiplier;
- UpdateField<float, 96, 103> MaxHealthModifier;
- UpdateField<float, 96, 104> HoverHeight;
- UpdateField<int32, 96, 105> MinItemLevelCutoff;
- UpdateField<int32, 96, 106> MinItemLevel;
- UpdateField<int32, 96, 107> MaxItemLevel;
- UpdateField<int32, 96, 108> AzeriteItemLevel;
- UpdateField<int32, 96, 109> WildBattlePetLevel;
- UpdateField<int32, 96, 110> BattlePetCompanionExperience;
- UpdateField<uint32, 96, 111> BattlePetCompanionNameTimestamp;
- UpdateField<int32, 96, 112> InteractSpellID;
+ UpdateField<uint8, 64, 85> PetFlags;
+ UpdateField<uint8, 64, 86> ShapeshiftForm;
+ UpdateField<int32, 64, 87> AttackPower;
+ UpdateField<int32, 64, 88> AttackPowerModPos;
+ UpdateField<int32, 64, 89> AttackPowerModNeg;
+ UpdateField<float, 64, 90> AttackPowerMultiplier;
+ UpdateField<int32, 64, 91> AttackPowerModSupport;
+ UpdateField<int32, 64, 92> RangedAttackPower;
+ UpdateField<int32, 64, 93> RangedAttackPowerModPos;
+ UpdateField<int32, 64, 94> RangedAttackPowerModNeg;
+ UpdateField<float, 64, 95> RangedAttackPowerMultiplier;
+ UpdateField<int32, 96, 97> RangedAttackPowerModSupport;
+ UpdateField<int32, 96, 98> MainHandWeaponAttackPower;
+ UpdateField<int32, 96, 99> OffHandWeaponAttackPower;
+ UpdateField<int32, 96, 100> RangedWeaponAttackPower;
+ UpdateField<int32, 96, 101> SetAttackSpeedAura;
+ UpdateField<float, 96, 102> Lifesteal;
+ UpdateField<float, 96, 103> MinRangedDamage;
+ UpdateField<float, 96, 104> MaxRangedDamage;
+ UpdateField<float, 96, 105> ManaCostMultiplier;
+ UpdateField<float, 96, 106> MaxHealthModifier;
+ UpdateField<float, 96, 107> HoverHeight;
+ UpdateField<int32, 96, 108> MinItemLevelCutoff;
+ UpdateField<int32, 96, 109> MinItemLevel;
+ UpdateField<int32, 96, 110> MaxItemLevel;
+ UpdateField<int32, 96, 111> AzeriteItemLevel;
+ UpdateField<int32, 96, 112> WildBattlePetLevel;
+ UpdateField<int32, 96, 113> BattlePetCompanionExperience;
+ UpdateField<uint32, 96, 114> BattlePetCompanionNameTimestamp;
+ UpdateField<int32, 96, 115> InteractSpellID;
struct InteractSpellIDTag : ViewerDependentValueTag<int32> {};
- UpdateField<int32, 96, 113> ScaleDuration;
- UpdateField<int32, 96, 114> LooksLikeMountID;
- UpdateField<int32, 96, 115> LooksLikeCreatureID;
- UpdateField<int32, 96, 116> LookAtControllerID;
- UpdateField<int32, 96, 117> PerksVendorItemID;
- UpdateField<int32, 96, 118> TaxiNodesID;
- UpdateField<ObjectGuid, 96, 119> GuildGUID;
- UpdateField<int32, 96, 120> FlightCapabilityID;
- UpdateField<float, 96, 121> GlideEventSpeedDivisor; // Movement speed gets divided by this value when evaluating what GlideEvents to use
- UpdateField<uint32, 96, 122> Field_308;
- UpdateField<uint32, 96, 123> Field_30C;
- UpdateField<uint32, 96, 124> SilencedSchoolMask;
- UpdateField<uint32, 96, 125> CurrentAreaID;
- UpdateField<ObjectGuid, 96, 126> NameplateAttachToGUID; // When set, nameplate of this unit will instead appear on that object
- UpdateFieldArray<uint32, 2, 127, 128> NpcFlags;
- struct NpcFlagsTag : ViewerDependentValueTag<uint32> {};
- UpdateFieldArray<int32, 10, 130, 131> Power;
- UpdateFieldArray<int32, 10, 130, 141> MaxPower;
- UpdateFieldArray<float, 10, 130, 151> PowerRegenFlatModifier;
- UpdateFieldArray<float, 10, 130, 161> PowerRegenInterruptedFlatModifier;
- UpdateFieldArray<UF::VisibleItem, 3, 171, 172> VirtualItems;
- UpdateFieldArray<uint32, 2, 175, 176> AttackRoundBaseTime;
- UpdateFieldArray<int32, 4, 178, 179> Stats;
- UpdateFieldArray<int32, 4, 178, 183> StatPosBuff;
- UpdateFieldArray<int32, 4, 178, 187> StatNegBuff;
- UpdateFieldArray<int32, 4, 178, 191> StatSupportBuff;
- UpdateFieldArray<int32, 7, 195, 196> Resistances;
- UpdateFieldArray<int32, 7, 195, 203> BonusResistanceMods;
- UpdateFieldArray<int32, 7, 195, 210> ManaCostModifier;
+ UpdateField<int32, 96, 116> ScaleDuration;
+ UpdateField<int32, 96, 117> LooksLikeMountID;
+ UpdateField<int32, 96, 118> LooksLikeCreatureID;
+ UpdateField<int32, 96, 119> LookAtControllerID;
+ UpdateField<int32, 96, 120> PerksVendorItemID;
+ UpdateField<int32, 96, 121> TaxiNodesID;
+ UpdateField<ObjectGuid, 96, 122> GuildGUID;
+ UpdateField<int32, 96, 123> FlightCapabilityID;
+ UpdateField<float, 96, 124> GlideEventSpeedDivisor; // Movement speed gets divided by this value when evaluating what GlideEvents to use
+ UpdateField<uint32, 96, 125> MaxHealthModifierFlatNeg;
+ UpdateField<uint32, 96, 126> MaxHealthModifierFlatPos;
+ UpdateField<uint32, 96, 127> SilencedSchoolMask;
+ UpdateField<uint32, 128, 129> CurrentAreaID;
+ UpdateField<float, 128, 130> Field_31C;
+ UpdateField<float, 128, 131> Field_320; // Soft targeting related? When UnitFlags3 & 0x40000000 is set, increases some range check using CombatReach by this amount
+ UpdateField<ObjectGuid, 128, 132> NameplateAttachToGUID; // When set, nameplate of this unit will instead appear on that object
+ UpdateFieldArray<int32, 10, 133, 134> Power;
+ UpdateFieldArray<int32, 10, 133, 144> MaxPower;
+ UpdateFieldArray<float, 10, 133, 154> PowerRegenFlatModifier;
+ UpdateFieldArray<float, 10, 133, 164> PowerRegenInterruptedFlatModifier;
+ UpdateFieldArray<UF::VisibleItem, 3, 174, 175> VirtualItems;
+ UpdateFieldArray<uint32, 2, 178, 179> AttackRoundBaseTime;
+ UpdateFieldArray<int32, 4, 181, 182> Stats;
+ UpdateFieldArray<int32, 4, 181, 186> StatPosBuff;
+ UpdateFieldArray<int32, 4, 181, 190> StatNegBuff;
+ UpdateFieldArray<int32, 4, 181, 194> StatSupportBuff;
+ UpdateFieldArray<int32, 7, 198, 199> Resistances;
+ UpdateFieldArray<int32, 7, 198, 206> BonusResistanceMods;
+ UpdateFieldArray<int32, 7, 198, 213> ManaCostModifier;
void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const;
@@ -574,6 +579,27 @@ struct SkillInfo : public IsUpdateFieldStructureTag, public HasChangesMask<1793>
void ClearChangesMask();
};
+struct BitVectors : public IsUpdateFieldStructureTag, public HasChangesMask<1>
+{
+ UpdateFieldArray<DynamicUpdateFieldBase<uint64>, 11, 0, -1> Values;
+
+ void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const;
+ void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const;
+ void ClearChangesMask();
+};
+
+struct PlayerDataElement : public IsUpdateFieldStructureTag
+{
+ uint32 Type;
+ float FloatValue;
+ int64 Int64Value;
+
+ void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const;
+ void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const;
+ bool operator==(PlayerDataElement const& right) const;
+ bool operator!=(PlayerDataElement const& right) const { return !(*this == right); }
+};
+
struct RestInfo : public IsUpdateFieldStructureTag, public HasChangesMask<3>
{
UpdateField<uint32, 0, 1> Threshold;
@@ -743,17 +769,30 @@ struct TraitEntry : public IsUpdateFieldStructureTag
bool operator!=(TraitEntry const& right) const { return !(*this == right); }
};
-struct TraitConfig : public IsUpdateFieldStructureTag, public HasChangesMask<12>
+struct TraitSubTreeCache : public IsUpdateFieldStructureTag
+{
+ std::vector<UF::TraitEntry> Entries;
+ int32 TraitSubTreeID;
+ uint32 Active;
+
+ void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const;
+ void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const;
+ bool operator==(TraitSubTreeCache const& right) const;
+ bool operator!=(TraitSubTreeCache const& right) const { return !(*this == right); }
+};
+
+struct TraitConfig : public IsUpdateFieldStructureTag, public HasChangesMask<14>
{
DynamicUpdateField<UF::TraitEntry, 0, 1> Entries;
- UpdateField<int32, 0, 2> ID;
- UpdateField<std::string, 0, 3> Name;
- UpdateField<int32, 4, 5> Type;
- UpdateField<int32, 4, 6> SkillLineID;
- UpdateField<int32, 4, 7> ChrSpecializationID;
- UpdateField<int32, 8, 9> CombatConfigFlags;
- UpdateField<int32, 8, 10> LocalIdentifier;
- UpdateField<int32, 8, 11> TraitSystemID;
+ DynamicUpdateField<UF::TraitSubTreeCache, 0, 2> SubTrees;
+ UpdateField<int32, 0, 3> ID;
+ UpdateField<std::string, 4, 5> Name;
+ UpdateField<int32, 4, 6> Type;
+ UpdateField<int32, 4, 7> SkillLineID;
+ UpdateField<int32, 8, 9> ChrSpecializationID;
+ UpdateField<int32, 8, 10> CombatConfigFlags;
+ UpdateField<int32, 8, 11> LocalIdentifier;
+ UpdateField<int32, 12, 13> TraitSystemID;
void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const;
@@ -775,27 +814,49 @@ struct CraftingOrderItem : public IsUpdateFieldStructureTag, public HasChangesMa
void ClearChangesMask();
};
-struct CraftingOrderData : public IsUpdateFieldStructureTag, public HasChangesMask<24>
+struct CraftingOrderCustomer : public IsUpdateFieldStructureTag, public HasChangesMask<2>
+{
+ UpdateField<ObjectGuid, -1, 0> CustomerGUID;
+ UpdateField<ObjectGuid, -1, 1> CustomerAccountGUID;
+
+ void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const;
+ void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const;
+ void ClearChangesMask();
+};
+
+struct CraftingOrderNpcCustomer : public IsUpdateFieldStructureTag, public HasChangesMask<2>
+{
+ UpdateField<int64, -1, 0> NpcCraftingOrderCustomerID;
+ UpdateField<int32, -1, 1> Field_8;
+
+ void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const;
+ void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const;
+ void ClearChangesMask();
+};
+
+struct CraftingOrderData : public IsUpdateFieldStructureTag, public HasChangesMask<26>
{
DynamicUpdateField<UF::CraftingOrderItem, 0, 1> Reagents;
UpdateField<int32, 0, 2> Field_0;
UpdateField<uint64, 0, 3> OrderID;
UpdateField<int32, 0, 4> SkillLineAbilityID;
- UpdateField<uint8, 5, 6> OrderState;
- UpdateField<uint8, 5, 7> OrderType;
- UpdateField<uint8, 5, 8> MinQuality;
- UpdateField<int64, 5, 9> ExpirationTime;
- UpdateField<int64, 10, 11> ClaimEndTime;
- UpdateField<int64, 10, 12> TipAmount;
- UpdateField<int64, 10, 13> ConsortiumCut;
- UpdateField<uint32, 10, 14> Flags;
- UpdateField<ObjectGuid, 15, 16> CustomerGUID;
- UpdateField<ObjectGuid, 15, 17> CustomerAccountGUID;
- UpdateField<ObjectGuid, 15, 18> CrafterGUID;
- UpdateField<ObjectGuid, 15, 19> PersonalCrafterGUID;
- UpdateField<std::string, 20, 21> CustomerNotes;
- OptionalUpdateField<UF::CraftingOrderItem, 20, 22> OutputItem;
- OptionalUpdateField<WorldPackets::Item::ItemInstance, 20, 23> OutputItemData;
+ UpdateField<uint8, 0, 5> OrderState;
+ UpdateField<uint8, 6, 7> OrderType;
+ UpdateField<uint8, 6, 8> MinQuality;
+ UpdateField<int64, 6, 9> ExpirationTime;
+ UpdateField<int64, 6, 10> ClaimEndTime;
+ UpdateField<int64, 6, 11> TipAmount;
+ UpdateField<int64, 12, 13> ConsortiumCut;
+ UpdateField<uint32, 12, 14> Flags;
+ UpdateField<ObjectGuid, 12, 15> CrafterGUID;
+ UpdateField<ObjectGuid, 12, 16> PersonalCrafterGUID;
+ UpdateField<int32, 12, 17> NpcCraftingOrderSetID;
+ UpdateField<int32, 18, 19> NpcTreasureID;
+ UpdateField<std::string, 18, 20> CustomerNotes;
+ OptionalUpdateField<UF::CraftingOrderCustomer, 18, 21> Customer;
+ OptionalUpdateField<UF::CraftingOrderNpcCustomer, 18, 22> NpcCustomer;
+ OptionalUpdateField<UF::CraftingOrderItem, 18, 23> OutputItem;
+ OptionalUpdateField<WorldPackets::Item::ItemInstance, 24, 25> OutputItemData;
void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const;
@@ -824,6 +885,18 @@ struct PersonalCraftingOrderCount : public IsUpdateFieldStructureTag, public Has
void ClearChangesMask();
};
+struct NPCCraftingOrderInfo : public IsUpdateFieldStructureTag, public HasChangesMask<4>
+{
+ UpdateField<uint64, -1, 0> Field_0;
+ UpdateField<int32, -1, 1> Field_8;
+ UpdateField<int32, -1, 2> Field_C;
+ UpdateField<int32, -1, 3> Field_10;
+
+ void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const;
+ void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const;
+ void ClearChangesMask();
+};
+
struct CategoryCooldownMod : public IsUpdateFieldStructureTag
{
int32 SpellCategoryID;
@@ -882,6 +955,46 @@ struct CollectableSourceTrackedData : public IsUpdateFieldStructureTag, public H
void ClearChangesMask();
};
+struct BankTabSettings : public IsUpdateFieldStructureTag, public HasChangesMask<4>
+{
+ UpdateField<std::string, -1, 0> Name;
+ UpdateField<std::string, -1, 1> Icon;
+ UpdateField<std::string, -1, 2> Description;
+ UpdateField<int32, -1, 3> DepositFlags;
+
+ void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const;
+ void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const;
+ void ClearChangesMask();
+};
+
+struct WalkInData : public IsUpdateFieldStructureTag
+{
+ int32 MapID;
+ int64 Field_8;
+ uint32 Type;
+ ObjectGuid Field_18;
+
+ void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const;
+ void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const;
+ bool operator==(WalkInData const& right) const;
+ bool operator!=(WalkInData const& right) const { return !(*this == right); }
+};
+
+struct DelveData : public IsUpdateFieldStructureTag
+{
+ std::vector<ObjectGuid> Owners;
+ int32 Field_0;
+ int64 Field_8;
+ int32 Field_10;
+ int32 SpellID;
+ uint32 Started; // Restricts rewards to players in m_owners if set to true. Intended to prevent rewarwding players that join in-progress delve?
+
+ void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const;
+ void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const;
+ bool operator==(DelveData const& right) const;
+ bool operator!=(DelveData const& right) const { return !(*this == right); }
+};
+
struct Research : public IsUpdateFieldStructureTag
{
int16 ResearchProjectID;
@@ -892,7 +1005,7 @@ struct Research : public IsUpdateFieldStructureTag
bool operator!=(Research const& right) const { return !(*this == right); }
};
-struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1454>
+struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1476>
{
UpdateField<bool, 0, 1> BackpackAutoSortDisabled;
UpdateField<bool, 0, 2> BackpackSellJunkDisabled;
@@ -900,146 +1013,154 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas
UpdateField<bool, 0, 4> SortBagsRightToLeft;
UpdateField<bool, 0, 5> InsertItemsLeftToRight;
UpdateField<bool, 0, 6> HasPerksProgramPendingReward;
- UpdateFieldArray<DynamicUpdateFieldBase<uint64>, 9, 36, 37> DataFlags;
- UpdateFieldArray<DynamicUpdateFieldBase<uint16>, 1, 38, 39> ResearchSites;
- UpdateFieldArray<DynamicUpdateFieldBase<uint32>, 1, 40, 41> ResearchSiteProgress;
- UpdateFieldArray<DynamicUpdateFieldBase<UF::Research>, 1, 42, 43> Research;
+ UpdateFieldArray<DynamicUpdateFieldBase<uint16>, 1, 40, 41> ResearchSites;
+ UpdateFieldArray<DynamicUpdateFieldBase<uint32>, 1, 42, 43> ResearchSiteProgress;
+ UpdateFieldArray<DynamicUpdateFieldBase<UF::Research>, 1, 44, 45> Research;
DynamicUpdateField<uint64, 0, 7> KnownTitles;
- DynamicUpdateField<int32, 0, 9> DailyQuestsCompleted;
- DynamicUpdateField<int32, 0, 10> AvailableQuestLineXQuestIDs;
- DynamicUpdateField<int32, 0, 11> Heirlooms;
- DynamicUpdateField<uint32, 0, 12> HeirloomFlags;
- DynamicUpdateField<int32, 0, 13> Toys;
- DynamicUpdateField<uint32, 0, 14> ToyFlags;
- DynamicUpdateField<uint32, 0, 15> Transmog;
- DynamicUpdateField<int32, 0, 16> ConditionalTransmog;
- DynamicUpdateField<int32, 0, 17> SelfResSpells;
- DynamicUpdateField<uint32, 0, 18> RuneforgePowers;
- DynamicUpdateField<uint32, 0, 19> TransmogIllusions;
- DynamicUpdateField<UF::SpellPctModByLabel, 0, 21> SpellPctModByLabel;
- DynamicUpdateField<UF::SpellFlatModByLabel, 0, 22> SpellFlatModByLabel;
- DynamicUpdateField<UF::MawPower, 0, 23> MawPowers;
- DynamicUpdateField<UF::MultiFloorExplore, 0, 24> MultiFloorExploration;
- DynamicUpdateField<UF::RecipeProgressionInfo, 0, 25> RecipeProgression;
- DynamicUpdateField<UF::ReplayedQuest, 0, 26> ReplayedQuests;
- DynamicUpdateField<UF::QuestLog, 0, 27> TaskQuests;
- DynamicUpdateField<int32, 0, 28> DisabledSpells;
- DynamicUpdateField<UF::PersonalCraftingOrderCount, 0, 31> PersonalCraftingOrderCounts;
- DynamicUpdateField<UF::CategoryCooldownMod, 32, 33> CategoryCooldownMods;
- DynamicUpdateField<UF::WeeklySpellUse, 32, 34> WeeklySpellUses;
- DynamicUpdateField<UF::CollectableSourceTrackedData, 32, 35> TrackedCollectableSources;
- DynamicUpdateField<UF::PVPInfo, 0, 8> PvpInfo;
- DynamicUpdateField<UF::CharacterRestriction, 0, 20> CharacterRestrictions;
- DynamicUpdateField<UF::TraitConfig, 0, 29> TraitConfigs;
- DynamicUpdateField<UF::CraftingOrder, 0, 30> CraftingOrders;
- UpdateField<ObjectGuid, 32, 44> FarsightObject;
- UpdateField<ObjectGuid, 32, 45> SummonedBattlePetGUID;
- UpdateField<uint64, 32, 46> Coinage;
- UpdateField<int32, 32, 47> XP;
- UpdateField<int32, 32, 48> NextLevelXP;
- UpdateField<int32, 32, 49> TrialXP;
- UpdateField<UF::SkillInfo, 32, 50> Skill;
- UpdateField<int32, 32, 51> CharacterPoints;
- UpdateField<int32, 32, 52> MaxTalentTiers;
- UpdateField<uint32, 32, 53> TrackCreatureMask;
- UpdateField<float, 32, 54> MainhandExpertise;
- UpdateField<float, 32, 55> OffhandExpertise;
- UpdateField<float, 32, 56> RangedExpertise;
- UpdateField<float, 32, 57> CombatRatingExpertise;
- UpdateField<float, 32, 58> BlockPercentage;
- UpdateField<float, 32, 59> DodgePercentage;
- UpdateField<float, 32, 60> DodgePercentageFromAttribute;
- UpdateField<float, 32, 61> ParryPercentage;
- UpdateField<float, 32, 62> ParryPercentageFromAttribute;
- UpdateField<float, 32, 63> CritPercentage;
- UpdateField<float, 32, 64> RangedCritPercentage;
- UpdateField<float, 32, 65> OffhandCritPercentage;
- UpdateField<float, 32, 66> SpellCritPercentage;
- UpdateField<int32, 32, 67> ShieldBlock;
- UpdateField<float, 32, 68> ShieldBlockCritPercentage;
- UpdateField<float, 32, 69> Mastery;
- UpdateField<float, 32, 70> Speed;
- UpdateField<float, 32, 71> Avoidance;
- UpdateField<float, 72, 73> Sturdiness;
- UpdateField<int32, 72, 74> Versatility;
- UpdateField<float, 72, 75> VersatilityBonus;
- UpdateField<float, 72, 76> PvpPowerDamage;
- UpdateField<float, 72, 77> PvpPowerHealing;
- UpdateField<int32, 72, 78> ModHealingDonePos;
- UpdateField<float, 72, 79> ModHealingPercent;
- UpdateField<float, 72, 80> ModPeriodicHealingDonePercent;
- UpdateField<float, 72, 81> ModSpellPowerPercent;
- UpdateField<float, 72, 82> ModResiliencePercent;
- UpdateField<float, 72, 83> OverrideSpellPowerByAPPercent;
- UpdateField<float, 72, 84> OverrideAPBySpellPowerPercent;
- UpdateField<int32, 72, 85> ModTargetResistance;
- UpdateField<int32, 72, 86> ModTargetPhysicalResistance;
- UpdateField<uint32, 72, 87> LocalFlags;
- UpdateField<uint8, 72, 88> GrantableLevels;
- UpdateField<uint8, 72, 89> MultiActionBars;
- UpdateField<uint8, 72, 90> LifetimeMaxRank;
- UpdateField<uint8, 72, 91> NumRespecs;
- UpdateField<uint32, 72, 92> PvpMedals;
- UpdateField<uint16, 72, 93> TodayHonorableKills;
- UpdateField<uint16, 72, 94> YesterdayHonorableKills;
- UpdateField<uint32, 72, 95> LifetimeHonorableKills;
- UpdateField<int32, 72, 96> WatchedFactionIndex;
- UpdateField<int32, 72, 97> MaxLevel;
- UpdateField<int32, 72, 98> ScalingPlayerLevelDelta;
- UpdateField<int32, 72, 99> MaxCreatureScalingLevel;
- UpdateField<int32, 72, 100> PetSpellPower;
- UpdateField<float, 72, 101> UiHitModifier;
- UpdateField<float, 72, 102> UiSpellHitModifier;
- UpdateField<int32, 72, 103> HomeRealmTimeOffset;
- UpdateField<float, 104, 105> ModPetHaste;
- UpdateField<int8, 104, 106> JailersTowerLevelMax;
- UpdateField<int8, 104, 107> JailersTowerLevel;
- UpdateField<uint8, 104, 108> LocalRegenFlags;
- UpdateField<uint8, 104, 109> AuraVision;
- UpdateField<uint8, 104, 110> NumBackpackSlots;
- UpdateField<int32, 104, 111> OverrideSpellsID;
- UpdateField<uint16, 104, 112> LootSpecID;
- UpdateField<uint32, 104, 113> OverrideZonePVPType;
- UpdateField<int32, 104, 114> Honor;
- UpdateField<int32, 104, 115> HonorNextLevel;
- UpdateField<int32, 104, 116> PerksProgramCurrency;
- UpdateField<uint8, 104, 117> NumBankSlots;
- UpdateField<UF::ResearchHistory, 104, 118> ResearchHistory;
- UpdateField<WorldPackets::PerksProgram::PerksVendorItem, 104, 119> FrozenPerksVendorItem;
- UpdateField<UF::ActivePlayerUnk901, 104, 121> Field_1410;
- OptionalUpdateField<UF::QuestSession, 104, 120> QuestSession;
- UpdateField<int32, 104, 122> UiChromieTimeExpansionID;
- UpdateField<int32, 104, 123> TimerunningSeasonID;
- UpdateField<int32, 104, 124> TransportServerTime;
- UpdateField<uint32, 104, 125> WeeklyRewardsPeriodSinceOrigin; // week count since Cfg_RegionsEntry::ChallengeOrigin
- UpdateField<int16, 104, 126> DEBUGSoulbindConduitRank;
- UpdateField<WorldPackets::MythicPlus::DungeonScoreData, 104, 127> DungeonScore;
- UpdateField<uint32, 104, 128> ActiveCombatTraitConfigID;
- UpdateField<int32, 104, 129> ItemUpgradeHighOnehandWeaponItemID;
- UpdateField<int32, 104, 130> ItemUpgradeHighFingerItemID;
- UpdateField<float, 104, 131> ItemUpgradeHighFingerWatermark;
- UpdateField<int32, 104, 132> ItemUpgradeHighTrinketItemID;
- UpdateField<float, 104, 133> ItemUpgradeHighTrinketWatermark;
- UpdateField<uint64, 104, 134> LootHistoryInstanceID;
- OptionalUpdateField<UF::StableInfo, 104, 135> PetStable;
- UpdateField<uint8, 136, 137> RequiredMountCapabilityFlags;
- UpdateFieldArray<ObjectGuid, 227, 138, 139> InvSlots;
- UpdateFieldArray<UF::RestInfo, 2, 366, 367> RestInfo;
- UpdateFieldArray<int32, 7, 369, 370> ModDamageDonePos;
- UpdateFieldArray<int32, 7, 369, 377> ModDamageDoneNeg;
- UpdateFieldArray<float, 7, 369, 384> ModDamageDonePercent;
- UpdateFieldArray<float, 7, 369, 391> ModHealingDonePercent;
- UpdateFieldArray<float, 3, 398, 399> WeaponDmgMultipliers;
- UpdateFieldArray<float, 3, 398, 402> WeaponAtkSpeedMultipliers;
- UpdateFieldArray<uint32, 12, 405, 406> BuybackPrice;
- UpdateFieldArray<int64, 12, 405, 418> BuybackTimestamp;
- UpdateFieldArray<int32, 32, 430, 431> CombatRatings;
- UpdateFieldArray<uint32, 4, 463, 464> NoReagentCostMask;
- UpdateFieldArray<int32, 2, 468, 469> ProfessionSkillLine;
- UpdateFieldArray<uint32, 5, 471, 472> BagSlotFlags;
- UpdateFieldArray<uint32, 7, 477, 478> BankBagSlotFlags;
- UpdateFieldArray<uint64, 950, 485, 486> QuestCompleted;
- UpdateFieldArray<float, 17, 1436, 1437> ItemUpgradeHighWatermark;
+ DynamicUpdateField<int32, 0, 11> DailyQuestsCompleted;
+ DynamicUpdateField<int32, 0, 12> AvailableQuestLineXQuestIDs;
+ DynamicUpdateField<int32, 0, 13> Heirlooms;
+ DynamicUpdateField<uint32, 0, 14> HeirloomFlags;
+ DynamicUpdateField<int32, 0, 15> Toys;
+ DynamicUpdateField<uint32, 0, 16> ToyFlags;
+ DynamicUpdateField<uint32, 0, 17> Transmog;
+ DynamicUpdateField<int32, 0, 18> ConditionalTransmog;
+ DynamicUpdateField<int32, 0, 19> SelfResSpells;
+ DynamicUpdateField<uint32, 0, 20> RuneforgePowers;
+ DynamicUpdateField<uint32, 0, 21> TransmogIllusions;
+ DynamicUpdateField<UF::SpellPctModByLabel, 0, 23> SpellPctModByLabel;
+ DynamicUpdateField<UF::SpellFlatModByLabel, 0, 24> SpellFlatModByLabel;
+ DynamicUpdateField<UF::MawPower, 0, 25> MawPowers;
+ DynamicUpdateField<UF::MultiFloorExplore, 0, 26> MultiFloorExploration;
+ DynamicUpdateField<UF::RecipeProgressionInfo, 0, 27> RecipeProgression;
+ DynamicUpdateField<UF::ReplayedQuest, 0, 28> ReplayedQuests;
+ DynamicUpdateField<UF::QuestLog, 0, 29> TaskQuests;
+ DynamicUpdateField<int32, 0, 30> DisabledSpells;
+ DynamicUpdateField<UF::PersonalCraftingOrderCount, 32, 34> PersonalCraftingOrderCounts;
+ DynamicUpdateField<UF::NPCCraftingOrderInfo, 32, 35> NpcCraftingOrders;
+ DynamicUpdateField<UF::CategoryCooldownMod, 32, 36> CategoryCooldownMods;
+ DynamicUpdateField<UF::WeeklySpellUse, 32, 37> WeeklySpellUses;
+ DynamicUpdateField<UF::CollectableSourceTrackedData, 32, 38> TrackedCollectableSources;
+ DynamicUpdateField<UF::PlayerDataElement, 0, 8> CharacterDataElements;
+ DynamicUpdateField<UF::PlayerDataElement, 0, 9> AccountDataElements;
+ DynamicUpdateField<UF::PVPInfo, 0, 10> PvpInfo;
+ DynamicUpdateField<UF::CharacterRestriction, 0, 22> CharacterRestrictions;
+ DynamicUpdateField<UF::TraitConfig, 0, 31> TraitConfigs;
+ DynamicUpdateField<UF::CraftingOrder, 32, 33> CraftingOrders;
+ DynamicUpdateField<UF::BankTabSettings, 32, 39> AccountBankTabSettings;
+ UpdateField<ObjectGuid, 32, 46> FarsightObject;
+ UpdateField<ObjectGuid, 32, 47> SummonedBattlePetGUID;
+ UpdateField<uint64, 32, 48> Coinage;
+ UpdateField<uint64, 32, 49> AccountBankCoinage;
+ UpdateField<int32, 32, 50> XP;
+ UpdateField<int32, 32, 51> NextLevelXP;
+ UpdateField<int32, 32, 52> TrialXP;
+ UpdateField<UF::SkillInfo, 32, 53> Skill;
+ UpdateField<int32, 32, 54> CharacterPoints;
+ UpdateField<int32, 32, 55> MaxTalentTiers;
+ UpdateField<uint32, 32, 56> TrackCreatureMask;
+ UpdateField<float, 32, 57> MainhandExpertise;
+ UpdateField<float, 32, 58> OffhandExpertise;
+ UpdateField<float, 32, 59> RangedExpertise;
+ UpdateField<float, 32, 60> CombatRatingExpertise;
+ UpdateField<float, 32, 61> BlockPercentage;
+ UpdateField<float, 32, 62> DodgePercentage;
+ UpdateField<float, 32, 63> DodgePercentageFromAttribute;
+ UpdateField<float, 32, 64> ParryPercentage;
+ UpdateField<float, 32, 65> ParryPercentageFromAttribute;
+ UpdateField<float, 32, 66> CritPercentage;
+ UpdateField<float, 32, 67> RangedCritPercentage;
+ UpdateField<float, 32, 68> OffhandCritPercentage;
+ UpdateField<float, 32, 69> SpellCritPercentage;
+ UpdateField<int32, 70, 71> ShieldBlock;
+ UpdateField<float, 70, 72> ShieldBlockCritPercentage;
+ UpdateField<float, 70, 73> Mastery;
+ UpdateField<float, 70, 74> Speed;
+ UpdateField<float, 70, 75> Avoidance;
+ UpdateField<float, 70, 76> Sturdiness;
+ UpdateField<int32, 70, 77> Versatility;
+ UpdateField<float, 70, 78> VersatilityBonus;
+ UpdateField<float, 70, 79> PvpPowerDamage;
+ UpdateField<float, 70, 80> PvpPowerHealing;
+ UpdateField<UF::BitVectors, 70, 81> BitVectors;
+ UpdateField<int32, 70, 82> ModHealingDonePos;
+ UpdateField<float, 70, 83> ModHealingPercent;
+ UpdateField<float, 70, 84> ModPeriodicHealingDonePercent;
+ UpdateField<float, 70, 85> ModSpellPowerPercent;
+ UpdateField<float, 70, 86> ModResiliencePercent;
+ UpdateField<float, 70, 87> OverrideSpellPowerByAPPercent;
+ UpdateField<float, 70, 88> OverrideAPBySpellPowerPercent;
+ UpdateField<int32, 70, 89> ModTargetResistance;
+ UpdateField<int32, 70, 90> ModTargetPhysicalResistance;
+ UpdateField<uint32, 70, 91> LocalFlags;
+ UpdateField<uint8, 70, 92> GrantableLevels;
+ UpdateField<uint8, 70, 93> MultiActionBars;
+ UpdateField<uint8, 70, 94> LifetimeMaxRank;
+ UpdateField<uint8, 70, 95> NumRespecs;
+ UpdateField<uint32, 70, 96> PvpMedals;
+ UpdateField<uint16, 70, 97> TodayHonorableKills;
+ UpdateField<uint16, 70, 98> YesterdayHonorableKills;
+ UpdateField<uint32, 70, 99> LifetimeHonorableKills;
+ UpdateField<int32, 70, 100> WatchedFactionIndex;
+ UpdateField<int32, 70, 101> MaxLevel;
+ UpdateField<int32, 102, 103> ScalingPlayerLevelDelta;
+ UpdateField<int32, 102, 104> MaxCreatureScalingLevel;
+ UpdateField<int32, 102, 105> PetSpellPower;
+ UpdateField<float, 102, 106> UiHitModifier;
+ UpdateField<float, 102, 107> UiSpellHitModifier;
+ UpdateField<int32, 102, 108> HomeRealmTimeOffset;
+ UpdateField<float, 102, 109> ModPetHaste;
+ UpdateField<int8, 102, 110> JailersTowerLevelMax;
+ UpdateField<int8, 102, 111> JailersTowerLevel;
+ UpdateField<uint8, 102, 112> LocalRegenFlags;
+ UpdateField<uint8, 102, 113> AuraVision;
+ UpdateField<uint8, 102, 114> NumBackpackSlots;
+ UpdateField<int32, 102, 115> OverrideSpellsID;
+ UpdateField<uint16, 102, 116> LootSpecID;
+ UpdateField<uint32, 102, 117> OverrideZonePVPType;
+ UpdateField<int32, 102, 118> Honor;
+ UpdateField<int32, 102, 119> HonorNextLevel;
+ UpdateField<int32, 102, 120> PerksProgramCurrency;
+ UpdateField<uint8, 102, 121> NumBankSlots;
+ UpdateField<uint8, 102, 122> NumAccountBankTabs;
+ UpdateField<UF::ResearchHistory, 102, 123> ResearchHistory;
+ UpdateField<WorldPackets::PerksProgram::PerksVendorItem, 102, 124> FrozenPerksVendorItem;
+ UpdateField<UF::ActivePlayerUnk901, 102, 126> Field_1410;
+ OptionalUpdateField<UF::QuestSession, 102, 125> QuestSession;
+ UpdateField<int32, 102, 127> UiChromieTimeExpansionID;
+ UpdateField<int32, 102, 128> TimerunningSeasonID;
+ UpdateField<int32, 102, 129> TransportServerTime;
+ UpdateField<uint32, 102, 130> WeeklyRewardsPeriodSinceOrigin; // week count since Cfg_RegionsEntry::ChallengeOrigin
+ UpdateField<int16, 102, 131> DEBUGSoulbindConduitRank;
+ UpdateField<WorldPackets::MythicPlus::DungeonScoreData, 102, 132> DungeonScore;
+ UpdateField<uint32, 102, 133> ActiveCombatTraitConfigID;
+ UpdateField<int32, 134, 135> ItemUpgradeHighOnehandWeaponItemID;
+ UpdateField<int32, 134, 136> ItemUpgradeHighFingerItemID;
+ UpdateField<float, 134, 137> ItemUpgradeHighFingerWatermark;
+ UpdateField<int32, 134, 138> ItemUpgradeHighTrinketItemID;
+ UpdateField<float, 134, 139> ItemUpgradeHighTrinketWatermark;
+ UpdateField<uint64, 134, 140> LootHistoryInstanceID;
+ OptionalUpdateField<UF::StableInfo, 134, 141> PetStable;
+ UpdateField<uint8, 134, 142> RequiredMountCapabilityFlags;
+ OptionalUpdateField<UF::WalkInData, 134, 143> WalkInData;
+ OptionalUpdateField<UF::DelveData, 134, 144> DelveData;
+ UpdateFieldArray<ObjectGuid, 232, 145, 146> InvSlots;
+ UpdateFieldArray<UF::RestInfo, 2, 378, 379> RestInfo;
+ UpdateFieldArray<int32, 7, 381, 382> ModDamageDonePos;
+ UpdateFieldArray<int32, 7, 381, 389> ModDamageDoneNeg;
+ UpdateFieldArray<float, 7, 381, 396> ModDamageDonePercent;
+ UpdateFieldArray<float, 7, 381, 403> ModHealingDonePercent;
+ UpdateFieldArray<float, 3, 410, 411> WeaponDmgMultipliers;
+ UpdateFieldArray<float, 3, 410, 414> WeaponAtkSpeedMultipliers;
+ UpdateFieldArray<uint32, 12, 417, 418> BuybackPrice;
+ UpdateFieldArray<int64, 12, 417, 430> BuybackTimestamp;
+ UpdateFieldArray<int32, 32, 442, 443> CombatRatings;
+ UpdateFieldArray<uint32, 4, 475, 476> NoReagentCostMask;
+ UpdateFieldArray<int32, 2, 480, 481> ProfessionSkillLine;
+ UpdateFieldArray<uint32, 5, 483, 484> BagSlotFlags;
+ UpdateFieldArray<uint32, 7, 489, 490> BankBagSlotFlags;
+ UpdateFieldArray<uint64, 960, 497, 498> QuestCompleted;
+ UpdateFieldArray<float, 17, 1458, 1459> ItemUpgradeHighWatermark;
void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const;
diff --git a/src/server/game/Entities/Object/Updates/ViewerDependentValues.h b/src/server/game/Entities/Object/Updates/ViewerDependentValues.h
index 68d393e9804..9e3461af947 100644
--- a/src/server/game/Entities/Object/Updates/ViewerDependentValues.h
+++ b/src/server/game/Entities/Object/Updates/ViewerDependentValues.h
@@ -313,7 +313,7 @@ public:
static value_type GetValue(UF::UnitData const* unitData, Unit const* unit, Player const* receiver)
{
value_type interactSpellId = unitData->InteractSpellID;
- if (unitData->NpcFlags[0] & UNIT_NPC_FLAG_SPELLCLICK && !interactSpellId)
+ if (unitData->NpcFlags & UNIT_NPC_FLAG_SPELLCLICK && !interactSpellId)
{
// this field is not set if there are multiple available spellclick spells
auto clickBounds = sObjectMgr->GetSpellClickInfoMapBounds(unit->GetEntry());
@@ -340,9 +340,9 @@ class ViewerDependentValue<UF::UnitData::NpcFlagsTag>
public:
using value_type = UF::UnitData::NpcFlagsTag::value_type;
- static value_type GetValue(UF::UnitData const* unitData, uint32 i, Unit const* unit, Player const* receiver)
+ static value_type GetValue(UF::UnitData const* unitData, Unit const* unit, Player const* receiver)
{
- value_type npcFlag = unitData->NpcFlags[i];
+ value_type npcFlag = unitData->NpcFlags;
if (npcFlag)
{
if ((!unit->IsInteractionAllowedInCombat() && unit->IsInCombat())
@@ -350,14 +350,11 @@ public:
npcFlag = 0;
else if (Creature const* creature = unit->ToCreature())
{
- if (i == 0)
- {
- if (!receiver->CanSeeGossipOn(creature))
- npcFlag &= ~(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER);
+ if (!receiver->CanSeeGossipOn(creature))
+ npcFlag &= ~(UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER);
- if (!receiver->CanSeeSpellClickOn(creature))
- npcFlag &= ~UNIT_NPC_FLAG_SPELLCLICK;
- }
+ if (!receiver->CanSeeSpellClickOn(creature))
+ npcFlag &= ~UNIT_NPC_FLAG_SPELLCLICK;
}
}
return npcFlag;
@@ -365,6 +362,25 @@ public:
};
template<>
+class ViewerDependentValue<UF::UnitData::NpcFlags2Tag>
+{
+public:
+ using value_type = UF::UnitData::NpcFlags2Tag::value_type;
+
+ static value_type GetValue(UF::UnitData const* unitData, Unit const* unit, Player const* receiver)
+ {
+ value_type npcFlag = unitData->NpcFlags2;
+ if (npcFlag)
+ {
+ if ((!unit->IsInteractionAllowedInCombat() && unit->IsInCombat())
+ || (!unit->IsInteractionAllowedWhileHostile() && unit->IsHostileTo(receiver)))
+ npcFlag = 0;
+ }
+ return npcFlag;
+ }
+};
+
+template<>
class ViewerDependentValue<UF::GameObjectData::FlagsTag>
{
public: