From ee081084d6b2b43b33fedc9a4d3ce03f8d68cd7a Mon Sep 17 00:00:00 2001 From: Shauren Date: Tue, 6 Aug 2019 19:45:00 +0200 Subject: Core/PacketIO: Fixed updatefield structures --- .../game/Entities/Object/Updates/UpdateFields.cpp | 100 ++++++++++++++++----- .../game/Entities/Object/Updates/UpdateFields.h | 30 ++++--- 2 files changed, 96 insertions(+), 34 deletions(-) (limited to 'src') diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp index 6419627bc27..5592eea246f 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp @@ -524,23 +524,51 @@ void SelectedAzeriteEssences::WriteCreate(ByteBuffer& data, EnumClassFlag fieldVisibilityFlags, Item const* owner, Player const* receiver) const { + UpdateMask<7> const& changesMask = _changesMask; + data.WriteBits(changesMask.GetBlocksMask(0), 1); + if (changesMask.GetBlock(0)) + data.WriteBits(changesMask.GetBlock(0), 32); + data.FlushBits(); - data << uint32(Field_0); - data.WriteBits(Enabled, 1); - for (std::size_t i = 0; i < 3; ++i) + if (changesMask[0]) { - data << uint32(AzeriteEssenceID[i]); + if (changesMask[1]) + { + data << uint32(SpecializationID); + } + if (changesMask[2]) + { + data.WriteBits(Enabled, 1); + } + } + if (changesMask[3]) + { + for (std::size_t i = 0; i < 3; ++i) + { + if (changesMask[4 + i]) + { + data << uint32(AzeriteEssenceID[i]); + } + } } data.FlushBits(); } +void SelectedAzeriteEssences::ClearChangesMask() +{ + Base::ClearChangesMask(SpecializationID); + Base::ClearChangesMask(Enabled); + Base::ClearChangesMask(AzeriteEssenceID); + _changesMask.ResetAll(); +} + void AzeriteItemData::WriteCreate(ByteBuffer& data, EnumClassFlag fieldVisibilityFlags, Item const* owner, Player const* receiver) const { if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner)) @@ -593,11 +621,11 @@ void AzeriteItemData::WriteUpdate(ByteBuffer& data, UpdateMask<9> const& changes } if (changesMask[2]) { - UnlockedEssenceMilestones.WriteUpdateMask(data); + SelectedEssences.WriteUpdateMask(data); } if (changesMask[3]) { - SelectedEssences.WriteUpdateMask(data); + UnlockedEssenceMilestones.WriteUpdateMask(data); } } data.FlushBits(); @@ -613,7 +641,7 @@ void AzeriteItemData::WriteUpdate(ByteBuffer& data, UpdateMask<9> const& changes } } } - if (changesMask[2]) + if (changesMask[3]) { for (std::size_t i = 0; i < UnlockedEssenceMilestones.size(); ++i) { @@ -623,7 +651,7 @@ void AzeriteItemData::WriteUpdate(ByteBuffer& data, UpdateMask<9> const& changes } } } - if (changesMask[3]) + if (changesMask[2]) { for (std::size_t i = 0; i < SelectedEssences.size(); ++i) { @@ -2634,15 +2662,15 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, EnumClassFlag fi void ScaleCurve::WriteUpdate(ByteBuffer& data, EnumClassFlag fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const { - data.WriteBit(OverrideActive); + UpdateMask<7> const& changesMask = _changesMask; + data.WriteBits(changesMask.GetBlocksMask(0), 1); + if (changesMask.GetBlock(0)) + data.WriteBits(changesMask.GetBlock(0), 32); + + if (changesMask[0]) + { + if (changesMask[1]) + { + data.WriteBit(OverrideActive); data.FlushBits(); - data << uint32(StartTimeOffset); - data << uint32(ParameterCurve); - for (std::size_t i = 0; i < 2; ++i) + } + if (changesMask[2]) + { + data << uint32(StartTimeOffset); + } + if (changesMask[3]) + { + data << uint32(ParameterCurve); + } + } + if (changesMask[4]) { - data << Points[i]; + for (std::size_t i = 0; i < 2; ++i) + { + if (changesMask[5 + i]) + { + data << Points[i]; + } + } } data.FlushBits(); } +void ScaleCurve::ClearChangesMask() +{ + Base::ClearChangesMask(OverrideActive); + Base::ClearChangesMask(StartTimeOffset); + Base::ClearChangesMask(ParameterCurve); + Base::ClearChangesMask(Points); + _changesMask.ResetAll(); +} + void AreaTriggerData::WriteCreate(ByteBuffer& data, EnumClassFlag fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const { OverrideScaleCurve->WriteCreate(data, fieldVisibilityFlags, owner, receiver); diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h index bb658b36356..148cc41e842 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.h +++ b/src/server/game/Entities/Object/Updates/UpdateFields.h @@ -143,21 +143,22 @@ struct UnlockedAzeriteEssence : public IsUpdateFieldStructureTag void WriteUpdate(ByteBuffer& data, EnumClassFlag fieldVisibilityFlags, Item const* owner, Player const* receiver) const; }; -struct SelectedAzeriteEssences : public IsUpdateFieldStructureTag +struct SelectedAzeriteEssences : public IsUpdateFieldStructureTag, public HasChangesMask<7> { - uint32 Field_0; - uint32 Enabled; - uint32 AzeriteEssenceID[3]; + UpdateField SpecializationID; + UpdateField Enabled; + UpdateFieldArray AzeriteEssenceID; void WriteCreate(ByteBuffer& data, EnumClassFlag fieldVisibilityFlags, Item const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumClassFlag fieldVisibilityFlags, Item const* owner, Player const* receiver) const; + void ClearChangesMask(); }; struct AzeriteItemData : public IsUpdateFieldStructureTag, public HasChangesMask<9> { DynamicUpdateField UnlockedEssences; - DynamicUpdateField UnlockedEssenceMilestones; - DynamicUpdateField SelectedEssences; + DynamicUpdateField UnlockedEssenceMilestones; + DynamicUpdateField SelectedEssences; UpdateField Xp; UpdateField Level; UpdateField AuraLevel; @@ -512,9 +513,9 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas DynamicUpdateField Transmog; DynamicUpdateField ConditionalTransmog; DynamicUpdateField SelfResSpells; - DynamicUpdateField SpellPctModByLabel; - DynamicUpdateField SpellFlatModByLabel; - DynamicUpdateField CharacterRestrictions; + DynamicUpdateField SpellPctModByLabel; + DynamicUpdateField SpellFlatModByLabel; + DynamicUpdateField CharacterRestrictions; UpdateField FarsightObject; UpdateField SummonedBattlePetGUID; UpdateField Coinage; @@ -684,15 +685,16 @@ struct CorpseData : public IsUpdateFieldStructureTag, public HasChangesMask<40> void ClearChangesMask(); }; -struct ScaleCurve : public IsUpdateFieldStructureTag +struct ScaleCurve : public IsUpdateFieldStructureTag, public HasChangesMask<7> { - bool OverrideActive; - uint32 StartTimeOffset; - uint32 ParameterCurve; - TaggedPosition Points[2]; + UpdateField OverrideActive; + UpdateField StartTimeOffset; + UpdateField ParameterCurve; + UpdateFieldArray, 2, 4, 5> Points; void WriteCreate(ByteBuffer& data, EnumClassFlag fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumClassFlag fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const; + void ClearChangesMask(); }; struct AreaTriggerData : public IsUpdateFieldStructureTag, public HasChangesMask<14> -- cgit v1.2.3