aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Object
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2023-07-12 16:29:00 +0200
committerShauren <shauren.trinity@gmail.com>2023-07-12 16:29:00 +0200
commit0cea730fa23473a85c47451c3bd13df816f2b6e4 (patch)
tree960078875798c5846a1aa465051da876642067e1 /src/server/game/Entities/Object
parent252da139adedd20c297ce7bdd2abed2234fa1bb6 (diff)
Core: Update to 10.1.5
Diffstat (limited to 'src/server/game/Entities/Object')
-rw-r--r--src/server/game/Entities/Object/ObjectGuid.cpp37
-rw-r--r--src/server/game/Entities/Object/ObjectGuid.h7
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.cpp1110
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.h458
4 files changed, 1048 insertions, 564 deletions
diff --git a/src/server/game/Entities/Object/ObjectGuid.cpp b/src/server/game/Entities/Object/ObjectGuid.cpp
index 77e9bef5746..e443d0a13b4 100644
--- a/src/server/game/Entities/Object/ObjectGuid.cpp
+++ b/src/server/game/Entities/Object/ObjectGuid.cpp
@@ -99,7 +99,9 @@ namespace
"WOWGUID_FAKE_MODERATOR",
nullptr,
nullptr,
- "WOWGUID_UNIQUE_ACCOUNT_OBJ_INITIALIZATION"
+ "WOWGUID_UNIQUE_ACCOUNT_OBJ_INITIALIZATION",
+ nullptr,
+ "WOWGUID_PENDING_PERMANENT_CHARACTER_ASSIGNMENT"
};
ObjectGuid::LowType id = guid.GetCounter();
@@ -452,6 +454,25 @@ namespace
return ObjectGuidFactory::CreateWorldLayer(arg1, arg2, arg3, arg4);
}
+ std::string FormatLMMLobby(char const* typeName, ObjectGuid guid)
+ {
+ return Trinity::StringFormat("{}-{}-{}-{}-{}-{:X}", typeName, guid.GetRealmId(), uint32(guid.GetRawValue(1) >> 26) & 0xFFFFFF,
+ uint32(guid.GetRawValue(1) >> 18) & 0xFF, uint32(guid.GetRawValue(1) >> 10) & 0xFF, guid.GetRawValue(0));
+ }
+
+ ObjectGuid ParseLMMLobby(HighGuid /*type*/, char const* guidString)
+ {
+ uint32 realmId = 0;
+ uint32 arg2 = 0;
+ uint8 arg3 = 0;
+ uint8 arg4 = 0;
+ uint64 arg5 = 0;
+ if (std::sscanf(guidString, "%u-%u-%hhu-%hhu-%" SCNx64, &realmId, &arg2, &arg3, &arg4, &arg5) != 5)
+ return ObjectGuid::FromStringFailed;
+
+ return ObjectGuidFactory::CreateLMMLobby(realmId, arg2, arg3, arg4, arg5);
+ }
+
ObjectGuidInfo();
} Info;
@@ -460,7 +481,7 @@ namespace
#define SET_GUID_INFO(type, format, parse) \
Names[AsUnderlyingType(HighGuid::type)] = #type;\
ClientFormatFunction[AsUnderlyingType(HighGuid::type)] = &ObjectGuidInfo::format;\
- ClientParseFunction[AsUnderlyingType(HighGuid::type)] = &ObjectGuidInfo::parse;
+ ClientParseFunction[AsUnderlyingType(HighGuid::type)] = &ObjectGuidInfo::parse
SET_GUID_INFO(Null, FormatNull, ParseNull);
SET_GUID_INFO(Uniq, FormatUniq, ParseUniq);
@@ -515,6 +536,8 @@ namespace
SET_GUID_INFO(ToolsClient, FormatToolsClient, ParseToolsClient);
SET_GUID_INFO(WorldLayer, FormatWorldLayer, ParseWorldLayer);
SET_GUID_INFO(ArenaTeam, FormatGuild, ParseGuild);
+ SET_GUID_INFO(LMMParty, FormatClient, ParseClient);
+ SET_GUID_INFO(LMMLobby, FormatLMMLobby, ParseLMMLobby);
#undef SET_GUID_INFO
}
@@ -718,6 +741,16 @@ ObjectGuid ObjectGuidFactory::CreateWorldLayer(uint32 arg1, uint16 arg2, uint8 a
| uint64(arg4 & 0x7FFFFF)));
}
+ObjectGuid ObjectGuidFactory::CreateLMMLobby(uint32 realmId, uint32 arg2, uint8 arg3, uint8 arg4, ObjectGuid::LowType counter)
+{
+ return ObjectGuid(uint64((uint64(HighGuid::LMMLobby) << 58)
+ | (uint64(GetRealmIdForObjectGuid(realmId)) << 42)
+ | (uint64(arg2 & 0xFFFFFFFF) << 26)
+ | (uint64(arg3 & 0xFF) << 18)
+ | (uint64(arg4 & 0xFF) << 10)),
+ counter);
+}
+
ObjectGuid const ObjectGuid::Empty = ObjectGuid();
ObjectGuid const ObjectGuid::FromStringFailed = ObjectGuid::Create<HighGuid::Uniq>(UI64LIT(4));
ObjectGuid const ObjectGuid::TradeItem = ObjectGuid::Create<HighGuid::Uniq>(UI64LIT(10));
diff --git a/src/server/game/Entities/Object/ObjectGuid.h b/src/server/game/Entities/Object/ObjectGuid.h
index b3a0213436d..46d88373807 100644
--- a/src/server/game/Entities/Object/ObjectGuid.h
+++ b/src/server/game/Entities/Object/ObjectGuid.h
@@ -124,6 +124,8 @@ enum class HighGuid
ToolsClient = 50,
WorldLayer = 51,
ArenaTeam = 52,
+ LMMParty = 53,
+ LMMLobby = 54,
Count,
};
@@ -158,6 +160,7 @@ enum class ObjectGuidFormatType
ClubFinder,
ToolsClient,
WorldLayer,
+ LMMLobby,
};
template<HighGuid high>
@@ -227,6 +230,8 @@ MAKE_GUID_TRAIT(HighGuid::ClubFinder, ObjectGuidSequenceSource::Global, ObjectGu
MAKE_GUID_TRAIT(HighGuid::ToolsClient, ObjectGuidSequenceSource::Realm, ObjectGuidFormatType::ToolsClient);
MAKE_GUID_TRAIT(HighGuid::WorldLayer, ObjectGuidSequenceSource::Global, ObjectGuidFormatType::WorldLayer);
MAKE_GUID_TRAIT(HighGuid::ArenaTeam, ObjectGuidSequenceSource::Realm, ObjectGuidFormatType::Guild);
+MAKE_GUID_TRAIT(HighGuid::LMMParty, ObjectGuidSequenceSource::Realm, ObjectGuidFormatType::Client);
+MAKE_GUID_TRAIT(HighGuid::LMMLobby, ObjectGuidSequenceSource::Realm, ObjectGuidFormatType::LMMLobby);
class ByteBuffer;
class ObjectGuid;
@@ -252,6 +257,7 @@ public:
static ObjectGuid CreateClubFinder(uint32 realmId, uint8 type, uint32 clubFinderId, uint64 dbId);
static ObjectGuid CreateToolsClient(uint16 mapId, uint32 serverId, uint64 counter);
static ObjectGuid CreateWorldLayer(uint32 arg1, uint16 arg2, uint8 arg3, uint32 arg4);
+ static ObjectGuid CreateLMMLobby(uint32 realmId, uint32 arg2, uint8 arg3, uint8 arg4, uint64 counter);
};
#pragma pack(push, 1)
@@ -367,6 +373,7 @@ class TC_GAME_API ObjectGuid
template<HighGuid type> static std::enable_if_t<ObjectGuidTraits<type>::Format::value == ObjectGuidFormatType::ClubFinder, ObjectGuid> Create(uint8 clubType, uint32 clubFinderId, ObjectGuid::LowType dbId) { return ObjectGuidFactory::CreateClubFinder(0, clubType, clubFinderId, dbId); }
template<HighGuid type> static std::enable_if_t<ObjectGuidTraits<type>::Format::value == ObjectGuidFormatType::ToolsClient, ObjectGuid> Create(uint16 mapId, uint32 serverId, ObjectGuid::LowType counter) { return ObjectGuidFactory::CreateToolsClient(mapId, serverId, counter); }
template<HighGuid type> static std::enable_if_t<ObjectGuidTraits<type>::Format::value == ObjectGuidFormatType::WorldLayer, ObjectGuid> Create(uint32 arg1, uint16 arg2, uint8 arg3, uint32 arg4) { return ObjectGuidFactory::CreateWorldLayer(arg1, arg2, arg3, arg4); }
+ template<HighGuid type> static std::enable_if_t<ObjectGuidTraits<type>::Format::value == ObjectGuidFormatType::LMMLobby, ObjectGuid> Create(uint32 arg2, uint8 arg3, uint8 arg4, ObjectGuid::LowType counter) { return ObjectGuidFactory::CreateLMMLobby(0, arg2, arg3, arg4, counter); }
protected:
ObjectGuid(uint64 high, uint64 low)
diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp
index ebb9c34207e..93ac9f8c967 100644
--- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp
+++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp
@@ -162,25 +162,19 @@ void ItemModList::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Item con
if (changesMask[0])
{
- if (changesMask[0])
- {
- if (!ignoreChangesMask)
- Values.WriteUpdateMask(data, 6);
- else
- WriteCompleteDynamicFieldUpdateMask(Values.size(), data, 6);
- }
+ if (!ignoreChangesMask)
+ Values.WriteUpdateMask(data, 6);
+ else
+ WriteCompleteDynamicFieldUpdateMask(Values.size(), data, 6);
}
data.FlushBits();
if (changesMask[0])
{
- if (changesMask[0])
+ for (uint32 i = 0; i < Values.size(); ++i)
{
- for (uint32 i = 0; i < Values.size(); ++i)
+ if (Values.HasChanged(i) || ignoreChangesMask)
{
- if (Values.HasChanged(i) || ignoreChangesMask)
- {
- Values[i].WriteUpdate(data, ignoreChangesMask, owner, receiver);
- }
+ Values[i].WriteUpdate(data, ignoreChangesMask, owner, receiver);
}
}
}
@@ -1048,6 +1042,7 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
data << int32(Stats[i]);
data << int32(StatPosBuff[i]);
data << int32(StatNegBuff[i]);
+ data << int32(StatSupportBuff[i]);
}
}
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner | UpdateFieldFlag::Empath))
@@ -1080,10 +1075,12 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
data << int32(AttackPowerModPos);
data << int32(AttackPowerModNeg);
data << float(AttackPowerMultiplier);
+ data << int32(AttackPowerModSupport);
data << int32(RangedAttackPower);
data << int32(RangedAttackPowerModPos);
data << int32(RangedAttackPowerModNeg);
data << float(RangedAttackPowerMultiplier);
+ data << int32(RangedAttackPowerModSupport);
data << int32(MainHandWeaponAttackPower);
data << int32(OffHandWeaponAttackPower);
data << int32(RangedWeaponAttackPower);
@@ -1114,7 +1111,9 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
data << uint32(WorldEffects.size());
data << uint32(ChannelObjects.size());
data << int32(FlightCapabilityID);
+ data << float(GlideEventSpeedDivisor);
data << uint32(SilencedSchoolMask);
+ data << uint32(CurrentAreaID);
data << NameplateAttachToGUID;
for (uint32 i = 0; i < PassiveSpells.size(); ++i)
{
@@ -1132,7 +1131,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, 0x0007FFFFu, 0x00003F80u, 0x00000000u });
+ Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xC3FEFFFFu, 0x003DFFFFu, 0xFFFFFC01u, 0x007FFFFFu, 0x0003F800u, 0x00000000u });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver);
}
@@ -1140,16 +1139,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, 0xFFF80000u, 0xFFFFC07Fu, 0x0001FFFFu };
+ allowedMaskForTarget |= { 0x00002000u, 0x3C010000u, 0xFFC20000u, 0x000003FEu, 0xFF800004u, 0xFFFC07FFu, 0x01FFFFFFu };
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::UnitAll))
- allowedMaskForTarget |= { 0x00000000u, 0x00000000u, 0x00000000u, 0x40000000u, 0xFFF80000u, 0x0000007Fu, 0x00000000u };
+ allowedMaskForTarget |= { 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xFF800004u, 0x000007FFu, 0x00000000u };
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Empath))
- allowedMaskForTarget |= { 0x00000000u, 0x3C000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0xF8000000u, 0x00000007u };
+ allowedMaskForTarget |= { 0x00000000u, 0x3C000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x000007F8u };
}
void UnitData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags)
{
- Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xC3FEFFFFu, 0x003DFFFFu, 0xFFFFFF01u, 0x0007FFFFu, 0x00003F80u, 0x00000000u });
+ Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xC3FEFFFFu, 0x003DFFFFu, 0xFFFFFC01u, 0x007FFFFFu, 0x0003F800u, 0x00000000u });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
changesMask &= allowedMaskForTarget;
}
@@ -1570,219 +1569,239 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
}
if (changesMask[90])
{
- data << int32(RangedAttackPower);
+ data << int32(AttackPowerModSupport);
}
if (changesMask[91])
{
- data << int32(RangedAttackPowerModPos);
+ data << int32(RangedAttackPower);
}
if (changesMask[92])
{
- data << int32(RangedAttackPowerModNeg);
+ data << int32(RangedAttackPowerModPos);
}
if (changesMask[93])
{
- data << float(RangedAttackPowerMultiplier);
+ data << int32(RangedAttackPowerModNeg);
}
if (changesMask[94])
{
- data << int32(MainHandWeaponAttackPower);
+ data << float(RangedAttackPowerMultiplier);
}
if (changesMask[95])
{
- data << int32(OffHandWeaponAttackPower);
+ data << int32(RangedAttackPowerModSupport);
}
}
if (changesMask[96])
{
if (changesMask[97])
{
- data << int32(RangedWeaponAttackPower);
+ data << int32(MainHandWeaponAttackPower);
}
if (changesMask[98])
{
- data << int32(SetAttackSpeedAura);
+ data << int32(OffHandWeaponAttackPower);
}
if (changesMask[99])
{
- data << float(Lifesteal);
+ data << int32(RangedWeaponAttackPower);
}
if (changesMask[100])
{
- data << float(MinRangedDamage);
+ data << int32(SetAttackSpeedAura);
}
if (changesMask[101])
{
- data << float(MaxRangedDamage);
+ data << float(Lifesteal);
}
if (changesMask[102])
{
- data << float(ManaCostMultiplier);
+ data << float(MinRangedDamage);
}
if (changesMask[103])
{
- data << float(MaxHealthModifier);
+ data << float(MaxRangedDamage);
}
if (changesMask[104])
{
- data << float(HoverHeight);
+ data << float(ManaCostMultiplier);
}
if (changesMask[105])
{
- data << int32(MinItemLevelCutoff);
+ data << float(MaxHealthModifier);
}
if (changesMask[106])
{
- data << int32(MinItemLevel);
+ data << float(HoverHeight);
}
if (changesMask[107])
{
- data << int32(MaxItemLevel);
+ data << int32(MinItemLevelCutoff);
}
if (changesMask[108])
{
- data << int32(AzeriteItemLevel);
+ data << int32(MinItemLevel);
}
if (changesMask[109])
{
- data << int32(WildBattlePetLevel);
+ data << int32(MaxItemLevel);
}
if (changesMask[110])
{
- data << int32(BattlePetCompanionExperience);
+ data << int32(AzeriteItemLevel);
}
if (changesMask[111])
{
- data << uint32(BattlePetCompanionNameTimestamp);
+ data << int32(WildBattlePetLevel);
}
if (changesMask[112])
{
- data << int32(InteractSpellID);
+ data << int32(BattlePetCompanionExperience);
}
if (changesMask[113])
{
- data << int32(ScaleDuration);
+ data << uint32(BattlePetCompanionNameTimestamp);
}
if (changesMask[114])
{
- data << int32(LooksLikeMountID);
+ data << int32(InteractSpellID);
}
if (changesMask[115])
{
- data << int32(LooksLikeCreatureID);
+ data << int32(ScaleDuration);
}
if (changesMask[116])
{
- data << int32(LookAtControllerID);
+ data << int32(LooksLikeMountID);
}
if (changesMask[117])
{
- data << int32(PerksVendorItemID);
+ data << int32(LooksLikeCreatureID);
}
if (changesMask[118])
{
- data << int32(TaxiNodesID);
+ data << int32(LookAtControllerID);
}
if (changesMask[119])
{
- data << GuildGUID;
+ data << int32(PerksVendorItemID);
}
if (changesMask[120])
{
- data << int32(FlightCapabilityID);
+ data << int32(TaxiNodesID);
}
if (changesMask[121])
{
- data << uint32(SilencedSchoolMask);
+ data << GuildGUID;
}
if (changesMask[122])
{
+ data << int32(FlightCapabilityID);
+ }
+ if (changesMask[123])
+ {
+ data << float(GlideEventSpeedDivisor);
+ }
+ if (changesMask[124])
+ {
+ data << uint32(SilencedSchoolMask);
+ }
+ if (changesMask[125])
+ {
+ data << uint32(CurrentAreaID);
+ }
+ if (changesMask[126])
+ {
data << NameplateAttachToGUID;
}
}
- if (changesMask[123])
+ if (changesMask[127])
{
for (uint32 i = 0; i < 2; ++i)
{
- if (changesMask[124 + i])
+ if (changesMask[128 + i])
{
data << uint32(ViewerDependentValue<NpcFlagsTag>::GetValue(this, i, owner, receiver));
}
}
}
- if (changesMask[126])
+ if (changesMask[130])
{
for (uint32 i = 0; i < 10; ++i)
{
- if (changesMask[127 + i])
+ if (changesMask[131 + i])
{
data << int32(Power[i]);
}
- if (changesMask[137 + i])
+ if (changesMask[141 + i])
{
data << int32(MaxPower[i]);
}
- if (changesMask[147 + i])
+ if (changesMask[151 + i])
{
data << float(PowerRegenFlatModifier[i]);
}
- if (changesMask[157 + i])
+ if (changesMask[161 + i])
{
data << float(PowerRegenInterruptedFlatModifier[i]);
}
}
}
- if (changesMask[167])
+ if (changesMask[171])
{
for (uint32 i = 0; i < 3; ++i)
{
- if (changesMask[168 + i])
+ if (changesMask[172 + i])
{
VirtualItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
- if (changesMask[171])
+ if (changesMask[175])
{
for (uint32 i = 0; i < 2; ++i)
{
- if (changesMask[172 + i])
+ if (changesMask[176 + i])
{
data << uint32(AttackRoundBaseTime[i]);
}
}
}
- if (changesMask[174])
+ if (changesMask[178])
{
for (uint32 i = 0; i < 4; ++i)
{
- if (changesMask[175 + i])
+ if (changesMask[179 + i])
{
data << int32(Stats[i]);
}
- if (changesMask[179 + i])
+ if (changesMask[183 + i])
{
data << int32(StatPosBuff[i]);
}
- if (changesMask[183 + i])
+ if (changesMask[187 + i])
{
data << int32(StatNegBuff[i]);
}
+ if (changesMask[191 + i])
+ {
+ data << int32(StatSupportBuff[i]);
+ }
}
}
- if (changesMask[187])
+ if (changesMask[195])
{
for (uint32 i = 0; i < 7; ++i)
{
- if (changesMask[188 + i])
+ if (changesMask[196 + i])
{
data << int32(Resistances[i]);
}
- if (changesMask[195 + i])
+ if (changesMask[203 + i])
{
data << int32(BonusResistanceMods[i]);
}
- if (changesMask[202 + i])
+ if (changesMask[210 + i])
{
data << int32(ManaCostModifier[i]);
}
@@ -1879,10 +1898,12 @@ void UnitData::ClearChangesMask()
Base::ClearChangesMask(AttackPowerModPos);
Base::ClearChangesMask(AttackPowerModNeg);
Base::ClearChangesMask(AttackPowerMultiplier);
+ Base::ClearChangesMask(AttackPowerModSupport);
Base::ClearChangesMask(RangedAttackPower);
Base::ClearChangesMask(RangedAttackPowerModPos);
Base::ClearChangesMask(RangedAttackPowerModNeg);
Base::ClearChangesMask(RangedAttackPowerMultiplier);
+ Base::ClearChangesMask(RangedAttackPowerModSupport);
Base::ClearChangesMask(MainHandWeaponAttackPower);
Base::ClearChangesMask(OffHandWeaponAttackPower);
Base::ClearChangesMask(RangedWeaponAttackPower);
@@ -1909,7 +1930,9 @@ void UnitData::ClearChangesMask()
Base::ClearChangesMask(TaxiNodesID);
Base::ClearChangesMask(GuildGUID);
Base::ClearChangesMask(FlightCapabilityID);
+ Base::ClearChangesMask(GlideEventSpeedDivisor);
Base::ClearChangesMask(SilencedSchoolMask);
+ Base::ClearChangesMask(CurrentAreaID);
Base::ClearChangesMask(NameplateAttachToGUID);
Base::ClearChangesMask(NpcFlags);
Base::ClearChangesMask(Power);
@@ -1921,6 +1944,7 @@ void UnitData::ClearChangesMask()
Base::ClearChangesMask(Stats);
Base::ClearChangesMask(StatPosBuff);
Base::ClearChangesMask(StatNegBuff);
+ Base::ClearChangesMask(StatSupportBuff);
Base::ClearChangesMask(Resistances);
Base::ClearChangesMask(BonusResistanceMods);
Base::ClearChangesMask(ManaCostModifier);
@@ -1947,10 +1971,9 @@ bool ChrCustomizationChoice::operator==(ChrCustomizationChoice const& right) con
void QuestLog::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
+ data << int64(EndTime);
data << int32(QuestID);
data << uint32(StateFlags);
- data << uint32(EndTime);
- data << uint32(AcceptTime);
data << uint32(ObjectiveFlags);
for (uint32 i = 0; i < 24; ++i)
{
@@ -1973,30 +1996,26 @@ void QuestLog::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player cons
{
if (changesMask[1])
{
- data << int32(QuestID);
+ data << int64(EndTime);
}
if (changesMask[2])
{
- data << uint32(StateFlags);
+ data << int32(QuestID);
}
if (changesMask[3])
{
- data << uint32(EndTime);
+ data << uint32(StateFlags);
}
if (changesMask[4])
{
- data << uint32(AcceptTime);
- }
- if (changesMask[5])
- {
data << uint32(ObjectiveFlags);
}
}
- if (changesMask[6])
+ if (changesMask[5])
{
for (uint32 i = 0; i < 24; ++i)
{
- if (changesMask[7 + i])
+ if (changesMask[6 + i])
{
data << int16(ObjectiveProgress[i]);
}
@@ -2006,10 +2025,9 @@ void QuestLog::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player cons
void QuestLog::ClearChangesMask()
{
+ Base::ClearChangesMask(EndTime);
Base::ClearChangesMask(QuestID);
Base::ClearChangesMask(StateFlags);
- Base::ClearChangesMask(EndTime);
- Base::ClearChangesMask(AcceptTime);
Base::ClearChangesMask(ObjectiveFlags);
Base::ClearChangesMask(ObjectiveProgress);
_changesMask.ResetAll();
@@ -2826,19 +2844,94 @@ bool SpellFlatModByLabel::operator==(SpellFlatModByLabel const& right) const
&& LabelID == right.LabelID;
}
-void Research::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
+void CompletedProject::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
- data << int16(ResearchProjectID);
+ data << uint32(ProjectID);
+ data << int64(FirstCompleted);
+ data << uint32(CompletionCount);
}
-void Research::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
+void CompletedProject::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
{
- data << int16(ResearchProjectID);
+ Mask changesMask = _changesMask;
+ if (ignoreChangesMask)
+ changesMask.SetAll();
+
+ data.WriteBits(changesMask.GetBlock(0), 4);
+
+ data.FlushBits();
+ if (changesMask[0])
+ {
+ if (changesMask[1])
+ {
+ data << uint32(ProjectID);
+ }
+ if (changesMask[2])
+ {
+ data << int64(FirstCompleted);
+ }
+ if (changesMask[3])
+ {
+ data << uint32(CompletionCount);
+ }
+ }
}
-bool Research::operator==(Research const& right) const
+void CompletedProject::ClearChangesMask()
{
- return ResearchProjectID == right.ResearchProjectID;
+ Base::ClearChangesMask(ProjectID);
+ Base::ClearChangesMask(FirstCompleted);
+ Base::ClearChangesMask(CompletionCount);
+ _changesMask.ResetAll();
+}
+
+void ResearchHistory::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
+{
+ data << uint32(CompletedProjects.size());
+ for (uint32 i = 0; i < CompletedProjects.size(); ++i)
+ {
+ CompletedProjects[i].WriteCreate(data, owner, receiver);
+ }
+}
+
+void ResearchHistory::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
+{
+ Mask changesMask = _changesMask;
+ if (ignoreChangesMask)
+ changesMask.SetAll();
+
+ data.WriteBits(changesMask.GetBlock(0), 2);
+
+ if (changesMask[0])
+ {
+ if (changesMask[1])
+ {
+ if (!ignoreChangesMask)
+ CompletedProjects.WriteUpdateMask(data);
+ else
+ WriteCompleteDynamicFieldUpdateMask(CompletedProjects.size(), data);
+ }
+ }
+ data.FlushBits();
+ if (changesMask[0])
+ {
+ if (changesMask[1])
+ {
+ for (uint32 i = 0; i < CompletedProjects.size(); ++i)
+ {
+ if (CompletedProjects.HasChanged(i) || ignoreChangesMask)
+ {
+ CompletedProjects[i].WriteUpdate(data, ignoreChangesMask, owner, receiver);
+ }
+ }
+ }
+ }
+}
+
+void ResearchHistory::ClearChangesMask()
+{
+ Base::ClearChangesMask(CompletedProjects);
+ _changesMask.ResetAll();
}
void MawPower::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
@@ -3188,6 +3281,7 @@ void CraftingOrderItem::WriteCreate(ByteBuffer& data, Player const* owner, Playe
data << uint32(Quantity);
data << int32(ReagentQuality);
data.WriteBits(DataSlotIndex.has_value(), 1);
+ data.FlushBits();
if (DataSlotIndex.has_value())
{
data << uint8(DataSlotIndex);
@@ -3228,6 +3322,7 @@ void CraftingOrderItem::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Pl
data << int32(ReagentQuality);
}
data.WriteBits(DataSlotIndex.has_value(), 1);
+ data.FlushBits();
if (changesMask[6])
{
if (DataSlotIndex.has_value())
@@ -3270,6 +3365,7 @@ void CraftingOrderData::WriteCreate(ByteBuffer& data, Player const* owner, Playe
data.WriteBits(CustomerNotes->size(), 10);
data.WriteBits(OutputItem.has_value(), 1);
data.WriteBits(OutputItemData.has_value(), 1);
+ data.FlushBits();
for (uint32 i = 0; i < Reagents.size(); ++i)
{
Reagents[i].WriteCreate(data, owner, receiver);
@@ -3396,6 +3492,7 @@ void CraftingOrderData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Pl
}
data.WriteBits(OutputItem.has_value(), 1);
data.WriteBits(OutputItemData.has_value(), 1);
+ data.FlushBits();
if (changesMask[22])
{
if (OutputItem.has_value())
@@ -3444,6 +3541,7 @@ void CraftingOrder::WriteCreate(ByteBuffer& data, Player const* owner, Player co
data.WriteBits(RecraftItemInfo.has_value(), 1);
data.WriteBits(Enchantments.size(), 4);
data.WriteBits(Gems.size(), 2);
+ data.FlushBits();
if (RecraftItemInfo.has_value())
{
data << RecraftItemInfo;
@@ -3507,6 +3605,7 @@ void CraftingOrder::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player
Data->WriteUpdate(data, ignoreChangesMask, owner, receiver);
}
data.WriteBits(RecraftItemInfo.has_value(), 1);
+ data.FlushBits();
if (changesMask[3])
{
if (RecraftItemInfo.has_value())
@@ -3580,6 +3679,145 @@ bool WeeklySpellUse::operator==(WeeklySpellUse const& right) const
&& Uses == right.Uses;
}
+void StablePetInfo::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
+{
+ data << uint32(PetSlot);
+ data << uint32(PetNumber);
+ data << uint32(CreatureID);
+ data << uint32(DisplayID);
+ data << uint32(ExperienceLevel);
+ data << uint8(PetFlags);
+ data.WriteBits(Name->size(), 8);
+ data.WriteString(Name);
+ data.FlushBits();
+}
+
+void StablePetInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
+{
+ Mask changesMask = _changesMask;
+ if (ignoreChangesMask)
+ changesMask.SetAll();
+
+ data.WriteBits(changesMask.GetBlock(0), 8);
+
+ data.FlushBits();
+ if (changesMask[0])
+ {
+ if (changesMask[1])
+ {
+ data << uint32(PetSlot);
+ }
+ if (changesMask[2])
+ {
+ data << uint32(PetNumber);
+ }
+ if (changesMask[3])
+ {
+ data << uint32(CreatureID);
+ }
+ if (changesMask[4])
+ {
+ data << uint32(DisplayID);
+ }
+ if (changesMask[5])
+ {
+ data << uint32(ExperienceLevel);
+ }
+ if (changesMask[7])
+ {
+ data << uint8(PetFlags);
+ }
+ if (changesMask[6])
+ {
+ data.WriteBits(Name->size(), 8);
+ data.WriteString(Name);
+ }
+ }
+ data.FlushBits();
+}
+
+void StablePetInfo::ClearChangesMask()
+{
+ Base::ClearChangesMask(PetSlot);
+ Base::ClearChangesMask(PetNumber);
+ Base::ClearChangesMask(CreatureID);
+ Base::ClearChangesMask(DisplayID);
+ Base::ClearChangesMask(ExperienceLevel);
+ Base::ClearChangesMask(Name);
+ Base::ClearChangesMask(PetFlags);
+ _changesMask.ResetAll();
+}
+
+void StableInfo::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
+{
+ data << uint32(Pets.size());
+ data << StableMaster;
+ for (uint32 i = 0; i < Pets.size(); ++i)
+ {
+ Pets[i].WriteCreate(data, owner, receiver);
+ }
+}
+
+void StableInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
+{
+ Mask changesMask = _changesMask;
+ if (ignoreChangesMask)
+ changesMask.SetAll();
+
+ data.WriteBits(changesMask.GetBlock(0), 3);
+
+ if (changesMask[0])
+ {
+ if (changesMask[1])
+ {
+ if (!ignoreChangesMask)
+ Pets.WriteUpdateMask(data);
+ else
+ WriteCompleteDynamicFieldUpdateMask(Pets.size(), data);
+ }
+ }
+ data.FlushBits();
+ if (changesMask[0])
+ {
+ if (changesMask[1])
+ {
+ for (uint32 i = 0; i < Pets.size(); ++i)
+ {
+ if (Pets.HasChanged(i) || ignoreChangesMask)
+ {
+ Pets[i].WriteUpdate(data, ignoreChangesMask, owner, receiver);
+ }
+ }
+ }
+ if (changesMask[2])
+ {
+ data << StableMaster;
+ }
+ }
+}
+
+void StableInfo::ClearChangesMask()
+{
+ Base::ClearChangesMask(Pets);
+ Base::ClearChangesMask(StableMaster);
+ _changesMask.ResetAll();
+}
+
+void Research::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
+{
+ data << int16(ResearchProjectID);
+}
+
+void Research::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
+{
+ data << int16(ResearchProjectID);
+}
+
+bool Research::operator==(Research const& right) const
+{
+ return ResearchProjectID == right.ResearchProjectID;
+}
+
void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const
{
for (uint32 i = 0; i < 227; ++i)
@@ -3711,8 +3949,24 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
data << int32(HonorNextLevel);
data << int32(PerksProgramCurrency);
data << uint8(NumBankSlots);
- data << uint32(ResearchSites.size());
- data << uint32(ResearchSiteProgress.size());
+ for (uint32 i = 0; i < 1; ++i)
+ {
+ data << uint32(ResearchSites[i].size());
+ data << uint32(ResearchSiteProgress[i].size());
+ data << uint32(Research[i].size());
+ for (uint32 j = 0; j < ResearchSites[i].size(); ++j)
+ {
+ data << uint16(ResearchSites[i][j]);
+ }
+ for (uint32 j = 0; j < ResearchSiteProgress[i].size(); ++j)
+ {
+ data << uint32(ResearchSiteProgress[i][j]);
+ }
+ for (uint32 j = 0; j < Research[i].size(); ++j)
+ {
+ Research[i][j].WriteCreate(data, owner, receiver);
+ }
+ }
data << uint32(DailyQuestsCompleted.size());
data << uint32(AvailableQuestLineXQuestIDs.size());
data << uint32(Heirlooms.size());
@@ -3727,18 +3981,11 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
data << uint32(CharacterRestrictions.size());
data << uint32(SpellPctModByLabel.size());
data << uint32(SpellFlatModByLabel.size());
- for (uint32 i = 0; i < 1; ++i)
- {
- data << uint32(Research[i].size());
- for (uint32 j = 0; j < Research[i].size(); ++j)
- {
- Research[i][j].WriteCreate(data, owner, receiver);
- }
- }
data << uint32(MawPowers.size());
data << uint32(MultiFloorExploration.size());
data << uint32(RecipeProgression.size());
data << uint32(ReplayedQuests.size());
+ data << uint32(TaskQuests.size());
data << uint32(DisabledSpells.size());
data << int32(UiChromieTimeExpansionID);
data << int32(TransportServerTime);
@@ -3754,19 +4001,18 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
{
data << float(ItemUpgradeHighWatermark[i]);
}
+ data << int32(ItemUpgradeHighOnehandWeaponItemID);
+ data << int32(ItemUpgradeHighFingerItemID);
+ data << float(ItemUpgradeHighFingerWatermark);
+ data << int32(ItemUpgradeHighTrinketItemID);
+ data << float(ItemUpgradeHighTrinketWatermark);
data << uint64(LootHistoryInstanceID);
+ data << uint32(TrackedCollectableSources.size());
+ data << uint8(RequiredMountCapabilityFlags);
for (uint32 i = 0; i < KnownTitles.size(); ++i)
{
data << uint64(KnownTitles[i]);
}
- for (uint32 i = 0; i < ResearchSites.size(); ++i)
- {
- data << uint16(ResearchSites[i]);
- }
- for (uint32 i = 0; i < ResearchSiteProgress.size(); ++i)
- {
- data << uint32(ResearchSiteProgress[i]);
- }
for (uint32 i = 0; i < DailyQuestsCompleted.size(); ++i)
{
data << int32(DailyQuestsCompleted[i]);
@@ -3835,6 +4081,10 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
{
ReplayedQuests[i].WriteCreate(data, owner, receiver);
}
+ for (uint32 i = 0; i < TaskQuests.size(); ++i)
+ {
+ TaskQuests[i].WriteCreate(data, owner, receiver);
+ }
for (uint32 i = 0; i < DisabledSpells.size(); ++i)
{
data << int32(DisabledSpells[i]);
@@ -3851,6 +4101,10 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
{
WeeklySpellUses[i].WriteCreate(data, owner, receiver);
}
+ for (uint32 i = 0; i < TrackedCollectableSources.size(); ++i)
+ {
+ data << int64(TrackedCollectableSources[i]);
+ }
data.FlushBits();
data.WriteBit(BackpackAutoSortDisabled);
data.WriteBit(BankAutoSortDisabled);
@@ -3858,11 +4112,14 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
data.WriteBit(InsertItemsLeftToRight);
data.WriteBit(HasPerksProgramPendingReward);
data.WriteBits(QuestSession.has_value(), 1);
- data << FrozenPerksVendorItem;
+ data.WriteBits(PetStable.has_value(), 1);
+ data.FlushBits();
+ ResearchHistory->WriteCreate(data, owner, receiver);
if (QuestSession.has_value())
{
QuestSession->WriteCreate(data, owner, receiver);
}
+ data << FrozenPerksVendorItem;
Field_1410->WriteCreate(data, owner, receiver);
data << DungeonScore;
for (uint32 i = 0; i < PvpInfo.size(); ++i)
@@ -3881,6 +4138,10 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
{
CraftingOrders[i].WriteCreate(data, owner, receiver);
}
+ if (PetStable.has_value())
+ {
+ PetStable->WriteCreate(data, owner, receiver);
+ }
data.FlushBits();
}
@@ -3934,214 +4195,281 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
else
WriteCompleteDynamicFieldUpdateMask(PvpInfo.size(), data);
}
- if (changesMask[8])
+ }
+ if (changesMask[35])
+ {
+ for (uint32 i = 0; i < 1; ++i)
{
- if (!ignoreNestedChangesMask)
- ResearchSites.WriteUpdateMask(data);
- else
- WriteCompleteDynamicFieldUpdateMask(ResearchSites.size(), data);
+ if (changesMask[36 + i])
+ {
+ if (!ignoreNestedChangesMask)
+ ResearchSites[i].WriteUpdateMask(data);
+ else
+ WriteCompleteDynamicFieldUpdateMask(ResearchSites[i].size(), data);
+ }
}
- if (changesMask[9])
+ }
+ if (changesMask[37])
+ {
+ for (uint32 i = 0; i < 1; ++i)
{
- if (!ignoreNestedChangesMask)
- ResearchSiteProgress.WriteUpdateMask(data);
- else
- WriteCompleteDynamicFieldUpdateMask(ResearchSiteProgress.size(), data);
+ if (changesMask[38 + i])
+ {
+ if (!ignoreNestedChangesMask)
+ ResearchSiteProgress[i].WriteUpdateMask(data);
+ else
+ WriteCompleteDynamicFieldUpdateMask(ResearchSiteProgress[i].size(), data);
+ }
}
- if (changesMask[10])
+ }
+ if (changesMask[39])
+ {
+ for (uint32 i = 0; i < 1; ++i)
+ {
+ if (changesMask[40 + i])
+ {
+ if (!ignoreNestedChangesMask)
+ Research[i].WriteUpdateMask(data);
+ else
+ WriteCompleteDynamicFieldUpdateMask(Research[i].size(), data);
+ }
+ }
+ }
+ if (changesMask[35])
+ {
+ for (uint32 i = 0; i < 1; ++i)
+ {
+ if (changesMask[36 + i])
+ {
+ for (uint32 j = 0; j < ResearchSites[i].size(); ++j)
+ {
+ if (ResearchSites[i].HasChanged(j) || ignoreNestedChangesMask)
+ {
+ data << uint16(ResearchSites[i][j]);
+ }
+ }
+ }
+ }
+ }
+ if (changesMask[37])
+ {
+ for (uint32 i = 0; i < 1; ++i)
+ {
+ if (changesMask[38 + i])
+ {
+ for (uint32 j = 0; j < ResearchSiteProgress[i].size(); ++j)
+ {
+ if (ResearchSiteProgress[i].HasChanged(j) || ignoreNestedChangesMask)
+ {
+ data << uint32(ResearchSiteProgress[i][j]);
+ }
+ }
+ }
+ }
+ }
+ if (changesMask[39])
+ {
+ for (uint32 i = 0; i < 1; ++i)
+ {
+ if (changesMask[40 + i])
+ {
+ for (uint32 j = 0; j < Research[i].size(); ++j)
+ {
+ if (Research[i].HasChanged(j) || ignoreNestedChangesMask)
+ {
+ Research[i][j].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ }
+ }
+ }
+ }
+ }
+ data.FlushBits();
+ if (changesMask[0])
+ {
+ if (changesMask[8])
{
if (!ignoreNestedChangesMask)
DailyQuestsCompleted.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(DailyQuestsCompleted.size(), data);
}
- if (changesMask[11])
+ if (changesMask[9])
{
if (!ignoreNestedChangesMask)
AvailableQuestLineXQuestIDs.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(AvailableQuestLineXQuestIDs.size(), data);
}
- if (changesMask[12])
+ if (changesMask[10])
{
if (!ignoreNestedChangesMask)
Heirlooms.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Heirlooms.size(), data);
}
- if (changesMask[13])
+ if (changesMask[11])
{
if (!ignoreNestedChangesMask)
HeirloomFlags.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(HeirloomFlags.size(), data);
}
- if (changesMask[14])
+ if (changesMask[12])
{
if (!ignoreNestedChangesMask)
Toys.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Toys.size(), data);
}
- if (changesMask[15])
+ if (changesMask[13])
{
if (!ignoreNestedChangesMask)
ToyFlags.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ToyFlags.size(), data);
}
- if (changesMask[16])
+ if (changesMask[14])
{
if (!ignoreNestedChangesMask)
Transmog.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Transmog.size(), data);
}
- if (changesMask[17])
+ if (changesMask[15])
{
if (!ignoreNestedChangesMask)
ConditionalTransmog.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ConditionalTransmog.size(), data);
}
- if (changesMask[18])
+ if (changesMask[16])
{
if (!ignoreNestedChangesMask)
SelfResSpells.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(SelfResSpells.size(), data);
}
- if (changesMask[19])
+ if (changesMask[17])
{
if (!ignoreNestedChangesMask)
RuneforgePowers.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(RuneforgePowers.size(), data);
}
- if (changesMask[20])
+ if (changesMask[18])
{
if (!ignoreNestedChangesMask)
TransmogIllusions.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(TransmogIllusions.size(), data);
}
- if (changesMask[21])
+ if (changesMask[19])
{
if (!ignoreNestedChangesMask)
CharacterRestrictions.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(CharacterRestrictions.size(), data);
}
- if (changesMask[22])
+ if (changesMask[20])
{
if (!ignoreNestedChangesMask)
SpellPctModByLabel.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(SpellPctModByLabel.size(), data);
}
- if (changesMask[23])
+ if (changesMask[21])
{
if (!ignoreNestedChangesMask)
SpellFlatModByLabel.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(SpellFlatModByLabel.size(), data);
}
- }
- if (changesMask[35])
- {
- for (uint32 i = 0; i < 1; ++i)
- {
- if (changesMask[36 + i])
- {
- if (!ignoreNestedChangesMask)
- Research[i].WriteUpdateMask(data);
- else
- WriteCompleteDynamicFieldUpdateMask(Research[i].size(), data);
- for (uint32 j = 0; j < Research[i].size(); ++j)
- {
- if (Research[i].HasChanged(j) || ignoreNestedChangesMask)
- {
- Research[i][j].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
- }
- }
- }
- }
- }
- data.FlushBits();
- if (changesMask[0])
- {
- if (changesMask[24])
+ if (changesMask[22])
{
if (!ignoreNestedChangesMask)
MawPowers.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(MawPowers.size(), data);
}
- if (changesMask[25])
+ if (changesMask[23])
{
if (!ignoreNestedChangesMask)
MultiFloorExploration.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(MultiFloorExploration.size(), data);
}
- if (changesMask[26])
+ if (changesMask[24])
{
if (!ignoreNestedChangesMask)
RecipeProgression.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(RecipeProgression.size(), data);
}
- if (changesMask[27])
+ if (changesMask[25])
{
if (!ignoreNestedChangesMask)
ReplayedQuests.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ReplayedQuests.size(), data);
}
- if (changesMask[28])
+ if (changesMask[26])
+ {
+ if (!ignoreNestedChangesMask)
+ TaskQuests.WriteUpdateMask(data);
+ else
+ WriteCompleteDynamicFieldUpdateMask(TaskQuests.size(), data);
+ }
+ if (changesMask[27])
{
if (!ignoreNestedChangesMask)
DisabledSpells.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(DisabledSpells.size(), data);
}
- if (changesMask[29])
+ if (changesMask[28])
{
if (!ignoreNestedChangesMask)
TraitConfigs.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(TraitConfigs.size(), data);
}
- if (changesMask[30])
+ if (changesMask[29])
{
if (!ignoreNestedChangesMask)
CraftingOrders.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(CraftingOrders.size(), data);
}
- if (changesMask[31])
+ if (changesMask[30])
{
if (!ignoreNestedChangesMask)
PersonalCraftingOrderCounts.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(PersonalCraftingOrderCounts.size(), data);
}
+ if (changesMask[31])
+ {
+ if (!ignoreNestedChangesMask)
+ CategoryCooldownMods.WriteUpdateMask(data);
+ else
+ WriteCompleteDynamicFieldUpdateMask(CategoryCooldownMods.size(), data);
+ }
}
if (changesMask[32])
{
if (changesMask[33])
{
if (!ignoreNestedChangesMask)
- CategoryCooldownMods.WriteUpdateMask(data);
+ WeeklySpellUses.WriteUpdateMask(data);
else
- WriteCompleteDynamicFieldUpdateMask(CategoryCooldownMods.size(), data);
+ WriteCompleteDynamicFieldUpdateMask(WeeklySpellUses.size(), data);
}
if (changesMask[34])
{
if (!ignoreNestedChangesMask)
- WeeklySpellUses.WriteUpdateMask(data);
+ TrackedCollectableSources.WriteUpdateMask(data);
else
- WriteCompleteDynamicFieldUpdateMask(WeeklySpellUses.size(), data);
+ WriteCompleteDynamicFieldUpdateMask(TrackedCollectableSources.size(), data);
}
}
data.FlushBits();
@@ -4159,26 +4487,6 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
if (changesMask[8])
{
- for (uint32 i = 0; i < ResearchSites.size(); ++i)
- {
- if (ResearchSites.HasChanged(i) || ignoreNestedChangesMask)
- {
- data << uint16(ResearchSites[i]);
- }
- }
- }
- if (changesMask[9])
- {
- for (uint32 i = 0; i < ResearchSiteProgress.size(); ++i)
- {
- if (ResearchSiteProgress.HasChanged(i) || ignoreNestedChangesMask)
- {
- data << uint32(ResearchSiteProgress[i]);
- }
- }
- }
- if (changesMask[10])
- {
for (uint32 i = 0; i < DailyQuestsCompleted.size(); ++i)
{
if (DailyQuestsCompleted.HasChanged(i) || ignoreNestedChangesMask)
@@ -4187,7 +4495,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[11])
+ if (changesMask[9])
{
for (uint32 i = 0; i < AvailableQuestLineXQuestIDs.size(); ++i)
{
@@ -4197,7 +4505,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[12])
+ if (changesMask[10])
{
for (uint32 i = 0; i < Heirlooms.size(); ++i)
{
@@ -4207,7 +4515,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[13])
+ if (changesMask[11])
{
for (uint32 i = 0; i < HeirloomFlags.size(); ++i)
{
@@ -4217,7 +4525,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[14])
+ if (changesMask[12])
{
for (uint32 i = 0; i < Toys.size(); ++i)
{
@@ -4227,7 +4535,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[15])
+ if (changesMask[13])
{
for (uint32 i = 0; i < ToyFlags.size(); ++i)
{
@@ -4237,7 +4545,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[16])
+ if (changesMask[14])
{
for (uint32 i = 0; i < Transmog.size(); ++i)
{
@@ -4247,7 +4555,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[17])
+ if (changesMask[15])
{
for (uint32 i = 0; i < ConditionalTransmog.size(); ++i)
{
@@ -4257,7 +4565,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[18])
+ if (changesMask[16])
{
for (uint32 i = 0; i < SelfResSpells.size(); ++i)
{
@@ -4267,7 +4575,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[19])
+ if (changesMask[17])
{
for (uint32 i = 0; i < RuneforgePowers.size(); ++i)
{
@@ -4277,7 +4585,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[20])
+ if (changesMask[18])
{
for (uint32 i = 0; i < TransmogIllusions.size(); ++i)
{
@@ -4287,7 +4595,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[22])
+ if (changesMask[20])
{
for (uint32 i = 0; i < SpellPctModByLabel.size(); ++i)
{
@@ -4297,7 +4605,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[23])
+ if (changesMask[21])
{
for (uint32 i = 0; i < SpellFlatModByLabel.size(); ++i)
{
@@ -4307,7 +4615,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[24])
+ if (changesMask[22])
{
for (uint32 i = 0; i < MawPowers.size(); ++i)
{
@@ -4317,7 +4625,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[25])
+ if (changesMask[23])
{
for (uint32 i = 0; i < MultiFloorExploration.size(); ++i)
{
@@ -4327,7 +4635,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[26])
+ if (changesMask[24])
{
for (uint32 i = 0; i < RecipeProgression.size(); ++i)
{
@@ -4337,7 +4645,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[27])
+ if (changesMask[25])
{
for (uint32 i = 0; i < ReplayedQuests.size(); ++i)
{
@@ -4347,7 +4655,17 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[28])
+ if (changesMask[26])
+ {
+ for (uint32 i = 0; i < TaskQuests.size(); ++i)
+ {
+ if (TaskQuests.HasChanged(i) || ignoreNestedChangesMask)
+ {
+ TaskQuests[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ }
+ }
+ }
+ if (changesMask[27])
{
for (uint32 i = 0; i < DisabledSpells.size(); ++i)
{
@@ -4357,7 +4675,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[31])
+ if (changesMask[30])
{
for (uint32 i = 0; i < PersonalCraftingOrderCounts.size(); ++i)
{
@@ -4367,10 +4685,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- }
- if (changesMask[32])
- {
- if (changesMask[33])
+ if (changesMask[31])
{
for (uint32 i = 0; i < CategoryCooldownMods.size(); ++i)
{
@@ -4380,7 +4695,10 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[34])
+ }
+ if (changesMask[32])
+ {
+ if (changesMask[33])
{
for (uint32 i = 0; i < WeeklySpellUses.size(); ++i)
{
@@ -4390,6 +4708,16 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
+ if (changesMask[34])
+ {
+ for (uint32 i = 0; i < TrackedCollectableSources.size(); ++i)
+ {
+ if (TrackedCollectableSources.HasChanged(i) || ignoreNestedChangesMask)
+ {
+ data << int64(TrackedCollectableSources[i]);
+ }
+ }
+ }
}
if (changesMask[0])
{
@@ -4403,7 +4731,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[21])
+ if (changesMask[19])
{
for (uint32 i = 0; i < CharacterRestrictions.size(); ++i)
{
@@ -4413,7 +4741,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[29])
+ if (changesMask[28])
{
for (uint32 i = 0; i < TraitConfigs.size(); ++i)
{
@@ -4423,7 +4751,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[30])
+ if (changesMask[29])
{
for (uint32 i = 0; i < CraftingOrders.size(); ++i)
{
@@ -4436,501 +4764,541 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
if (changesMask[32])
{
- if (changesMask[37])
+ if (changesMask[41])
{
data << FarsightObject;
}
- if (changesMask[38])
+ if (changesMask[42])
{
data << SummonedBattlePetGUID;
}
- if (changesMask[39])
+ if (changesMask[43])
{
data << uint64(Coinage);
}
- if (changesMask[40])
+ if (changesMask[44])
{
data << int32(XP);
}
- if (changesMask[41])
+ if (changesMask[45])
{
data << int32(NextLevelXP);
}
- if (changesMask[42])
+ if (changesMask[46])
{
data << int32(TrialXP);
}
- if (changesMask[43])
+ if (changesMask[47])
{
Skill->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
- if (changesMask[44])
+ if (changesMask[48])
{
data << int32(CharacterPoints);
}
- if (changesMask[45])
+ if (changesMask[49])
{
data << int32(MaxTalentTiers);
}
- if (changesMask[46])
+ if (changesMask[50])
{
data << uint32(TrackCreatureMask);
}
- if (changesMask[47])
+ if (changesMask[51])
{
data << float(MainhandExpertise);
}
- if (changesMask[48])
+ if (changesMask[52])
{
data << float(OffhandExpertise);
}
- if (changesMask[49])
+ if (changesMask[53])
{
data << float(RangedExpertise);
}
- if (changesMask[50])
+ if (changesMask[54])
{
data << float(CombatRatingExpertise);
}
- if (changesMask[51])
+ if (changesMask[55])
{
data << float(BlockPercentage);
}
- if (changesMask[52])
+ if (changesMask[56])
{
data << float(DodgePercentage);
}
- if (changesMask[53])
+ if (changesMask[57])
{
data << float(DodgePercentageFromAttribute);
}
- if (changesMask[54])
+ if (changesMask[58])
{
data << float(ParryPercentage);
}
- if (changesMask[55])
+ if (changesMask[59])
{
data << float(ParryPercentageFromAttribute);
}
- if (changesMask[56])
+ if (changesMask[60])
{
data << float(CritPercentage);
}
- if (changesMask[57])
+ if (changesMask[61])
{
data << float(RangedCritPercentage);
}
- if (changesMask[58])
+ if (changesMask[62])
{
data << float(OffhandCritPercentage);
}
- if (changesMask[59])
+ if (changesMask[63])
{
data << float(SpellCritPercentage);
}
- if (changesMask[60])
+ if (changesMask[64])
{
data << int32(ShieldBlock);
}
- if (changesMask[61])
+ if (changesMask[65])
{
data << float(ShieldBlockCritPercentage);
}
- if (changesMask[62])
+ if (changesMask[66])
{
data << float(Mastery);
}
- if (changesMask[63])
+ if (changesMask[67])
{
data << float(Speed);
}
- if (changesMask[64])
+ if (changesMask[68])
{
data << float(Avoidance);
}
- if (changesMask[65])
+ if (changesMask[69])
{
data << float(Sturdiness);
}
}
- if (changesMask[66])
+ if (changesMask[70])
{
- if (changesMask[67])
+ if (changesMask[71])
{
data << int32(Versatility);
}
- if (changesMask[68])
+ if (changesMask[72])
{
data << float(VersatilityBonus);
}
- if (changesMask[69])
+ if (changesMask[73])
{
data << float(PvpPowerDamage);
}
- if (changesMask[70])
+ if (changesMask[74])
{
data << float(PvpPowerHealing);
}
- if (changesMask[71])
+ if (changesMask[75])
{
data << int32(ModHealingDonePos);
}
- if (changesMask[72])
+ if (changesMask[76])
{
data << float(ModHealingPercent);
}
- if (changesMask[73])
+ if (changesMask[77])
{
data << float(ModPeriodicHealingDonePercent);
}
- if (changesMask[74])
+ if (changesMask[78])
{
data << float(ModSpellPowerPercent);
}
- if (changesMask[75])
+ if (changesMask[79])
{
data << float(ModResiliencePercent);
}
- if (changesMask[76])
+ if (changesMask[80])
{
data << float(OverrideSpellPowerByAPPercent);
}
- if (changesMask[77])
+ if (changesMask[81])
{
data << float(OverrideAPBySpellPowerPercent);
}
- if (changesMask[78])
+ if (changesMask[82])
{
data << int32(ModTargetResistance);
}
- if (changesMask[79])
+ if (changesMask[83])
{
data << int32(ModTargetPhysicalResistance);
}
- if (changesMask[80])
+ if (changesMask[84])
{
data << uint32(LocalFlags);
}
- if (changesMask[81])
+ if (changesMask[85])
{
data << uint8(GrantableLevels);
}
- if (changesMask[82])
+ if (changesMask[86])
{
data << uint8(MultiActionBars);
}
- if (changesMask[83])
+ if (changesMask[87])
{
data << uint8(LifetimeMaxRank);
}
- if (changesMask[84])
+ if (changesMask[88])
{
data << uint8(NumRespecs);
}
- if (changesMask[85])
+ if (changesMask[89])
{
data << uint32(PvpMedals);
}
- if (changesMask[86])
+ if (changesMask[90])
{
data << uint16(TodayHonorableKills);
}
- if (changesMask[87])
+ if (changesMask[91])
{
data << uint16(YesterdayHonorableKills);
}
- if (changesMask[88])
+ if (changesMask[92])
{
data << uint32(LifetimeHonorableKills);
}
- if (changesMask[89])
+ if (changesMask[93])
{
data << int32(WatchedFactionIndex);
}
- if (changesMask[90])
+ if (changesMask[94])
{
data << int32(MaxLevel);
}
- if (changesMask[91])
+ if (changesMask[95])
{
data << int32(ScalingPlayerLevelDelta);
}
- if (changesMask[92])
+ if (changesMask[96])
{
data << int32(MaxCreatureScalingLevel);
}
- if (changesMask[93])
+ if (changesMask[97])
{
data << int32(PetSpellPower);
}
- if (changesMask[94])
+ if (changesMask[98])
{
data << float(UiHitModifier);
}
- if (changesMask[95])
+ if (changesMask[99])
{
data << float(UiSpellHitModifier);
}
- if (changesMask[96])
+ if (changesMask[100])
{
data << int32(HomeRealmTimeOffset);
}
- if (changesMask[97])
+ if (changesMask[101])
{
data << float(ModPetHaste);
}
}
- if (changesMask[98])
+ if (changesMask[102])
{
- if (changesMask[99])
+ if (changesMask[103])
{
data << int8(JailersTowerLevelMax);
}
- if (changesMask[100])
+ if (changesMask[104])
{
data << int8(JailersTowerLevel);
}
- if (changesMask[101])
+ if (changesMask[105])
{
data << uint8(LocalRegenFlags);
}
- if (changesMask[102])
+ if (changesMask[106])
{
data << uint8(AuraVision);
}
- if (changesMask[103])
+ if (changesMask[107])
{
data << uint8(NumBackpackSlots);
}
- if (changesMask[104])
+ if (changesMask[108])
{
data << int32(OverrideSpellsID);
}
- if (changesMask[105])
+ if (changesMask[109])
{
data << uint16(LootSpecID);
}
- if (changesMask[106])
+ if (changesMask[110])
{
data << uint32(OverrideZonePVPType);
}
- if (changesMask[107])
+ if (changesMask[111])
{
data << BnetAccount;
}
- if (changesMask[108])
+ if (changesMask[112])
{
data << uint64(GuildClubMemberID);
}
- if (changesMask[109])
+ if (changesMask[113])
{
data << int32(Honor);
}
- if (changesMask[110])
+ if (changesMask[114])
{
data << int32(HonorNextLevel);
}
- if (changesMask[111])
+ if (changesMask[115])
{
data << int32(PerksProgramCurrency);
}
- if (changesMask[112])
+ if (changesMask[116])
{
data << uint8(NumBankSlots);
}
- if (changesMask[116])
+ if (changesMask[121])
{
data << int32(UiChromieTimeExpansionID);
}
- if (changesMask[117])
+ if (changesMask[122])
{
data << int32(TransportServerTime);
}
- if (changesMask[118])
+ if (changesMask[123])
{
data << uint32(WeeklyRewardsPeriodSinceOrigin);
}
- if (changesMask[119])
+ if (changesMask[124])
{
data << int16(DEBUGSoulbindConduitRank);
}
- if (changesMask[121])
+ if (changesMask[126])
{
data << uint32(ActiveCombatTraitConfigID);
}
- if (changesMask[122])
+ if (changesMask[127])
+ {
+ data << int32(ItemUpgradeHighOnehandWeaponItemID);
+ }
+ if (changesMask[128])
+ {
+ data << int32(ItemUpgradeHighFingerItemID);
+ }
+ if (changesMask[129])
+ {
+ data << float(ItemUpgradeHighFingerWatermark);
+ }
+ if (changesMask[130])
+ {
+ data << int32(ItemUpgradeHighTrinketItemID);
+ }
+ if (changesMask[131])
+ {
+ data << float(ItemUpgradeHighTrinketWatermark);
+ }
+ if (changesMask[132])
{
data << uint64(LootHistoryInstanceID);
}
}
- if (changesMask[98])
+ if (changesMask[134])
+ {
+ if (changesMask[135])
+ {
+ data << uint8(RequiredMountCapabilityFlags);
+ }
+ }
+ if (changesMask[102])
{
data.WriteBits(QuestSession.has_value(), 1);
- if (changesMask[113])
+ data.WriteBits(PetStable.has_value(), 1);
+ data.FlushBits();
+ if (changesMask[117])
{
- data << FrozenPerksVendorItem;
+ ResearchHistory->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
- if (changesMask[114])
+ if (changesMask[119])
{
if (QuestSession.has_value())
{
QuestSession->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
- if (changesMask[115])
+ if (changesMask[118])
{
- Field_1410->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ data << FrozenPerksVendorItem;
}
if (changesMask[120])
{
+ Field_1410->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ }
+ if (changesMask[125])
+ {
data << DungeonScore;
}
+ if (changesMask[133])
+ {
+ if (PetStable.has_value())
+ {
+ PetStable->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ }
+ }
}
- if (changesMask[123])
+ if (changesMask[136])
{
for (uint32 i = 0; i < 227; ++i)
{
- if (changesMask[124 + i])
+ if (changesMask[137 + i])
{
data << InvSlots[i];
}
}
}
- if (changesMask[351])
+ if (changesMask[364])
{
for (uint32 i = 0; i < 240; ++i)
{
- if (changesMask[352 + i])
+ if (changesMask[365 + i])
{
data << uint64(ExploredZones[i]);
}
}
}
- if (changesMask[592])
+ if (changesMask[605])
{
for (uint32 i = 0; i < 2; ++i)
{
- if (changesMask[593 + i])
+ if (changesMask[606 + i])
{
RestInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
- if (changesMask[595])
+ if (changesMask[608])
{
for (uint32 i = 0; i < 7; ++i)
{
- if (changesMask[596 + i])
+ if (changesMask[609 + i])
{
data << int32(ModDamageDonePos[i]);
}
- if (changesMask[603 + i])
+ if (changesMask[616 + i])
{
data << int32(ModDamageDoneNeg[i]);
}
- if (changesMask[610 + i])
+ if (changesMask[623 + i])
{
data << float(ModDamageDonePercent[i]);
}
- if (changesMask[617 + i])
+ if (changesMask[630 + i])
{
data << float(ModHealingDonePercent[i]);
}
}
}
- if (changesMask[624])
+ if (changesMask[637])
{
for (uint32 i = 0; i < 3; ++i)
{
- if (changesMask[625 + i])
+ if (changesMask[638 + i])
{
data << float(WeaponDmgMultipliers[i]);
}
- if (changesMask[628 + i])
+ if (changesMask[641 + i])
{
data << float(WeaponAtkSpeedMultipliers[i]);
}
}
}
- if (changesMask[631])
+ if (changesMask[644])
{
for (uint32 i = 0; i < 12; ++i)
{
- if (changesMask[632 + i])
+ if (changesMask[645 + i])
{
data << uint32(BuybackPrice[i]);
}
- if (changesMask[644 + i])
+ if (changesMask[657 + i])
{
data << int64(BuybackTimestamp[i]);
}
}
}
- if (changesMask[656])
+ if (changesMask[669])
{
for (uint32 i = 0; i < 32; ++i)
{
- if (changesMask[657 + i])
+ if (changesMask[670 + i])
{
data << int32(CombatRatings[i]);
}
}
}
- if (changesMask[689])
+ if (changesMask[702])
{
for (uint32 i = 0; i < 4; ++i)
{
- if (changesMask[690 + i])
+ if (changesMask[703 + i])
{
data << uint32(NoReagentCostMask[i]);
}
}
}
- if (changesMask[694])
+ if (changesMask[707])
{
for (uint32 i = 0; i < 2; ++i)
{
- if (changesMask[695 + i])
+ if (changesMask[708 + i])
{
data << int32(ProfessionSkillLine[i]);
}
}
}
- if (changesMask[697])
+ if (changesMask[710])
{
for (uint32 i = 0; i < 5; ++i)
{
- if (changesMask[698 + i])
+ if (changesMask[711 + i])
{
data << uint32(BagSlotFlags[i]);
}
}
}
- if (changesMask[703])
+ if (changesMask[716])
{
for (uint32 i = 0; i < 7; ++i)
{
- if (changesMask[704 + i])
+ if (changesMask[717 + i])
{
data << uint32(BankBagSlotFlags[i]);
}
}
}
- if (changesMask[711])
+ if (changesMask[724])
{
for (uint32 i = 0; i < 875; ++i)
{
- if (changesMask[712 + i])
+ if (changesMask[725 + i])
{
data << uint64(QuestCompleted[i]);
}
}
}
- if (changesMask[1587])
+ if (changesMask[1600])
{
for (uint32 i = 0; i < 17; ++i)
{
- if (changesMask[1588 + i])
+ if (changesMask[1601 + i])
{
data << float(ItemUpgradeHighWatermark[i]);
}
@@ -4946,10 +5314,10 @@ void ActivePlayerData::ClearChangesMask()
Base::ClearChangesMask(SortBagsRightToLeft);
Base::ClearChangesMask(InsertItemsLeftToRight);
Base::ClearChangesMask(HasPerksProgramPendingReward);
- Base::ClearChangesMask(Research);
- Base::ClearChangesMask(KnownTitles);
Base::ClearChangesMask(ResearchSites);
Base::ClearChangesMask(ResearchSiteProgress);
+ Base::ClearChangesMask(Research);
+ Base::ClearChangesMask(KnownTitles);
Base::ClearChangesMask(DailyQuestsCompleted);
Base::ClearChangesMask(AvailableQuestLineXQuestIDs);
Base::ClearChangesMask(Heirlooms);
@@ -4967,10 +5335,12 @@ void ActivePlayerData::ClearChangesMask()
Base::ClearChangesMask(MultiFloorExploration);
Base::ClearChangesMask(RecipeProgression);
Base::ClearChangesMask(ReplayedQuests);
+ Base::ClearChangesMask(TaskQuests);
Base::ClearChangesMask(DisabledSpells);
Base::ClearChangesMask(PersonalCraftingOrderCounts);
Base::ClearChangesMask(CategoryCooldownMods);
Base::ClearChangesMask(WeeklySpellUses);
+ Base::ClearChangesMask(TrackedCollectableSources);
Base::ClearChangesMask(PvpInfo);
Base::ClearChangesMask(CharacterRestrictions);
Base::ClearChangesMask(TraitConfigs);
@@ -5049,6 +5419,7 @@ void ActivePlayerData::ClearChangesMask()
Base::ClearChangesMask(HonorNextLevel);
Base::ClearChangesMask(PerksProgramCurrency);
Base::ClearChangesMask(NumBankSlots);
+ Base::ClearChangesMask(ResearchHistory);
Base::ClearChangesMask(FrozenPerksVendorItem);
Base::ClearChangesMask(Field_1410);
Base::ClearChangesMask(QuestSession);
@@ -5058,7 +5429,14 @@ void ActivePlayerData::ClearChangesMask()
Base::ClearChangesMask(DEBUGSoulbindConduitRank);
Base::ClearChangesMask(DungeonScore);
Base::ClearChangesMask(ActiveCombatTraitConfigID);
+ Base::ClearChangesMask(ItemUpgradeHighOnehandWeaponItemID);
+ Base::ClearChangesMask(ItemUpgradeHighFingerItemID);
+ Base::ClearChangesMask(ItemUpgradeHighFingerWatermark);
+ Base::ClearChangesMask(ItemUpgradeHighTrinketItemID);
+ Base::ClearChangesMask(ItemUpgradeHighTrinketWatermark);
Base::ClearChangesMask(LootHistoryInstanceID);
+ Base::ClearChangesMask(PetStable);
+ Base::ClearChangesMask(RequiredMountCapabilityFlags);
Base::ClearChangesMask(InvSlots);
Base::ClearChangesMask(ExploredZones);
Base::ClearChangesMask(RestInfo);
@@ -5618,26 +5996,27 @@ void AreaTriggerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fi
data << uint32(TimeToTarget);
data << uint32(TimeToTargetScale);
data << uint32(TimeToTargetExtraScale);
- data << uint32(Field_B0);
+ data << uint32(TimeToTargetPos);
data << int32(SpellID);
data << int32(SpellForVisuals);
SpellVisual->WriteCreate(data, owner, receiver);
data << float(BoundsRadius2D);
data << uint32(DecalPropertiesID);
data << CreatingEffectGUID;
- data << uint32(Field_80);
- data << uint32(Field_84);
- data << Field_88;
- data << Field_F8;
+ data << uint32(NumUnitsInside);
+ data << uint32(NumPlayersInside);
+ data << OrbitPathTarget;
+ data << RollPitchYaw;
+ data << int32(PositionalSoundKitID);
ExtraScaleCurve->WriteCreate(data, owner, receiver);
- data.WriteBit(Field_260);
+ data.FlushBits();
+ data.WriteBit(HeightIgnoresScale);
data.WriteBit(Field_261);
- Field_C38->WriteCreate(data, owner, receiver);
- Field_C54->WriteCreate(data, owner, receiver);
- Field_C70->WriteCreate(data, owner, receiver);
+ OverrideMoveCurveX->WriteCreate(data, owner, receiver);
+ OverrideMoveCurveY->WriteCreate(data, owner, receiver);
+ OverrideMoveCurveZ->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
@@ -5647,13 +6026,13 @@ 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), 25);
+ data.WriteBits(changesMask.GetBlock(0), 26);
if (changesMask[0])
{
if (changesMask[1])
{
- data.WriteBit(Field_260);
+ data.WriteBit(HeightIgnoresScale);
}
if (changesMask[2])
{
@@ -5689,7 +6068,7 @@ void AreaTriggerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, boo
}
if (changesMask[13])
{
- data << uint32(Field_B0);
+ data << uint32(TimeToTargetPos);
}
if (changesMask[14])
{
@@ -5717,19 +6096,23 @@ void AreaTriggerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, boo
}
if (changesMask[20])
{
- data << uint32(Field_80);
+ data << uint32(NumUnitsInside);
}
if (changesMask[21])
{
- data << uint32(Field_84);
+ data << uint32(NumPlayersInside);
}
if (changesMask[22])
{
- data << Field_88;
+ data << OrbitPathTarget;
}
if (changesMask[23])
{
- data << Field_F8;
+ data << RollPitchYaw;
+ }
+ if (changesMask[24])
+ {
+ data << int32(PositionalSoundKitID);
}
if (changesMask[4])
{
@@ -5737,17 +6120,17 @@ void AreaTriggerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, boo
}
if (changesMask[5])
{
- Field_C38->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ OverrideMoveCurveX->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (changesMask[6])
{
- Field_C54->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ OverrideMoveCurveY->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (changesMask[7])
{
- Field_C70->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ OverrideMoveCurveZ->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
- if (changesMask[24])
+ if (changesMask[25])
{
VisualAnim->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
@@ -5757,29 +6140,30 @@ void AreaTriggerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, boo
void AreaTriggerData::ClearChangesMask()
{
- Base::ClearChangesMask(Field_260);
+ Base::ClearChangesMask(HeightIgnoresScale);
Base::ClearChangesMask(Field_261);
Base::ClearChangesMask(OverrideScaleCurve);
Base::ClearChangesMask(ExtraScaleCurve);
- Base::ClearChangesMask(Field_C38);
- Base::ClearChangesMask(Field_C54);
- Base::ClearChangesMask(Field_C70);
+ Base::ClearChangesMask(OverrideMoveCurveX);
+ Base::ClearChangesMask(OverrideMoveCurveY);
+ Base::ClearChangesMask(OverrideMoveCurveZ);
Base::ClearChangesMask(Caster);
Base::ClearChangesMask(Duration);
Base::ClearChangesMask(TimeToTarget);
Base::ClearChangesMask(TimeToTargetScale);
Base::ClearChangesMask(TimeToTargetExtraScale);
- Base::ClearChangesMask(Field_B0);
+ Base::ClearChangesMask(TimeToTargetPos);
Base::ClearChangesMask(SpellID);
Base::ClearChangesMask(SpellForVisuals);
Base::ClearChangesMask(SpellVisual);
Base::ClearChangesMask(BoundsRadius2D);
Base::ClearChangesMask(DecalPropertiesID);
Base::ClearChangesMask(CreatingEffectGUID);
- Base::ClearChangesMask(Field_80);
- Base::ClearChangesMask(Field_84);
- Base::ClearChangesMask(Field_88);
- Base::ClearChangesMask(Field_F8);
+ Base::ClearChangesMask(NumUnitsInside);
+ Base::ClearChangesMask(NumPlayersInside);
+ Base::ClearChangesMask(OrbitPathTarget);
+ Base::ClearChangesMask(RollPitchYaw);
+ Base::ClearChangesMask(PositionalSoundKitID);
Base::ClearChangesMask(VisualAnim);
_changesMask.ResetAll();
}
diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h
index 9af78fef00f..9d9c3df590f 100644
--- a/src/server/game/Entities/Object/Updates/UpdateFields.h
+++ b/src/server/game/Entities/Object/Updates/UpdateFields.h
@@ -85,7 +85,7 @@ struct ItemMod : public IsUpdateFieldStructureTag
struct ItemModList : public IsUpdateFieldStructureTag, public HasChangesMask<1>
{
- DynamicUpdateField<UF::ItemMod, 0, 0> Values;
+ DynamicUpdateField<UF::ItemMod, -1, 0> Values;
void WriteCreate(ByteBuffer& data, Item const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Item const* owner, Player const* receiver) const;
@@ -256,7 +256,7 @@ struct PassiveSpellHistory : public IsUpdateFieldStructureTag
bool operator!=(PassiveSpellHistory const& right) const { return !(*this == right); }
};
-struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<209>
+struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<217>
{
UpdateField<std::vector<uint32>, 0, 1> StateWorldEffectIDs;
DynamicUpdateField<UF::PassiveSpellHistory, 0, 2> PassiveSpells;
@@ -351,52 +351,57 @@ struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<209>
UpdateField<int32, 64, 87> AttackPowerModPos;
UpdateField<int32, 64, 88> AttackPowerModNeg;
UpdateField<float, 64, 89> AttackPowerMultiplier;
- UpdateField<int32, 64, 90> RangedAttackPower;
- UpdateField<int32, 64, 91> RangedAttackPowerModPos;
- UpdateField<int32, 64, 92> RangedAttackPowerModNeg;
- UpdateField<float, 64, 93> RangedAttackPowerMultiplier;
- UpdateField<int32, 64, 94> MainHandWeaponAttackPower;
- UpdateField<int32, 64, 95> OffHandWeaponAttackPower;
- UpdateField<int32, 96, 97> RangedWeaponAttackPower;
- UpdateField<int32, 96, 98> SetAttackSpeedAura;
- UpdateField<float, 96, 99> Lifesteal;
- UpdateField<float, 96, 100> MinRangedDamage;
- UpdateField<float, 96, 101> MaxRangedDamage;
- UpdateField<float, 96, 102> ManaCostMultiplier;
- UpdateField<float, 96, 103> MaxHealthModifier;
- UpdateField<float, 96, 104> HoverHeight;
- UpdateField<int32, 96, 105> MinItemLevelCutoff;
- UpdateField<int32, 96, 106> MinItemLevel;
- UpdateField<int32, 96, 107> MaxItemLevel;
- UpdateField<int32, 96, 108> AzeriteItemLevel;
- UpdateField<int32, 96, 109> WildBattlePetLevel;
- UpdateField<int32, 96, 110> BattlePetCompanionExperience;
- UpdateField<uint32, 96, 111> BattlePetCompanionNameTimestamp;
- UpdateField<int32, 96, 112> InteractSpellID;
- UpdateField<int32, 96, 113> ScaleDuration;
- UpdateField<int32, 96, 114> LooksLikeMountID;
- UpdateField<int32, 96, 115> LooksLikeCreatureID;
- UpdateField<int32, 96, 116> LookAtControllerID;
- UpdateField<int32, 96, 117> PerksVendorItemID;
- UpdateField<int32, 96, 118> TaxiNodesID;
- UpdateField<ObjectGuid, 96, 119> GuildGUID;
- UpdateField<int32, 96, 120> FlightCapabilityID;
- UpdateField<uint32, 96, 121> SilencedSchoolMask;
- UpdateField<ObjectGuid, 96, 122> NameplateAttachToGUID; // When set, nameplate of this unit will instead appear on that object
- UpdateFieldArray<uint32, 2, 123, 124> NpcFlags;
+ UpdateField<int32, 64, 90> AttackPowerModSupport;
+ UpdateField<int32, 64, 91> RangedAttackPower;
+ UpdateField<int32, 64, 92> RangedAttackPowerModPos;
+ UpdateField<int32, 64, 93> RangedAttackPowerModNeg;
+ UpdateField<float, 64, 94> RangedAttackPowerMultiplier;
+ UpdateField<int32, 64, 95> RangedAttackPowerModSupport;
+ UpdateField<int32, 96, 97> MainHandWeaponAttackPower;
+ UpdateField<int32, 96, 98> OffHandWeaponAttackPower;
+ UpdateField<int32, 96, 99> RangedWeaponAttackPower;
+ UpdateField<int32, 96, 100> SetAttackSpeedAura;
+ UpdateField<float, 96, 101> Lifesteal;
+ UpdateField<float, 96, 102> MinRangedDamage;
+ UpdateField<float, 96, 103> MaxRangedDamage;
+ UpdateField<float, 96, 104> ManaCostMultiplier;
+ UpdateField<float, 96, 105> MaxHealthModifier;
+ UpdateField<float, 96, 106> HoverHeight;
+ UpdateField<int32, 96, 107> MinItemLevelCutoff;
+ UpdateField<int32, 96, 108> MinItemLevel;
+ UpdateField<int32, 96, 109> MaxItemLevel;
+ UpdateField<int32, 96, 110> AzeriteItemLevel;
+ UpdateField<int32, 96, 111> WildBattlePetLevel;
+ UpdateField<int32, 96, 112> BattlePetCompanionExperience;
+ UpdateField<uint32, 96, 113> BattlePetCompanionNameTimestamp;
+ UpdateField<int32, 96, 114> InteractSpellID;
+ UpdateField<int32, 96, 115> ScaleDuration;
+ UpdateField<int32, 96, 116> LooksLikeMountID;
+ UpdateField<int32, 96, 117> LooksLikeCreatureID;
+ UpdateField<int32, 96, 118> LookAtControllerID;
+ UpdateField<int32, 96, 119> PerksVendorItemID;
+ UpdateField<int32, 96, 120> TaxiNodesID;
+ UpdateField<ObjectGuid, 96, 121> GuildGUID;
+ UpdateField<int32, 96, 122> FlightCapabilityID;
+ UpdateField<float, 96, 123> GlideEventSpeedDivisor; // Movement speed gets divided by this value when evaluating what GlideEvents to use
+ UpdateField<uint32, 96, 124> SilencedSchoolMask;
+ UpdateField<uint32, 96, 125> CurrentAreaID;
+ UpdateField<ObjectGuid, 96, 126> NameplateAttachToGUID; // When set, nameplate of this unit will instead appear on that object
+ UpdateFieldArray<uint32, 2, 127, 128> NpcFlags;
struct NpcFlagsTag : ViewerDependentValueTag<uint32> {};
- 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;
+ UpdateFieldArray<int32, 10, 130, 131> Power;
+ UpdateFieldArray<int32, 10, 130, 141> MaxPower;
+ UpdateFieldArray<float, 10, 130, 151> PowerRegenFlatModifier;
+ UpdateFieldArray<float, 10, 130, 161> PowerRegenInterruptedFlatModifier;
+ UpdateFieldArray<UF::VisibleItem, 3, 171, 172> VirtualItems;
+ UpdateFieldArray<uint32, 2, 175, 176> AttackRoundBaseTime;
+ UpdateFieldArray<int32, 4, 178, 179> Stats;
+ UpdateFieldArray<int32, 4, 178, 183> StatPosBuff;
+ UpdateFieldArray<int32, 4, 178, 187> StatNegBuff;
+ UpdateFieldArray<int32, 4, 178, 191> StatSupportBuff;
+ UpdateFieldArray<int32, 7, 195, 196> Resistances;
+ UpdateFieldArray<int32, 7, 195, 203> BonusResistanceMods;
+ UpdateFieldArray<int32, 7, 195, 210> 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;
@@ -417,14 +422,13 @@ struct ChrCustomizationChoice : public IsUpdateFieldStructureTag
bool operator!=(ChrCustomizationChoice const& right) const { return !(*this == right); }
};
-struct QuestLog : public IsUpdateFieldStructureTag, public HasChangesMask<31>
+struct QuestLog : public IsUpdateFieldStructureTag, public HasChangesMask<30>
{
- UpdateField<int32, 0, 1> QuestID;
- UpdateField<uint32, 0, 2> StateFlags;
- UpdateField<uint32, 0, 3> EndTime;
- UpdateField<uint32, 0, 4> AcceptTime;
- UpdateField<uint32, 0, 5> ObjectiveFlags;
- UpdateFieldArray<int16, 24, 6, 7> ObjectiveProgress;
+ UpdateField<int64, 0, 1> EndTime;
+ UpdateField<int32, 0, 2> QuestID;
+ UpdateField<uint32, 0, 3> StateFlags;
+ UpdateField<uint32, 0, 4> ObjectiveFlags;
+ UpdateFieldArray<int16, 24, 5, 6> ObjectiveProgress;
void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const;
@@ -598,14 +602,24 @@ struct SpellFlatModByLabel : public IsUpdateFieldStructureTag
bool operator!=(SpellFlatModByLabel const& right) const { return !(*this == right); }
};
-struct Research : public IsUpdateFieldStructureTag
+struct CompletedProject : public IsUpdateFieldStructureTag, public HasChangesMask<4>
{
- int16 ResearchProjectID;
+ UpdateField<uint32, 0, 1> ProjectID;
+ UpdateField<int64, 0, 2> FirstCompleted;
+ UpdateField<uint32, 0, 3> CompletionCount;
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==(Research const& right) const;
- bool operator!=(Research const& right) const { return !(*this == right); }
+ void ClearChangesMask();
+};
+
+struct ResearchHistory : public IsUpdateFieldStructureTag, public HasChangesMask<2>
+{
+ DynamicUpdateField<UF::CompletedProject, 0, 1> CompletedProjects;
+
+ void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const;
+ void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const;
+ void ClearChangesMask();
};
struct MawPower : public IsUpdateFieldStructureTag
@@ -788,144 +802,189 @@ struct WeeklySpellUse : public IsUpdateFieldStructureTag
bool operator!=(WeeklySpellUse const& right) const { return !(*this == right); }
};
-struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1605>
+struct StablePetInfo : public IsUpdateFieldStructureTag, public HasChangesMask<8>
+{
+ UpdateField<uint32, 0, 1> PetSlot;
+ UpdateField<uint32, 0, 2> PetNumber;
+ UpdateField<uint32, 0, 3> CreatureID;
+ UpdateField<uint32, 0, 4> DisplayID;
+ UpdateField<uint32, 0, 5> ExperienceLevel;
+ UpdateField<std::string, 0, 6> Name;
+ UpdateField<uint8, 0, 7> PetFlags;
+
+ void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const;
+ void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const;
+ void ClearChangesMask();
+};
+
+struct StableInfo : public IsUpdateFieldStructureTag, public HasChangesMask<3>
+{
+ DynamicUpdateField<UF::StablePetInfo, 0, 1> Pets;
+ UpdateField<ObjectGuid, 0, 2> StableMaster;
+
+ void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const;
+ void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const;
+ void ClearChangesMask();
+};
+
+struct Research : public IsUpdateFieldStructureTag
+{
+ int16 ResearchProjectID;
+
+ 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==(Research const& right) const;
+ bool operator!=(Research const& right) const { return !(*this == right); }
+};
+
+struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1618>
{
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, 35, 36> Research;
+ UpdateFieldArray<DynamicUpdateFieldBase<uint16>, 1, 35, 36> ResearchSites;
+ UpdateFieldArray<DynamicUpdateFieldBase<uint32>, 1, 37, 38> ResearchSiteProgress;
+ UpdateFieldArray<DynamicUpdateFieldBase<UF::Research>, 1, 39, 40> Research;
DynamicUpdateField<uint64, 0, 6> KnownTitles;
- DynamicUpdateField<uint16, 0, 8> ResearchSites;
- DynamicUpdateField<uint32, 0, 9> ResearchSiteProgress;
- DynamicUpdateField<int32, 0, 10> DailyQuestsCompleted;
- DynamicUpdateField<int32, 0, 11> AvailableQuestLineXQuestIDs;
- DynamicUpdateField<int32, 0, 12> Heirlooms;
- DynamicUpdateField<uint32, 0, 13> HeirloomFlags;
- DynamicUpdateField<int32, 0, 14> Toys;
- DynamicUpdateField<uint32, 0, 15> ToyFlags;
- DynamicUpdateField<uint32, 0, 16> Transmog;
- DynamicUpdateField<int32, 0, 17> ConditionalTransmog;
- DynamicUpdateField<int32, 0, 18> SelfResSpells;
- DynamicUpdateField<uint32, 0, 19> RuneforgePowers;
- DynamicUpdateField<uint32, 0, 20> TransmogIllusions;
- DynamicUpdateField<UF::SpellPctModByLabel, 0, 22> SpellPctModByLabel;
- DynamicUpdateField<UF::SpellFlatModByLabel, 0, 23> SpellFlatModByLabel;
- DynamicUpdateField<UF::MawPower, 0, 24> MawPowers;
- DynamicUpdateField<UF::MultiFloorExplore, 0, 25> MultiFloorExploration;
- DynamicUpdateField<UF::RecipeProgressionInfo, 0, 26> RecipeProgression;
- 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<int32, 0, 8> DailyQuestsCompleted;
+ DynamicUpdateField<int32, 0, 9> AvailableQuestLineXQuestIDs;
+ DynamicUpdateField<int32, 0, 10> Heirlooms;
+ DynamicUpdateField<uint32, 0, 11> HeirloomFlags;
+ DynamicUpdateField<int32, 0, 12> Toys;
+ DynamicUpdateField<uint32, 0, 13> ToyFlags;
+ DynamicUpdateField<uint32, 0, 14> Transmog;
+ DynamicUpdateField<int32, 0, 15> ConditionalTransmog;
+ DynamicUpdateField<int32, 0, 16> SelfResSpells;
+ DynamicUpdateField<uint32, 0, 17> RuneforgePowers;
+ DynamicUpdateField<uint32, 0, 18> TransmogIllusions;
+ DynamicUpdateField<UF::SpellPctModByLabel, 0, 20> SpellPctModByLabel;
+ DynamicUpdateField<UF::SpellFlatModByLabel, 0, 21> SpellFlatModByLabel;
+ DynamicUpdateField<UF::MawPower, 0, 22> MawPowers;
+ DynamicUpdateField<UF::MultiFloorExplore, 0, 23> MultiFloorExploration;
+ DynamicUpdateField<UF::RecipeProgressionInfo, 0, 24> RecipeProgression;
+ DynamicUpdateField<UF::ReplayedQuest, 0, 25> ReplayedQuests;
+ DynamicUpdateField<UF::QuestLog, 0, 26> TaskQuests;
+ DynamicUpdateField<int32, 0, 27> DisabledSpells;
+ DynamicUpdateField<UF::PersonalCraftingOrderCount, 0, 30> PersonalCraftingOrderCounts;
+ DynamicUpdateField<UF::CategoryCooldownMod, 0, 31> CategoryCooldownMods;
+ DynamicUpdateField<UF::WeeklySpellUse, 32, 33> WeeklySpellUses;
+ DynamicUpdateField<int64, 32, 34> TrackedCollectableSources;
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, 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;
+ DynamicUpdateField<UF::CharacterRestriction, 0, 19> CharacterRestrictions;
+ DynamicUpdateField<UF::TraitConfig, 0, 28> TraitConfigs;
+ DynamicUpdateField<UF::CraftingOrder, 0, 29> CraftingOrders;
+ UpdateField<ObjectGuid, 32, 41> FarsightObject;
+ UpdateField<ObjectGuid, 32, 42> SummonedBattlePetGUID;
+ UpdateField<uint64, 32, 43> Coinage;
+ UpdateField<int32, 32, 44> XP;
+ UpdateField<int32, 32, 45> NextLevelXP;
+ UpdateField<int32, 32, 46> TrialXP;
+ UpdateField<UF::SkillInfo, 32, 47> Skill;
+ UpdateField<int32, 32, 48> CharacterPoints;
+ UpdateField<int32, 32, 49> MaxTalentTiers;
+ UpdateField<uint32, 32, 50> TrackCreatureMask;
+ UpdateField<float, 32, 51> MainhandExpertise;
+ UpdateField<float, 32, 52> OffhandExpertise;
+ UpdateField<float, 32, 53> RangedExpertise;
+ UpdateField<float, 32, 54> CombatRatingExpertise;
+ UpdateField<float, 32, 55> BlockPercentage;
+ UpdateField<float, 32, 56> DodgePercentage;
+ UpdateField<float, 32, 57> DodgePercentageFromAttribute;
+ UpdateField<float, 32, 58> ParryPercentage;
+ UpdateField<float, 32, 59> ParryPercentageFromAttribute;
+ UpdateField<float, 32, 60> CritPercentage;
+ UpdateField<float, 32, 61> RangedCritPercentage;
+ UpdateField<float, 32, 62> OffhandCritPercentage;
+ UpdateField<float, 32, 63> SpellCritPercentage;
+ UpdateField<int32, 32, 64> ShieldBlock;
+ UpdateField<float, 32, 65> ShieldBlockCritPercentage;
+ UpdateField<float, 32, 66> Mastery;
+ UpdateField<float, 32, 67> Speed;
+ UpdateField<float, 32, 68> Avoidance;
+ UpdateField<float, 32, 69> Sturdiness;
+ UpdateField<int32, 70, 71> Versatility;
+ UpdateField<float, 70, 72> VersatilityBonus;
+ UpdateField<float, 70, 73> PvpPowerDamage;
+ UpdateField<float, 70, 74> PvpPowerHealing;
+ UpdateField<int32, 70, 75> ModHealingDonePos;
+ UpdateField<float, 70, 76> ModHealingPercent;
+ UpdateField<float, 70, 77> ModPeriodicHealingDonePercent;
+ UpdateField<float, 70, 78> ModSpellPowerPercent;
+ UpdateField<float, 70, 79> ModResiliencePercent;
+ UpdateField<float, 70, 80> OverrideSpellPowerByAPPercent;
+ UpdateField<float, 70, 81> OverrideAPBySpellPowerPercent;
+ UpdateField<int32, 70, 82> ModTargetResistance;
+ UpdateField<int32, 70, 83> ModTargetPhysicalResistance;
+ UpdateField<uint32, 70, 84> LocalFlags;
+ UpdateField<uint8, 70, 85> GrantableLevels;
+ UpdateField<uint8, 70, 86> MultiActionBars;
+ UpdateField<uint8, 70, 87> LifetimeMaxRank;
+ UpdateField<uint8, 70, 88> NumRespecs;
+ UpdateField<uint32, 70, 89> PvpMedals;
+ UpdateField<uint16, 70, 90> TodayHonorableKills;
+ UpdateField<uint16, 70, 91> YesterdayHonorableKills;
+ UpdateField<uint32, 70, 92> LifetimeHonorableKills;
+ UpdateField<int32, 70, 93> WatchedFactionIndex;
+ UpdateField<int32, 70, 94> MaxLevel;
+ UpdateField<int32, 70, 95> ScalingPlayerLevelDelta;
+ UpdateField<int32, 70, 96> MaxCreatureScalingLevel;
+ UpdateField<int32, 70, 97> PetSpellPower;
+ UpdateField<float, 70, 98> UiHitModifier;
+ UpdateField<float, 70, 99> UiSpellHitModifier;
+ UpdateField<int32, 70, 100> HomeRealmTimeOffset;
+ UpdateField<float, 70, 101> ModPetHaste;
+ UpdateField<int8, 102, 103> JailersTowerLevelMax;
+ UpdateField<int8, 102, 104> JailersTowerLevel;
+ UpdateField<uint8, 102, 105> LocalRegenFlags;
+ UpdateField<uint8, 102, 106> AuraVision;
+ UpdateField<uint8, 102, 107> NumBackpackSlots;
+ UpdateField<int32, 102, 108> OverrideSpellsID;
+ UpdateField<uint16, 102, 109> LootSpecID;
+ UpdateField<uint32, 102, 110> OverrideZonePVPType;
+ UpdateField<ObjectGuid, 102, 111> BnetAccount;
+ UpdateField<uint64, 102, 112> GuildClubMemberID;
+ UpdateField<int32, 102, 113> Honor;
+ UpdateField<int32, 102, 114> HonorNextLevel;
+ UpdateField<int32, 102, 115> PerksProgramCurrency;
+ UpdateField<uint8, 102, 116> NumBankSlots;
+ UpdateField<UF::ResearchHistory, 102, 117> ResearchHistory;
+ UpdateField<WorldPackets::PerksProgram::PerksVendorItem, 102, 118> FrozenPerksVendorItem;
+ UpdateField<UF::ActivePlayerUnk901, 102, 120> Field_1410;
+ OptionalUpdateField<UF::QuestSession, 102, 119> QuestSession;
+ UpdateField<int32, 102, 121> UiChromieTimeExpansionID;
+ UpdateField<int32, 102, 122> TransportServerTime;
+ UpdateField<uint32, 102, 123> WeeklyRewardsPeriodSinceOrigin; // week count since Cfg_RegionsEntry::ChallengeOrigin
+ UpdateField<int16, 102, 124> DEBUGSoulbindConduitRank;
+ UpdateField<WorldPackets::MythicPlus::DungeonScoreData, 102, 125> DungeonScore;
+ UpdateField<uint32, 102, 126> ActiveCombatTraitConfigID;
+ UpdateField<int32, 102, 127> ItemUpgradeHighOnehandWeaponItemID;
+ UpdateField<int32, 102, 128> ItemUpgradeHighFingerItemID;
+ UpdateField<float, 102, 129> ItemUpgradeHighFingerWatermark;
+ UpdateField<int32, 102, 130> ItemUpgradeHighTrinketItemID;
+ UpdateField<float, 102, 131> ItemUpgradeHighTrinketWatermark;
+ UpdateField<uint64, 102, 132> LootHistoryInstanceID;
+ OptionalUpdateField<UF::StableInfo, 102, 133> PetStable;
+ UpdateField<uint8, 134, 135> RequiredMountCapabilityFlags;
+ UpdateFieldArray<ObjectGuid, 227, 136, 137> InvSlots;
+ UpdateFieldArray<uint64, 240, 364, 365> ExploredZones;
+ UpdateFieldArray<UF::RestInfo, 2, 605, 606> RestInfo;
+ UpdateFieldArray<int32, 7, 608, 609> ModDamageDonePos;
+ UpdateFieldArray<int32, 7, 608, 616> ModDamageDoneNeg;
+ UpdateFieldArray<float, 7, 608, 623> ModDamageDonePercent;
+ UpdateFieldArray<float, 7, 608, 630> ModHealingDonePercent;
+ UpdateFieldArray<float, 3, 637, 638> WeaponDmgMultipliers;
+ UpdateFieldArray<float, 3, 637, 641> WeaponAtkSpeedMultipliers;
+ UpdateFieldArray<uint32, 12, 644, 645> BuybackPrice;
+ UpdateFieldArray<int64, 12, 644, 657> BuybackTimestamp;
+ UpdateFieldArray<int32, 32, 669, 670> CombatRatings;
+ UpdateFieldArray<uint32, 4, 702, 703> NoReagentCostMask;
+ UpdateFieldArray<int32, 2, 707, 708> ProfessionSkillLine;
+ UpdateFieldArray<uint32, 5, 710, 711> BagSlotFlags;
+ UpdateFieldArray<uint32, 7, 716, 717> BankBagSlotFlags;
+ UpdateFieldArray<uint64, 875, 724, 725> QuestCompleted;
+ UpdateFieldArray<float, 17, 1600, 1601> 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;
@@ -1029,32 +1088,33 @@ struct VisualAnim : public IsUpdateFieldStructureTag, public HasChangesMask<5>
void ClearChangesMask();
};
-struct AreaTriggerData : public IsUpdateFieldStructureTag, public HasChangesMask<25>
+struct AreaTriggerData : public IsUpdateFieldStructureTag, public HasChangesMask<26>
{
- UpdateField<bool, 0, 1> Field_260;
+ UpdateField<bool, 0, 1> HeightIgnoresScale;
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<UF::ScaleCurve, 0, 5> OverrideMoveCurveX;
+ UpdateField<UF::ScaleCurve, 0, 6> OverrideMoveCurveY;
+ UpdateField<UF::ScaleCurve, 0, 7> OverrideMoveCurveZ;
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<uint32, 0, 13> TimeToTargetPos; // Linked to m_overrideMoveCurve
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;
+ UpdateField<uint32, 0, 20> NumUnitsInside;
+ UpdateField<uint32, 0, 21> NumPlayersInside; // When not 0 this causes SpellVisualEvent 14 to trigger, playing alternate visuals, typically used by "SOAK THIS" areatriggers
+ UpdateField<ObjectGuid, 0, 22> OrbitPathTarget;
+ UpdateField<TaggedPosition<Position::XYZ>, 0, 23> RollPitchYaw;
+ UpdateField<int32, 0, 24> PositionalSoundKitID;
+ UpdateField<UF::VisualAnim, 0, 25> 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;