aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2019-08-06 19:45:00 +0200
committerShauren <shauren.trinity@gmail.com>2019-08-06 19:45:00 +0200
commitee081084d6b2b43b33fedc9a4d3ce03f8d68cd7a (patch)
tree98db5722fdb34f5897786d01f9203810c62e13b8
parent245b6db2025510830d7569bd51e9a7e885443a13 (diff)
Core/PacketIO: Fixed updatefield structures
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.cpp100
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.h30
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>