diff options
author | Shauren <shauren.trinity@gmail.com> | 2019-08-06 19:45:00 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2019-08-06 19:45:00 +0200 |
commit | ee081084d6b2b43b33fedc9a4d3ce03f8d68cd7a (patch) | |
tree | 98db5722fdb34f5897786d01f9203810c62e13b8 | |
parent | 245b6db2025510830d7569bd51e9a7e885443a13 (diff) |
Core/PacketIO: Fixed updatefield structures
-rw-r--r-- | src/server/game/Entities/Object/Updates/UpdateFields.cpp | 100 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Updates/UpdateFields.h | 30 |
2 files changed, 96 insertions, 34 deletions
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<Update { data << uint32(AzeriteEssenceID[i]); } - data << uint32(Field_0); + data << uint32(SpecializationID); data.WriteBits(Enabled, 1); data.FlushBits(); } void SelectedAzeriteEssences::WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> 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<UpdateFieldFlag> 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<UpdateFieldFl } if (changesMask[17]) { - SpellPctModByLabel.WriteUpdateMask(data); + CharacterRestrictions.WriteUpdateMask(data); } if (changesMask[18]) { - SpellFlatModByLabel.WriteUpdateMask(data); + SpellPctModByLabel.WriteUpdateMask(data); } if (changesMask[19]) { - CharacterRestrictions.WriteUpdateMask(data); + SpellFlatModByLabel.WriteUpdateMask(data); } } if (changesMask[20]) @@ -2794,7 +2822,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFl } } } - if (changesMask[17]) + if (changesMask[18]) { for (std::size_t i = 0; i < SpellPctModByLabel.size(); ++i) { @@ -2804,7 +2832,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFl } } } - if (changesMask[18]) + if (changesMask[19]) { for (std::size_t i = 0; i < SpellFlatModByLabel.size(); ++i) { @@ -2814,7 +2842,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFl } } } - if (changesMask[19]) + if (changesMask[17]) { for (std::size_t i = 0; i < CharacterRestrictions.size(); ++i) { @@ -3798,17 +3826,49 @@ void ScaleCurve::WriteCreate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fi void ScaleCurve::WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> 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<UpdateFieldFlag> 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<UpdateFieldFlag> 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<uint32, 0, 1> SpecializationID; + UpdateField<uint32, 0, 2> Enabled; + UpdateFieldArray<uint32, 3, 3, 4> AzeriteEssenceID; void WriteCreate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const; + void ClearChangesMask(); }; struct AzeriteItemData : public IsUpdateFieldStructureTag, public HasChangesMask<9> { DynamicUpdateField<UnlockedAzeriteEssence, 0, 1> UnlockedEssences; - DynamicUpdateField<uint32, 0, 2> UnlockedEssenceMilestones; - DynamicUpdateField<SelectedAzeriteEssences, 0, 3> SelectedEssences; + DynamicUpdateField<uint32, 0, 3> UnlockedEssenceMilestones; + DynamicUpdateField<SelectedAzeriteEssences, 0, 2> SelectedEssences; UpdateField<uint64, 0, 4> Xp; UpdateField<uint32, 0, 5> Level; UpdateField<uint32, 0, 6> AuraLevel; @@ -512,9 +513,9 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas DynamicUpdateField<uint32, 0, 14> Transmog; DynamicUpdateField<int32, 0, 15> ConditionalTransmog; DynamicUpdateField<int32, 0, 16> SelfResSpells; - DynamicUpdateField<SpellPctModByLabel, 0, 17> SpellPctModByLabel; - DynamicUpdateField<SpellFlatModByLabel, 0, 18> SpellFlatModByLabel; - DynamicUpdateField<CharacterRestriction, 0, 19> CharacterRestrictions; + DynamicUpdateField<SpellPctModByLabel, 0, 18> SpellPctModByLabel; + DynamicUpdateField<SpellFlatModByLabel, 0, 19> SpellFlatModByLabel; + DynamicUpdateField<CharacterRestriction, 0, 17> CharacterRestrictions; UpdateField<ObjectGuid, 0, 22> FarsightObject; UpdateField<ObjectGuid, 0, 23> SummonedBattlePetGUID; UpdateField<uint64, 0, 24> 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<Position::XY> Points[2]; + UpdateField<bool, 0, 1> OverrideActive; + UpdateField<uint32, 0, 2> StartTimeOffset; + UpdateField<uint32, 0, 3> ParameterCurve; + UpdateFieldArray<TaggedPosition<Position::XY>, 2, 4, 5> Points; void WriteCreate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumClassFlag<UpdateFieldFlag> fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const; + void ClearChangesMask(); }; struct AreaTriggerData : public IsUpdateFieldStructureTag, public HasChangesMask<14> |