diff options
author | Shauren <shauren.trinity@gmail.com> | 2021-11-04 21:47:03 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-11-04 21:47:03 +0100 |
commit | 5c8a058120dcf2c3ff8592886cb842ca889e0411 (patch) | |
tree | 951397fd3cc69637d4c399510a725b9a3385a80d | |
parent | 792721ad6450065ec81da6472c1e2a143ad57341 (diff) |
Core/PacketIO: 9.1.5 updatefields and SMSG_UPDATE_OBJECT structure
-rw-r--r-- | sql/base/characters_database.sql | 5 | ||||
-rw-r--r-- | sql/updates/characters/master/2021_11_04_00_characters.sql | 2 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/CharacterDatabase.cpp | 12 | ||||
-rw-r--r-- | src/server/game/Entities/AreaTrigger/AreaTrigger.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 20 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Updates/UpdateFields.cpp | 243 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Updates/UpdateFields.h | 111 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 3 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/SharedDefines.h | 2 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MythicPlusPacketsCommon.cpp | 12 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MythicPlusPacketsCommon.h | 12 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 20 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.h | 1 |
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; |