From 5c8a058120dcf2c3ff8592886cb842ca889e0411 Mon Sep 17 00:00:00 2001 From: Shauren Date: Thu, 4 Nov 2021 21:47:03 +0100 Subject: Core/PacketIO: 9.1.5 updatefields and SMSG_UPDATE_OBJECT structure --- .../game/Entities/AreaTrigger/AreaTrigger.cpp | 5 + src/server/game/Entities/Object/Object.cpp | 20 -- .../game/Entities/Object/Updates/UpdateFields.cpp | 243 ++++++++++++++------- .../game/Entities/Object/Updates/UpdateFields.h | 111 ++++++---- src/server/game/Entities/Player/Player.cpp | 4 +- src/server/game/Entities/Player/Player.h | 3 - src/server/game/Miscellaneous/SharedDefines.h | 2 +- .../Server/Packets/MythicPlusPacketsCommon.cpp | 12 +- .../game/Server/Packets/MythicPlusPacketsCommon.h | 12 +- src/server/game/Spells/Auras/SpellAuraEffects.cpp | 20 +- src/server/game/Spells/Auras/SpellAuraEffects.h | 1 - 11 files changed, 243 insertions(+), 190 deletions(-) (limited to 'src/server/game') 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 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 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 fieldVisi void UnitData::WriteUpdate(ByteBuffer& data, EnumFlag 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 fieldVisi void UnitData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag 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 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::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 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); @@ -3963,150 +3977,140 @@ 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 fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const { OverrideScaleCurve->WriteCreate(data, owner, receiver); @@ -4697,7 +4752,9 @@ void AreaTriggerData::WriteCreate(ByteBuffer& data, EnumFlag 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 fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const @@ -4707,7 +4764,7 @@ void AreaTriggerData::WriteUpdate(ByteBuffer& data, EnumFlag 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 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 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, 0, 1> StateWorldEffectIDs; DynamicUpdateField PassiveSpells; @@ -364,31 +364,32 @@ struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<190> UpdateField MaxItemLevel; UpdateField AzeriteItemLevel; UpdateField WildBattlePetLevel; - UpdateField BattlePetCompanionNameTimestamp; - UpdateField InteractSpellID; - UpdateField ScaleDuration; - UpdateField LooksLikeMountID; - UpdateField LooksLikeCreatureID; - UpdateField LookAtControllerID; - UpdateField TaxiNodesID; - UpdateField GuildGUID; - UpdateField SkinningOwnerGUID; - UpdateField SilencedSchoolMask; - UpdateField NameplateAttachToGUID; // When set, nameplate of this unit will instead appear on that object - UpdateFieldArray NpcFlags; + UpdateField Field_220; + UpdateField BattlePetCompanionNameTimestamp; + UpdateField InteractSpellID; + UpdateField ScaleDuration; + UpdateField LooksLikeMountID; + UpdateField LooksLikeCreatureID; + UpdateField LookAtControllerID; + UpdateField TaxiNodesID; + UpdateField GuildGUID; + UpdateField SkinningOwnerGUID; + UpdateField SilencedSchoolMask; + UpdateField NameplateAttachToGUID; // When set, nameplate of this unit will instead appear on that object + UpdateFieldArray NpcFlags; struct NpcFlagsTag : ViewerDependentValueTag {}; - UpdateFieldArray Power; - UpdateFieldArray MaxPower; - UpdateFieldArray PowerRegenFlatModifier; - UpdateFieldArray PowerRegenInterruptedFlatModifier; - UpdateFieldArray VirtualItems; - UpdateFieldArray AttackRoundBaseTime; - UpdateFieldArray Stats; - UpdateFieldArray StatPosBuff; - UpdateFieldArray StatNegBuff; - UpdateFieldArray Resistances; - UpdateFieldArray BonusResistanceMods; - UpdateFieldArray ManaCostModifier; + UpdateFieldArray Power; + UpdateFieldArray MaxPower; + UpdateFieldArray PowerRegenFlatModifier; + UpdateFieldArray PowerRegenInterruptedFlatModifier; + UpdateFieldArray VirtualItems; + UpdateFieldArray AttackRoundBaseTime; + UpdateFieldArray Stats; + UpdateFieldArray StatPosBuff; + UpdateFieldArray StatNegBuff; + UpdateFieldArray Resistances; + UpdateFieldArray BonusResistanceMods; + UpdateFieldArray ManaCostModifier; void WriteCreate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, Unit const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag 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 Disqualified; UpdateField WeeklyPlayed; @@ -535,6 +536,8 @@ struct PVPInfo : public IsUpdateFieldStructureTag, public HasChangesMask<11> UpdateField SeasonBestRating; UpdateField PvpTierID; UpdateField WeeklyBestWinPvpTierID; + UpdateField Field_28; + UpdateField 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 BackpackAutoSortDisabled; UpdateField BankAutoSortDisabled; @@ -761,24 +764,23 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas UpdateField DEBUGSoulbindConduitRank; UpdateField DungeonScore; UpdateFieldArray InvSlots; - UpdateFieldArray TrackResourceMask; - UpdateFieldArray ExploredZones; - UpdateFieldArray RestInfo; - UpdateFieldArray ModDamageDonePos; - UpdateFieldArray ModDamageDoneNeg; - UpdateFieldArray ModDamageDonePercent; - UpdateFieldArray ModHealingDonePercent; - UpdateFieldArray WeaponDmgMultipliers; - UpdateFieldArray WeaponAtkSpeedMultipliers; - UpdateFieldArray BuybackPrice; - UpdateFieldArray BuybackTimestamp; - UpdateFieldArray CombatRatings; - UpdateFieldArray PvpInfo; - UpdateFieldArray NoReagentCostMask; - UpdateFieldArray ProfessionSkillLine; - UpdateFieldArray BagSlotFlags; - UpdateFieldArray BankBagSlotFlags; - UpdateFieldArray QuestCompleted; + UpdateFieldArray ExploredZones; + UpdateFieldArray RestInfo; + UpdateFieldArray ModDamageDonePos; + UpdateFieldArray ModDamageDoneNeg; + UpdateFieldArray ModDamageDonePercent; + UpdateFieldArray ModHealingDonePercent; + UpdateFieldArray WeaponDmgMultipliers; + UpdateFieldArray WeaponAtkSpeedMultipliers; + UpdateFieldArray BuybackPrice; + UpdateFieldArray BuybackTimestamp; + UpdateFieldArray CombatRatings; + UpdateFieldArray PvpInfo; + UpdateFieldArray NoReagentCostMask; + UpdateFieldArray ProfessionSkillLine; + UpdateFieldArray BagSlotFlags; + UpdateFieldArray BankBagSlotFlags; + UpdateFieldArray QuestCompleted; void WriteCreate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, Player const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag 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 Field_C; + UpdateField AnimationDataID; + UpdateField AnimKitID; + UpdateField 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 OverrideScaleCurve; UpdateField ExtraScaleCurve; @@ -882,6 +896,8 @@ struct AreaTriggerData : public IsUpdateFieldStructureTag, public HasChangesMask UpdateField BoundsRadius2D; UpdateField DecalPropertiesID; UpdateField CreatingEffectGUID; + UpdateField Field_80; + UpdateField VisualAnim; void WriteCreate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag 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 DontPlayBroadcastTextSounds; UpdateField, 0, 2> Lines; @@ -941,6 +957,7 @@ struct ConversationData : public IsUpdateFieldStructureTag, public HasChangesMas UpdateField LastLineEndTime; struct LastLineEndTimeTag : ViewerDependentValueTag {}; UpdateField Progress; + UpdateField Flags; void WriteCreate(ByteBuffer& data, EnumFlag fieldVisibilityFlags, Conversation const* owner, Player const* receiver) const; void WriteUpdate(ByteBuffer& data, EnumFlag 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 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 Runs; }; @@ -66,7 +66,7 @@ namespace WorldPackets Timestamp<> CompletionDate; int32 Season; std::vector Members; - int32 RunScore; + float RunScore; std::array 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 BestRuns; - int32 OverAllScore = 0; + float OverAllScore = 0; }; @@ -89,7 +89,7 @@ namespace WorldPackets { int32 Season = 0; std::vector 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 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; -- cgit v1.2.3