Core/PacketIO: Fixed updatefield structures

This commit is contained in:
Shauren
2019-08-06 19:45:00 +02:00
parent 245b6db202
commit ee081084d6
2 changed files with 97 additions and 35 deletions

View File

@@ -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);
data.FlushBits();
data << uint32(StartTimeOffset);
data << uint32(ParameterCurve);
for (std::size_t i = 0; i < 2; ++i)
UpdateMask<7> const& changesMask = _changesMask;
data.WriteBits(changesMask.GetBlocksMask(0), 1);
if (changesMask.GetBlock(0))
data.WriteBits(changesMask.GetBlock(0), 32);
if (changesMask[0])
{
data << Points[i];
if (changesMask[1])
{
data.WriteBit(OverrideActive);
data.FlushBits();
}
if (changesMask[2])
{
data << uint32(StartTimeOffset);
}
if (changesMask[3])
{
data << uint32(ParameterCurve);
}
}
if (changesMask[4])
{
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);

View File

@@ -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>