diff options
author | Aqua Deus <95978183+aquadeus@users.noreply.github.com> | 2023-08-20 21:07:21 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-20 21:07:21 +0200 |
commit | 789dbb6e150d199cb22bd6008e5ae1c624abcdeb (patch) | |
tree | 5dcf4bb276fae400d30f55cdb2271005d3d40a43 /src | |
parent | 119200b74582bc90cc75ebd60873a3d9afb77fa0 (diff) |
Scripts/Spells: Implement Ardent Defender (#29189)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Spells/spell_paladin.cpp | 126 |
1 files changed, 44 insertions, 82 deletions
diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index e561f11f268..842454065b5 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -38,6 +38,7 @@ enum PaladinSpells { + SPELL_PALADIN_ARDENT_DEFENDER_HEAL = 66235, SPELL_PALADIN_ART_OF_WAR_TRIGGERED = 231843, SPELL_PALADIN_AVENGERS_SHIELD = 31935, SPELL_PALADIN_AVENGING_WRATH = 31884, @@ -124,7 +125,7 @@ enum PaladinSpellVisual PALADIN_VISUAL_SPELL_HOLY_SHOCK_DAMAGE = 83731, PALADIN_VISUAL_SPELL_HOLY_SHOCK_DAMAGE_CRIT = 83881, PALADIN_VISUAL_SPELL_HOLY_SHOCK_HEAL = 83732, - PALADIN_VISUAL_SPELL_HOLY_SHOCK_HEAL_CRIT = 83880, + PALADIN_VISUAL_SPELL_HOLY_SHOCK_HEAL_CRIT = 83880 }; enum PaladinSpellLabel @@ -132,6 +133,47 @@ enum PaladinSpellLabel SPELL_LABEL_PALADIN_T30_2P_HEARTFIRE = 2598 }; +// 31850 - Ardent Defender +class spell_pal_ardent_defender : public AuraScript +{ + bool Validate(SpellInfo const* spellInfo) override + { + return ValidateSpellInfo({ SPELL_PALADIN_ARDENT_DEFENDER_HEAL }) + && ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } }); + } + + void HandleAbsorb(AuraEffect const* aurEff, DamageInfo const& dmgInfo, uint32& absorbAmount) + { + PreventDefaultAction(); + + int32 targetHealthPercent = GetEffectInfo(EFFECT_1).CalcValue(GetTarget()); + uint64 targetHealth = int32(GetTarget()->CountPctFromMaxHealth(targetHealthPercent)); + if (GetTarget()->HealthBelowPct(targetHealthPercent)) + { + // we are currently below desired health + // absorb everything and heal up + absorbAmount = dmgInfo.GetDamage(); + + GetTarget()->CastSpell(GetTarget(), SPELL_PALADIN_ARDENT_DEFENDER_HEAL, + CastSpellExtraArgs(aurEff) + .AddSpellMod(SPELLVALUE_BASE_POINT0, int32(targetHealth - GetTarget()->GetHealth()))); + } + else + { + // we are currently above desired health + // just absorb enough to reach that percentage + absorbAmount = dmgInfo.GetDamage() - int32(GetTarget()->GetHealth() - targetHealth); + } + + Remove(); + } + + void Register() override + { + OnEffectAbsorb += AuraEffectAbsorbOverkillFn(spell_pal_ardent_defender::HandleAbsorb, EFFECT_2); + } +}; + // 267344 - Art of War class spell_pal_art_of_war : public AuraScript { @@ -213,86 +255,6 @@ private: Milliseconds _period; }; -/* -// -31850 - Ardent Defender -class spell_pal_ardent_defender : public SpellScriptLoader -{ - public: - spell_pal_ardent_defender() : SpellScriptLoader("spell_pal_ardent_defender") { } - - class spell_pal_ardent_defender_AuraScript : public AuraScript - { - uint32 _absorbPct = 0; - uint32 _healPct = 0; - - enum Spell - { - PAL_SPELL_ARDENT_DEFENDER_HEAL = 66235 - }; - - bool Validate(SpellInfo const* spellInfo) override - { - return ValidateSpellInfo({ PAL_SPELL_ARDENT_DEFENDER_HEAL }); - } - - bool Load() override - { - _absorbPct = GetSpellInfo()->Effects[EFFECT_0].CalcValue(); - _healPct = GetSpellInfo()->Effects[EFFECT_1].CalcValue(); - return GetUnitOwner()->GetTypeId() == TYPEID_PLAYER; - } - - void CalculateAmount(AuraEffect const* aurEff, int32 & amount, bool & canBeRecalculated) - { - // Set absorbtion amount to unlimited - amount = -1; - } - - void Absorb(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount) - { - Unit* victim = GetTarget(); - int32 remainingHealth = victim->GetHealth() - dmgInfo.GetDamage(); - uint32 allowedHealth = victim->CountPctFromMaxHealth(35); - // If damage kills us - if (remainingHealth <= 0 && !victim->ToPlayer()->HasSpellCooldown(PAL_SPELL_ARDENT_DEFENDER_HEAL)) - { - // Cast healing spell, completely avoid damage - absorbAmount = dmgInfo.GetDamage(); - - float defenseSkillValue = victim->GetDefenseSkillValue(); - // Max heal when defense skill denies critical hits from raid bosses - // Formula: max defense at level + 140 (raiting from gear) - float reqDefForMaxHeal = victim->GetMaxSkillValueForLevel() + 140.0f; - float defenseFactor = std::min(1.0f, defenseSkillValue / reqDefForMaxHeal); - - int32 healAmount = int32(victim->CountPctFromMaxHealth(static_cast<uint32>(lroundf(_healPct * defenseFactor)))); - victim->CastCustomSpell(victim, PAL_SPELL_ARDENT_DEFENDER_HEAL, &healAmount, nullptr, nullptr, true, nullptr, aurEff); - victim->ToPlayer()->AddSpellCooldown(PAL_SPELL_ARDENT_DEFENDER_HEAL, 0, GameTime::GetGameTime() + 120); - } - else if (remainingHealth < int32(allowedHealth)) - { - // Reduce damage that brings us under 35% (or full damage if we are already under 35%) by x% - uint32 damageToReduce = (victim->GetHealth() < allowedHealth) - ? dmgInfo.GetDamage() - : allowedHealth - remainingHealth; - absorbAmount = CalculatePct(damageToReduce, _absorbPct); - } - } - - void Register() override - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pal_ardent_defender_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); - OnEffectAbsorb += AuraEffectAbsorbFn(spell_pal_ardent_defender_AuraScript::Absorb, EFFECT_0); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_pal_ardent_defender_AuraScript(); - } -}; -*/ - // 248033 - Awakening class spell_pal_awakening : public AuraScript { @@ -1577,7 +1539,7 @@ class spell_pal_zeal : public AuraScript void AddSC_paladin_spell_scripts() { - //new spell_pal_ardent_defender(); + RegisterSpellScript(spell_pal_ardent_defender); RegisterSpellScript(spell_pal_art_of_war); RegisterAreaTriggerAI(areatrigger_pal_ashen_hallow); RegisterSpellScript(spell_pal_awakening); |