diff options
| author | Shauren <shauren.trinity@gmail.com> | 2023-05-04 17:00:52 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2023-05-04 17:00:52 +0200 |
| commit | 16bc74667e8996b64258718e95b97258dfc0217a (patch) | |
| tree | 20c19a6ecd393c55608f2be2f94a74fab2c1b6f1 /src/server/game/Entities/Object | |
| parent | 64f8693751090bd28e6dc840a2c218c3c609fcf8 (diff) | |
Core: Update to 10.1
Diffstat (limited to 'src/server/game/Entities/Object')
| -rw-r--r-- | src/server/game/Entities/Object/MovementInfo.h | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 21 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/ObjectDefines.h | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Updates/UpdateFields.cpp | 519 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Updates/UpdateFields.h | 322 |
5 files changed, 535 insertions, 331 deletions
diff --git a/src/server/game/Entities/Object/MovementInfo.h b/src/server/game/Entities/Object/MovementInfo.h index 9e8c3909b36..768785fdfb9 100644 --- a/src/server/game/Entities/Object/MovementInfo.h +++ b/src/server/game/Entities/Object/MovementInfo.h @@ -95,6 +95,8 @@ struct MovementInfo Optional<AdvFlying> advFlying; + Optional<ObjectGuid> standingOnGameObjectGUID; + MovementInfo() : flags(0), flags2(0), flags3(0), time(0), pitch(0.0f), stepUpStartElevation(0.0f) { diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index a710e31bf71..a911aaec5ab 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -279,6 +279,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 HasStandingOnGameObjectGUID = unit->m_movementInfo.standingOnGameObjectGUID.has_value(); *data << GetGUID(); // MoverGUID @@ -301,6 +302,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe //for (std::size_t i = 0; i < RemoveForcesIDs.size(); ++i) // *data << ObjectGuid(RemoveForcesIDs); + data->WriteBit(HasStandingOnGameObjectGUID); // HasStandingOnGameObjectGUID data->WriteBit(!unit->m_movementInfo.transport.guid.IsEmpty()); // HasTransport data->WriteBit(HasFall); // HasFall data->WriteBit(HasSpline); // HasSpline - marks that the unit uses spline movement @@ -312,6 +314,9 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe if (!unit->m_movementInfo.transport.guid.IsEmpty()) *data << unit->m_movementInfo.transport; + if (HasStandingOnGameObjectGUID) + *data << *unit->m_movementInfo.standingOnGameObjectGUID; + if (HasInertia) { *data << unit->m_movementInfo.inertia->id; @@ -842,6 +847,22 @@ void MovementInfo::OutDebug() if (flags & MOVEMENTFLAG_SPLINE_ELEVATION) TC_LOG_DEBUG("misc", "stepUpStartElevation: {}", stepUpStartElevation); + + if (inertia) + { + TC_LOG_DEBUG("misc", "inertia->id: {}", inertia->id); + TC_LOG_DEBUG("misc", "inertia->force: {}", inertia->force.ToString()); + TC_LOG_DEBUG("misc", "inertia->lifetime: {}", inertia->lifetime); + } + + if (advFlying) + { + TC_LOG_DEBUG("misc", "advFlying->forwardVelocity: {}", advFlying->forwardVelocity); + TC_LOG_DEBUG("misc", "advFlying->upVelocity: {}", advFlying->upVelocity); + } + + if (standingOnGameObjectGUID) + TC_LOG_DEBUG("misc", "standingOnGameObjectGUID: {}", standingOnGameObjectGUID->ToString()); } WorldObject::WorldObject(bool isWorldObject) : Object(), WorldLocation(), LastUsedScriptID(0), diff --git a/src/server/game/Entities/Object/ObjectDefines.h b/src/server/game/Entities/Object/ObjectDefines.h index 964743fbc0e..86b2c3be09b 100644 --- a/src/server/game/Entities/Object/ObjectDefines.h +++ b/src/server/game/Entities/Object/ObjectDefines.h @@ -58,7 +58,7 @@ enum class VisibilityDistanceType : uint8 Max }; -enum TempSummonType +enum TempSummonType : uint8 { TEMPSUMMON_TIMED_OR_DEAD_DESPAWN = 1, // despawns after a specified time OR when the creature disappears TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN = 2, // despawns after a specified time OR when the creature dies diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp index 8d125ed74db..ebb9c34207e 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp @@ -968,14 +968,14 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << uint8(DisplayPower); data << uint32(OverrideDisplayPowerID); data << int64(Health); - for (uint32 i = 0; i < 7; ++i) + for (uint32 i = 0; i < 10; ++i) { data << int32(Power[i]); data << int32(MaxPower[i]); } if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner | UpdateFieldFlag::UnitAll)) { - for (uint32 i = 0; i < 7; ++i) + for (uint32 i = 0; i < 10; ++i) { data << float(PowerRegenFlatModifier[i]); data << float(PowerRegenInterruptedFlatModifier[i]); @@ -1132,7 +1132,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({ 0xFFFFDFFFu, 0xC3FEFFFFu, 0x003DFFFFu, 0xFFFFFF01u, 0xF8001FFFu, 0x00000003u, 0x00000000u }); + Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xC3FEFFFFu, 0x003DFFFFu, 0xFFFFFF01u, 0x0007FFFFu, 0x00003F80u, 0x00000000u }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); } @@ -1140,16 +1140,16 @@ void UnitData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi void UnitData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) - allowedMaskForTarget |= { 0x00002000u, 0x3C010000u, 0xFFC20000u, 0x400000FEu, 0x07FFE000u, 0xFFFFFFFCu, 0x0000001Fu }; + allowedMaskForTarget |= { 0x00002000u, 0x3C010000u, 0xFFC20000u, 0x400000FEu, 0xFFF80000u, 0xFFFFC07Fu, 0x0001FFFFu }; if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::UnitAll)) - allowedMaskForTarget |= { 0x00000000u, 0x00000000u, 0x00000000u, 0x40000000u, 0x07FFE000u, 0x00000000u, 0x00000000u }; + allowedMaskForTarget |= { 0x00000000u, 0x00000000u, 0x00000000u, 0x40000000u, 0xFFF80000u, 0x0000007Fu, 0x00000000u }; if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Empath)) - allowedMaskForTarget |= { 0x00000000u, 0x3C000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x007F8000u, 0x00000000u }; + allowedMaskForTarget |= { 0x00000000u, 0x3C000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xF8000000u, 0x00000007u }; } void UnitData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { - Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xC3FEFFFFu, 0x003DFFFFu, 0xFFFFFF01u, 0xF8001FFFu, 0x00000003u, 0x00000000u }); + Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xC3FEFFFFu, 0x003DFFFFu, 0xFFFFFF01u, 0x0007FFFFu, 0x00003F80u, 0x00000000u }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); changesMask &= allowedMaskForTarget; } @@ -1712,77 +1712,77 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor } if (changesMask[126]) { - for (uint32 i = 0; i < 7; ++i) + for (uint32 i = 0; i < 10; ++i) { if (changesMask[127 + i]) { data << int32(Power[i]); } - if (changesMask[134 + i]) + if (changesMask[137 + i]) { data << int32(MaxPower[i]); } - if (changesMask[141 + i]) + if (changesMask[147 + i]) { data << float(PowerRegenFlatModifier[i]); } - if (changesMask[148 + i]) + if (changesMask[157 + i]) { data << float(PowerRegenInterruptedFlatModifier[i]); } } } - if (changesMask[155]) + if (changesMask[167]) { for (uint32 i = 0; i < 3; ++i) { - if (changesMask[156 + i]) + if (changesMask[168 + i]) { VirtualItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[159]) + if (changesMask[171]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[160 + i]) + if (changesMask[172 + i]) { data << uint32(AttackRoundBaseTime[i]); } } } - if (changesMask[162]) + if (changesMask[174]) { for (uint32 i = 0; i < 4; ++i) { - if (changesMask[163 + i]) + if (changesMask[175 + i]) { data << int32(Stats[i]); } - if (changesMask[167 + i]) + if (changesMask[179 + i]) { data << int32(StatPosBuff[i]); } - if (changesMask[171 + i]) + if (changesMask[183 + i]) { data << int32(StatNegBuff[i]); } } } - if (changesMask[175]) + if (changesMask[187]) { for (uint32 i = 0; i < 7; ++i) { - if (changesMask[176 + i]) + if (changesMask[188 + i]) { data << int32(Resistances[i]); } - if (changesMask[183 + i]) + if (changesMask[195 + i]) { data << int32(BonusResistanceMods[i]); } - if (changesMask[190 + i]) + if (changesMask[202 + i]) { data << int32(ManaCostModifier[i]); } @@ -2146,10 +2146,15 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi data << uint32(ArenaCooldowns.size()); data << int32(Field_B0); data << int32(Field_B4); + data << int32(CurrentBattlePetSpeciesID); CtrOptions->WriteCreate(data, owner, receiver); data << int32(CovenantID); data << int32(SoulbindID); data << uint32(VisualItemReplacements.size()); + for (uint32 i = 0; i < 19; ++i) + { + data << uint32(Field_3120[i]); + } for (uint32 i = 0; i < Customizations.size(); ++i) { Customizations[i].WriteCreate(data, owner, receiver); @@ -2180,7 +2185,7 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi void PlayerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const { - Mask allowedMaskForTarget({ 0xFFFFFFEDu, 0x0000001Fu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFE00000u, 0x0000FFFFu }); + Mask allowedMaskForTarget({ 0xFFFFFFEDu, 0x0000003Fu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFC00000u, 0xFFFFFFFFu, 0x0000001Fu }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver); } @@ -2188,20 +2193,20 @@ void PlayerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi void PlayerData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::PartyMember)) - allowedMaskForTarget |= { 0x00000012u, 0xFFFFFFE0u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x001FFFFFu, 0x00000000u }; + allowedMaskForTarget |= { 0x00000012u, 0xFFFFFFC0u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x003FFFFFu, 0x00000000u, 0x00000000u }; } void PlayerData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) { - Mask allowedMaskForTarget({ 0xFFFFFFEDu, 0x0000001Fu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFE00000u, 0x0000FFFFu }); + Mask allowedMaskForTarget({ 0xFFFFFFEDu, 0x0000003Fu, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFFC00000u, 0xFFFFFFFFu, 0x0000001Fu }); AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags); changesMask &= allowedMaskForTarget; } void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, Player const* owner, Player const* receiver) const { - data.WriteBits(changesMask.GetBlocksMask(0), 8); - for (uint32 i = 0; i < 8; ++i) + data.WriteBits(changesMask.GetBlocksMask(0), 9); + for (uint32 i = 0; i < 9; ++i) if (changesMask.GetBlock(i)) data.WriteBits(changesMask.GetBlock(i), 32); @@ -2396,26 +2401,30 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign { if (changesMask[33]) { - CtrOptions->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + data << int32(CurrentBattlePetSpeciesID); } if (changesMask[34]) { - data << int32(CovenantID); + CtrOptions->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } if (changesMask[35]) { - data << int32(SoulbindID); + data << int32(CovenantID); } if (changesMask[36]) { + data << int32(SoulbindID); + } + if (changesMask[37]) + { data << DungeonScore; } } - if (changesMask[37]) + if (changesMask[38]) { for (uint32 i = 0; i < 175; ++i) { - if (changesMask[38 + i]) + if (changesMask[39 + i]) { if (noQuestLogChangesMask) QuestLog[i].WriteCreate(data, owner, receiver); @@ -2424,26 +2433,36 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign } } } - if (changesMask[213]) + if (changesMask[214]) { for (uint32 i = 0; i < 19; ++i) { - if (changesMask[214 + i]) + if (changesMask[215 + i]) { VisibleItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[233]) + if (changesMask[234]) { for (uint32 i = 0; i < 6; ++i) { - if (changesMask[234 + i]) + if (changesMask[235 + i]) { data << float(AvgItemLevel[i]); } } } + if (changesMask[241]) + { + for (uint32 i = 0; i < 19; ++i) + { + if (changesMask[242 + i]) + { + data << uint32(Field_3120[i]); + } + } + } data.FlushBits(); } @@ -2480,6 +2499,7 @@ void PlayerData::ClearChangesMask() Base::ClearChangesMask(LogoutTime); Base::ClearChangesMask(Field_B0); Base::ClearChangesMask(Field_B4); + Base::ClearChangesMask(CurrentBattlePetSpeciesID); Base::ClearChangesMask(CtrOptions); Base::ClearChangesMask(CovenantID); Base::ClearChangesMask(SoulbindID); @@ -2487,6 +2507,7 @@ void PlayerData::ClearChangesMask() Base::ClearChangesMask(QuestLog); Base::ClearChangesMask(VisibleItems); Base::ClearChangesMask(AvgItemLevel); + Base::ClearChangesMask(Field_3120); _changesMask.ResetAll(); } @@ -3523,9 +3544,45 @@ bool PersonalCraftingOrderCount::operator==(PersonalCraftingOrderCount const& ri && Count == right.Count; } +void CategoryCooldownMod::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const +{ + data << int32(SpellCategoryID); + data << int32(ModCooldown); +} + +void CategoryCooldownMod::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const +{ + data << int32(SpellCategoryID); + data << int32(ModCooldown); +} + +bool CategoryCooldownMod::operator==(CategoryCooldownMod const& right) const +{ + return SpellCategoryID == right.SpellCategoryID + && ModCooldown == right.ModCooldown; +} + +void WeeklySpellUse::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const +{ + data << int32(SpellCategoryID); + data << uint8(Uses); +} + +void WeeklySpellUse::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const +{ + data << int32(SpellCategoryID); + data << uint8(Uses); +} + +bool WeeklySpellUse::operator==(WeeklySpellUse const& right) const +{ + return SpellCategoryID == right.SpellCategoryID + && Uses == right.Uses; +} + void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const { - for (uint32 i = 0; i < 218; ++i) + for (uint32 i = 0; i < 227; ++i) { data << InvSlots[i]; } @@ -3691,6 +3748,13 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f data << uint32(ActiveCombatTraitConfigID); data << uint32(CraftingOrders.size()); data << uint32(PersonalCraftingOrderCounts.size()); + data << uint32(CategoryCooldownMods.size()); + data << uint32(WeeklySpellUses.size()); + for (uint32 i = 0; i < 17; ++i) + { + data << float(ItemUpgradeHighWatermark[i]); + } + data << uint64(LootHistoryInstanceID); for (uint32 i = 0; i < KnownTitles.size(); ++i) { data << uint64(KnownTitles[i]); @@ -3779,6 +3843,14 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f { PersonalCraftingOrderCounts[i].WriteCreate(data, owner, receiver); } + for (uint32 i = 0; i < CategoryCooldownMods.size(); ++i) + { + CategoryCooldownMods[i].WriteCreate(data, owner, receiver); + } + for (uint32 i = 0; i < WeeklySpellUses.size(); ++i) + { + WeeklySpellUses[i].WriteCreate(data, owner, receiver); + } data.FlushBits(); data.WriteBit(BackpackAutoSortDisabled); data.WriteBit(BankAutoSortDisabled); @@ -3821,8 +3893,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), 18); - for (uint32 i = 0; i < 50; ++i) + data.WriteBits(changesMask.GetBlocksMask(1), 19); + for (uint32 i = 0; i < 51; ++i) if (changesMask.GetBlock(i)) data.WriteBits(changesMask.GetBlock(i), 32); @@ -3975,11 +4047,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo WriteCompleteDynamicFieldUpdateMask(SpellFlatModByLabel.size(), data); } } - if (changesMask[32]) + if (changesMask[35]) { for (uint32 i = 0; i < 1; ++i) { - if (changesMask[33 + i]) + if (changesMask[36 + i]) { if (!ignoreNestedChangesMask) Research[i].WriteUpdateMask(data); @@ -4055,6 +4127,23 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo WriteCompleteDynamicFieldUpdateMask(PersonalCraftingOrderCounts.size(), data); } } + if (changesMask[32]) + { + if (changesMask[33]) + { + if (!ignoreNestedChangesMask) + CategoryCooldownMods.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(CategoryCooldownMods.size(), data); + } + if (changesMask[34]) + { + if (!ignoreNestedChangesMask) + WeeklySpellUses.WriteUpdateMask(data); + else + WriteCompleteDynamicFieldUpdateMask(WeeklySpellUses.size(), data); + } + } data.FlushBits(); if (changesMask[0]) { @@ -4278,6 +4367,32 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } + } + if (changesMask[32]) + { + if (changesMask[33]) + { + for (uint32 i = 0; i < CategoryCooldownMods.size(); ++i) + { + if (CategoryCooldownMods.HasChanged(i) || ignoreNestedChangesMask) + { + CategoryCooldownMods[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + } + if (changesMask[34]) + { + for (uint32 i = 0; i < WeeklySpellUses.size(); ++i) + { + if (WeeklySpellUses.HasChanged(i) || ignoreNestedChangesMask) + { + WeeklySpellUses[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + } + } + } + } + if (changesMask[0]) + { if (changesMask[7]) { for (uint32 i = 0; i < PvpInfo.size(); ++i) @@ -4319,494 +4434,508 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo } } } - if (changesMask[34]) + if (changesMask[32]) { - if (changesMask[35]) - { - data << FarsightObject; - } - if (changesMask[36]) - { - data << SummonedBattlePetGUID; - } if (changesMask[37]) { - data << uint64(Coinage); + data << FarsightObject; } if (changesMask[38]) { - data << int32(XP); + data << SummonedBattlePetGUID; } if (changesMask[39]) { - data << int32(NextLevelXP); + data << uint64(Coinage); } if (changesMask[40]) { - data << int32(TrialXP); + data << int32(XP); } if (changesMask[41]) { - Skill->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); + data << int32(NextLevelXP); } if (changesMask[42]) { - data << int32(CharacterPoints); + data << int32(TrialXP); } if (changesMask[43]) { - data << int32(MaxTalentTiers); + Skill->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } if (changesMask[44]) { - data << uint32(TrackCreatureMask); + data << int32(CharacterPoints); } if (changesMask[45]) { - data << float(MainhandExpertise); + data << int32(MaxTalentTiers); } if (changesMask[46]) { - data << float(OffhandExpertise); + data << uint32(TrackCreatureMask); } if (changesMask[47]) { - data << float(RangedExpertise); + data << float(MainhandExpertise); } if (changesMask[48]) { - data << float(CombatRatingExpertise); + data << float(OffhandExpertise); } if (changesMask[49]) { - data << float(BlockPercentage); + data << float(RangedExpertise); } if (changesMask[50]) { - data << float(DodgePercentage); + data << float(CombatRatingExpertise); } if (changesMask[51]) { - data << float(DodgePercentageFromAttribute); + data << float(BlockPercentage); } if (changesMask[52]) { - data << float(ParryPercentage); + data << float(DodgePercentage); } if (changesMask[53]) { - data << float(ParryPercentageFromAttribute); + data << float(DodgePercentageFromAttribute); } if (changesMask[54]) { - data << float(CritPercentage); + data << float(ParryPercentage); } if (changesMask[55]) { - data << float(RangedCritPercentage); + data << float(ParryPercentageFromAttribute); } if (changesMask[56]) { - data << float(OffhandCritPercentage); + data << float(CritPercentage); } if (changesMask[57]) { - data << float(SpellCritPercentage); + data << float(RangedCritPercentage); } if (changesMask[58]) { - data << int32(ShieldBlock); + data << float(OffhandCritPercentage); } if (changesMask[59]) { - data << float(ShieldBlockCritPercentage); + data << float(SpellCritPercentage); } if (changesMask[60]) { - data << float(Mastery); + data << int32(ShieldBlock); } if (changesMask[61]) { - data << float(Speed); + data << float(ShieldBlockCritPercentage); } if (changesMask[62]) { - data << float(Avoidance); + data << float(Mastery); } if (changesMask[63]) { - data << float(Sturdiness); + data << float(Speed); } if (changesMask[64]) { - data << int32(Versatility); + data << float(Avoidance); } if (changesMask[65]) { - data << float(VersatilityBonus); + data << float(Sturdiness); } } if (changesMask[66]) { if (changesMask[67]) { - data << float(PvpPowerDamage); + data << int32(Versatility); } if (changesMask[68]) { - data << float(PvpPowerHealing); + data << float(VersatilityBonus); } if (changesMask[69]) { - data << int32(ModHealingDonePos); + data << float(PvpPowerDamage); } if (changesMask[70]) { - data << float(ModHealingPercent); + data << float(PvpPowerHealing); } if (changesMask[71]) { - data << float(ModPeriodicHealingDonePercent); + data << int32(ModHealingDonePos); } if (changesMask[72]) { - data << float(ModSpellPowerPercent); + data << float(ModHealingPercent); } if (changesMask[73]) { - data << float(ModResiliencePercent); + data << float(ModPeriodicHealingDonePercent); } if (changesMask[74]) { - data << float(OverrideSpellPowerByAPPercent); + data << float(ModSpellPowerPercent); } if (changesMask[75]) { - data << float(OverrideAPBySpellPowerPercent); + data << float(ModResiliencePercent); } if (changesMask[76]) { - data << int32(ModTargetResistance); + data << float(OverrideSpellPowerByAPPercent); } if (changesMask[77]) { - data << int32(ModTargetPhysicalResistance); + data << float(OverrideAPBySpellPowerPercent); } if (changesMask[78]) { - data << uint32(LocalFlags); + data << int32(ModTargetResistance); } if (changesMask[79]) { - data << uint8(GrantableLevels); + data << int32(ModTargetPhysicalResistance); } if (changesMask[80]) { - data << uint8(MultiActionBars); + data << uint32(LocalFlags); } if (changesMask[81]) { - data << uint8(LifetimeMaxRank); + data << uint8(GrantableLevels); } if (changesMask[82]) { - data << uint8(NumRespecs); + data << uint8(MultiActionBars); } if (changesMask[83]) { - data << uint32(PvpMedals); + data << uint8(LifetimeMaxRank); } if (changesMask[84]) { - data << uint16(TodayHonorableKills); + data << uint8(NumRespecs); } if (changesMask[85]) { - data << uint16(YesterdayHonorableKills); + data << uint32(PvpMedals); } if (changesMask[86]) { - data << uint32(LifetimeHonorableKills); + data << uint16(TodayHonorableKills); } if (changesMask[87]) { - data << int32(WatchedFactionIndex); + data << uint16(YesterdayHonorableKills); } if (changesMask[88]) { - data << int32(MaxLevel); + data << uint32(LifetimeHonorableKills); } if (changesMask[89]) { - data << int32(ScalingPlayerLevelDelta); + data << int32(WatchedFactionIndex); } if (changesMask[90]) { - data << int32(MaxCreatureScalingLevel); + data << int32(MaxLevel); } if (changesMask[91]) { - data << int32(PetSpellPower); + data << int32(ScalingPlayerLevelDelta); } if (changesMask[92]) { - data << float(UiHitModifier); + data << int32(MaxCreatureScalingLevel); } if (changesMask[93]) { - data << float(UiSpellHitModifier); + data << int32(PetSpellPower); } if (changesMask[94]) { - data << int32(HomeRealmTimeOffset); + data << float(UiHitModifier); } if (changesMask[95]) { - data << float(ModPetHaste); + data << float(UiSpellHitModifier); } if (changesMask[96]) { - data << int8(JailersTowerLevelMax); + data << int32(HomeRealmTimeOffset); } if (changesMask[97]) { - data << int8(JailersTowerLevel); + data << float(ModPetHaste); } } if (changesMask[98]) { if (changesMask[99]) { - data << uint8(LocalRegenFlags); + data << int8(JailersTowerLevelMax); } if (changesMask[100]) { - data << uint8(AuraVision); + data << int8(JailersTowerLevel); } if (changesMask[101]) { - data << uint8(NumBackpackSlots); + data << uint8(LocalRegenFlags); } if (changesMask[102]) { - data << int32(OverrideSpellsID); + data << uint8(AuraVision); } if (changesMask[103]) { - data << uint16(LootSpecID); + data << uint8(NumBackpackSlots); } if (changesMask[104]) { - data << uint32(OverrideZonePVPType); + data << int32(OverrideSpellsID); } if (changesMask[105]) { - data << BnetAccount; + data << uint16(LootSpecID); } if (changesMask[106]) { - data << uint64(GuildClubMemberID); + data << uint32(OverrideZonePVPType); } if (changesMask[107]) { - data << int32(Honor); + data << BnetAccount; } if (changesMask[108]) { - data << int32(HonorNextLevel); + data << uint64(GuildClubMemberID); } if (changesMask[109]) { - data << int32(PerksProgramCurrency); + data << int32(Honor); } if (changesMask[110]) { + data << int32(HonorNextLevel); + } + if (changesMask[111]) + { + data << int32(PerksProgramCurrency); + } + if (changesMask[112]) + { data << uint8(NumBankSlots); } - if (changesMask[114]) + if (changesMask[116]) { data << int32(UiChromieTimeExpansionID); } - if (changesMask[115]) + if (changesMask[117]) { data << int32(TransportServerTime); } - if (changesMask[116]) + if (changesMask[118]) { data << uint32(WeeklyRewardsPeriodSinceOrigin); } - if (changesMask[117]) + if (changesMask[119]) { data << int16(DEBUGSoulbindConduitRank); } - if (changesMask[119]) + if (changesMask[121]) { data << uint32(ActiveCombatTraitConfigID); } + if (changesMask[122]) + { + data << uint64(LootHistoryInstanceID); + } } if (changesMask[98]) { data.WriteBits(QuestSession.has_value(), 1); - if (changesMask[111]) + if (changesMask[113]) { data << FrozenPerksVendorItem; } - if (changesMask[112]) + if (changesMask[114]) { if (QuestSession.has_value()) { QuestSession->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } - if (changesMask[113]) + if (changesMask[115]) { Field_1410->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[118]) + if (changesMask[120]) { data << DungeonScore; } } - if (changesMask[120]) + if (changesMask[123]) { - for (uint32 i = 0; i < 218; ++i) + for (uint32 i = 0; i < 227; ++i) { - if (changesMask[121 + i]) + if (changesMask[124 + i]) { data << InvSlots[i]; } } } - if (changesMask[339]) + if (changesMask[351]) { for (uint32 i = 0; i < 240; ++i) { - if (changesMask[340 + i]) + if (changesMask[352 + i]) { data << uint64(ExploredZones[i]); } } } - if (changesMask[580]) + if (changesMask[592]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[581 + i]) + if (changesMask[593 + i]) { RestInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } } - if (changesMask[583]) + if (changesMask[595]) { for (uint32 i = 0; i < 7; ++i) { - if (changesMask[584 + i]) + if (changesMask[596 + i]) { data << int32(ModDamageDonePos[i]); } - if (changesMask[591 + i]) + if (changesMask[603 + i]) { data << int32(ModDamageDoneNeg[i]); } - if (changesMask[598 + i]) + if (changesMask[610 + i]) { data << float(ModDamageDonePercent[i]); } - if (changesMask[605 + i]) + if (changesMask[617 + i]) { data << float(ModHealingDonePercent[i]); } } } - if (changesMask[612]) + if (changesMask[624]) { for (uint32 i = 0; i < 3; ++i) { - if (changesMask[613 + i]) + if (changesMask[625 + i]) { data << float(WeaponDmgMultipliers[i]); } - if (changesMask[616 + i]) + if (changesMask[628 + i]) { data << float(WeaponAtkSpeedMultipliers[i]); } } } - if (changesMask[619]) + if (changesMask[631]) { for (uint32 i = 0; i < 12; ++i) { - if (changesMask[620 + i]) + if (changesMask[632 + i]) { data << uint32(BuybackPrice[i]); } - if (changesMask[632 + i]) + if (changesMask[644 + i]) { data << int64(BuybackTimestamp[i]); } } } - if (changesMask[644]) + if (changesMask[656]) { for (uint32 i = 0; i < 32; ++i) { - if (changesMask[645 + i]) + if (changesMask[657 + i]) { data << int32(CombatRatings[i]); } } } - if (changesMask[677]) + if (changesMask[689]) { for (uint32 i = 0; i < 4; ++i) { - if (changesMask[678 + i]) + if (changesMask[690 + i]) { data << uint32(NoReagentCostMask[i]); } } } - if (changesMask[682]) + if (changesMask[694]) { for (uint32 i = 0; i < 2; ++i) { - if (changesMask[683 + i]) + if (changesMask[695 + i]) { data << int32(ProfessionSkillLine[i]); } } } - if (changesMask[685]) + if (changesMask[697]) { for (uint32 i = 0; i < 5; ++i) { - if (changesMask[686 + i]) + if (changesMask[698 + i]) { data << uint32(BagSlotFlags[i]); } } } - if (changesMask[691]) + if (changesMask[703]) { for (uint32 i = 0; i < 7; ++i) { - if (changesMask[692 + i]) + if (changesMask[704 + i]) { data << uint32(BankBagSlotFlags[i]); } } } - if (changesMask[699]) + if (changesMask[711]) { for (uint32 i = 0; i < 875; ++i) { - if (changesMask[700 + i]) + if (changesMask[712 + i]) { data << uint64(QuestCompleted[i]); } } } + if (changesMask[1587]) + { + for (uint32 i = 0; i < 17; ++i) + { + if (changesMask[1588 + i]) + { + data << float(ItemUpgradeHighWatermark[i]); + } + } + } data.FlushBits(); } @@ -4840,6 +4969,8 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(ReplayedQuests); Base::ClearChangesMask(DisabledSpells); Base::ClearChangesMask(PersonalCraftingOrderCounts); + Base::ClearChangesMask(CategoryCooldownMods); + Base::ClearChangesMask(WeeklySpellUses); Base::ClearChangesMask(PvpInfo); Base::ClearChangesMask(CharacterRestrictions); Base::ClearChangesMask(TraitConfigs); @@ -4927,6 +5058,7 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(DEBUGSoulbindConduitRank); Base::ClearChangesMask(DungeonScore); Base::ClearChangesMask(ActiveCombatTraitConfigID); + Base::ClearChangesMask(LootHistoryInstanceID); Base::ClearChangesMask(InvSlots); Base::ClearChangesMask(ExploredZones); Base::ClearChangesMask(RestInfo); @@ -4944,6 +5076,7 @@ void ActivePlayerData::ClearChangesMask() Base::ClearChangesMask(BagSlotFlags); Base::ClearChangesMask(BankBagSlotFlags); Base::ClearChangesMask(QuestCompleted); + Base::ClearChangesMask(ItemUpgradeHighWatermark); _changesMask.ResetAll(); } @@ -5497,10 +5630,14 @@ void AreaTriggerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fi data << Field_88; data << Field_F8; ExtraScaleCurve->WriteCreate(data, owner, receiver); + data.WriteBit(Field_260); + data.WriteBit(Field_261); Field_C38->WriteCreate(data, owner, receiver); Field_C54->WriteCreate(data, owner, receiver); Field_C70->WriteCreate(data, owner, receiver); VisualAnim->WriteCreate(data, owner, receiver); + data.FlushBits(); + data.FlushBits(); } void AreaTriggerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const @@ -5510,104 +5647,118 @@ void AreaTriggerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fi void AreaTriggerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, AreaTrigger const* owner, Player const* receiver) const { - data.WriteBits(changesMask.GetBlock(0), 23); + data.WriteBits(changesMask.GetBlock(0), 25); - data.FlushBits(); if (changesMask[0]) { if (changesMask[1]) { + data.WriteBit(Field_260); + } + if (changesMask[2]) + { + data.WriteBit(Field_261); + } + } + data.FlushBits(); + if (changesMask[0]) + { + if (changesMask[3]) + { OverrideScaleCurve->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[6]) + if (changesMask[8]) { data << Caster; } - if (changesMask[7]) + if (changesMask[9]) { data << uint32(Duration); } - if (changesMask[8]) + if (changesMask[10]) { data << uint32(TimeToTarget); } - if (changesMask[9]) + if (changesMask[11]) { data << uint32(TimeToTargetScale); } - if (changesMask[10]) + if (changesMask[12]) { data << uint32(TimeToTargetExtraScale); } - if (changesMask[11]) + if (changesMask[13]) { data << uint32(Field_B0); } - if (changesMask[12]) + if (changesMask[14]) { data << int32(SpellID); } - if (changesMask[13]) + if (changesMask[15]) { data << int32(SpellForVisuals); } - if (changesMask[14]) + if (changesMask[16]) { SpellVisual->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[15]) + if (changesMask[17]) { data << float(BoundsRadius2D); } - if (changesMask[16]) + if (changesMask[18]) { data << uint32(DecalPropertiesID); } - if (changesMask[17]) + if (changesMask[19]) { data << CreatingEffectGUID; } - if (changesMask[18]) + if (changesMask[20]) { data << uint32(Field_80); } - if (changesMask[19]) + if (changesMask[21]) { data << uint32(Field_84); } - if (changesMask[20]) + if (changesMask[22]) { data << Field_88; } - if (changesMask[21]) + if (changesMask[23]) { data << Field_F8; } - if (changesMask[2]) + if (changesMask[4]) { ExtraScaleCurve->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[3]) + if (changesMask[5]) { Field_C38->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[4]) + if (changesMask[6]) { Field_C54->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[5]) + if (changesMask[7]) { Field_C70->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } - if (changesMask[22]) + if (changesMask[24]) { VisualAnim->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver); } } + data.FlushBits(); } void AreaTriggerData::ClearChangesMask() { + Base::ClearChangesMask(Field_260); + Base::ClearChangesMask(Field_261); Base::ClearChangesMask(OverrideScaleCurve); Base::ClearChangesMask(ExtraScaleCurve); Base::ClearChangesMask(Field_C38); diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h index ee689dd4fa4..9af78fef00f 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.h +++ b/src/server/game/Entities/Object/Updates/UpdateFields.h @@ -256,7 +256,7 @@ struct PassiveSpellHistory : public IsUpdateFieldStructureTag bool operator!=(PassiveSpellHistory const& right) const { return !(*this == right); } }; -struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<197> +struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<209> { UpdateField<std::vector<uint32>, 0, 1> StateWorldEffectIDs; DynamicUpdateField<UF::PassiveSpellHistory, 0, 2> PassiveSpells; @@ -385,18 +385,18 @@ struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<197> UpdateField<ObjectGuid, 96, 122> NameplateAttachToGUID; // When set, nameplate of this unit will instead appear on that object UpdateFieldArray<uint32, 2, 123, 124> NpcFlags; struct NpcFlagsTag : ViewerDependentValueTag<uint32> {}; - UpdateFieldArray<int32, 7, 126, 127> Power; - UpdateFieldArray<int32, 7, 126, 134> MaxPower; - UpdateFieldArray<float, 7, 126, 141> PowerRegenFlatModifier; - UpdateFieldArray<float, 7, 126, 148> PowerRegenInterruptedFlatModifier; - UpdateFieldArray<UF::VisibleItem, 3, 155, 156> VirtualItems; - UpdateFieldArray<uint32, 2, 159, 160> AttackRoundBaseTime; - UpdateFieldArray<int32, 4, 162, 163> Stats; - UpdateFieldArray<int32, 4, 162, 167> StatPosBuff; - UpdateFieldArray<int32, 4, 162, 171> StatNegBuff; - UpdateFieldArray<int32, 7, 175, 176> Resistances; - UpdateFieldArray<int32, 7, 175, 183> BonusResistanceMods; - UpdateFieldArray<int32, 7, 175, 190> ManaCostModifier; + UpdateFieldArray<int32, 10, 126, 127> Power; + UpdateFieldArray<int32, 10, 126, 137> MaxPower; + UpdateFieldArray<float, 10, 126, 147> PowerRegenFlatModifier; + UpdateFieldArray<float, 10, 126, 157> PowerRegenInterruptedFlatModifier; + UpdateFieldArray<UF::VisibleItem, 3, 167, 168> VirtualItems; + UpdateFieldArray<uint32, 2, 171, 172> AttackRoundBaseTime; + UpdateFieldArray<int32, 4, 174, 175> Stats; + UpdateFieldArray<int32, 4, 174, 179> StatPosBuff; + UpdateFieldArray<int32, 4, 174, 183> StatNegBuff; + UpdateFieldArray<int32, 7, 187, 188> Resistances; + UpdateFieldArray<int32, 7, 187, 195> BonusResistanceMods; + UpdateFieldArray<int32, 7, 187, 202> 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; @@ -458,7 +458,7 @@ struct CTROptions : public IsUpdateFieldStructureTag bool operator!=(CTROptions const& right) const { return !(*this == right); } }; -struct PlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<240> +struct PlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<261> { UpdateField<bool, 0, 1> HasQuestSession; UpdateField<bool, 0, 2> HasLevelLink; @@ -491,13 +491,15 @@ struct PlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<240> UpdateField<int64, 0, 29> LogoutTime; UpdateField<int32, 0, 30> Field_B0; UpdateField<int32, 0, 31> Field_B4; - UpdateField<UF::CTROptions, 32, 33> CtrOptions; - UpdateField<int32, 32, 34> CovenantID; - UpdateField<int32, 32, 35> SoulbindID; - UpdateField<WorldPackets::MythicPlus::DungeonScoreSummary, 32, 36> DungeonScore; - UpdateFieldArray<UF::QuestLog, 175, 37, 38> QuestLog; - UpdateFieldArray<UF::VisibleItem, 19, 213, 214> VisibleItems; - UpdateFieldArray<float, 6, 233, 234> AvgItemLevel; + UpdateField<int32, 32, 33> CurrentBattlePetSpeciesID; + UpdateField<UF::CTROptions, 32, 34> CtrOptions; + UpdateField<int32, 32, 35> CovenantID; + UpdateField<int32, 32, 36> SoulbindID; + UpdateField<WorldPackets::MythicPlus::DungeonScoreSummary, 32, 37> DungeonScore; + UpdateFieldArray<UF::QuestLog, 175, 38, 39> QuestLog; + UpdateFieldArray<UF::VisibleItem, 19, 214, 215> VisibleItems; + UpdateFieldArray<float, 6, 234, 235> AvgItemLevel; + UpdateFieldArray<uint32, 19, 241, 242> Field_3120; 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; @@ -764,14 +766,36 @@ struct PersonalCraftingOrderCount : public IsUpdateFieldStructureTag bool operator!=(PersonalCraftingOrderCount const& right) const { return !(*this == right); } }; -struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1575> +struct CategoryCooldownMod : public IsUpdateFieldStructureTag +{ + int32 SpellCategoryID; + int32 ModCooldown; + + 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==(CategoryCooldownMod const& right) const; + bool operator!=(CategoryCooldownMod const& right) const { return !(*this == right); } +}; + +struct WeeklySpellUse : public IsUpdateFieldStructureTag +{ + int32 SpellCategoryID; + uint8 Uses; + + 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==(WeeklySpellUse const& right) const; + bool operator!=(WeeklySpellUse const& right) const { return !(*this == right); } +}; + +struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1605> { UpdateField<bool, 0, 1> BackpackAutoSortDisabled; UpdateField<bool, 0, 2> BankAutoSortDisabled; UpdateField<bool, 0, 3> SortBagsRightToLeft; UpdateField<bool, 0, 4> InsertItemsLeftToRight; UpdateField<bool, 0, 5> HasPerksProgramPendingReward; - UpdateFieldArray<DynamicUpdateFieldBase<UF::Research>, 1, 32, 33> Research; + UpdateFieldArray<DynamicUpdateFieldBase<UF::Research>, 1, 35, 36> Research; DynamicUpdateField<uint64, 0, 6> KnownTitles; DynamicUpdateField<uint16, 0, 8> ResearchSites; DynamicUpdateField<uint32, 0, 9> ResearchSiteProgress; @@ -794,110 +818,114 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas DynamicUpdateField<UF::ReplayedQuest, 0, 27> ReplayedQuests; 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::PVPInfo, 0, 7> PvpInfo; DynamicUpdateField<UF::CharacterRestriction, 0, 21> CharacterRestrictions; DynamicUpdateField<UF::TraitConfig, 0, 29> TraitConfigs; DynamicUpdateField<UF::CraftingOrder, 0, 30> CraftingOrders; - UpdateField<ObjectGuid, 34, 35> FarsightObject; - UpdateField<ObjectGuid, 34, 36> SummonedBattlePetGUID; - UpdateField<uint64, 34, 37> Coinage; - UpdateField<int32, 34, 38> XP; - UpdateField<int32, 34, 39> NextLevelXP; - UpdateField<int32, 34, 40> TrialXP; - UpdateField<UF::SkillInfo, 34, 41> Skill; - UpdateField<int32, 34, 42> CharacterPoints; - UpdateField<int32, 34, 43> MaxTalentTiers; - UpdateField<uint32, 34, 44> TrackCreatureMask; - UpdateField<float, 34, 45> MainhandExpertise; - UpdateField<float, 34, 46> OffhandExpertise; - UpdateField<float, 34, 47> RangedExpertise; - UpdateField<float, 34, 48> CombatRatingExpertise; - UpdateField<float, 34, 49> BlockPercentage; - UpdateField<float, 34, 50> DodgePercentage; - UpdateField<float, 34, 51> DodgePercentageFromAttribute; - UpdateField<float, 34, 52> ParryPercentage; - UpdateField<float, 34, 53> ParryPercentageFromAttribute; - UpdateField<float, 34, 54> CritPercentage; - UpdateField<float, 34, 55> RangedCritPercentage; - UpdateField<float, 34, 56> OffhandCritPercentage; - UpdateField<float, 34, 57> SpellCritPercentage; - UpdateField<int32, 34, 58> ShieldBlock; - UpdateField<float, 34, 59> ShieldBlockCritPercentage; - UpdateField<float, 34, 60> Mastery; - UpdateField<float, 34, 61> Speed; - UpdateField<float, 34, 62> Avoidance; - UpdateField<float, 34, 63> Sturdiness; - UpdateField<int32, 34, 64> Versatility; - UpdateField<float, 34, 65> VersatilityBonus; - UpdateField<float, 66, 67> PvpPowerDamage; - UpdateField<float, 66, 68> PvpPowerHealing; - UpdateField<int32, 66, 69> ModHealingDonePos; - UpdateField<float, 66, 70> ModHealingPercent; - UpdateField<float, 66, 71> ModPeriodicHealingDonePercent; - UpdateField<float, 66, 72> ModSpellPowerPercent; - UpdateField<float, 66, 73> ModResiliencePercent; - UpdateField<float, 66, 74> OverrideSpellPowerByAPPercent; - UpdateField<float, 66, 75> OverrideAPBySpellPowerPercent; - UpdateField<int32, 66, 76> ModTargetResistance; - UpdateField<int32, 66, 77> ModTargetPhysicalResistance; - UpdateField<uint32, 66, 78> LocalFlags; - UpdateField<uint8, 66, 79> GrantableLevels; - UpdateField<uint8, 66, 80> MultiActionBars; - UpdateField<uint8, 66, 81> LifetimeMaxRank; - UpdateField<uint8, 66, 82> NumRespecs; - UpdateField<uint32, 66, 83> PvpMedals; - UpdateField<uint16, 66, 84> TodayHonorableKills; - UpdateField<uint16, 66, 85> YesterdayHonorableKills; - UpdateField<uint32, 66, 86> LifetimeHonorableKills; - UpdateField<int32, 66, 87> WatchedFactionIndex; - UpdateField<int32, 66, 88> MaxLevel; - UpdateField<int32, 66, 89> ScalingPlayerLevelDelta; - UpdateField<int32, 66, 90> MaxCreatureScalingLevel; - UpdateField<int32, 66, 91> PetSpellPower; - UpdateField<float, 66, 92> UiHitModifier; - UpdateField<float, 66, 93> UiSpellHitModifier; - UpdateField<int32, 66, 94> HomeRealmTimeOffset; - UpdateField<float, 66, 95> ModPetHaste; - UpdateField<int8, 66, 96> JailersTowerLevelMax; - UpdateField<int8, 66, 97> JailersTowerLevel; - UpdateField<uint8, 98, 99> LocalRegenFlags; - UpdateField<uint8, 98, 100> AuraVision; - UpdateField<uint8, 98, 101> NumBackpackSlots; - UpdateField<int32, 98, 102> OverrideSpellsID; - UpdateField<uint16, 98, 103> LootSpecID; - UpdateField<uint32, 98, 104> OverrideZonePVPType; - UpdateField<ObjectGuid, 98, 105> BnetAccount; - UpdateField<uint64, 98, 106> GuildClubMemberID; - UpdateField<int32, 98, 107> Honor; - UpdateField<int32, 98, 108> HonorNextLevel; - UpdateField<int32, 98, 109> PerksProgramCurrency; - UpdateField<uint8, 98, 110> NumBankSlots; - UpdateField<WorldPackets::PerksProgram::PerksVendorItem, 98, 111> FrozenPerksVendorItem; - UpdateField<UF::ActivePlayerUnk901, 98, 113> Field_1410; - OptionalUpdateField<UF::QuestSession, 98, 112> QuestSession; - UpdateField<int32, 98, 114> UiChromieTimeExpansionID; - UpdateField<int32, 98, 115> TransportServerTime; - UpdateField<uint32, 98, 116> WeeklyRewardsPeriodSinceOrigin; // week count since Cfg_RegionsEntry::ChallengeOrigin - UpdateField<int16, 98, 117> DEBUGSoulbindConduitRank; - UpdateField<WorldPackets::MythicPlus::DungeonScoreData, 98, 118> DungeonScore; - UpdateField<uint32, 98, 119> ActiveCombatTraitConfigID; - UpdateFieldArray<ObjectGuid, 218, 120, 121> InvSlots; - UpdateFieldArray<uint64, 240, 339, 340> ExploredZones; - UpdateFieldArray<UF::RestInfo, 2, 580, 581> RestInfo; - UpdateFieldArray<int32, 7, 583, 584> ModDamageDonePos; - UpdateFieldArray<int32, 7, 583, 591> ModDamageDoneNeg; - UpdateFieldArray<float, 7, 583, 598> ModDamageDonePercent; - UpdateFieldArray<float, 7, 583, 605> ModHealingDonePercent; - UpdateFieldArray<float, 3, 612, 613> WeaponDmgMultipliers; - UpdateFieldArray<float, 3, 612, 616> WeaponAtkSpeedMultipliers; - UpdateFieldArray<uint32, 12, 619, 620> BuybackPrice; - UpdateFieldArray<int64, 12, 619, 632> BuybackTimestamp; - UpdateFieldArray<int32, 32, 644, 645> CombatRatings; - UpdateFieldArray<uint32, 4, 677, 678> NoReagentCostMask; - UpdateFieldArray<int32, 2, 682, 683> ProfessionSkillLine; - UpdateFieldArray<uint32, 5, 685, 686> BagSlotFlags; - UpdateFieldArray<uint32, 7, 691, 692> BankBagSlotFlags; - UpdateFieldArray<uint64, 875, 699, 700> QuestCompleted; + UpdateField<ObjectGuid, 32, 37> FarsightObject; + UpdateField<ObjectGuid, 32, 38> SummonedBattlePetGUID; + UpdateField<uint64, 32, 39> Coinage; + UpdateField<int32, 32, 40> XP; + UpdateField<int32, 32, 41> NextLevelXP; + UpdateField<int32, 32, 42> TrialXP; + UpdateField<UF::SkillInfo, 32, 43> Skill; + UpdateField<int32, 32, 44> CharacterPoints; + UpdateField<int32, 32, 45> MaxTalentTiers; + UpdateField<uint32, 32, 46> TrackCreatureMask; + UpdateField<float, 32, 47> MainhandExpertise; + UpdateField<float, 32, 48> OffhandExpertise; + UpdateField<float, 32, 49> RangedExpertise; + UpdateField<float, 32, 50> CombatRatingExpertise; + UpdateField<float, 32, 51> BlockPercentage; + UpdateField<float, 32, 52> DodgePercentage; + UpdateField<float, 32, 53> DodgePercentageFromAttribute; + UpdateField<float, 32, 54> ParryPercentage; + UpdateField<float, 32, 55> ParryPercentageFromAttribute; + UpdateField<float, 32, 56> CritPercentage; + UpdateField<float, 32, 57> RangedCritPercentage; + UpdateField<float, 32, 58> OffhandCritPercentage; + UpdateField<float, 32, 59> SpellCritPercentage; + UpdateField<int32, 32, 60> ShieldBlock; + UpdateField<float, 32, 61> ShieldBlockCritPercentage; + UpdateField<float, 32, 62> Mastery; + UpdateField<float, 32, 63> Speed; + UpdateField<float, 32, 64> Avoidance; + UpdateField<float, 32, 65> Sturdiness; + UpdateField<int32, 66, 67> Versatility; + UpdateField<float, 66, 68> VersatilityBonus; + UpdateField<float, 66, 69> PvpPowerDamage; + UpdateField<float, 66, 70> PvpPowerHealing; + UpdateField<int32, 66, 71> ModHealingDonePos; + UpdateField<float, 66, 72> ModHealingPercent; + UpdateField<float, 66, 73> ModPeriodicHealingDonePercent; + UpdateField<float, 66, 74> ModSpellPowerPercent; + UpdateField<float, 66, 75> ModResiliencePercent; + UpdateField<float, 66, 76> OverrideSpellPowerByAPPercent; + UpdateField<float, 66, 77> OverrideAPBySpellPowerPercent; + UpdateField<int32, 66, 78> ModTargetResistance; + UpdateField<int32, 66, 79> ModTargetPhysicalResistance; + UpdateField<uint32, 66, 80> LocalFlags; + UpdateField<uint8, 66, 81> GrantableLevels; + UpdateField<uint8, 66, 82> MultiActionBars; + UpdateField<uint8, 66, 83> LifetimeMaxRank; + UpdateField<uint8, 66, 84> NumRespecs; + UpdateField<uint32, 66, 85> PvpMedals; + UpdateField<uint16, 66, 86> TodayHonorableKills; + UpdateField<uint16, 66, 87> YesterdayHonorableKills; + UpdateField<uint32, 66, 88> LifetimeHonorableKills; + UpdateField<int32, 66, 89> WatchedFactionIndex; + UpdateField<int32, 66, 90> MaxLevel; + UpdateField<int32, 66, 91> ScalingPlayerLevelDelta; + UpdateField<int32, 66, 92> MaxCreatureScalingLevel; + UpdateField<int32, 66, 93> PetSpellPower; + UpdateField<float, 66, 94> UiHitModifier; + UpdateField<float, 66, 95> UiSpellHitModifier; + UpdateField<int32, 66, 96> HomeRealmTimeOffset; + UpdateField<float, 66, 97> ModPetHaste; + UpdateField<int8, 98, 99> JailersTowerLevelMax; + UpdateField<int8, 98, 100> JailersTowerLevel; + UpdateField<uint8, 98, 101> LocalRegenFlags; + UpdateField<uint8, 98, 102> AuraVision; + UpdateField<uint8, 98, 103> NumBackpackSlots; + UpdateField<int32, 98, 104> OverrideSpellsID; + UpdateField<uint16, 98, 105> LootSpecID; + UpdateField<uint32, 98, 106> OverrideZonePVPType; + UpdateField<ObjectGuid, 98, 107> BnetAccount; + UpdateField<uint64, 98, 108> GuildClubMemberID; + UpdateField<int32, 98, 109> Honor; + UpdateField<int32, 98, 110> HonorNextLevel; + UpdateField<int32, 98, 111> PerksProgramCurrency; + UpdateField<uint8, 98, 112> NumBankSlots; + UpdateField<WorldPackets::PerksProgram::PerksVendorItem, 98, 113> FrozenPerksVendorItem; + UpdateField<UF::ActivePlayerUnk901, 98, 115> Field_1410; + OptionalUpdateField<UF::QuestSession, 98, 114> QuestSession; + UpdateField<int32, 98, 116> UiChromieTimeExpansionID; + UpdateField<int32, 98, 117> TransportServerTime; + UpdateField<uint32, 98, 118> WeeklyRewardsPeriodSinceOrigin; // week count since Cfg_RegionsEntry::ChallengeOrigin + UpdateField<int16, 98, 119> DEBUGSoulbindConduitRank; + UpdateField<WorldPackets::MythicPlus::DungeonScoreData, 98, 120> DungeonScore; + UpdateField<uint32, 98, 121> ActiveCombatTraitConfigID; + UpdateField<uint64, 98, 122> LootHistoryInstanceID; + UpdateFieldArray<ObjectGuid, 227, 123, 124> InvSlots; + UpdateFieldArray<uint64, 240, 351, 352> ExploredZones; + UpdateFieldArray<UF::RestInfo, 2, 592, 593> RestInfo; + UpdateFieldArray<int32, 7, 595, 596> ModDamageDonePos; + UpdateFieldArray<int32, 7, 595, 603> ModDamageDoneNeg; + UpdateFieldArray<float, 7, 595, 610> ModDamageDonePercent; + UpdateFieldArray<float, 7, 595, 617> ModHealingDonePercent; + UpdateFieldArray<float, 3, 624, 625> WeaponDmgMultipliers; + UpdateFieldArray<float, 3, 624, 628> WeaponAtkSpeedMultipliers; + UpdateFieldArray<uint32, 12, 631, 632> BuybackPrice; + UpdateFieldArray<int64, 12, 631, 644> BuybackTimestamp; + UpdateFieldArray<int32, 32, 656, 657> CombatRatings; + UpdateFieldArray<uint32, 4, 689, 690> NoReagentCostMask; + UpdateFieldArray<int32, 2, 694, 695> ProfessionSkillLine; + UpdateFieldArray<uint32, 5, 697, 698> BagSlotFlags; + UpdateFieldArray<uint32, 7, 703, 704> BankBagSlotFlags; + UpdateFieldArray<uint64, 875, 711, 712> QuestCompleted; + UpdateFieldArray<float, 17, 1587, 1588> 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; @@ -1001,30 +1029,32 @@ struct VisualAnim : public IsUpdateFieldStructureTag, public HasChangesMask<5> void ClearChangesMask(); }; -struct AreaTriggerData : public IsUpdateFieldStructureTag, public HasChangesMask<23> +struct AreaTriggerData : public IsUpdateFieldStructureTag, public HasChangesMask<25> { - UpdateField<UF::ScaleCurve, 0, 1> OverrideScaleCurve; - UpdateField<UF::ScaleCurve, 0, 2> ExtraScaleCurve; - UpdateField<UF::ScaleCurve, 0, 3> Field_C38; - UpdateField<UF::ScaleCurve, 0, 4> Field_C54; - UpdateField<UF::ScaleCurve, 0, 5> Field_C70; - UpdateField<ObjectGuid, 0, 6> Caster; - UpdateField<uint32, 0, 7> Duration; - UpdateField<uint32, 0, 8> TimeToTarget; - UpdateField<uint32, 0, 9> TimeToTargetScale; - UpdateField<uint32, 0, 10> TimeToTargetExtraScale; - UpdateField<uint32, 0, 11> Field_B0; - UpdateField<int32, 0, 12> SpellID; - UpdateField<int32, 0, 13> SpellForVisuals; - UpdateField<UF::SpellCastVisual, 0, 14> SpellVisual; - UpdateField<float, 0, 15> BoundsRadius2D; - UpdateField<uint32, 0, 16> DecalPropertiesID; - UpdateField<ObjectGuid, 0, 17> CreatingEffectGUID; - UpdateField<uint32, 0, 18> Field_80; - UpdateField<uint32, 0, 19> Field_84; - UpdateField<ObjectGuid, 0, 20> Field_88; - UpdateField<TaggedPosition<Position::XYZ>, 0, 21> Field_F8; - UpdateField<UF::VisualAnim, 0, 22> VisualAnim; + UpdateField<bool, 0, 1> Field_260; + UpdateField<bool, 0, 2> Field_261; + UpdateField<UF::ScaleCurve, 0, 3> OverrideScaleCurve; + UpdateField<UF::ScaleCurve, 0, 4> ExtraScaleCurve; + UpdateField<UF::ScaleCurve, 0, 5> Field_C38; + UpdateField<UF::ScaleCurve, 0, 6> Field_C54; + UpdateField<UF::ScaleCurve, 0, 7> Field_C70; + UpdateField<ObjectGuid, 0, 8> Caster; + UpdateField<uint32, 0, 9> Duration; + UpdateField<uint32, 0, 10> TimeToTarget; + UpdateField<uint32, 0, 11> TimeToTargetScale; + UpdateField<uint32, 0, 12> TimeToTargetExtraScale; + UpdateField<uint32, 0, 13> Field_B0; + UpdateField<int32, 0, 14> SpellID; + UpdateField<int32, 0, 15> SpellForVisuals; + UpdateField<UF::SpellCastVisual, 0, 16> SpellVisual; + UpdateField<float, 0, 17> BoundsRadius2D; + UpdateField<uint32, 0, 18> DecalPropertiesID; + UpdateField<ObjectGuid, 0, 19> CreatingEffectGUID; + UpdateField<uint32, 0, 20> Field_80; + UpdateField<uint32, 0, 21> Field_84; + UpdateField<ObjectGuid, 0, 22> Field_88; + UpdateField<TaggedPosition<Position::XYZ>, 0, 23> Field_F8; + UpdateField<UF::VisualAnim, 0, 24> VisualAnim; void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const; |
