diff options
| author | Shauren <shauren.trinity@gmail.com> | 2025-03-02 15:43:34 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2025-03-02 15:43:34 +0100 |
| commit | 23624ed75abc8cbb77bb2e24a08e0836e4c41db5 (patch) | |
| tree | 593c0a5f9e4b75404ff3d30729ac08a7ea93f690 /src/server/game/Entities/Object | |
| parent | dac15a32a6361a5e47e17b621828369b1b7a4d84 (diff) | |
Core: Updated to 11.1.0
Diffstat (limited to 'src/server/game/Entities/Object')
8 files changed, 648 insertions, 539 deletions
diff --git a/src/server/game/Entities/Object/MovementInfo.h b/src/server/game/Entities/Object/MovementInfo.h index 65a044ecbe4..f7defefe5d0 100644 --- a/src/server/game/Entities/Object/MovementInfo.h +++ b/src/server/game/Entities/Object/MovementInfo.h @@ -92,12 +92,26 @@ struct MovementInfo // advflying struct AdvFlying { + AdvFlying() : forwardVelocity(0.0f), upVelocity(0.0f) { } + float forwardVelocity; float upVelocity; }; + struct Drive + { + Drive() : speed(0.0f), movementAngle(0.0f), accelerating(false), drifting(false) { } + + float speed; + float movementAngle; + bool accelerating; + bool drifting; + }; + Optional<AdvFlying> advFlying; + Optional<Drive> driveStatus; + Optional<ObjectGuid> standingOnGameObjectGUID; uint32 GetMovementFlags() const { return flags; } @@ -149,6 +163,9 @@ struct MovementForce float Magnitude = 0.0f; MovementForceType Type = MovementForceType::SingleDirectional; int32 MovementForceID = 0; + int32 Unknown1110_1 = 0; + int32 Unused1110 = 0; + uint32 Flags = 0; }; class MovementForces diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index b5728d43395..7c5570488de 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -247,11 +247,16 @@ void Object::BuildEntityFragments(ByteBuffer* data, std::span<WowCS::EntityFragm *data << WorldPackets::As<uint8>(WowCS::EntityFragment::End); } -void Object::BuildEntityFragmentsForValuesUpdateForPlayerWithMask(ByteBuffer* data, EnumFlag<UF::UpdateFieldFlag> flags) +void Object::BuildEntityFragmentsForValuesUpdateForPlayerWithMask(ByteBuffer* data, EnumFlag<UF::UpdateFieldFlag> flags) const { + uint8 contentsChangedMask = WowCS::CGObjectChangedMask; + for (WowCS::EntityFragment updateableFragmentId : m_entityFragments.GetUpdateableIds()) + if (WowCS::IsIndirectFragment(updateableFragmentId)) + contentsChangedMask |= m_entityFragments.GetUpdateMaskFor(updateableFragmentId) >> 1; // set the "fragment exists" bit + *data << uint8(flags.HasFlag(UF::UpdateFieldFlag::Owner)); *data << uint8(false); // m_entityFragments.IdsChanged - *data << uint8(WowCS::CGObjectUpdateMask); + *data << uint8(contentsChangedMask); } void Object::BuildDestroyUpdateBlock(UpdateData* data) const @@ -329,6 +334,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe bool HasSpline = unit->IsSplineEnabled(); bool HasInertia = unit->m_movementInfo.inertia.has_value(); bool HasAdvFlying = unit->m_movementInfo.advFlying.has_value(); + bool HasDriveStatus = unit->m_movementInfo.driveStatus.has_value(); bool HasStandingOnGameObjectGUID = unit->m_movementInfo.standingOnGameObjectGUID.has_value(); *data << GetGUID(); // MoverGUID @@ -360,6 +366,8 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe data->WriteBit(false); // RemoteTimeValid data->WriteBit(HasInertia); // HasInertia data->WriteBit(HasAdvFlying); // HasAdvFlying + data->WriteBit(HasDriveStatus); // HasDriveStatus + data->FlushBits(); if (!unit->m_movementInfo.transport.guid.IsEmpty()) *data << unit->m_movementInfo.transport; @@ -393,6 +401,14 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe } } + if (HasDriveStatus) + { + data->WriteBit(unit->m_movementInfo.driveStatus->accelerating); + data->WriteBit(unit->m_movementInfo.driveStatus->drifting); + *data << float(unit->m_movementInfo.driveStatus->speed); + *data << float(unit->m_movementInfo.driveStatus->movementAngle); + } + *data << float(unit->GetSpeed(MOVE_WALK)); *data << float(unit->GetSpeed(MOVE_RUN)); *data << float(unit->GetSpeed(MOVE_RUN_BACK)); @@ -838,7 +854,6 @@ void Object::ClearUpdateMask(bool remove) { m_values.ClearChangesMask(&Object::m_objectData); m_entityFragments.IdsChanged = false; - m_entityFragments.ContentsChangedMask = WowCS::CGObjectActiveMask; if (m_objectUpdated) { diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 2e96f92c59d..c9f0fdd04ed 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -433,7 +433,7 @@ class TC_GAME_API Object virtual void BuildValuesCreate(ByteBuffer* data, UF::UpdateFieldFlag flags, Player const* target) const = 0; virtual void BuildValuesUpdate(ByteBuffer* data, UF::UpdateFieldFlag flags, Player const* target) const = 0; static void BuildEntityFragments(ByteBuffer* data, std::span<WowCS::EntityFragment const> fragments); - static void BuildEntityFragmentsForValuesUpdateForPlayerWithMask(ByteBuffer* data, EnumFlag<UF::UpdateFieldFlag> flags); + void BuildEntityFragmentsForValuesUpdateForPlayerWithMask(ByteBuffer* data, EnumFlag<UF::UpdateFieldFlag> flags) const; public: virtual void BuildValuesUpdateWithFlag(ByteBuffer* data, UF::UpdateFieldFlag flags, Player const* target) const; @@ -523,7 +523,13 @@ inline void UF::UpdateFieldHolder::ClearChangesMask(UpdateField<T, BlockBit, Bit Object* owner = GetOwner(); owner->m_entityFragments.ContentsChangedMask &= ~owner->m_entityFragments.GetUpdateMaskFor(WowCS::EntityFragment(BlockBit)); if constexpr (WowCS::EntityFragment(BlockBit) == WowCS::EntityFragment::CGObject) + { _changesMask &= ~UpdateMaskHelpers::GetBlockFlag(Bit); + if (!_changesMask) + owner->m_entityFragments.ContentsChangedMask &= ~owner->m_entityFragments.GetUpdateMaskFor(WowCS::EntityFragment(BlockBit)); + } + else + owner->m_entityFragments.ContentsChangedMask &= ~owner->m_entityFragments.GetUpdateMaskFor(WowCS::EntityFragment(BlockBit)); (static_cast<Derived*>(owner)->*field)._value.ClearChangesMask(); } @@ -532,11 +538,18 @@ template <typename Derived, typename T, int32 BlockBit, uint32 Bit> inline void UF::UpdateFieldHolder::ClearChangesMask(OptionalUpdateField<T, BlockBit, Bit> Derived::* field) { Object* owner = GetOwner(); - owner->m_entityFragments.ContentsChangedMask &= ~owner->m_entityFragments.GetUpdateMaskFor(WowCS::EntityFragment(BlockBit)); if constexpr (WowCS::EntityFragment(BlockBit) == WowCS::EntityFragment::CGObject) + { _changesMask &= ~UpdateMaskHelpers::GetBlockFlag(Bit); + if (!_changesMask) + owner->m_entityFragments.ContentsChangedMask &= ~owner->m_entityFragments.GetUpdateMaskFor(WowCS::EntityFragment(BlockBit)); + } + else + owner->m_entityFragments.ContentsChangedMask &= ~owner->m_entityFragments.GetUpdateMaskFor(WowCS::EntityFragment(BlockBit)); - (static_cast<Derived*>(owner)->*field)._value->ClearChangesMask(); + auto& uf = (static_cast<Derived*>(owner)->*field); + if (uf.has_value()) + uf._value->ClearChangesMask(); } template <class T_VALUES, class T_FLAGS, class FLAG_TYPE, size_t ARRAY_SIZE> diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp index 83784f90050..cc073ad6592 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp @@ -929,7 +929,7 @@ bool PassiveSpellHistory::operator==(PassiveSpellHistory const& right) const void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const { - ViewerDependentValue<StateWorldEffectIDsTag>::value_type stateWorldEffectIDs = ViewerDependentValue<StateWorldEffectIDsTag>::GetValue(this, owner, receiver); + ViewerDependentValue<StateWorldEffectIDsTag>::value_type stateWorldEffectIDs = {}; data << int32(ViewerDependentValue<DisplayIDTag>::GetValue(this, owner, receiver)); data << uint32(ViewerDependentValue<NpcFlagsTag>::GetValue(this, owner, receiver)); @@ -937,6 +937,7 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << uint32(ViewerDependentValue<StateSpellVisualIDTag>::GetValue(this, owner, receiver)); data << uint32(ViewerDependentValue<StateAnimIDTag>::GetValue(this, owner, receiver)); data << uint32(ViewerDependentValue<StateAnimKitIDTag>::GetValue(this, owner, receiver)); + stateWorldEffectIDs = ViewerDependentValue<StateWorldEffectIDsTag>::GetValue(this, owner, receiver); data << uint32(stateWorldEffectIDs->size()); data << uint32(StateWorldEffectsQuestObjectiveID); data << int32(SpellOverrideNameID); @@ -988,7 +989,7 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << int32(ScalingLevelMin); data << int32(ScalingLevelMax); data << int32(ScalingLevelDelta); - data << int32(ScalingFactionGroup); + data << uint8(ScalingFactionGroup); data << int32(ViewerDependentValue<FactionTemplateTag>::GetValue(this, owner, receiver)); for (uint32 i = 0; i < 3; ++i) { @@ -997,6 +998,7 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << uint32(ViewerDependentValue<FlagsTag>::GetValue(this, owner, receiver)); data << uint32(ViewerDependentValue<Flags2Tag>::GetValue(this, owner, receiver)); data << uint32(ViewerDependentValue<Flags3Tag>::GetValue(this, owner, receiver)); + data << uint32(ViewerDependentValue<Flags4Tag>::GetValue(this, owner, receiver)); data << uint32(ViewerDependentValue<AuraStateTag>::GetValue(this, owner, receiver)); for (uint32 i = 0; i < 2; ++i) { @@ -1010,7 +1012,7 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << float(CombatReach); data << float(DisplayScale); data << int32(CreatureFamily); - data << int32(CreatureType); + data << uint8(CreatureType); data << int32(NativeDisplayID); data << float(NativeXDisplayScale); data << int32(MountDisplayID); @@ -1116,6 +1118,7 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << uint32(ChannelObjects.size()); data << int32(FlightCapabilityID); data << float(GlideEventSpeedDivisor); + data << int32(DriveCapabilityID); data << int32(MaxHealthModifierFlatNeg); data << int32(MaxHealthModifierFlatPos); data << uint32(SilencedSchoolMask); @@ -1141,7 +1144,7 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi void UnitData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const { - Mask allowedMaskForTarget({ 0xFFFEFFFFu, 0x87FDFFFFu, 0x007BFFFFu, 0xFFFFFC01u, 0x03FFFFFFu, 0x001FC000u, 0x00000000u }); + Mask allowedMaskForTarget({ 0xFFFEFFFFu, 0x0FFBFFFFu, 0x00F7FFFFu, 0xFFFFF801u, 0x0FFFFFFFu, 0x007F0000u, 0x00000000u }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); } @@ -1149,16 +1152,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>{ 0x00010000u, 0x78020000u, 0xFF840000u, 0x000003FEu, 0xFC000020u, 0xFFE03FFFu, 0x0FFFFFFFu }; + allowedMaskForTarget |= std::array<uint32, 7>{ 0x00010000u, 0xF0040000u, 0xFF080000u, 0x000007FEu, 0xF0000080u, 0xFF80FFFFu, 0x3FFFFFFFu }; if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::UnitAll)) - allowedMaskForTarget |= std::array<uint32, 7>{ 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFC000020u, 0x00003FFFu, 0x00000000u }; + allowedMaskForTarget |= std::array<uint32, 7>{ 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xF0000080u, 0x0000FFFFu, 0x00000000u }; if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Empath)) - allowedMaskForTarget |= std::array<uint32, 7>{ 0x00000000u, 0x78000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00003FC0u }; + allowedMaskForTarget |= std::array<uint32, 7>{ 0x00000000u, 0xF0000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x0000FF00u }; } void UnitData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { - Mask allowedMaskForTarget({ 0xFFFEFFFFu, 0x87FDFFFFu, 0x007BFFFFu, 0xFFFFFC01u, 0x03FFFFFFu, 0x001FC000u, 0x00000000u }); + Mask allowedMaskForTarget({ 0xFFFEFFFFu, 0x0FFBFFFFu, 0x00F7FFFFu, 0xFFFFF801u, 0x0FFFFFFFu, 0x007F0000u, 0x00000000u }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); changesMask &= allowedMaskForTarget; } @@ -1395,7 +1398,7 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor } if (changesMask[43]) { - data << int32(ScalingFactionGroup); + data << uint8(ScalingFactionGroup); } if (changesMask[44]) { @@ -1415,419 +1418,427 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor } if (changesMask[48]) { - data << uint32(ViewerDependentValue<AuraStateTag>::GetValue(this, owner, receiver)); + data << uint32(ViewerDependentValue<Flags4Tag>::GetValue(this, owner, receiver)); } if (changesMask[49]) { - data << uint32(RangedAttackRoundBaseTime); + data << uint32(ViewerDependentValue<AuraStateTag>::GetValue(this, owner, receiver)); } if (changesMask[50]) { - data << float(BoundingRadius); + data << uint32(RangedAttackRoundBaseTime); } if (changesMask[51]) { - data << float(CombatReach); + data << float(BoundingRadius); } if (changesMask[52]) { - data << float(DisplayScale); + data << float(CombatReach); } if (changesMask[53]) { - data << int32(CreatureFamily); + data << float(DisplayScale); } if (changesMask[54]) { - data << int32(CreatureType); + data << int32(CreatureFamily); } if (changesMask[55]) { - data << int32(NativeDisplayID); + data << uint8(CreatureType); } if (changesMask[56]) { - data << float(NativeXDisplayScale); + data << int32(NativeDisplayID); } if (changesMask[57]) { - data << int32(MountDisplayID); + data << float(NativeXDisplayScale); } if (changesMask[58]) { - data << int32(CosmeticMountDisplayID); + data << int32(MountDisplayID); } if (changesMask[59]) { - data << float(MinDamage); + data << int32(CosmeticMountDisplayID); } if (changesMask[60]) { - data << float(MaxDamage); + data << float(MinDamage); } if (changesMask[61]) { - data << float(MinOffHandDamage); + data << float(MaxDamage); } if (changesMask[62]) { - data << float(MaxOffHandDamage); + data << float(MinOffHandDamage); } if (changesMask[63]) { - data << uint8(StandState); + data << float(MaxOffHandDamage); } } if (changesMask[64]) { if (changesMask[65]) { - data << uint8(PetTalentPoints); + data << uint8(StandState); } if (changesMask[66]) { - data << uint8(VisFlags); + data << uint8(PetTalentPoints); } if (changesMask[67]) { - data << uint8(AnimTier); + data << uint8(VisFlags); } if (changesMask[68]) { - data << uint32(PetNumber); + data << uint8(AnimTier); } if (changesMask[69]) { - data << uint32(PetNameTimestamp); + data << uint32(PetNumber); } if (changesMask[70]) { - data << uint32(PetExperience); + data << uint32(PetNameTimestamp); } if (changesMask[71]) { - data << uint32(PetNextLevelExperience); + data << uint32(PetExperience); } if (changesMask[72]) { - data << float(ModCastingSpeed); + data << uint32(PetNextLevelExperience); } if (changesMask[73]) { - data << float(ModCastingSpeedNeg); + data << float(ModCastingSpeed); } if (changesMask[74]) { - data << float(ModSpellHaste); + data << float(ModCastingSpeedNeg); } if (changesMask[75]) { - data << float(ModHaste); + data << float(ModSpellHaste); } if (changesMask[76]) { - data << float(ModRangedHaste); + data << float(ModHaste); } if (changesMask[77]) { - data << float(ModHasteRegen); + data << float(ModRangedHaste); } if (changesMask[78]) { - data << float(ModTimeRate); + data << float(ModHasteRegen); } if (changesMask[79]) { - data << int32(CreatedBySpell); + data << float(ModTimeRate); } if (changesMask[80]) { - data << int32(EmoteState); + data << int32(CreatedBySpell); } if (changesMask[81]) { - data << int32(BaseMana); + data << int32(EmoteState); } if (changesMask[82]) { - data << int32(BaseHealth); + data << int32(BaseMana); } if (changesMask[83]) { - data << uint8(SheatheState); + data << int32(BaseHealth); } if (changesMask[84]) { - data << uint8(ViewerDependentValue<PvpFlagsTag>::GetValue(this, owner, receiver)); + data << uint8(SheatheState); } if (changesMask[85]) { - data << uint8(PetFlags); + data << uint8(ViewerDependentValue<PvpFlagsTag>::GetValue(this, owner, receiver)); } if (changesMask[86]) { - data << uint8(ShapeshiftForm); + data << uint8(PetFlags); } if (changesMask[87]) { - data << int32(AttackPower); + data << uint8(ShapeshiftForm); } if (changesMask[88]) { - data << int32(AttackPowerModPos); + data << int32(AttackPower); } if (changesMask[89]) { - data << int32(AttackPowerModNeg); + data << int32(AttackPowerModPos); } if (changesMask[90]) { - data << float(AttackPowerMultiplier); + data << int32(AttackPowerModNeg); } if (changesMask[91]) { - data << int32(AttackPowerModSupport); + data << float(AttackPowerMultiplier); } if (changesMask[92]) { - data << int32(RangedAttackPower); + data << int32(AttackPowerModSupport); } if (changesMask[93]) { - data << int32(RangedAttackPowerModPos); + data << int32(RangedAttackPower); } if (changesMask[94]) { - data << int32(RangedAttackPowerModNeg); + data << int32(RangedAttackPowerModPos); } if (changesMask[95]) { - data << float(RangedAttackPowerMultiplier); + data << int32(RangedAttackPowerModNeg); } } if (changesMask[96]) { if (changesMask[97]) { - data << int32(RangedAttackPowerModSupport); + data << float(RangedAttackPowerMultiplier); } if (changesMask[98]) { - data << int32(MainHandWeaponAttackPower); + data << int32(RangedAttackPowerModSupport); } if (changesMask[99]) { - data << int32(OffHandWeaponAttackPower); + data << int32(MainHandWeaponAttackPower); } if (changesMask[100]) { - data << int32(RangedWeaponAttackPower); + data << int32(OffHandWeaponAttackPower); } if (changesMask[101]) { - data << int32(SetAttackSpeedAura); + data << int32(RangedWeaponAttackPower); } if (changesMask[102]) { - data << float(Lifesteal); + data << int32(SetAttackSpeedAura); } if (changesMask[103]) { - data << float(MinRangedDamage); + data << float(Lifesteal); } if (changesMask[104]) { - data << float(MaxRangedDamage); + data << float(MinRangedDamage); } if (changesMask[105]) { - data << float(ManaCostMultiplier); + data << float(MaxRangedDamage); } if (changesMask[106]) { - data << float(MaxHealthModifier); + data << float(ManaCostMultiplier); } if (changesMask[107]) { - data << float(HoverHeight); + data << float(MaxHealthModifier); } if (changesMask[108]) { - data << int32(MinItemLevelCutoff); + data << float(HoverHeight); } if (changesMask[109]) { - data << int32(MinItemLevel); + data << int32(MinItemLevelCutoff); } if (changesMask[110]) { - data << int32(MaxItemLevel); + data << int32(MinItemLevel); } if (changesMask[111]) { - data << int32(AzeriteItemLevel); + data << int32(MaxItemLevel); } if (changesMask[112]) { - data << int32(WildBattlePetLevel); + data << int32(AzeriteItemLevel); } if (changesMask[113]) { - data << int32(BattlePetCompanionExperience); + data << int32(WildBattlePetLevel); } if (changesMask[114]) { - data << uint32(BattlePetCompanionNameTimestamp); + data << int32(BattlePetCompanionExperience); } if (changesMask[115]) { - data << int32(ViewerDependentValue<InteractSpellIDTag>::GetValue(this, owner, receiver)); + data << uint32(BattlePetCompanionNameTimestamp); } if (changesMask[116]) { - data << int32(ScaleDuration); + data << int32(ViewerDependentValue<InteractSpellIDTag>::GetValue(this, owner, receiver)); } if (changesMask[117]) { - data << int32(LooksLikeMountID); + data << int32(ScaleDuration); } if (changesMask[118]) { - data << int32(LooksLikeCreatureID); + data << int32(LooksLikeMountID); } if (changesMask[119]) { - data << int32(LookAtControllerID); + data << int32(LooksLikeCreatureID); } if (changesMask[120]) { - data << int32(PerksVendorItemID); + data << int32(LookAtControllerID); } if (changesMask[121]) { - data << int32(TaxiNodesID); + data << int32(PerksVendorItemID); } if (changesMask[122]) { - data << GuildGUID; + data << int32(TaxiNodesID); } if (changesMask[123]) { - data << int32(FlightCapabilityID); + data << GuildGUID; } if (changesMask[124]) { - data << float(GlideEventSpeedDivisor); + data << int32(FlightCapabilityID); } if (changesMask[125]) { - data << int32(MaxHealthModifierFlatNeg); + data << float(GlideEventSpeedDivisor); } if (changesMask[126]) { - data << int32(MaxHealthModifierFlatPos); + data << int32(DriveCapabilityID); } if (changesMask[127]) { - data << uint32(SilencedSchoolMask); + data << int32(MaxHealthModifierFlatNeg); } } if (changesMask[128]) { if (changesMask[129]) { - data << uint32(CurrentAreaID); + data << int32(MaxHealthModifierFlatPos); } if (changesMask[130]) { - data << float(Field_31C); + data << uint32(SilencedSchoolMask); } if (changesMask[131]) { - data << float(Field_320); + data << uint32(CurrentAreaID); } if (changesMask[132]) { + data << float(Field_31C); + } + if (changesMask[133]) + { + data << float(Field_320); + } + if (changesMask[134]) + { data << NameplateAttachToGUID; } } - if (changesMask[133]) + if (changesMask[135]) { for (uint32 i = 0; i < 10; ++i) { - if (changesMask[134 + i]) + if (changesMask[136 + i]) { data << int32(Power[i]); } - if (changesMask[144 + i]) + if (changesMask[146 + i]) { data << int32(MaxPower[i]); } - if (changesMask[154 + i]) + if (changesMask[156 + i]) { data << float(PowerRegenFlatModifier[i]); } - if (changesMask[164 + i]) + if (changesMask[166 + i]) { data << float(PowerRegenInterruptedFlatModifier[i]); } } } - if (changesMask[174]) + if (changesMask[176]) { for (uint32 i = 0; i < 3; ++i) { - if (changesMask[175 + i]) + if (changesMask[177 + i]) { VirtualItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[178]) + if (changesMask[180]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[179 + i]) + if (changesMask[181 + i]) { data << uint32(AttackRoundBaseTime[i]); } } } - if (changesMask[181]) + if (changesMask[183]) { for (uint32 i = 0; i < 4; ++i) { - if (changesMask[182 + i]) + if (changesMask[184 + i]) { data << int32(Stats[i]); } - if (changesMask[186 + i]) + if (changesMask[188 + i]) { data << int32(StatPosBuff[i]); } - if (changesMask[190 + i]) + if (changesMask[192 + i]) { data << int32(StatNegBuff[i]); } - if (changesMask[194 + i]) + if (changesMask[196 + i]) { data << int32(StatSupportBuff[i]); } } } - if (changesMask[198]) + if (changesMask[200]) { for (uint32 i = 0; i < 7; ++i) { - if (changesMask[199 + i]) + if (changesMask[201 + i]) { data << int32(Resistances[i]); } - if (changesMask[206 + i]) + if (changesMask[208 + i]) { data << int32(BonusResistanceMods[i]); } - if (changesMask[213 + i]) + if (changesMask[215 + i]) { data << int32(ManaCostModifier[i]); } @@ -1884,6 +1895,7 @@ void UnitData::ClearChangesMask() Base::ClearChangesMask(Flags); Base::ClearChangesMask(Flags2); Base::ClearChangesMask(Flags3); + Base::ClearChangesMask(Flags4); Base::ClearChangesMask(AuraState); Base::ClearChangesMask(RangedAttackRoundBaseTime); Base::ClearChangesMask(BoundingRadius); @@ -1959,6 +1971,7 @@ void UnitData::ClearChangesMask() Base::ClearChangesMask(GuildGUID); Base::ClearChangesMask(FlightCapabilityID); Base::ClearChangesMask(GlideEventSpeedDivisor); + Base::ClearChangesMask(DriveCapabilityID); Base::ClearChangesMask(MaxHealthModifierFlatNeg); Base::ClearChangesMask(MaxHealthModifierFlatPos); Base::ClearChangesMask(SilencedSchoolMask); @@ -2205,15 +2218,15 @@ void PetCreatureName::ClearChangesMask() void CTROptions::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const { - data << int32(ConditionalFlags); - data << uint32(FactionGroup); + data << uint32(ConditionalFlags); + data << uint8(FactionGroup); data << uint32(ChromieTimeExpansionMask); } void CTROptions::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const { - data << int32(ConditionalFlags); - data << uint32(FactionGroup); + data << uint32(ConditionalFlags); + data << uint8(FactionGroup); data << uint32(ChromieTimeExpansionMask); } @@ -4367,6 +4380,7 @@ void StablePetInfo::WriteCreate(ByteBuffer& data, Player const* owner, Player co data << uint32(DisplayID); data << uint32(ExperienceLevel); data << uint8(PetFlags); + data << uint32(Specialization); data.WriteBits(Name->size(), 8); data.WriteString(Name); data.FlushBits(); @@ -4378,7 +4392,7 @@ void StablePetInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player if (ignoreChangesMask) changesMask.SetAll(); - data.WriteBits(changesMask.GetBlock(0), 8); + data.WriteBits(changesMask.GetBlock(0), 9); data.FlushBits(); if (changesMask[0]) @@ -4407,6 +4421,10 @@ void StablePetInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player { data << uint8(PetFlags); } + if (changesMask[8]) + { + data << uint32(Specialization); + } if (changesMask[6]) { data.WriteBits(Name->size(), 8); @@ -4425,6 +4443,7 @@ void StablePetInfo::ClearChangesMask() Base::ClearChangesMask(ExperienceLevel); Base::ClearChangesMask(Name); Base::ClearChangesMask(PetFlags); + Base::ClearChangesMask(Specialization); _changesMask.ResetAll(); } @@ -4741,7 +4760,7 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f data << uint8(MultiActionBars); data << uint8(LifetimeMaxRank); data << uint8(NumRespecs); - data << uint32(PvpMedals); + data << uint8(PvpMedals); for (uint32 i = 0; i < 12; ++i) { data << uint32(BuybackPrice[i]); @@ -4826,6 +4845,7 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f data << uint32(SelfResSpells.size()); data << uint32(RuneforgePowers.size()); data << uint32(TransmogIllusions.size()); + data << uint32(WarbandScenes.size()); data << uint32(CharacterRestrictions.size()); data << uint32(SpellPctModByLabel.size()); data << uint32(SpellFlatModByLabel.size()); @@ -4907,6 +4927,10 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f { data << uint32(TransmogIllusions[i]); } + for (uint32 i = 0; i < WarbandScenes.size(); ++i) + { + data << uint32(WarbandScenes[i]); + } for (uint32 i = 0; i < SpellPctModByLabel.size(); ++i) { SpellPctModByLabel[i].WriteCreate(data, owner, receiver); @@ -5092,11 +5116,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo WriteCompleteDynamicFieldUpdateMask(PvpInfo.size(), data); } } - if (changesMask[40]) + if (changesMask[41]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[41]) + if (changesMask[42]) { if (!ignoreNestedChangesMask) ResearchSites[i].WriteUpdateMask(data); @@ -5105,11 +5129,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[42]) + if (changesMask[43]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[43]) + if (changesMask[44]) { if (!ignoreNestedChangesMask) ResearchSiteProgress[i].WriteUpdateMask(data); @@ -5118,11 +5142,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[44]) + if (changesMask[45]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[45]) + if (changesMask[46]) { if (!ignoreNestedChangesMask) Research[i].WriteUpdateMask(data); @@ -5131,11 +5155,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[40]) + if (changesMask[41]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[41]) + if (changesMask[42]) { for (uint32 j = 0; j < ResearchSites[i].size(); ++j) { @@ -5147,11 +5171,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[42]) + if (changesMask[43]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[43]) + if (changesMask[44]) { for (uint32 j = 0; j < ResearchSiteProgress[i].size(); ++j) { @@ -5163,11 +5187,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[44]) + if (changesMask[45]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[45]) + if (changesMask[46]) { for (uint32 j = 0; j < Research[i].size(); ++j) { @@ -5262,112 +5286,119 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo if (changesMask[22]) { if (!ignoreNestedChangesMask) + WarbandScenes.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(WarbandScenes.size(), data); + } + if (changesMask[23]) + { + if (!ignoreNestedChangesMask) CharacterRestrictions.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(CharacterRestrictions.size(), data); } - if (changesMask[23]) + if (changesMask[24]) { if (!ignoreNestedChangesMask) SpellPctModByLabel.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(SpellPctModByLabel.size(), data); } - if (changesMask[24]) + if (changesMask[25]) { if (!ignoreNestedChangesMask) SpellFlatModByLabel.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(SpellFlatModByLabel.size(), data); } - if (changesMask[25]) + if (changesMask[26]) { if (!ignoreNestedChangesMask) MawPowers.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(MawPowers.size(), data); } - if (changesMask[26]) + if (changesMask[27]) { if (!ignoreNestedChangesMask) MultiFloorExploration.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(MultiFloorExploration.size(), data); } - if (changesMask[27]) + if (changesMask[28]) { if (!ignoreNestedChangesMask) RecipeProgression.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(RecipeProgression.size(), data); } - if (changesMask[28]) + if (changesMask[29]) { if (!ignoreNestedChangesMask) ReplayedQuests.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(ReplayedQuests.size(), data); } - if (changesMask[29]) + if (changesMask[30]) { if (!ignoreNestedChangesMask) TaskQuests.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(TaskQuests.size(), data); } - if (changesMask[30]) + if (changesMask[31]) { if (!ignoreNestedChangesMask) DisabledSpells.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(DisabledSpells.size(), data); } - if (changesMask[31]) + } + if (changesMask[32]) + { + if (changesMask[33]) { if (!ignoreNestedChangesMask) TraitConfigs.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(TraitConfigs.size(), data); } - } - if (changesMask[32]) - { - if (changesMask[33]) + if (changesMask[34]) { if (!ignoreNestedChangesMask) CraftingOrders.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(CraftingOrders.size(), data); } - if (changesMask[34]) + if (changesMask[35]) { if (!ignoreNestedChangesMask) PersonalCraftingOrderCounts.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(PersonalCraftingOrderCounts.size(), data); } - if (changesMask[35]) + if (changesMask[36]) { if (!ignoreNestedChangesMask) NpcCraftingOrders.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(NpcCraftingOrders.size(), data); } - if (changesMask[36]) + if (changesMask[37]) { if (!ignoreNestedChangesMask) CategoryCooldownMods.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(CategoryCooldownMods.size(), data); } - if (changesMask[37]) + if (changesMask[38]) { if (!ignoreNestedChangesMask) WeeklySpellUses.WriteUpdateMask(data); else WriteCompleteDynamicFieldUpdateMask(WeeklySpellUses.size(), data); } - if (changesMask[38]) + if (changesMask[39]) { if (!ignoreNestedChangesMask) TrackedCollectableSources.WriteUpdateMask(data); @@ -5498,7 +5529,17 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[23]) + if (changesMask[22]) + { + for (uint32 i = 0; i < WarbandScenes.size(); ++i) + { + if (WarbandScenes.HasChanged(i) || ignoreNestedChangesMask) + { + data << uint32(WarbandScenes[i]); + } + } + } + if (changesMask[24]) { for (uint32 i = 0; i < SpellPctModByLabel.size(); ++i) { @@ -5508,7 +5549,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[24]) + if (changesMask[25]) { for (uint32 i = 0; i < SpellFlatModByLabel.size(); ++i) { @@ -5518,7 +5559,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[25]) + if (changesMask[26]) { for (uint32 i = 0; i < MawPowers.size(); ++i) { @@ -5528,7 +5569,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[26]) + if (changesMask[27]) { for (uint32 i = 0; i < MultiFloorExploration.size(); ++i) { @@ -5538,7 +5579,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[27]) + if (changesMask[28]) { for (uint32 i = 0; i < RecipeProgression.size(); ++i) { @@ -5548,7 +5589,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[28]) + if (changesMask[29]) { for (uint32 i = 0; i < ReplayedQuests.size(); ++i) { @@ -5558,7 +5599,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[29]) + if (changesMask[30]) { for (uint32 i = 0; i < TaskQuests.size(); ++i) { @@ -5568,7 +5609,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[30]) + if (changesMask[31]) { for (uint32 i = 0; i < DisabledSpells.size(); ++i) { @@ -5581,7 +5622,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } if (changesMask[32]) { - if (changesMask[34]) + if (changesMask[35]) { for (uint32 i = 0; i < PersonalCraftingOrderCounts.size(); ++i) { @@ -5591,7 +5632,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[35]) + if (changesMask[36]) { for (uint32 i = 0; i < NpcCraftingOrders.size(); ++i) { @@ -5601,7 +5642,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[36]) + if (changesMask[37]) { for (uint32 i = 0; i < CategoryCooldownMods.size(); ++i) { @@ -5611,7 +5652,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[37]) + if (changesMask[38]) { for (uint32 i = 0; i < WeeklySpellUses.size(); ++i) { @@ -5621,7 +5662,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[38]) + if (changesMask[39]) { for (uint32 i = 0; i < TrackedCollectableSources.size(); ++i) { @@ -5631,7 +5672,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[39]) + if (changesMask[40]) { if (!ignoreNestedChangesMask) AccountBankTabSettings.WriteUpdateMask(data, 3); @@ -5671,7 +5712,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[22]) + if (changesMask[23]) { for (uint32 i = 0; i < CharacterRestrictions.size(); ++i) { @@ -5681,7 +5722,10 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[31]) + } + if (changesMask[32]) + { + if (changesMask[33]) { for (uint32 i = 0; i < TraitConfigs.size(); ++i) { @@ -5691,10 +5735,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - } - if (changesMask[32]) - { - if (changesMask[33]) + if (changesMask[34]) { for (uint32 i = 0; i < CraftingOrders.size(); ++i) { @@ -5704,7 +5745,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[39]) + if (changesMask[40]) { for (uint32 i = 0; i < AccountBankTabSettings.size(); ++i) { @@ -5714,364 +5755,364 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[46]) - { - data << FarsightObject; - } if (changesMask[47]) { - data << SummonedBattlePetGUID; + data << FarsightObject; } if (changesMask[48]) { - data << uint64(Coinage); + data << SummonedBattlePetGUID; } if (changesMask[49]) { - data << uint64(AccountBankCoinage); + data << uint64(Coinage); } if (changesMask[50]) { - data << int32(XP); + data << uint64(AccountBankCoinage); } if (changesMask[51]) { - data << int32(NextLevelXP); + data << int32(XP); } if (changesMask[52]) { - data << int32(TrialXP); + data << int32(NextLevelXP); } if (changesMask[53]) { - Skill->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + data << int32(TrialXP); } if (changesMask[54]) { - data << int32(CharacterPoints); + Skill->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } if (changesMask[55]) { - data << int32(MaxTalentTiers); + data << int32(CharacterPoints); } if (changesMask[56]) { - data << uint32(TrackCreatureMask); + data << int32(MaxTalentTiers); } if (changesMask[57]) { - data << float(MainhandExpertise); + data << uint32(TrackCreatureMask); } if (changesMask[58]) { - data << float(OffhandExpertise); + data << float(MainhandExpertise); } if (changesMask[59]) { - data << float(RangedExpertise); + data << float(OffhandExpertise); } if (changesMask[60]) { - data << float(CombatRatingExpertise); + data << float(RangedExpertise); } if (changesMask[61]) { - data << float(BlockPercentage); + data << float(CombatRatingExpertise); } if (changesMask[62]) { - data << float(DodgePercentage); + data << float(BlockPercentage); } if (changesMask[63]) { - data << float(DodgePercentageFromAttribute); + data << float(DodgePercentage); } if (changesMask[64]) { - data << float(ParryPercentage); + data << float(DodgePercentageFromAttribute); } if (changesMask[65]) { - data << float(ParryPercentageFromAttribute); + data << float(ParryPercentage); } if (changesMask[66]) { - data << float(CritPercentage); + data << float(ParryPercentageFromAttribute); } if (changesMask[67]) { - data << float(RangedCritPercentage); + data << float(CritPercentage); } if (changesMask[68]) { - data << float(OffhandCritPercentage); + data << float(RangedCritPercentage); } if (changesMask[69]) { - data << float(SpellCritPercentage); + data << float(OffhandCritPercentage); } } if (changesMask[70]) { if (changesMask[71]) { - data << int32(ShieldBlock); + data << float(SpellCritPercentage); } if (changesMask[72]) { - data << float(ShieldBlockCritPercentage); + data << int32(ShieldBlock); } if (changesMask[73]) { - data << float(Mastery); + data << float(ShieldBlockCritPercentage); } if (changesMask[74]) { - data << float(Speed); + data << float(Mastery); } if (changesMask[75]) { - data << float(Avoidance); + data << float(Speed); } if (changesMask[76]) { - data << float(Sturdiness); + data << float(Avoidance); } if (changesMask[77]) { - data << int32(Versatility); + data << float(Sturdiness); } if (changesMask[78]) { - data << float(VersatilityBonus); + data << int32(Versatility); } if (changesMask[79]) { - data << float(PvpPowerDamage); + data << float(VersatilityBonus); } if (changesMask[80]) { - data << float(PvpPowerHealing); + data << float(PvpPowerDamage); } if (changesMask[81]) { - BitVectors->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + data << float(PvpPowerHealing); } if (changesMask[82]) { - data << int32(ModHealingDonePos); + BitVectors->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } if (changesMask[83]) { - data << float(ModHealingPercent); + data << int32(ModHealingDonePos); } if (changesMask[84]) { - data << float(ModPeriodicHealingDonePercent); + data << float(ModHealingPercent); } if (changesMask[85]) { - data << float(ModSpellPowerPercent); + data << float(ModPeriodicHealingDonePercent); } if (changesMask[86]) { - data << float(ModResiliencePercent); + data << float(ModSpellPowerPercent); } if (changesMask[87]) { - data << float(OverrideSpellPowerByAPPercent); + data << float(ModResiliencePercent); } if (changesMask[88]) { - data << float(OverrideAPBySpellPowerPercent); + data << float(OverrideSpellPowerByAPPercent); } if (changesMask[89]) { - data << int32(ModTargetResistance); + data << float(OverrideAPBySpellPowerPercent); } if (changesMask[90]) { - data << int32(ModTargetPhysicalResistance); + data << int32(ModTargetResistance); } if (changesMask[91]) { - data << uint32(LocalFlags); + data << int32(ModTargetPhysicalResistance); } if (changesMask[92]) { - data << uint8(GrantableLevels); + data << uint32(LocalFlags); } if (changesMask[93]) { - data << uint8(MultiActionBars); + data << uint8(GrantableLevels); } if (changesMask[94]) { - data << uint8(LifetimeMaxRank); + data << uint8(MultiActionBars); } if (changesMask[95]) { - data << uint8(NumRespecs); + data << uint8(LifetimeMaxRank); } if (changesMask[96]) { - data << uint32(PvpMedals); + data << uint8(NumRespecs); } if (changesMask[97]) { - data << uint16(TodayHonorableKills); + data << uint8(PvpMedals); } if (changesMask[98]) { - data << uint16(YesterdayHonorableKills); + data << uint16(TodayHonorableKills); } if (changesMask[99]) { - data << uint32(LifetimeHonorableKills); + data << uint16(YesterdayHonorableKills); } if (changesMask[100]) { - data << int32(WatchedFactionIndex); + data << uint32(LifetimeHonorableKills); } if (changesMask[101]) { - data << int32(MaxLevel); + data << int32(WatchedFactionIndex); } } if (changesMask[102]) { if (changesMask[103]) { - data << int32(ScalingPlayerLevelDelta); + data << int32(MaxLevel); } if (changesMask[104]) { - data << int32(MaxCreatureScalingLevel); + data << int32(ScalingPlayerLevelDelta); } if (changesMask[105]) { - data << int32(PetSpellPower); + data << int32(MaxCreatureScalingLevel); } if (changesMask[106]) { - data << float(UiHitModifier); + data << int32(PetSpellPower); } if (changesMask[107]) { - data << float(UiSpellHitModifier); + data << float(UiHitModifier); } if (changesMask[108]) { - data << int32(HomeRealmTimeOffset); + data << float(UiSpellHitModifier); } if (changesMask[109]) { - data << float(ModPetHaste); + data << int32(HomeRealmTimeOffset); } if (changesMask[110]) { - data << int8(JailersTowerLevelMax); + data << float(ModPetHaste); } if (changesMask[111]) { - data << int8(JailersTowerLevel); + data << int8(JailersTowerLevelMax); } if (changesMask[112]) { - data << uint8(LocalRegenFlags); + data << int8(JailersTowerLevel); } if (changesMask[113]) { - data << uint8(AuraVision); + data << uint8(LocalRegenFlags); } if (changesMask[114]) { - data << uint8(NumBackpackSlots); + data << uint8(AuraVision); } if (changesMask[115]) { - data << int32(OverrideSpellsID); + data << uint8(NumBackpackSlots); } if (changesMask[116]) { - data << uint16(LootSpecID); + data << int32(OverrideSpellsID); } if (changesMask[117]) { - data << uint32(OverrideZonePVPType); + data << uint16(LootSpecID); } if (changesMask[118]) { - data << int32(Honor); + data << uint32(OverrideZonePVPType); } if (changesMask[119]) { - data << int32(HonorNextLevel); + data << int32(Honor); } if (changesMask[120]) { - data << int32(PerksProgramCurrency); + data << int32(HonorNextLevel); } if (changesMask[121]) { - data << uint8(NumBankSlots); + data << int32(PerksProgramCurrency); } if (changesMask[122]) { - data << uint8(NumAccountBankTabs); + data << uint8(NumBankSlots); } - if (changesMask[127]) + if (changesMask[123]) { - data << int32(UiChromieTimeExpansionID); + data << uint8(NumAccountBankTabs); } if (changesMask[128]) { - data << int32(TimerunningSeasonID); + data << int32(UiChromieTimeExpansionID); } if (changesMask[129]) { - data << int32(TransportServerTime); + data << int32(TimerunningSeasonID); } if (changesMask[130]) { - data << uint32(WeeklyRewardsPeriodSinceOrigin); + data << int32(TransportServerTime); } if (changesMask[131]) { - data << int16(DEBUGSoulbindConduitRank); + data << uint32(WeeklyRewardsPeriodSinceOrigin); } - if (changesMask[133]) + if (changesMask[132]) { - data << uint32(ActiveCombatTraitConfigID); + data << int16(DEBUGSoulbindConduitRank); } } if (changesMask[134]) { if (changesMask[135]) { - data << int32(ItemUpgradeHighOnehandWeaponItemID); + data << uint32(ActiveCombatTraitConfigID); } if (changesMask[136]) { - data << int32(ItemUpgradeHighFingerItemID); + data << int32(ItemUpgradeHighOnehandWeaponItemID); } if (changesMask[137]) { - data << float(ItemUpgradeHighFingerWatermark); + data << int32(ItemUpgradeHighFingerItemID); } if (changesMask[138]) { - data << int32(ItemUpgradeHighTrinketItemID); + data << float(ItemUpgradeHighFingerWatermark); } if (changesMask[139]) { - data << float(ItemUpgradeHighTrinketWatermark); + data << int32(ItemUpgradeHighTrinketItemID); } if (changesMask[140]) { + data << float(ItemUpgradeHighTrinketWatermark); + } + if (changesMask[141]) + { data << uint64(LootHistoryInstanceID); } - if (changesMask[142]) + if (changesMask[143]) { data << uint8(RequiredMountCapabilityFlags); } @@ -6089,47 +6130,47 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo data.FlushBits(); if (changesMask[102]) { - if (changesMask[123]) + if (changesMask[124]) { ResearchHistory->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[125]) + if (changesMask[126]) { if (QuestSession.has_value()) { QuestSession->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } - if (changesMask[124]) + if (changesMask[125]) { data << FrozenPerksVendorItem; } - if (changesMask[126]) + if (changesMask[127]) { Field_1410->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[132]) + if (changesMask[133]) { data << DungeonScore; } } if (changesMask[134]) { - if (changesMask[141]) + if (changesMask[142]) { if (PetStable.has_value()) { PetStable->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } - if (changesMask[143]) + if (changesMask[144]) { if (WalkInData.has_value()) { WalkInData->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } - if (changesMask[144]) + if (changesMask[145]) { if (DelveData.has_value()) { @@ -6137,141 +6178,141 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[145]) + if (changesMask[146]) { for (uint32 i = 0; i < 232; ++i) { - if (changesMask[146 + i]) + if (changesMask[147 + i]) { data << InvSlots[i]; } } } - if (changesMask[378]) + if (changesMask[379]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[379 + i]) + if (changesMask[380 + i]) { RestInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[381]) + if (changesMask[382]) { for (uint32 i = 0; i < 7; ++i) { - if (changesMask[382 + i]) + if (changesMask[383 + i]) { data << int32(ModDamageDonePos[i]); } - if (changesMask[389 + i]) + if (changesMask[390 + i]) { data << int32(ModDamageDoneNeg[i]); } - if (changesMask[396 + i]) + if (changesMask[397 + i]) { data << float(ModDamageDonePercent[i]); } - if (changesMask[403 + i]) + if (changesMask[404 + i]) { data << float(ModHealingDonePercent[i]); } } } - if (changesMask[410]) + if (changesMask[411]) { for (uint32 i = 0; i < 3; ++i) { - if (changesMask[411 + i]) + if (changesMask[412 + i]) { data << float(WeaponDmgMultipliers[i]); } - if (changesMask[414 + i]) + if (changesMask[415 + i]) { data << float(WeaponAtkSpeedMultipliers[i]); } } } - if (changesMask[417]) + if (changesMask[418]) { for (uint32 i = 0; i < 12; ++i) { - if (changesMask[418 + i]) + if (changesMask[419 + i]) { data << uint32(BuybackPrice[i]); } - if (changesMask[430 + i]) + if (changesMask[431 + i]) { data << int64(BuybackTimestamp[i]); } } } - if (changesMask[442]) + if (changesMask[443]) { for (uint32 i = 0; i < 32; ++i) { - if (changesMask[443 + i]) + if (changesMask[444 + i]) { data << int32(CombatRatings[i]); } } } - if (changesMask[475]) + if (changesMask[476]) { for (uint32 i = 0; i < 4; ++i) { - if (changesMask[476 + i]) + if (changesMask[477 + i]) { data << uint32(NoReagentCostMask[i]); } } } - if (changesMask[480]) + if (changesMask[481]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[481 + i]) + if (changesMask[482 + i]) { data << int32(ProfessionSkillLine[i]); } } } - if (changesMask[483]) + if (changesMask[484]) { for (uint32 i = 0; i < 5; ++i) { - if (changesMask[484 + i]) + if (changesMask[485 + i]) { data << uint32(BagSlotFlags[i]); } } } - if (changesMask[489]) + if (changesMask[490]) { for (uint32 i = 0; i < 7; ++i) { - if (changesMask[490 + i]) + if (changesMask[491 + i]) { data << uint32(BankBagSlotFlags[i]); } } } - if (changesMask[497]) + if (changesMask[498]) { for (uint32 i = 0; i < 1000; ++i) { - if (changesMask[498 + i]) + if (changesMask[499 + i]) { data << uint64(QuestCompleted[i]); } } } - if (changesMask[1498]) + if (changesMask[1499]) { for (uint32 i = 0; i < 17; ++i) { - if (changesMask[1499 + i]) + if (changesMask[1500 + i]) { data << float(ItemUpgradeHighWatermark[i]); } @@ -6303,6 +6344,7 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(SelfResSpells); Base::ClearChangesMask(RuneforgePowers); Base::ClearChangesMask(TransmogIllusions); + Base::ClearChangesMask(WarbandScenes); Base::ClearChangesMask(SpellPctModByLabel); Base::ClearChangesMask(SpellFlatModByLabel); Base::ClearChangesMask(MawPowers); @@ -6441,13 +6483,14 @@ void ActivePlayerData::ClearChangesMask() void GameObjectData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, GameObject const* owner, Player const* receiver) const { - ViewerDependentValue<StateWorldEffectIDsTag>::value_type stateWorldEffectIDs = ViewerDependentValue<StateWorldEffectIDsTag>::GetValue(this, owner, receiver); + ViewerDependentValue<StateWorldEffectIDsTag>::value_type stateWorldEffectIDs = {}; data << int32(DisplayID); data << uint32(SpellVisualID); data << uint32(ViewerDependentValue<StateSpellVisualIDTag>::GetValue(this, owner, receiver)); data << uint32(ViewerDependentValue<SpawnTrackingStateAnimIDTag>::GetValue(this, owner, receiver)); data << uint32(ViewerDependentValue<SpawnTrackingStateAnimKitIDTag>::GetValue(this, owner, receiver)); + stateWorldEffectIDs = ViewerDependentValue<StateWorldEffectIDsTag>::GetValue(this, owner, receiver); data << uint32(stateWorldEffectIDs->size()); data << uint32(StateWorldEffectsQuestObjectiveID); for (uint32 i = 0; i < stateWorldEffectIDs->size(); ++i) diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h index 0f24599e5db..bc02576f7f6 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.h +++ b/src/server/game/Entities/Object/Updates/UpdateFields.h @@ -258,7 +258,7 @@ struct PassiveSpellHistory : public IsUpdateFieldStructureTag bool operator!=(PassiveSpellHistory const& right) const { return !(*this == right); } }; -struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<220> +struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<222> { UpdateField<bool, 0, 1> Field_314; UpdateField<std::vector<uint32>, 0, 2> StateWorldEffectIDs; @@ -308,7 +308,7 @@ struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<220> UpdateField<int32, 32, 40> ScalingLevelMin; UpdateField<int32, 32, 41> ScalingLevelMax; UpdateField<int32, 32, 42> ScalingLevelDelta; - UpdateField<int32, 32, 43> ScalingFactionGroup; + UpdateField<uint8, 32, 43> ScalingFactionGroup; UpdateField<int32, 32, 44> FactionTemplate; struct FactionTemplateTag : ViewerDependentValueTag<int32> {}; UpdateField<uint32, 32, 45> Flags; @@ -317,104 +317,107 @@ struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<220> struct Flags2Tag : ViewerDependentValueTag<uint32> {}; UpdateField<uint32, 32, 47> Flags3; struct Flags3Tag : ViewerDependentValueTag<uint32> {}; - UpdateField<uint32, 32, 48> AuraState; + UpdateField<uint32, 32, 48> Flags4; + struct Flags4Tag : ViewerDependentValueTag<uint32> {}; + UpdateField<uint32, 32, 49> AuraState; struct AuraStateTag : ViewerDependentValueTag<uint32> {}; - 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; + UpdateField<uint32, 32, 50> RangedAttackRoundBaseTime; + UpdateField<float, 32, 51> BoundingRadius; + UpdateField<float, 32, 52> CombatReach; + UpdateField<float, 32, 53> DisplayScale; + UpdateField<int32, 32, 54> CreatureFamily; + UpdateField<uint8, 32, 55> CreatureType; + UpdateField<int32, 32, 56> NativeDisplayID; + UpdateField<float, 32, 57> NativeXDisplayScale; + UpdateField<int32, 32, 58> MountDisplayID; + UpdateField<int32, 32, 59> CosmeticMountDisplayID; + UpdateField<float, 32, 60> MinDamage; + UpdateField<float, 32, 61> MaxDamage; + UpdateField<float, 32, 62> MinOffHandDamage; + UpdateField<float, 32, 63> MaxOffHandDamage; + UpdateField<uint8, 64, 65> StandState; + UpdateField<uint8, 64, 66> PetTalentPoints; + UpdateField<uint8, 64, 67> VisFlags; + UpdateField<uint8, 64, 68> AnimTier; + UpdateField<uint32, 64, 69> PetNumber; + UpdateField<uint32, 64, 70> PetNameTimestamp; + UpdateField<uint32, 64, 71> PetExperience; + UpdateField<uint32, 64, 72> PetNextLevelExperience; + UpdateField<float, 64, 73> ModCastingSpeed; + UpdateField<float, 64, 74> ModCastingSpeedNeg; + UpdateField<float, 64, 75> ModSpellHaste; + UpdateField<float, 64, 76> ModHaste; + UpdateField<float, 64, 77> ModRangedHaste; + UpdateField<float, 64, 78> ModHasteRegen; + UpdateField<float, 64, 79> ModTimeRate; + UpdateField<int32, 64, 80> CreatedBySpell; + UpdateField<int32, 64, 81> EmoteState; + UpdateField<int32, 64, 82> BaseMana; + UpdateField<int32, 64, 83> BaseHealth; + UpdateField<uint8, 64, 84> SheatheState; + UpdateField<uint8, 64, 85> PvpFlags; struct PvpFlagsTag : ViewerDependentValueTag<uint8> {}; - 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; + UpdateField<uint8, 64, 86> PetFlags; + UpdateField<uint8, 64, 87> ShapeshiftForm; + UpdateField<int32, 64, 88> AttackPower; + UpdateField<int32, 64, 89> AttackPowerModPos; + UpdateField<int32, 64, 90> AttackPowerModNeg; + UpdateField<float, 64, 91> AttackPowerMultiplier; + UpdateField<int32, 64, 92> AttackPowerModSupport; + UpdateField<int32, 64, 93> RangedAttackPower; + UpdateField<int32, 64, 94> RangedAttackPowerModPos; + UpdateField<int32, 64, 95> RangedAttackPowerModNeg; + UpdateField<float, 96, 97> RangedAttackPowerMultiplier; + UpdateField<int32, 96, 98> RangedAttackPowerModSupport; + UpdateField<int32, 96, 99> MainHandWeaponAttackPower; + UpdateField<int32, 96, 100> OffHandWeaponAttackPower; + UpdateField<int32, 96, 101> RangedWeaponAttackPower; + UpdateField<int32, 96, 102> SetAttackSpeedAura; + UpdateField<float, 96, 103> Lifesteal; + UpdateField<float, 96, 104> MinRangedDamage; + UpdateField<float, 96, 105> MaxRangedDamage; + UpdateField<float, 96, 106> ManaCostMultiplier; + UpdateField<float, 96, 107> MaxHealthModifier; + UpdateField<float, 96, 108> HoverHeight; + UpdateField<int32, 96, 109> MinItemLevelCutoff; + UpdateField<int32, 96, 110> MinItemLevel; + UpdateField<int32, 96, 111> MaxItemLevel; + UpdateField<int32, 96, 112> AzeriteItemLevel; + UpdateField<int32, 96, 113> WildBattlePetLevel; + UpdateField<int32, 96, 114> BattlePetCompanionExperience; + UpdateField<uint32, 96, 115> BattlePetCompanionNameTimestamp; + UpdateField<int32, 96, 116> InteractSpellID; struct InteractSpellIDTag : ViewerDependentValueTag<int32> {}; - 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<int32, 96, 125> MaxHealthModifierFlatNeg; - UpdateField<int32, 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; + UpdateField<int32, 96, 117> ScaleDuration; + UpdateField<int32, 96, 118> LooksLikeMountID; + UpdateField<int32, 96, 119> LooksLikeCreatureID; + UpdateField<int32, 96, 120> LookAtControllerID; + UpdateField<int32, 96, 121> PerksVendorItemID; + UpdateField<int32, 96, 122> TaxiNodesID; + UpdateField<ObjectGuid, 96, 123> GuildGUID; + UpdateField<int32, 96, 124> FlightCapabilityID; + UpdateField<float, 96, 125> GlideEventSpeedDivisor; // Movement speed gets divided by this value when evaluating what GlideEvents to use + UpdateField<int32, 96, 126> DriveCapabilityID; + UpdateField<int32, 96, 127> MaxHealthModifierFlatNeg; + UpdateField<int32, 128, 129> MaxHealthModifierFlatPos; + UpdateField<uint32, 128, 130> SilencedSchoolMask; + UpdateField<uint32, 128, 131> CurrentAreaID; + UpdateField<float, 128, 132> Field_31C; + UpdateField<float, 128, 133> Field_320; // Soft targeting related? When UnitFlags3 & 0x40000000 is set, increases some range check using CombatReach by this amount + UpdateField<ObjectGuid, 128, 134> NameplateAttachToGUID; // When set, nameplate of this unit will instead appear on that object + UpdateFieldArray<int32, 10, 135, 136> Power; + UpdateFieldArray<int32, 10, 135, 146> MaxPower; + UpdateFieldArray<float, 10, 135, 156> PowerRegenFlatModifier; + UpdateFieldArray<float, 10, 135, 166> PowerRegenInterruptedFlatModifier; + UpdateFieldArray<UF::VisibleItem, 3, 176, 177> VirtualItems; + UpdateFieldArray<uint32, 2, 180, 181> AttackRoundBaseTime; + UpdateFieldArray<int32, 4, 183, 184> Stats; + UpdateFieldArray<int32, 4, 183, 188> StatPosBuff; + UpdateFieldArray<int32, 4, 183, 192> StatNegBuff; + UpdateFieldArray<int32, 4, 183, 196> StatSupportBuff; + UpdateFieldArray<int32, 7, 200, 201> Resistances; + UpdateFieldArray<int32, 7, 200, 208> BonusResistanceMods; + UpdateFieldArray<int32, 7, 200, 215> 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; @@ -485,8 +488,8 @@ struct PetCreatureName : public IsUpdateFieldStructureTag, public HasChangesMask struct CTROptions : public IsUpdateFieldStructureTag { - int32 ConditionalFlags; - uint32 FactionGroup; + uint32 ConditionalFlags; + uint8 FactionGroup; uint32 ChromieTimeExpansionMask; void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; @@ -944,7 +947,7 @@ struct WeeklySpellUse : public IsUpdateFieldStructureTag bool operator!=(WeeklySpellUse const& right) const { return !(*this == right); } }; -struct StablePetInfo : public IsUpdateFieldStructureTag, public HasChangesMask<8> +struct StablePetInfo : public IsUpdateFieldStructureTag, public HasChangesMask<9> { UpdateField<uint32, 0, 1> PetSlot; UpdateField<uint32, 0, 2> PetNumber; @@ -953,6 +956,7 @@ struct StablePetInfo : public IsUpdateFieldStructureTag, public HasChangesMask<8 UpdateField<uint32, 0, 5> ExperienceLevel; UpdateField<std::string, 0, 6> Name; UpdateField<uint8, 0, 7> PetFlags; + UpdateField<uint32, 0, 8> Specialization; void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const; @@ -1030,7 +1034,7 @@ struct Research : public IsUpdateFieldStructureTag bool operator!=(Research const& right) const { return !(*this == right); } }; -struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1516> +struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1517> { UpdateField<bool, 0, 1> BackpackAutoSortDisabled; UpdateField<bool, 0, 2> BackpackSellJunkDisabled; @@ -1038,9 +1042,9 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas UpdateField<bool, 0, 4> SortBagsRightToLeft; UpdateField<bool, 0, 5> InsertItemsLeftToRight; UpdateField<bool, 0, 6> HasPerksProgramPendingReward; - UpdateFieldArray<DynamicUpdateFieldBase<uint16>, 1, 40, 41> ResearchSites; - UpdateFieldArray<DynamicUpdateFieldBase<uint32>, 1, 42, 43> ResearchSiteProgress; - UpdateFieldArray<DynamicUpdateFieldBase<UF::Research>, 1, 44, 45> Research; + UpdateFieldArray<DynamicUpdateFieldBase<uint16>, 1, 41, 42> ResearchSites; + UpdateFieldArray<DynamicUpdateFieldBase<uint32>, 1, 43, 44> ResearchSiteProgress; + UpdateFieldArray<DynamicUpdateFieldBase<UF::Research>, 1, 45, 46> Research; DynamicUpdateField<uint64, 0, 7> KnownTitles; DynamicUpdateField<int32, 0, 11> DailyQuestsCompleted; DynamicUpdateField<int32, 0, 12> AvailableQuestLineXQuestIDs; @@ -1053,139 +1057,140 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas 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<uint32, 0, 22> WarbandScenes; + DynamicUpdateField<UF::SpellPctModByLabel, 0, 24> SpellPctModByLabel; + DynamicUpdateField<UF::SpellFlatModByLabel, 0, 25> SpellFlatModByLabel; + DynamicUpdateField<UF::MawPower, 0, 26> MawPowers; + DynamicUpdateField<UF::MultiFloorExplore, 0, 27> MultiFloorExploration; + DynamicUpdateField<UF::RecipeProgressionInfo, 0, 28> RecipeProgression; + DynamicUpdateField<UF::ReplayedQuest, 0, 29> ReplayedQuests; + DynamicUpdateField<UF::QuestLog, 0, 30> TaskQuests; + DynamicUpdateField<int32, 0, 31> DisabledSpells; + DynamicUpdateField<UF::PersonalCraftingOrderCount, 32, 35> PersonalCraftingOrderCounts; + DynamicUpdateField<UF::NPCCraftingOrderInfo, 32, 36> NpcCraftingOrders; + DynamicUpdateField<UF::CategoryCooldownMod, 32, 37> CategoryCooldownMods; + DynamicUpdateField<UF::WeeklySpellUse, 32, 38> WeeklySpellUses; + DynamicUpdateField<UF::CollectableSourceTrackedData, 32, 39> 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, 1000, 497, 498> QuestCompleted; - UpdateFieldArray<float, 17, 1498, 1499> ItemUpgradeHighWatermark; + DynamicUpdateField<UF::CharacterRestriction, 0, 23> CharacterRestrictions; + DynamicUpdateField<UF::TraitConfig, 32, 33> TraitConfigs; + DynamicUpdateField<UF::CraftingOrder, 32, 34> CraftingOrders; + DynamicUpdateField<UF::BankTabSettings, 32, 40> AccountBankTabSettings; + UpdateField<ObjectGuid, 32, 47> FarsightObject; + UpdateField<ObjectGuid, 32, 48> SummonedBattlePetGUID; + UpdateField<uint64, 32, 49> Coinage; + UpdateField<uint64, 32, 50> AccountBankCoinage; + UpdateField<int32, 32, 51> XP; + UpdateField<int32, 32, 52> NextLevelXP; + UpdateField<int32, 32, 53> TrialXP; + UpdateField<UF::SkillInfo, 32, 54> Skill; + UpdateField<int32, 32, 55> CharacterPoints; + UpdateField<int32, 32, 56> MaxTalentTiers; + UpdateField<uint32, 32, 57> TrackCreatureMask; + UpdateField<float, 32, 58> MainhandExpertise; + UpdateField<float, 32, 59> OffhandExpertise; + UpdateField<float, 32, 60> RangedExpertise; + UpdateField<float, 32, 61> CombatRatingExpertise; + UpdateField<float, 32, 62> BlockPercentage; + UpdateField<float, 32, 63> DodgePercentage; + UpdateField<float, 32, 64> DodgePercentageFromAttribute; + UpdateField<float, 32, 65> ParryPercentage; + UpdateField<float, 32, 66> ParryPercentageFromAttribute; + UpdateField<float, 32, 67> CritPercentage; + UpdateField<float, 32, 68> RangedCritPercentage; + UpdateField<float, 32, 69> OffhandCritPercentage; + UpdateField<float, 70, 71> SpellCritPercentage; + UpdateField<int32, 70, 72> ShieldBlock; + UpdateField<float, 70, 73> ShieldBlockCritPercentage; + UpdateField<float, 70, 74> Mastery; + UpdateField<float, 70, 75> Speed; + UpdateField<float, 70, 76> Avoidance; + UpdateField<float, 70, 77> Sturdiness; + UpdateField<int32, 70, 78> Versatility; + UpdateField<float, 70, 79> VersatilityBonus; + UpdateField<float, 70, 80> PvpPowerDamage; + UpdateField<float, 70, 81> PvpPowerHealing; + UpdateField<UF::BitVectors, 70, 82> BitVectors; + UpdateField<int32, 70, 83> ModHealingDonePos; + UpdateField<float, 70, 84> ModHealingPercent; + UpdateField<float, 70, 85> ModPeriodicHealingDonePercent; + UpdateField<float, 70, 86> ModSpellPowerPercent; + UpdateField<float, 70, 87> ModResiliencePercent; + UpdateField<float, 70, 88> OverrideSpellPowerByAPPercent; + UpdateField<float, 70, 89> OverrideAPBySpellPowerPercent; + UpdateField<int32, 70, 90> ModTargetResistance; + UpdateField<int32, 70, 91> ModTargetPhysicalResistance; + UpdateField<uint32, 70, 92> LocalFlags; + UpdateField<uint8, 70, 93> GrantableLevels; + UpdateField<uint8, 70, 94> MultiActionBars; + UpdateField<uint8, 70, 95> LifetimeMaxRank; + UpdateField<uint8, 70, 96> NumRespecs; + UpdateField<uint8, 70, 97> PvpMedals; + UpdateField<uint16, 70, 98> TodayHonorableKills; + UpdateField<uint16, 70, 99> YesterdayHonorableKills; + UpdateField<uint32, 70, 100> LifetimeHonorableKills; + UpdateField<int32, 70, 101> WatchedFactionIndex; + UpdateField<int32, 102, 103> MaxLevel; + UpdateField<int32, 102, 104> ScalingPlayerLevelDelta; + UpdateField<int32, 102, 105> MaxCreatureScalingLevel; + UpdateField<int32, 102, 106> PetSpellPower; + UpdateField<float, 102, 107> UiHitModifier; + UpdateField<float, 102, 108> UiSpellHitModifier; + UpdateField<int32, 102, 109> HomeRealmTimeOffset; + UpdateField<float, 102, 110> ModPetHaste; + UpdateField<int8, 102, 111> JailersTowerLevelMax; + UpdateField<int8, 102, 112> JailersTowerLevel; + UpdateField<uint8, 102, 113> LocalRegenFlags; + UpdateField<uint8, 102, 114> AuraVision; + UpdateField<uint8, 102, 115> NumBackpackSlots; + UpdateField<int32, 102, 116> OverrideSpellsID; + UpdateField<uint16, 102, 117> LootSpecID; + UpdateField<uint32, 102, 118> OverrideZonePVPType; + UpdateField<int32, 102, 119> Honor; + UpdateField<int32, 102, 120> HonorNextLevel; + UpdateField<int32, 102, 121> PerksProgramCurrency; + UpdateField<uint8, 102, 122> NumBankSlots; + UpdateField<uint8, 102, 123> NumAccountBankTabs; + UpdateField<UF::ResearchHistory, 102, 124> ResearchHistory; + UpdateField<WorldPackets::PerksProgram::PerksVendorItem, 102, 125> FrozenPerksVendorItem; + UpdateField<UF::ActivePlayerUnk901, 102, 127> Field_1410; + OptionalUpdateField<UF::QuestSession, 102, 126> QuestSession; + UpdateField<int32, 102, 128> UiChromieTimeExpansionID; + UpdateField<int32, 102, 129> TimerunningSeasonID; + UpdateField<int32, 102, 130> TransportServerTime; + UpdateField<uint32, 102, 131> WeeklyRewardsPeriodSinceOrigin; // week count since Cfg_RegionsEntry::ChallengeOrigin + UpdateField<int16, 102, 132> DEBUGSoulbindConduitRank; + UpdateField<WorldPackets::MythicPlus::DungeonScoreData, 102, 133> DungeonScore; + UpdateField<uint32, 134, 135> ActiveCombatTraitConfigID; + UpdateField<int32, 134, 136> ItemUpgradeHighOnehandWeaponItemID; + UpdateField<int32, 134, 137> ItemUpgradeHighFingerItemID; + UpdateField<float, 134, 138> ItemUpgradeHighFingerWatermark; + UpdateField<int32, 134, 139> ItemUpgradeHighTrinketItemID; + UpdateField<float, 134, 140> ItemUpgradeHighTrinketWatermark; + UpdateField<uint64, 134, 141> LootHistoryInstanceID; + OptionalUpdateField<UF::StableInfo, 134, 142> PetStable; + UpdateField<uint8, 134, 143> RequiredMountCapabilityFlags; + OptionalUpdateField<UF::WalkInData, 134, 144> WalkInData; + OptionalUpdateField<UF::DelveData, 134, 145> DelveData; + UpdateFieldArray<ObjectGuid, 232, 146, 147> InvSlots; + UpdateFieldArray<UF::RestInfo, 2, 379, 380> RestInfo; + UpdateFieldArray<int32, 7, 382, 383> ModDamageDonePos; + UpdateFieldArray<int32, 7, 382, 390> ModDamageDoneNeg; + UpdateFieldArray<float, 7, 382, 397> ModDamageDonePercent; + UpdateFieldArray<float, 7, 382, 404> ModHealingDonePercent; + UpdateFieldArray<float, 3, 411, 412> WeaponDmgMultipliers; + UpdateFieldArray<float, 3, 411, 415> WeaponAtkSpeedMultipliers; + UpdateFieldArray<uint32, 12, 418, 419> BuybackPrice; + UpdateFieldArray<int64, 12, 418, 431> BuybackTimestamp; + UpdateFieldArray<int32, 32, 443, 444> CombatRatings; + UpdateFieldArray<uint32, 4, 476, 477> NoReagentCostMask; + UpdateFieldArray<int32, 2, 481, 482> ProfessionSkillLine; + UpdateFieldArray<uint32, 5, 484, 485> BagSlotFlags; + UpdateFieldArray<uint32, 7, 490, 491> BankBagSlotFlags; + UpdateFieldArray<uint64, 1000, 498, 499> QuestCompleted; + UpdateFieldArray<float, 17, 1499, 1500> 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 9422d37bdcb..caa867467e5 100644 --- a/src/server/game/Entities/Object/Updates/ViewerDependentValues.h +++ b/src/server/game/Entities/Object/Updates/ViewerDependentValues.h @@ -346,6 +346,18 @@ public: }; template<> +class ViewerDependentValue<UF::UnitData::Flags4Tag> +{ +public: + using value_type = UF::UnitData::Flags4Tag::value_type; + + static value_type GetValue(UF::UnitData const* unitData, Unit const* /*unit*/, Player const* /*receiver*/) + { + return unitData->Flags4; + } +}; + +template<> class ViewerDependentValue<UF::UnitData::AuraStateTag> { public: diff --git a/src/server/game/Entities/Object/Updates/WowCSEntityDefinitions.cpp b/src/server/game/Entities/Object/Updates/WowCSEntityDefinitions.cpp index 85249caab78..b89d7aab275 100644 --- a/src/server/game/Entities/Object/Updates/WowCSEntityDefinitions.cpp +++ b/src/server/game/Entities/Object/Updates/WowCSEntityDefinitions.cpp @@ -56,7 +56,8 @@ void EntityFragmentsHolder::Add(EntityFragment fragment, bool update) if (IsIndirectFragment(UpdateableIds[i])) { ContentsChangedMask |= UpdateableMasks[i]; // set the first bit to true to activate fragment - UpdateableMasks[i] |= 1 << maskIndex++; + ++maskIndex; + UpdateableMasks[i] <<= 1; } } } @@ -96,7 +97,10 @@ void EntityFragmentsHolder::Remove(EntityFragment fragment) { UpdateableMasks[i] = 1 << maskIndex++; if (IsIndirectFragment(UpdateableIds[i])) - UpdateableMasks[i] |= 1 << maskIndex++; + { + ++maskIndex; + UpdateableMasks[i] <<= 1; + } } } } diff --git a/src/server/game/Entities/Object/Updates/WowCSEntityDefinitions.h b/src/server/game/Entities/Object/Updates/WowCSEntityDefinitions.h index dba9e0a11a9..a65ca60978a 100644 --- a/src/server/game/Entities/Object/Updates/WowCSEntityDefinitions.h +++ b/src/server/game/Entities/Object/Updates/WowCSEntityDefinitions.h @@ -51,7 +51,7 @@ enum class EntityFragment : uint8 FEntityLocalMatrix = 113, FEntityWorldMatrix = 114, CActor = 115, // INDIRECT, - FVendor_C = 117, // UPDATEABLE, + FVendor_C = 117, // UPDATEABLE, INDIRECT, FMirroredObject_C = 119, End = 255, }; @@ -63,7 +63,7 @@ inline constexpr bool IsUpdateableFragment(EntityFragment frag) inline constexpr bool IsIndirectFragment(EntityFragment frag) { - return frag == EntityFragment::CGObject || frag == EntityFragment::CActor; + return frag == EntityFragment::CGObject || frag == EntityFragment::CActor || frag == EntityFragment::FVendor_C; } // common case optimization, make use of the fact that fragment arrays are sorted |
