diff options
| author | Shauren <shauren.trinity@gmail.com> | 2024-08-02 13:25:41 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2024-08-02 13:25:41 +0200 |
| commit | e59eef5432c7b70679d33f4911c88d0f7d75fd39 (patch) | |
| tree | fe9bce9c82496589facec3719b3f2943d8295e76 /src/server/game/Entities/Object | |
| parent | 7fb9168d57f378075b0f6692ea7ad822c1d8e43d (diff) | |
Core/PacketIO: Updated to 11.0.0
Diffstat (limited to 'src/server/game/Entities/Object')
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: |
