From 22b8067bd3d770a23f8ad4ba5efb0959352ae64f Mon Sep 17 00:00:00 2001 From: Aqua Deus <95978183+aquadeus@users.noreply.github.com> Date: Sun, 8 Feb 2026 23:06:32 +0100 Subject: [PATCH] Core/Auras: Implement SPELL_AURA_CONVERT_CRIT_RATING_PCT_TO_PARRY_RATING (#31531) --- src/server/game/Entities/Player/Player.cpp | 4 ++++ src/server/game/Spells/Auras/SpellAuraDefines.h | 2 +- src/server/game/Spells/Auras/SpellAuraEffects.cpp | 14 +++++++++++++- src/server/game/Spells/Auras/SpellAuraEffects.h | 1 + 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index a46dd0da17..b12117480b 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -5333,6 +5333,9 @@ void Player::UpdateRating(CombatRating cr) if (aurEff->GetMiscValue() & (1 << cr)) amount += int32(CalculatePct(amount, aurEff->GetAmount())); + if (cr == CR_PARRY) + amount += m_baseRatingValue[CR_CRIT_MELEE] * (GetTotalAuraMultiplier(SPELL_AURA_CONVERT_CRIT_RATING_PCT_TO_PARRY_RATING) - 1.0f); + if (amount < 0) amount = 0; @@ -5370,6 +5373,7 @@ void Player::UpdateRating(CombatRating cr) UpdateCritPercentage(BASE_ATTACK); UpdateCritPercentage(OFF_ATTACK); } + UpdateRating(CR_PARRY); break; case CR_CRIT_RANGED: if (affectStats) diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index 5e1e7c01a5..23a6b26224 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -547,7 +547,7 @@ enum AuraType : uint32 SPELL_AURA_RESET_COOLDOWNS_ON_DUEL_START = 460, // NYI SPELL_AURA_461 = 461, SPELL_AURA_MOD_HEALING_AND_ABSORB_FROM_CASTER = 462, // NYI - SPELL_AURA_CONVERT_CRIT_RATING_PCT_TO_PARRY_RATING = 463, // NYI + SPELL_AURA_CONVERT_CRIT_RATING_PCT_TO_PARRY_RATING = 463, SPELL_AURA_MOD_ATTACK_POWER_OF_BONUS_ARMOR = 464, // NYI SPELL_AURA_MOD_BONUS_ARMOR = 465, SPELL_AURA_MOD_BONUS_ARMOR_PCT = 466, // Affects bonus armor gain from all sources except base stats diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 1d8bc7eb42..65408d210e 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -532,7 +532,7 @@ NonDefaultConstructible AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleNULL, //460 SPELL_AURA_RESET_COOLDOWNS_ON_DUEL_START &AuraEffect::HandleNULL, //461 &AuraEffect::HandleNULL, //462 SPELL_AURA_MOD_HEALING_AND_ABSORB_FROM_CASTER - &AuraEffect::HandleNULL, //463 SPELL_AURA_CONVERT_CRIT_RATING_PCT_TO_PARRY_RATING used by Riposte + &AuraEffect::HandleConvertCritToParry, //463 SPELL_AURA_CONVERT_CRIT_RATING_PCT_TO_PARRY_RATING used by Riposte &AuraEffect::HandleNULL, //464 SPELL_AURA_MOD_ATTACK_POWER_OF_BONUS_ARMOR &AuraEffect::HandleModBonusArmor, //465 SPELL_AURA_MOD_BONUS_ARMOR &AuraEffect::HandleModBonusArmorPercent, //466 SPELL_AURA_MOD_BONUS_ARMOR_PCT @@ -4050,6 +4050,18 @@ void AuraEffect::HandleAuraModMaxPower(AuraApplication const* aurApp, uint8 mode target->HandleStatFlatModifier(unitMod, TOTAL_VALUE, float(GetAmount()), apply); } +void AuraEffect::HandleConvertCritToParry(AuraApplication const* aurApp, uint8 mode, bool /*apply*/) const +{ + if (!(mode & (AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK | AURA_EFFECT_HANDLE_STAT))) + return; + + Player* target = aurApp->GetTarget()->ToPlayer(); + if (!target) + return; + + target->UpdateRating(CR_PARRY); +} + /********************************/ /*** HEAL & ENERGIZE ***/ /********************************/ diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h index f141df6e1d..97bc61885a 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.h +++ b/src/server/game/Spells/Auras/SpellAuraEffects.h @@ -253,6 +253,7 @@ class TC_GAME_API AuraEffect void HandleOverrideAttackPowerBySpellPower(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleModVersatilityByPct(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleAuraModMaxPower(AuraApplication const* aurApp, uint8 mode, bool apply) const; + void HandleConvertCritToParry(AuraApplication const* aurApp, uint8 mode, bool apply) const; // heal and energize void HandleModPowerRegen(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleModPowerRegenPCT(AuraApplication const* aurApp, uint8 mode, bool apply) const;