aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2021-11-04 21:47:03 +0100
committerShauren <shauren.trinity@gmail.com>2021-11-04 21:47:03 +0100
commit5c8a058120dcf2c3ff8592886cb842ca889e0411 (patch)
tree951397fd3cc69637d4c399510a725b9a3385a80d
parent792721ad6450065ec81da6472c1e2a143ad57341 (diff)
Core/PacketIO: 9.1.5 updatefields and SMSG_UPDATE_OBJECT structure
-rw-r--r--sql/base/characters_database.sql5
-rw-r--r--sql/updates/characters/master/2021_11_04_00_characters.sql2
-rw-r--r--src/server/database/Database/Implementation/CharacterDatabase.cpp12
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.cpp5
-rw-r--r--src/server/game/Entities/Object/Object.cpp20
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.cpp243
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.h111
-rw-r--r--src/server/game/Entities/Player/Player.cpp4
-rw-r--r--src/server/game/Entities/Player/Player.h3
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h2
-rw-r--r--src/server/game/Server/Packets/MythicPlusPacketsCommon.cpp12
-rw-r--r--src/server/game/Server/Packets/MythicPlusPacketsCommon.h12
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp20
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.h1
14 files changed, 255 insertions, 197 deletions
diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql
index 21d4ff0ae5c..da109df7c71 100644
--- a/sql/base/characters_database.sql
+++ b/sql/base/characters_database.sql
@@ -1632,6 +1632,7 @@ CREATE TABLE `character_stats` (
`maxpower4` int(10) unsigned NOT NULL DEFAULT '0',
`maxpower5` int(10) unsigned NOT NULL DEFAULT '0',
`maxpower6` int(10) unsigned NOT NULL DEFAULT '0',
+ `maxpower7` int(10) unsigned NOT NULL DEFAULT '0',
`strength` int(10) unsigned NOT NULL DEFAULT '0',
`agility` int(10) unsigned NOT NULL DEFAULT '0',
`stamina` int(10) unsigned NOT NULL DEFAULT '0',
@@ -1843,6 +1844,7 @@ CREATE TABLE `characters` (
`power4` int(10) unsigned NOT NULL DEFAULT '0',
`power5` int(10) unsigned NOT NULL DEFAULT '0',
`power6` int(10) unsigned NOT NULL DEFAULT '0',
+ `power7` int(10) unsigned NOT NULL DEFAULT '0',
`latency` mediumint(8) unsigned NOT NULL DEFAULT '0',
`activeTalentGroup` tinyint(3) unsigned NOT NULL DEFAULT '0',
`lootSpecId` int(10) unsigned NOT NULL DEFAULT '0',
@@ -3670,7 +3672,8 @@ INSERT INTO `updates` VALUES
('2021_10_02_01_characters.sql','F97B956F3B5F909294CA399F75B5795A07C4D8EC','ARCHIVED','2021-10-02 21:47:38',0),
('2021_10_15_00_characters.sql','906FECD65CBA7C406969F45FDF28DDEF8AAF8715','ARCHIVED','2021-10-15 10:11:47',0),
('2021_10_16_00_characters.sql','B5A31BB6FBC34512767475EDF13099DEC948EBB7','RELEASED','2021-10-16 01:12:20',0),
-('2021_11_02_00_characters.sql','A3C0A6DA70CC70803C80685E4E2ED6255156520A','RELEASED','2021-11-02 18:11:13',0);
+('2021_11_02_00_characters.sql','A3C0A6DA70CC70803C80685E4E2ED6255156520A','RELEASED','2021-11-02 18:11:13',0),
+('2021_11_04_00_characters.sql','ED533235ADAD174F91A6B8E51D1046243B78B46D','RELEASED','2021-11-04 21:53:04',0);
/*!40000 ALTER TABLE `updates` ENABLE KEYS */;
UNLOCK TABLES;
diff --git a/sql/updates/characters/master/2021_11_04_00_characters.sql b/sql/updates/characters/master/2021_11_04_00_characters.sql
new file mode 100644
index 00000000000..e6db9872f42
--- /dev/null
+++ b/sql/updates/characters/master/2021_11_04_00_characters.sql
@@ -0,0 +1,2 @@
+ALTER TABLE `characters` ADD `power7` int(10) unsigned NOT NULL DEFAULT '0' AFTER `power6`;
+ALTER TABLE `character_stats` ADD `maxpower7` int(10) unsigned NOT NULL DEFAULT '0' AFTER `maxpower6`;
diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp
index 18448dd6cf0..482b14a7528 100644
--- a/src/server/database/Database/Implementation/CharacterDatabase.cpp
+++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp
@@ -86,7 +86,7 @@ void CharacterDatabaseConnection::DoPrepareStatements()
"position_x, position_y, position_z, map, orientation, taximask, createTime, createMode, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, "
"resettalents_time, primarySpecialization, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, "
"totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, "
- "health, power1, power2, power3, power4, power5, power6, instance_id, activeTalentGroup, lootSpecId, exploredZones, knownTitles, actionBars, raidDifficulty, legacyRaidDifficulty, fishingSteps, "
+ "health, power1, power2, power3, power4, power5, power6, power7, instance_id, activeTalentGroup, lootSpecId, exploredZones, knownTitles, actionBars, raidDifficulty, legacyRaidDifficulty, fishingSteps, "
"honor, honorLevel, honorRestState, honorRestBonus, numRespecs "
"FROM characters c LEFT JOIN character_fishingsteps cfs ON c.guid = cfs.guid WHERE c.guid = ?", CONNECTION_ASYNC);
@@ -481,13 +481,13 @@ void CharacterDatabaseConnection::DoPrepareStatements()
"extra_flags, stable_slots, at_login, "
"death_expire_time, taxi_path, totalKills, "
"todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, health, power1, power2, power3, "
- "power4, power5, power6, latency, activeTalentGroup, lootSpecId, exploredZones, equipmentCache, knownTitles, actionBars, lastLoginBuild) VALUES "
- "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC);
+ "power4, power5, power6, power7, latency, activeTalentGroup, lootSpecId, exploredZones, equipmentCache, knownTitles, actionBars, lastLoginBuild) VALUES "
+ "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC);
PrepareStatement(CHAR_UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,inventorySlots=?,bankSlots=?,restState=?,playerFlags=?,playerFlagsEx=?,"
"map=?,instance_id=?,dungeonDifficulty=?,raidDifficulty=?,legacyRaidDifficulty=?,position_x=?,position_y=?,position_z=?,orientation=?,trans_x=?,trans_y=?,trans_z=?,trans_o=?,transguid=?,taximask=?,cinematic=?,totaltime=?,leveltime=?,rest_bonus=?,"
"logout_time=?,is_logout_resting=?,resettalents_cost=?,resettalents_time=?,numRespecs=?,primarySpecialization=?,extra_flags=?,stable_slots=?,at_login=?,zone=?,death_expire_time=?,taxi_path=?,"
"totalKills=?,todayKills=?,yesterdayKills=?,chosenTitle=?,"
- "watchedFaction=?,drunk=?,health=?,power1=?,power2=?,power3=?,power4=?,power5=?,power6=?,latency=?,activeTalentGroup=?,lootSpecId=?,exploredZones=?,"
+ "watchedFaction=?,drunk=?,health=?,power1=?,power2=?,power3=?,power4=?,power5=?,power6=?,power7=?,latency=?,activeTalentGroup=?,lootSpecId=?,exploredZones=?,"
"equipmentCache=?,knownTitles=?,actionBars=?,online=?,honor=?,honorLevel=?,honorRestState=?,honorRestBonus=?,lastLoginBuild=? WHERE guid=?", CONNECTION_ASYNC);
PrepareStatement(CHAR_UPD_ADD_AT_LOGIN_FLAG, "UPDATE characters SET at_login = at_login | ? WHERE guid = ?", CONNECTION_ASYNC);
@@ -671,9 +671,9 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PrepareStatement(CHAR_UPD_CHAR_SKILLS, "UPDATE character_skills SET value = ?, max = ? WHERE guid = ? AND skill = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_INS_CHAR_SPELL, "INSERT INTO character_spell (guid, spell, active, disabled) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_CHAR_STATS, "DELETE FROM character_stats WHERE guid = ?", CONNECTION_ASYNC);
- PrepareStatement(CHAR_INS_CHAR_STATS, "INSERT INTO character_stats (guid, maxhealth, maxpower1, maxpower2, maxpower3, maxpower4, maxpower5, maxpower6, strength, agility, stamina, intellect, "
+ PrepareStatement(CHAR_INS_CHAR_STATS, "INSERT INTO character_stats (guid, maxhealth, maxpower1, maxpower2, maxpower3, maxpower4, maxpower5, maxpower6, maxpower7, strength, agility, stamina, intellect, "
"armor, resHoly, resFire, resNature, resFrost, resShadow, resArcane, blockPct, dodgePct, parryPct, critPct, rangedCritPct, spellCritPct, attackPower, rangedAttackPower, "
- "spellPower, resilience) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ "spellPower, resilience) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_PETITION_BY_OWNER, "DELETE FROM petition WHERE ownerguid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_PETITION_SIGNATURE_BY_OWNER, "DELETE FROM petition_sign WHERE ownerguid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_INS_CHAR_GLYPHS, "INSERT INTO character_glyphs VALUES(?, ?, ?)", CONNECTION_ASYNC);
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
index cd4c495b64e..a3720060d6f 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
+++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
@@ -148,6 +148,11 @@ bool AreaTrigger::Create(uint32 areaTriggerCreatePropertiesId, Unit* caster, Uni
if (GetCreateProperties()->ExtraScale.Data.Structured.OverrideActive)
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ExtraScaleCurve).ModifyValue(&UF::ScaleCurve::OverrideActive), GetCreateProperties()->ExtraScale.Data.Structured.OverrideActive);
+ SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::VisualAnim).ModifyValue(&UF::VisualAnim::AnimationDataID), GetCreateProperties()->AnimId);
+ SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::VisualAnim).ModifyValue(&UF::VisualAnim::AnimKitID), GetCreateProperties()->AnimKitId);
+ if (GetTemplate() && GetTemplate()->HasFlag(AREATRIGGER_FLAG_UNK3))
+ SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::VisualAnim).ModifyValue(&UF::VisualAnim::Field_C), true);
+
PhasingHandler::InheritPhaseShift(this, caster);
if (target && GetTemplate() && GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ATTACHED))
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 6544e584240..123a4e416ce 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -474,10 +474,6 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags) const
bool hasMorphCurveID = createProperties && createProperties->MorphCurveId != 0;
bool hasFacingCurveID = createProperties && createProperties->FacingCurveId != 0;
bool hasMoveCurveID = createProperties && createProperties->MoveCurveId != 0;
- bool hasAnimation = createProperties && createProperties->AnimId;
- bool hasUnk3 = areaTriggerTemplate && areaTrigger->GetTemplate()->HasFlag(AREATRIGGER_FLAG_UNK3);
- bool hasAnimKitID = createProperties && createProperties->AnimKitId;
- bool hasAnimProgress = false;
bool hasAreaTriggerSphere = shape.IsSphere();
bool hasAreaTriggerBox = shape.IsBox();
bool hasAreaTriggerPolygon = createProperties && shape.IsPolygon();
@@ -497,10 +493,6 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags) const
data->WriteBit(hasMorphCurveID);
data->WriteBit(hasFacingCurveID);
data->WriteBit(hasMoveCurveID);
- data->WriteBit(hasAnimation);
- data->WriteBit(hasAnimKitID);
- data->WriteBit(hasUnk3);
- data->WriteBit(hasAnimProgress);
data->WriteBit(hasAreaTriggerSphere);
data->WriteBit(hasAreaTriggerBox);
data->WriteBit(hasAreaTriggerPolygon);
@@ -509,9 +501,6 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags) const
data->WriteBit(hasOrbit);
data->WriteBit(hasMovementScript);
- if (hasUnk3)
- data->WriteBit(false);
-
data->FlushBits();
if (hasAreaTriggerSpline)
@@ -537,15 +526,6 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags) const
if (hasMoveCurveID)
*data << uint32(createProperties->MoveCurveId);
- if (hasAnimation)
- *data << int32(createProperties->AnimId);
-
- if (hasAnimKitID)
- *data << int32(createProperties->AnimKitId);
-
- if (hasAnimProgress)
- *data << uint32(0);
-
if (hasAreaTriggerSphere)
{
*data << float(shape.SphereDatas.Radius);
diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp
index 0fa4e8c1c8b..ac3727ca7c0 100644
--- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp
+++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp
@@ -970,14 +970,14 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
data << uint8(DisplayPower);
data << uint32(OverrideDisplayPowerID);
data << int64(Health);
- for (std::size_t i = 0; i < 6; ++i)
+ for (std::size_t i = 0; i < 7; ++i)
{
data << int32(Power[i]);
data << int32(MaxPower[i]);
}
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner | UpdateFieldFlag::UnitAll))
{
- for (std::size_t i = 0; i < 6; ++i)
+ for (std::size_t i = 0; i < 7; ++i)
{
data << float(PowerRegenFlatModifier[i]);
data << float(PowerRegenInterruptedFlatModifier[i]);
@@ -1102,6 +1102,7 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
data << int32(MaxItemLevel);
data << int32(AzeriteItemLevel);
data << int32(WildBattlePetLevel);
+ data << int32(Field_220);
data << uint32(BattlePetCompanionNameTimestamp);
data << int32(InteractSpellID);
data << int32(ScaleDuration);
@@ -1132,7 +1133,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, 0xE1FF7FFFu, 0x001EFFFFu, 0xFFFFFF81u, 0x07F000FFu, 0x00000000u });
+ Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFFFFFF81u, 0xFE0007FFu, 0x00000000u, 0x00000000u });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver);
}
@@ -1140,24 +1141,24 @@ void UnitData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
void UnitData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const
{
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
- allowedMaskForTarget |= { 0x00002000u, 0x1E008000u, 0xFFE10000u, 0x0800007Eu, 0xF80FFF00u, 0x3FFFFFFFu };
+ allowedMaskForTarget |= { 0x00002000u, 0x1E008000u, 0xFFE10000u, 0x1000007Eu, 0x01FFF800u, 0xFFFFFFFFu, 0x00000007u };
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::UnitAll))
- allowedMaskForTarget |= { 0x00000000u, 0x00000000u, 0x00000000u, 0x08000000u, 0x000FFF00u, 0x00000000u };
+ allowedMaskForTarget |= { 0x00000000u, 0x00000000u, 0x00000000u, 0x10000000u, 0x01FFF800u, 0x00000000u, 0x00000000u };
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Empath))
- allowedMaskForTarget |= { 0x00000000u, 0x1E000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x0000FF00u };
+ allowedMaskForTarget |= { 0x00000000u, 0x1E000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x001FE000u, 0x00000000u };
}
void UnitData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const
{
- Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFFFFFF81u, 0x07F000FFu, 0x00000000u });
+ Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFFFFFF81u, 0xFE0007FFu, 0x00000000u, 0x00000000u });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
changesMask &= allowedMaskForTarget;
}
void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, Unit const* owner, Player const* receiver) const
{
- data.WriteBits(changesMask.GetBlocksMask(0), 6);
- for (std::size_t i = 0; i < 6; ++i)
+ data.WriteBits(changesMask.GetBlocksMask(0), 7);
+ for (std::size_t i = 0; i < 7; ++i)
if (changesMask.GetBlock(i))
data.WriteBits(changesMask.GetBlock(i), 32);
@@ -1645,132 +1646,136 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
}
if (changesMask[109])
{
- data << uint32(BattlePetCompanionNameTimestamp);
+ data << int32(Field_220);
}
if (changesMask[110])
{
- data << int32(InteractSpellID);
+ data << uint32(BattlePetCompanionNameTimestamp);
}
if (changesMask[111])
{
- data << int32(ScaleDuration);
+ data << int32(InteractSpellID);
}
if (changesMask[112])
{
- data << int32(LooksLikeMountID);
+ data << int32(ScaleDuration);
}
if (changesMask[113])
{
- data << int32(LooksLikeCreatureID);
+ data << int32(LooksLikeMountID);
}
if (changesMask[114])
{
- data << int32(LookAtControllerID);
+ data << int32(LooksLikeCreatureID);
}
if (changesMask[115])
{
- data << int32(TaxiNodesID);
+ data << int32(LookAtControllerID);
}
if (changesMask[116])
{
- data << GuildGUID;
+ data << int32(TaxiNodesID);
}
if (changesMask[117])
{
- data << SkinningOwnerGUID;
+ data << GuildGUID;
}
if (changesMask[118])
{
- data << uint32(SilencedSchoolMask);
+ data << SkinningOwnerGUID;
}
if (changesMask[119])
{
+ data << uint32(SilencedSchoolMask);
+ }
+ if (changesMask[120])
+ {
data << NameplateAttachToGUID;
}
}
- if (changesMask[120])
+ if (changesMask[121])
{
for (std::size_t i = 0; i < 2; ++i)
{
- if (changesMask[121 + i])
+ if (changesMask[122 + i])
{
data << uint32(ViewerDependentValue<NpcFlagsTag>::GetValue(this, i, owner, receiver));
}
}
}
- if (changesMask[123])
+ if (changesMask[124])
{
- for (std::size_t i = 0; i < 6; ++i)
+ for (std::size_t i = 0; i < 7; ++i)
{
- if (changesMask[124 + i])
+ if (changesMask[125 + i])
{
data << int32(Power[i]);
}
- if (changesMask[130 + i])
+ if (changesMask[132 + i])
{
data << int32(MaxPower[i]);
}
- if (changesMask[136 + i])
+ if (changesMask[139 + i])
{
data << float(PowerRegenFlatModifier[i]);
}
- if (changesMask[142 + i])
+ if (changesMask[146 + i])
{
data << float(PowerRegenInterruptedFlatModifier[i]);
}
}
}
- if (changesMask[148])
+ if (changesMask[153])
{
for (std::size_t i = 0; i < 3; ++i)
{
- if (changesMask[149 + i])
+ if (changesMask[154 + i])
{
VirtualItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
- if (changesMask[152])
+ if (changesMask[157])
{
for (std::size_t i = 0; i < 2; ++i)
{
- if (changesMask[153 + i])
+ if (changesMask[158 + i])
{
data << uint32(AttackRoundBaseTime[i]);
}
}
}
- if (changesMask[155])
+ if (changesMask[160])
{
for (std::size_t i = 0; i < 4; ++i)
{
- if (changesMask[156 + i])
+ if (changesMask[161 + i])
{
data << int32(Stats[i]);
}
- if (changesMask[160 + i])
+ if (changesMask[165 + i])
{
data << int32(StatPosBuff[i]);
}
- if (changesMask[164 + i])
+ if (changesMask[169 + i])
{
data << int32(StatNegBuff[i]);
}
}
}
- if (changesMask[168])
+ if (changesMask[173])
{
for (std::size_t i = 0; i < 7; ++i)
{
- if (changesMask[169 + i])
+ if (changesMask[174 + i])
{
data << int32(Resistances[i]);
}
- if (changesMask[176 + i])
+ if (changesMask[181 + i])
{
data << int32(BonusResistanceMods[i]);
}
- if (changesMask[183 + i])
+ if (changesMask[188 + i])
{
data << int32(ManaCostModifier[i]);
}
@@ -1885,6 +1890,7 @@ void UnitData::ClearChangesMask()
Base::ClearChangesMask(MaxItemLevel);
Base::ClearChangesMask(AzeriteItemLevel);
Base::ClearChangesMask(WildBattlePetLevel);
+ Base::ClearChangesMask(Field_220);
Base::ClearChangesMask(BattlePetCompanionNameTimestamp);
Base::ClearChangesMask(InteractSpellID);
Base::ClearChangesMask(ScaleDuration);
@@ -2568,6 +2574,8 @@ void PVPInfo::WriteCreate(ByteBuffer& data, Player const* owner, Player const* r
data << uint32(SeasonBestRating);
data << uint32(PvpTierID);
data << uint32(WeeklyBestWinPvpTierID);
+ data << uint32(Field_28);
+ data << uint32(Field_2C);
data.WriteBit(Disqualified);
data.FlushBits();
}
@@ -2578,7 +2586,7 @@ void PVPInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const
if (ignoreChangesMask)
changesMask.SetAll();
- data.WriteBits(changesMask.GetBlock(0), 11);
+ data.WriteBits(changesMask.GetBlock(0), 13);
if (changesMask[0])
{
@@ -2626,6 +2634,14 @@ void PVPInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const
{
data << uint32(WeeklyBestWinPvpTierID);
}
+ if (changesMask[11])
+ {
+ data << uint32(Field_28);
+ }
+ if (changesMask[12])
+ {
+ data << uint32(Field_2C);
+ }
}
data.FlushBits();
}
@@ -2642,6 +2658,8 @@ void PVPInfo::ClearChangesMask()
Base::ClearChangesMask(SeasonBestRating);
Base::ClearChangesMask(PvpTierID);
Base::ClearChangesMask(WeeklyBestWinPvpTierID);
+ Base::ClearChangesMask(Field_28);
+ Base::ClearChangesMask(Field_2C);
_changesMask.ResetAll();
}
@@ -2925,10 +2943,6 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
data << int32(CharacterPoints);
data << int32(MaxTalentTiers);
data << uint32(TrackCreatureMask);
- for (std::size_t i = 0; i < 2; ++i)
- {
- data << uint32(TrackResourceMask[i]);
- }
data << float(MainhandExpertise);
data << float(OffhandExpertise);
data << float(RangedExpertise);
@@ -3964,149 +3978,139 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
if (changesMask[312])
{
- for (std::size_t i = 0; i < 2; ++i)
- {
- if (changesMask[313 + i])
- {
- data << uint32(TrackResourceMask[i]);
- }
- }
- }
- if (changesMask[315])
- {
for (std::size_t i = 0; i < 240; ++i)
{
- if (changesMask[316 + i])
+ if (changesMask[313 + i])
{
data << uint64(ExploredZones[i]);
}
}
}
- if (changesMask[556])
+ if (changesMask[553])
{
for (std::size_t i = 0; i < 2; ++i)
{
- if (changesMask[557 + i])
+ if (changesMask[554 + i])
{
RestInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
- if (changesMask[559])
+ if (changesMask[556])
{
for (std::size_t i = 0; i < 7; ++i)
{
- if (changesMask[560 + i])
+ if (changesMask[557 + i])
{
data << int32(ModDamageDonePos[i]);
}
- if (changesMask[567 + i])
+ if (changesMask[564 + i])
{
data << int32(ModDamageDoneNeg[i]);
}
- if (changesMask[574 + i])
+ if (changesMask[571 + i])
{
data << float(ModDamageDonePercent[i]);
}
- if (changesMask[581 + i])
+ if (changesMask[578 + i])
{
data << float(ModHealingDonePercent[i]);
}
}
}
- if (changesMask[588])
+ if (changesMask[585])
{
for (std::size_t i = 0; i < 3; ++i)
{
- if (changesMask[589 + i])
+ if (changesMask[586 + i])
{
data << float(WeaponDmgMultipliers[i]);
}
- if (changesMask[592 + i])
+ if (changesMask[589 + i])
{
data << float(WeaponAtkSpeedMultipliers[i]);
}
}
}
- if (changesMask[595])
+ if (changesMask[592])
{
for (std::size_t i = 0; i < 12; ++i)
{
- if (changesMask[596 + i])
+ if (changesMask[593 + i])
{
data << uint32(BuybackPrice[i]);
}
- if (changesMask[608 + i])
+ if (changesMask[605 + i])
{
data << uint32(BuybackTimestamp[i]);
}
}
}
- if (changesMask[620])
+ if (changesMask[617])
{
for (std::size_t i = 0; i < 32; ++i)
{
- if (changesMask[621 + i])
+ if (changesMask[618 + i])
{
data << int32(CombatRatings[i]);
}
}
}
- if (changesMask[660])
+ if (changesMask[657])
{
for (std::size_t i = 0; i < 4; ++i)
{
- if (changesMask[661 + i])
+ if (changesMask[658 + i])
{
data << uint32(NoReagentCostMask[i]);
}
}
}
- if (changesMask[665])
+ if (changesMask[662])
{
for (std::size_t i = 0; i < 2; ++i)
{
- if (changesMask[666 + i])
+ if (changesMask[663 + i])
{
data << int32(ProfessionSkillLine[i]);
}
}
}
- if (changesMask[668])
+ if (changesMask[665])
{
for (std::size_t i = 0; i < 4; ++i)
{
- if (changesMask[669 + i])
+ if (changesMask[666 + i])
{
data << uint32(BagSlotFlags[i]);
}
}
}
- if (changesMask[673])
+ if (changesMask[670])
{
for (std::size_t i = 0; i < 7; ++i)
{
- if (changesMask[674 + i])
+ if (changesMask[671 + i])
{
data << uint32(BankBagSlotFlags[i]);
}
}
}
- if (changesMask[681])
+ if (changesMask[678])
{
for (std::size_t i = 0; i < 875; ++i)
{
- if (changesMask[682 + i])
+ if (changesMask[679 + i])
{
data << uint64(QuestCompleted[i]);
}
}
}
- if (changesMask[653])
+ if (changesMask[650])
{
for (std::size_t i = 0; i < 6; ++i)
{
- if (changesMask[654 + i])
+ if (changesMask[651 + i])
{
PvpInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
@@ -4225,7 +4229,6 @@ void ActivePlayerData::ClearChangesMask()
Base::ClearChangesMask(DEBUGSoulbindConduitRank);
Base::ClearChangesMask(DungeonScore);
Base::ClearChangesMask(InvSlots);
- Base::ClearChangesMask(TrackResourceMask);
Base::ClearChangesMask(ExploredZones);
Base::ClearChangesMask(RestInfo);
Base::ClearChangesMask(ModDamageDonePos);
@@ -4683,6 +4686,58 @@ void ScaleCurve::ClearChangesMask()
_changesMask.ResetAll();
}
+void VisualAnim::WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const
+{
+ data << uint32(AnimationDataID);
+ data << uint32(AnimKitID);
+ data << uint32(AnimProgress);
+ data.WriteBit(Field_C);
+ data.FlushBits();
+}
+
+void VisualAnim::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const
+{
+ Mask changesMask = _changesMask;
+ if (ignoreChangesMask)
+ changesMask.SetAll();
+
+ data.WriteBits(changesMask.GetBlock(0), 5);
+
+ if (changesMask[0])
+ {
+ if (changesMask[1])
+ {
+ data.WriteBit(Field_C);
+ }
+ }
+ data.FlushBits();
+ if (changesMask[0])
+ {
+ if (changesMask[2])
+ {
+ data << uint32(AnimationDataID);
+ }
+ if (changesMask[3])
+ {
+ data << uint32(AnimKitID);
+ }
+ if (changesMask[4])
+ {
+ data << uint32(AnimProgress);
+ }
+ }
+ data.FlushBits();
+}
+
+void VisualAnim::ClearChangesMask()
+{
+ Base::ClearChangesMask(Field_C);
+ Base::ClearChangesMask(AnimationDataID);
+ Base::ClearChangesMask(AnimKitID);
+ Base::ClearChangesMask(AnimProgress);
+ _changesMask.ResetAll();
+}
+
void AreaTriggerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const
{
OverrideScaleCurve->WriteCreate(data, owner, receiver);
@@ -4697,7 +4752,9 @@ void AreaTriggerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fi
data << float(BoundsRadius2D);
data << uint32(DecalPropertiesID);
data << CreatingEffectGUID;
+ data << Field_80;
ExtraScaleCurve->WriteCreate(data, owner, receiver);
+ VisualAnim->WriteCreate(data, owner, receiver);
}
void AreaTriggerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const
@@ -4707,7 +4764,7 @@ 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), 14);
+ data.WriteBits(changesMask.GetBlock(0), 16);
data.FlushBits();
if (changesMask[0])
@@ -4760,10 +4817,18 @@ void AreaTriggerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, boo
{
data << CreatingEffectGUID;
}
+ if (changesMask[14])
+ {
+ data << Field_80;
+ }
if (changesMask[2])
{
ExtraScaleCurve->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
+ if (changesMask[15])
+ {
+ VisualAnim->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ }
}
}
@@ -4782,6 +4847,8 @@ void AreaTriggerData::ClearChangesMask()
Base::ClearChangesMask(BoundsRadius2D);
Base::ClearChangesMask(DecalPropertiesID);
Base::ClearChangesMask(CreatingEffectGUID);
+ Base::ClearChangesMask(Field_80);
+ Base::ClearChangesMask(VisualAnim);
_changesMask.ResetAll();
}
@@ -4906,6 +4973,7 @@ void ConversationData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
}
data.WriteBit(DontPlayBroadcastTextSounds);
data << uint32(Actors.size());
+ data << uint32(Flags);
for (std::size_t i = 0; i < Actors.size(); ++i)
{
Actors[i].WriteCreate(data, owner, receiver);
@@ -4920,7 +4988,7 @@ void ConversationData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
void ConversationData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, Conversation const* owner, Player const* receiver) const
{
- data.WriteBits(changesMask.GetBlock(0), 6);
+ data.WriteBits(changesMask.GetBlock(0), 7);
if (changesMask[0])
{
@@ -4969,6 +5037,10 @@ void ConversationData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
{
data << uint32(Progress);
}
+ if (changesMask[6])
+ {
+ data << uint32(Flags);
+ }
}
data.FlushBits();
}
@@ -4980,6 +5052,7 @@ void ConversationData::ClearChangesMask()
Base::ClearChangesMask(Actors);
Base::ClearChangesMask(LastLineEndTime);
Base::ClearChangesMask(Progress);
+ Base::ClearChangesMask(Flags);
_changesMask.ResetAll();
}
diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h
index 813838755aa..7c253229d54 100644
--- a/src/server/game/Entities/Object/Updates/UpdateFields.h
+++ b/src/server/game/Entities/Object/Updates/UpdateFields.h
@@ -252,7 +252,7 @@ struct PassiveSpellHistory : public IsUpdateFieldStructureTag
bool operator!=(PassiveSpellHistory const& right) const { return !(*this == right); }
};
-struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<190>
+struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<195>
{
UpdateField<std::vector<uint32>, 0, 1> StateWorldEffectIDs;
DynamicUpdateField<UF::PassiveSpellHistory, 0, 2> PassiveSpells;
@@ -364,31 +364,32 @@ struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<190>
UpdateField<int32, 96, 106> MaxItemLevel;
UpdateField<int32, 96, 107> AzeriteItemLevel;
UpdateField<int32, 96, 108> WildBattlePetLevel;
- UpdateField<uint32, 96, 109> BattlePetCompanionNameTimestamp;
- UpdateField<int32, 96, 110> InteractSpellID;
- UpdateField<int32, 96, 111> ScaleDuration;
- UpdateField<int32, 96, 112> LooksLikeMountID;
- UpdateField<int32, 96, 113> LooksLikeCreatureID;
- UpdateField<int32, 96, 114> LookAtControllerID;
- UpdateField<int32, 96, 115> TaxiNodesID;
- UpdateField<ObjectGuid, 96, 116> GuildGUID;
- UpdateField<ObjectGuid, 96, 117> SkinningOwnerGUID;
- UpdateField<uint32, 96, 118> SilencedSchoolMask;
- UpdateField<ObjectGuid, 96, 119> NameplateAttachToGUID; // When set, nameplate of this unit will instead appear on that object
- UpdateFieldArray<uint32, 2, 120, 121> NpcFlags;
+ UpdateField<int32, 96, 109> Field_220;
+ UpdateField<uint32, 96, 110> BattlePetCompanionNameTimestamp;
+ UpdateField<int32, 96, 111> InteractSpellID;
+ UpdateField<int32, 96, 112> ScaleDuration;
+ UpdateField<int32, 96, 113> LooksLikeMountID;
+ UpdateField<int32, 96, 114> LooksLikeCreatureID;
+ UpdateField<int32, 96, 115> LookAtControllerID;
+ UpdateField<int32, 96, 116> TaxiNodesID;
+ UpdateField<ObjectGuid, 96, 117> GuildGUID;
+ UpdateField<ObjectGuid, 96, 118> SkinningOwnerGUID;
+ UpdateField<uint32, 96, 119> SilencedSchoolMask;
+ UpdateField<ObjectGuid, 96, 120> NameplateAttachToGUID; // When set, nameplate of this unit will instead appear on that object
+ UpdateFieldArray<uint32, 2, 121, 122> NpcFlags;
struct NpcFlagsTag : ViewerDependentValueTag<uint32> {};
- UpdateFieldArray<int32, 6, 123, 124> Power;
- UpdateFieldArray<int32, 6, 123, 130> MaxPower;
- UpdateFieldArray<float, 6, 123, 136> PowerRegenFlatModifier;
- UpdateFieldArray<float, 6, 123, 142> PowerRegenInterruptedFlatModifier;
- UpdateFieldArray<UF::VisibleItem, 3, 148, 149> VirtualItems;
- UpdateFieldArray<uint32, 2, 152, 153> AttackRoundBaseTime;
- UpdateFieldArray<int32, 4, 155, 156> Stats;
- UpdateFieldArray<int32, 4, 155, 160> StatPosBuff;
- UpdateFieldArray<int32, 4, 155, 164> StatNegBuff;
- UpdateFieldArray<int32, 7, 168, 169> Resistances;
- UpdateFieldArray<int32, 7, 168, 176> BonusResistanceMods;
- UpdateFieldArray<int32, 7, 168, 183> ManaCostModifier;
+ UpdateFieldArray<int32, 7, 124, 125> Power;
+ UpdateFieldArray<int32, 7, 124, 132> MaxPower;
+ UpdateFieldArray<float, 7, 124, 139> PowerRegenFlatModifier;
+ UpdateFieldArray<float, 7, 124, 146> PowerRegenInterruptedFlatModifier;
+ UpdateFieldArray<UF::VisibleItem, 3, 153, 154> VirtualItems;
+ UpdateFieldArray<uint32, 2, 157, 158> AttackRoundBaseTime;
+ UpdateFieldArray<int32, 4, 160, 161> Stats;
+ UpdateFieldArray<int32, 4, 160, 165> StatPosBuff;
+ UpdateFieldArray<int32, 4, 160, 169> StatNegBuff;
+ UpdateFieldArray<int32, 7, 173, 174> Resistances;
+ UpdateFieldArray<int32, 7, 173, 181> BonusResistanceMods;
+ UpdateFieldArray<int32, 7, 173, 188> 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;
@@ -523,7 +524,7 @@ struct RestInfo : public IsUpdateFieldStructureTag, public HasChangesMask<3>
void ClearChangesMask();
};
-struct PVPInfo : public IsUpdateFieldStructureTag, public HasChangesMask<11>
+struct PVPInfo : public IsUpdateFieldStructureTag, public HasChangesMask<13>
{
UpdateField<bool, 0, 1> Disqualified;
UpdateField<uint32, 0, 2> WeeklyPlayed;
@@ -535,6 +536,8 @@ struct PVPInfo : public IsUpdateFieldStructureTag, public HasChangesMask<11>
UpdateField<uint32, 0, 8> SeasonBestRating;
UpdateField<uint32, 0, 9> PvpTierID;
UpdateField<uint32, 0, 10> WeeklyBestWinPvpTierID;
+ UpdateField<uint32, 0, 11> Field_28;
+ UpdateField<uint32, 0, 12> Field_2C;
void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const;
@@ -651,7 +654,7 @@ struct ReplayedQuest : public IsUpdateFieldStructureTag, public HasChangesMask<3
void ClearChangesMask();
};
-struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1557>
+struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1554>
{
UpdateField<bool, 0, 1> BackpackAutoSortDisabled;
UpdateField<bool, 0, 2> BankAutoSortDisabled;
@@ -761,24 +764,23 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas
UpdateField<int16, 98, 110> DEBUGSoulbindConduitRank;
UpdateField<WorldPackets::MythicPlus::DungeonScoreData, 98, 111> DungeonScore;
UpdateFieldArray<ObjectGuid, 199, 112, 113> InvSlots;
- UpdateFieldArray<uint32, 2, 312, 313> TrackResourceMask;
- UpdateFieldArray<uint64, 240, 315, 316> ExploredZones;
- UpdateFieldArray<UF::RestInfo, 2, 556, 557> RestInfo;
- UpdateFieldArray<int32, 7, 559, 560> ModDamageDonePos;
- UpdateFieldArray<int32, 7, 559, 567> ModDamageDoneNeg;
- UpdateFieldArray<float, 7, 559, 574> ModDamageDonePercent;
- UpdateFieldArray<float, 7, 559, 581> ModHealingDonePercent;
- UpdateFieldArray<float, 3, 588, 589> WeaponDmgMultipliers;
- UpdateFieldArray<float, 3, 588, 592> WeaponAtkSpeedMultipliers;
- UpdateFieldArray<uint32, 12, 595, 596> BuybackPrice;
- UpdateFieldArray<uint32, 12, 595, 608> BuybackTimestamp;
- UpdateFieldArray<int32, 32, 620, 621> CombatRatings;
- UpdateFieldArray<UF::PVPInfo, 6, 653, 654> PvpInfo;
- UpdateFieldArray<uint32, 4, 660, 661> NoReagentCostMask;
- UpdateFieldArray<int32, 2, 665, 666> ProfessionSkillLine;
- UpdateFieldArray<uint32, 4, 668, 669> BagSlotFlags;
- UpdateFieldArray<uint32, 7, 673, 674> BankBagSlotFlags;
- UpdateFieldArray<uint64, 875, 681, 682> QuestCompleted;
+ UpdateFieldArray<uint64, 240, 312, 313> ExploredZones;
+ UpdateFieldArray<UF::RestInfo, 2, 553, 554> RestInfo;
+ UpdateFieldArray<int32, 7, 556, 557> ModDamageDonePos;
+ UpdateFieldArray<int32, 7, 556, 564> ModDamageDoneNeg;
+ UpdateFieldArray<float, 7, 556, 571> ModDamageDonePercent;
+ UpdateFieldArray<float, 7, 556, 578> ModHealingDonePercent;
+ UpdateFieldArray<float, 3, 585, 586> WeaponDmgMultipliers;
+ UpdateFieldArray<float, 3, 585, 589> WeaponAtkSpeedMultipliers;
+ UpdateFieldArray<uint32, 12, 592, 593> BuybackPrice;
+ UpdateFieldArray<uint32, 12, 592, 605> BuybackTimestamp;
+ UpdateFieldArray<int32, 32, 617, 618> CombatRatings;
+ UpdateFieldArray<UF::PVPInfo, 6, 650, 651> PvpInfo;
+ UpdateFieldArray<uint32, 4, 657, 658> NoReagentCostMask;
+ UpdateFieldArray<int32, 2, 662, 663> ProfessionSkillLine;
+ UpdateFieldArray<uint32, 4, 665, 666> BagSlotFlags;
+ UpdateFieldArray<uint32, 7, 670, 671> BankBagSlotFlags;
+ UpdateFieldArray<uint64, 875, 678, 679> QuestCompleted;
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;
@@ -867,7 +869,19 @@ struct ScaleCurve : public IsUpdateFieldStructureTag, public HasChangesMask<7>
void ClearChangesMask();
};
-struct AreaTriggerData : public IsUpdateFieldStructureTag, public HasChangesMask<14>
+struct VisualAnim : public IsUpdateFieldStructureTag, public HasChangesMask<5>
+{
+ UpdateField<bool, 0, 1> Field_C;
+ UpdateField<uint32, 0, 2> AnimationDataID;
+ UpdateField<uint32, 0, 3> AnimKitID;
+ UpdateField<uint32, 0, 4> AnimProgress;
+
+ void WriteCreate(ByteBuffer& data, AreaTrigger const* owner, Player const* receiver) const;
+ void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, AreaTrigger const* owner, Player const* receiver) const;
+ void ClearChangesMask();
+};
+
+struct AreaTriggerData : public IsUpdateFieldStructureTag, public HasChangesMask<16>
{
UpdateField<UF::ScaleCurve, 0, 1> OverrideScaleCurve;
UpdateField<UF::ScaleCurve, 0, 2> ExtraScaleCurve;
@@ -882,6 +896,8 @@ struct AreaTriggerData : public IsUpdateFieldStructureTag, public HasChangesMask
UpdateField<float, 0, 11> BoundsRadius2D;
UpdateField<uint32, 0, 12> DecalPropertiesID;
UpdateField<ObjectGuid, 0, 13> CreatingEffectGUID;
+ UpdateField<ObjectGuid, 0, 14> Field_80;
+ UpdateField<UF::VisualAnim, 0, 15> 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;
@@ -933,7 +949,7 @@ struct ConversationActor : public IsUpdateFieldStructureTag
bool operator!=(ConversationActor const& right) const { return !(*this == right); }
};
-struct ConversationData : public IsUpdateFieldStructureTag, public HasChangesMask<6>
+struct ConversationData : public IsUpdateFieldStructureTag, public HasChangesMask<7>
{
UpdateField<bool, 0, 1> DontPlayBroadcastTextSounds;
UpdateField<std::vector<UF::ConversationLine>, 0, 2> Lines;
@@ -941,6 +957,7 @@ struct ConversationData : public IsUpdateFieldStructureTag, public HasChangesMas
UpdateField<int32, 0, 4> LastLineEndTime;
struct LastLineEndTimeTag : ViewerDependentValueTag<int32> {};
UpdateField<uint32, 0, 5> Progress;
+ UpdateField<uint32, 0, 6> Flags;
void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Conversation const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Conversation const* owner, Player const* receiver) const;
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 2fb445583cc..24d2fd3f033 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -17703,7 +17703,7 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder* holder)
// "position_x, position_y, position_z, map, orientation, taximask, createTime, createMode, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, "
// "resettalents_time, primarySpecialization, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, "
// "totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, "
- // "health, power1, power2, power3, power4, power5, power6, instance_id, activeTalentGroup, lootSpecId, exploredZones, knownTitles, actionBars, raidDifficulty, legacyRaidDifficulty, fishingSteps, "
+ // "health, power1, power2, power3, power4, power5, power6, power7, instance_id, activeTalentGroup, lootSpecId, exploredZones, knownTitles, actionBars, raidDifficulty, legacyRaidDifficulty, fishingSteps, "
// "honor, honorLevel, honorRestState, honorRestBonus, numRespecs "
// "FROM characters c LEFT JOIN character_fishingsteps cfs ON c.guid = cfs.guid WHERE c.guid = ?", CONNECTION_ASYNC);
@@ -21487,7 +21487,7 @@ void Player::_SaveStats(CharacterDatabaseTransaction& trans) const
stmt->setUInt32(index++, GetMaxHealth());
for (uint8 i = 0; i < MAX_POWERS_PER_CLASS; ++i)
- stmt->setUInt32(index++, GetMaxPower(Powers(i)));
+ stmt->setUInt32(index++, m_unitData->MaxPower[i]);
for (uint8 i = 0; i < MAX_STATS; ++i)
stmt->setUInt32(index++, GetStat(Stats(i)));
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 252cb202ffc..2f1c19b1fa2 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -2685,9 +2685,6 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void AddTrackCreatureFlag(uint32 flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::TrackCreatureMask), flags); }
void RemoveTrackCreatureFlag(uint32 flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::TrackCreatureMask), flags); }
- void AddTrackResourceFlag(uint32 index, uint32 flags) { SetUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::TrackResourceMask, index), flags); }
- void RemoveTrackResourceFlag(uint32 index, uint32 flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::TrackResourceMask, index), flags); }
-
void SetVersatilityBonus(float value) { SetUpdateFieldStatValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::VersatilityBonus), value); }
void ApplyModOverrideSpellPowerByAPPercent(float mod, bool apply) { ApplyModUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::OverrideSpellPowerByAPPercent), mod, apply); }
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index 6ecad771c96..e5ad3203c63 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -286,7 +286,7 @@ enum Powers : int8
POWER_HEALTH = -2 // (-2 as signed value)
};
-#define MAX_POWERS_PER_CLASS 6
+#define MAX_POWERS_PER_CLASS 7
enum SpellSchools : uint16
{
diff --git a/src/server/game/Server/Packets/MythicPlusPacketsCommon.cpp b/src/server/game/Server/Packets/MythicPlusPacketsCommon.cpp
index 91206bbb847..fd20e6fd25c 100644
--- a/src/server/game/Server/Packets/MythicPlusPacketsCommon.cpp
+++ b/src/server/game/Server/Packets/MythicPlusPacketsCommon.cpp
@@ -24,7 +24,7 @@ namespace MythicPlus
ByteBuffer& operator<<(ByteBuffer& data, DungeonScoreMapSummary const& dungeonScoreMapSummary)
{
data << int32(dungeonScoreMapSummary.ChallengeModeID);
- data << int32(dungeonScoreMapSummary.MapScore);
+ data << float(dungeonScoreMapSummary.MapScore);
data << int32(dungeonScoreMapSummary.BestRunLevel);
data << int32(dungeonScoreMapSummary.BestRunDurationMS);
data.WriteBit(dungeonScoreMapSummary.FinishedSuccess);
@@ -35,7 +35,7 @@ ByteBuffer& operator<<(ByteBuffer& data, DungeonScoreMapSummary const& dungeonSc
ByteBuffer& operator<<(ByteBuffer& data, DungeonScoreSummary const& dungeonScoreSummary)
{
- data << int32(dungeonScoreSummary.CurrentSeasonScore);
+ data << float(dungeonScoreSummary.CurrentSeasonScore);
data << uint32(dungeonScoreSummary.Runs.size());
for (DungeonScoreMapSummary const& dungeonScoreMapSummary : dungeonScoreSummary.Runs)
data << dungeonScoreMapSummary;
@@ -70,7 +70,7 @@ ByteBuffer& operator<<(ByteBuffer& data, MythicPlusRun const& mythicPlusRun)
data << int32(mythicPlusRun.Season);
data.append(mythicPlusRun.KeystoneAffixIDs.data(), mythicPlusRun.KeystoneAffixIDs.size());
data << uint32(mythicPlusRun.Members.size());
- data << int32(mythicPlusRun.RunScore);
+ data << float(mythicPlusRun.RunScore);
for (MythicPlusMember const& member : mythicPlusRun.Members)
data << member;
@@ -83,7 +83,7 @@ ByteBuffer& operator<<(ByteBuffer& data, MythicPlusRun const& mythicPlusRun)
ByteBuffer& operator<<(ByteBuffer& data, DungeonScoreBestRunForAffix const& dungeonScoreBestRunForAffix)
{
data << int32(dungeonScoreBestRunForAffix.KeystoneAffixID);
- data << int32(dungeonScoreBestRunForAffix.Score);
+ data << float(dungeonScoreBestRunForAffix.Score);
data << dungeonScoreBestRunForAffix.Run;
return data;
@@ -93,7 +93,7 @@ ByteBuffer& operator<<(ByteBuffer& data, DungeonScoreMapData const& dungeonScore
{
data << int32(dungeonScoreMapData.MapChallengeModeID);
data << uint32(dungeonScoreMapData.BestRuns.size());
- data << int32(dungeonScoreMapData.OverAllScore);
+ data << float(dungeonScoreMapData.OverAllScore);
for (DungeonScoreBestRunForAffix const& bestRun : dungeonScoreMapData.BestRuns)
data << bestRun;
@@ -104,7 +104,7 @@ ByteBuffer& operator<<(ByteBuffer& data, DungeonScoreSeasonData const& dungeonSc
{
data << int32(dungeonScoreSeasonData.Season);
data << uint32(dungeonScoreSeasonData.Maps.size());
- data << int32(dungeonScoreSeasonData.SeasonScore);
+ data << float(dungeonScoreSeasonData.SeasonScore);
for (DungeonScoreMapData const& map : dungeonScoreSeasonData.Maps)
data << map;
diff --git a/src/server/game/Server/Packets/MythicPlusPacketsCommon.h b/src/server/game/Server/Packets/MythicPlusPacketsCommon.h
index dc48360aea7..b0ada2e947e 100644
--- a/src/server/game/Server/Packets/MythicPlusPacketsCommon.h
+++ b/src/server/game/Server/Packets/MythicPlusPacketsCommon.h
@@ -29,7 +29,7 @@ namespace WorldPackets
struct DungeonScoreMapSummary
{
int32 ChallengeModeID = 0;
- int32 MapScore = 0;
+ float MapScore = 0;
int32 BestRunLevel = 0;
int32 BestRunDurationMS = 0;
bool FinishedSuccess = false;
@@ -37,7 +37,7 @@ namespace WorldPackets
struct DungeonScoreSummary
{
- int32 CurrentSeasonScore = 0;
+ float CurrentSeasonScore = 0;
std::vector<DungeonScoreMapSummary> Runs;
};
@@ -66,7 +66,7 @@ namespace WorldPackets
Timestamp<> CompletionDate;
int32 Season;
std::vector<MythicPlusMember> Members;
- int32 RunScore;
+ float RunScore;
std::array<int32, 4> KeystoneAffixIDs;
};
@@ -74,14 +74,14 @@ namespace WorldPackets
{
int32 KeystoneAffixID = 0;
MythicPlusRun Run;
- int32 Score = 0;
+ float Score = 0;
};
struct DungeonScoreMapData
{
int32 MapChallengeModeID = 0;
std::vector<DungeonScoreBestRunForAffix> BestRuns;
- int32 OverAllScore = 0;
+ float OverAllScore = 0;
};
@@ -89,7 +89,7 @@ namespace WorldPackets
{
int32 Season = 0;
std::vector<DungeonScoreMapData> Maps;
- int32 SeasonScore = 0;
+ float SeasonScore = 0;
};
struct DungeonScoreData
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index 691b54a3f03..a9bfb2cdb82 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -113,7 +113,7 @@ NonDefaultConstructible<pAuraEffectHandler> AuraEffectHandler[TOTAL_AURAS]=
&AuraEffect::HandleNoImmediateEffect, // 42 SPELL_AURA_PROC_TRIGGER_SPELL implemented in AuraEffect::HandleProc
&AuraEffect::HandleNoImmediateEffect, // 43 SPELL_AURA_PROC_TRIGGER_DAMAGE implemented in AuraEffect::HandleProc
&AuraEffect::HandleAuraTrackCreatures, // 44 SPELL_AURA_TRACK_CREATURES
- &AuraEffect::HandleAuraTrackResources, // 45 SPELL_AURA_TRACK_RESOURCES
+ &AuraEffect::HandleNULL, // 45 SPELL_AURA_TRACK_RESOURCES implemented clientside
&AuraEffect::HandleNULL, // 46 SPELL_AURA_46 (used in test spells 54054 and 54058, and spell 48050) (3.0.8a)
&AuraEffect::HandleAuraModParryPercent, // 47 SPELL_AURA_MOD_PARRY_PERCENT
&AuraEffect::HandleNULL, // 48 SPELL_AURA_48 spell Napalm (area damage spell with additional delayed damage effect)
@@ -2386,24 +2386,6 @@ void AuraEffect::HandleAuraTrackCreatures(AuraApplication const* aurApp, uint8 m
target->RemoveTrackCreatureFlag(uint32(1) << (GetMiscValue() - 1));
}
-void AuraEffect::HandleAuraTrackResources(AuraApplication const* aurApp, uint8 mode, bool apply) const
-{
- if (!(mode & AURA_EFFECT_HANDLE_SEND_FOR_CLIENT_MASK))
- return;
-
- Player* target = aurApp->GetTarget()->ToPlayer();
- if (!target)
- return;
-
- uint32 bitIndex = GetMiscValue() - 1;
- uint32 index = bitIndex / 32;
- uint32 flag = 1 << (bitIndex % 32);
- if (apply)
- target->AddTrackResourceFlag(index, flag);
- else
- target->RemoveTrackResourceFlag(index, flag);
-}
-
void AuraEffect::HandleAuraTrackStealthed(AuraApplication const* aurApp, uint8 mode, bool apply) const
{
if (!(mode & AURA_EFFECT_HANDLE_SEND_FOR_CLIENT_MASK))
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h
index bc9f3c5ff18..7f62550a250 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.h
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.h
@@ -167,7 +167,6 @@ class TC_GAME_API AuraEffect
void HandleAuraDisableAttackingExceptAbilities(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleAuraModNoActions(AuraApplication const* aurApp, uint8 mode, bool apply) const;
// tracking
- void HandleAuraTrackResources(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleAuraTrackCreatures(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleAuraTrackStealthed(AuraApplication const* aurApp, uint8 mode, bool apply) const;
void HandleAuraModStalked(AuraApplication const* aurApp, uint8 mode, bool apply) const;