From 854b9832eb4c11eedde791ce97d26248a18b8972 Mon Sep 17 00:00:00 2001 From: sogladev Date: Wed, 15 Apr 2026 13:02:45 +0200 Subject: [PATCH] fix(Core/Unit): Sanctified Wrath calculations `SPELL_AURA_MOD_IGNORE_TARGET_RESIST` (#25400) Co-authored-by: From: ariel- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/server/game/Entities/Unit/Unit.cpp | 61 ++++++------------- src/server/game/Entities/Unit/Unit.h | 2 +- .../game/Spells/Auras/SpellAuraDefines.h | 2 +- src/server/scripts/Commands/cs_spellinfo.cpp | 2 +- 4 files changed, 22 insertions(+), 45 deletions(-) diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index ddd99bb3f..9f8da4ece 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -2238,20 +2238,11 @@ uint32 Unit::CalcArmorReducedDamage(Unit const* attacker, Unit const* victim, co if (Player* modOwner = attacker->GetSpellModOwner()) modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_IGNORE_ARMOR, armor); - AuraEffectList const& ResIgnoreAurasAb = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST); - for (AuraEffectList::const_iterator j = ResIgnoreAurasAb.begin(); j != ResIgnoreAurasAb.end(); ++j) - { - if ((*j)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL - && (*j)->IsAffectedOnSpell(spellInfo)) - armor = std::floor(AddPct(armor, -(*j)->GetAmount())); - } - - AuraEffectList const& ResIgnoreAuras = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST); - for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j) - { - if ((*j)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL) - armor = std::floor(AddPct(armor, -(*j)->GetAmount())); - } + // Apply ability-specific ignore target resist effects for physical damage (armor) + AuraEffectList const& targetIgnoreRes = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST); + for (AuraEffect const* aurEff : targetIgnoreRes) + if (aurEff->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL && aurEff->IsAffectedOnSpell(spellInfo)) + armor = std::floor(AddPct(armor, -aurEff->GetAmount())); // Apply Player CR_ARMOR_PENETRATION rating and buffs from stances\specializations etc. if (attacker->IsPlayer()) @@ -2399,8 +2390,6 @@ void Unit::CalcAbsorbResist(DamageInfo& dmgInfo, bool Splited) return true; }); damageResisted -= damageResisted * (mult - 1.0f); - mult = attacker->GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_IGNORE_TARGET_RESIST, schoolMask); - damageResisted -= damageResisted * (mult - 1.0f); } // pussywizard: @@ -8986,21 +8975,15 @@ uint32 Unit::SpellDamageBonusTaken(Unit* caster, SpellInfo const* spellProto, ui TakenTotalMod = 1.0f; } - // xinef: sanctified wrath talent - if (caster && TakenTotalMod < 1.0f && caster->HasIgnoreTargetResistAura()) + // Sanctified Wrath (bypass damage reduction) + if (caster && TakenTotalMod < 1.0f && caster->HasIgnoreTargetResistModifiersAura()) { - float ignoreModifier = 1.0f - TakenTotalMod; - bool addModifier = false; - AuraEffectList const& ResIgnoreAuras = caster->GetAuraEffectsByType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST); - for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j) - if ((*j)->GetMiscValue() & spellProto->SchoolMask) - { - ApplyPct(ignoreModifier, (*j)->GetAmount()); - addModifier = true; - } + float damageModifier = 1.0f - TakenTotalMod; + for (AuraEffect const* aurEff : caster->GetAuraEffectsByType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST_MODIFIERS)) + if (aurEff->GetMiscValue() & spellProto->SchoolMask) + AddPct(damageModifier, -aurEff->GetAmount()); - if (addModifier) - TakenTotalMod += ignoreModifier; + TakenTotalMod = 1.0f - damageModifier; } float tmpDamage = (float(pdamage) + TakenTotal) * TakenTotalMod; @@ -10448,21 +10431,15 @@ uint32 Unit::MeleeDamageBonusTaken(Unit* attacker, uint32 pdamage, WeaponAttackT TakenTotalMod = 1.0f; } - // xinef: sanctified wrath talent - if (TakenTotalMod < 1.0f && attacker->HasIgnoreTargetResistAura()) + // Sanctified Wrath (bypass damage reduction) + if (TakenTotalMod < 1.0f && attacker->HasIgnoreTargetResistModifiersAura()) { - float ignoreModifier = 1.0f - TakenTotalMod; - bool addModifier = false; - AuraEffectList const& ResIgnoreAuras = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST); - for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j) - if ((*j)->GetMiscValue() & damageSchoolMask) - { - ApplyPct(ignoreModifier, (*j)->GetAmount()); - addModifier = true; - } + float damageModifier = 1.0f - TakenTotalMod; + for (AuraEffect const* aurEff : attacker->GetAuraEffectsByType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST_MODIFIERS)) + if (aurEff->GetMiscValue() & damageSchoolMask) + AddPct(damageModifier, -aurEff->GetAmount()); - if (addModifier) - TakenTotalMod += ignoreModifier; + TakenTotalMod = 1.0f - damageModifier; } float tmpDamage = (float(pdamage) + TakenFlatBenefit) * TakenTotalMod; diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 16034e29a..c8dff2f94 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1826,7 +1826,7 @@ public: [[nodiscard]] bool HasShapeshiftAura() const { return HasAuraType(SPELL_AURA_MOD_SHAPESHIFT); } [[nodiscard]] bool HasDecreaseSpeedAura() const { return HasAuraType(SPELL_AURA_MOD_DECREASE_SPEED); } [[nodiscard]] bool HasPacifyAura() const { return HasAuraType(SPELL_AURA_MOD_PACIFY); } - [[nodiscard]] bool HasIgnoreTargetResistAura() const { return HasAuraType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST); } + [[nodiscard]] bool HasIgnoreTargetResistModifiersAura() const { return HasAuraType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST_MODIFIERS); } [[nodiscard]] bool HasIncreaseMountedSpeedAura() const { return HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED); } [[nodiscard]] bool HasIncreaseMountedFlightSpeedAura() const { return HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED); } diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index ff34ae883..94b56501c 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -329,7 +329,7 @@ enum AuraType SPELL_AURA_266 = 266, SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL = 267, SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT = 268, - SPELL_AURA_MOD_IGNORE_TARGET_RESIST = 269, + SPELL_AURA_MOD_IGNORE_TARGET_RESIST_MODIFIERS = 269, // Sanctified Wrath, reduces effectiveness of a target's damage reduction effects like Shield Wall SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST = 270, // Possibly need swap vs 195 aura used only in 1 spell Chaos Bolt Passive SPELL_AURA_MOD_DAMAGE_FROM_CASTER = 271, SPELL_AURA_IGNORE_MELEE_RESET = 272, diff --git a/src/server/scripts/Commands/cs_spellinfo.cpp b/src/server/scripts/Commands/cs_spellinfo.cpp index 4b7b562df..f0a1014d9 100644 --- a/src/server/scripts/Commands/cs_spellinfo.cpp +++ b/src/server/scripts/Commands/cs_spellinfo.cpp @@ -494,7 +494,7 @@ public: case SPELL_AURA_266: return "SPELL_AURA_266"; case SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL: return "SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL"; case SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT: return "SPELL_AURA_MOD_ATTACK_POWER_OF_STAT_PERCENT"; - case SPELL_AURA_MOD_IGNORE_TARGET_RESIST: return "SPELL_AURA_MOD_IGNORE_TARGET_RESIST"; + case SPELL_AURA_MOD_IGNORE_TARGET_RESIST_MODIFIERS: return "SPELL_AURA_MOD_IGNORE_TARGET_RESIST_MODIFIERS"; case SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST: return "SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST"; case SPELL_AURA_MOD_DAMAGE_FROM_CASTER: return "SPELL_AURA_MOD_DAMAGE_FROM_CASTER"; case SPELL_AURA_IGNORE_MELEE_RESET: return "SPELL_AURA_IGNORE_MELEE_RESET";