diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/scripts/Spells/spell_dk.cpp | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp index e27d46c1b82..1d3b0a84087 100644 --- a/src/server/scripts/Spells/spell_dk.cpp +++ b/src/server/scripts/Spells/spell_dk.cpp @@ -78,12 +78,16 @@ enum DeathKnightSpells SPELL_DK_OBLITERATION_RUNE_ENERGIZE = 281327, SPELL_DK_PILLAR_OF_FROST = 51271, SPELL_DK_RAISE_DEAD_SUMMON = 52150, + SPELL_DK_REAPER_OF_SOULS_PROC = 469172, + SPELL_DK_RUNIC_CORRUPTION = 51460, SPELL_DK_RECENTLY_USED_DEATH_STRIKE = 180612, SPELL_DK_RUNIC_POWER_ENERGIZE = 49088, SPELL_DK_RUNIC_RETURN = 61258, SPELL_DK_SLUDGE_BELCHER = 207313, SPELL_DK_SLUDGE_BELCHER_SUMMON = 212027, SPELL_DK_SMOTHERING_OFFENSE = 435005, + SPELL_DK_SOUL_REAPER = 343294, + SPELL_DK_SOUL_REAPER_DAMAGE = 343295, SPELL_DK_SUBDUING_GRASP_TALENT = 454822, SPELL_DK_SUBDUING_GRASP_DEBUFF = 454824, SPELL_DK_DEATH_STRIKE_ENABLER = 89832, // Server Side @@ -1027,6 +1031,40 @@ class spell_dk_raise_dead : public SpellScript } }; +// 440002 - Reaper of Souls (attached to 343294 - Soul Reaper) +class spell_dk_reaper_of_souls : public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DK_REAPER_OF_SOULS_PROC }); + } + + bool IsAffectedByReaperOfSouls() const + { + if (Aura* reaperOfSouls = GetCaster()->GetAura(SPELL_DK_REAPER_OF_SOULS_PROC)) + return GetSpell()->m_appliedMods.contains(reaperOfSouls); + return false; + } + + void HandleDefault(WorldObject*& target) const + { + if (IsAffectedByReaperOfSouls()) + target = nullptr; + } + + void HandleReaperOfSouls(SpellEffIndex effIndex) + { + if (!IsAffectedByReaperOfSouls()) + PreventHitDefaultEffect(effIndex); + } + + void Register() override + { + OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dk_reaper_of_souls::HandleDefault, EFFECT_1, TARGET_UNIT_TARGET_ENEMY); + OnEffectLaunch += SpellEffectFn(spell_dk_reaper_of_souls::HandleReaperOfSouls, EFFECT_3, SPELL_EFFECT_TRIGGER_SPELL); + } +}; + // 59057 - Rime class spell_dk_rime : public AuraScript { @@ -1050,6 +1088,60 @@ class spell_dk_rime : public AuraScript } }; +// 343294 - Soul Reaper +// 469180 - Soul Reaper +class spell_dk_soul_reaper : public AuraScript +{ +public: + explicit spell_dk_soul_reaper(SpellEffIndex auraEffectIndex, Optional<SpellEffIndex> healthLimitEffectIndex) + : _auraEffectIndex(auraEffectIndex), _healthLimitEffectIndex(healthLimitEffectIndex) { } + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DK_SOUL_REAPER, SPELL_DK_SOUL_REAPER_DAMAGE, SPELL_DK_RUNIC_CORRUPTION }); + } + + void HandleOnTick(AuraEffect const* aurEff) const + { + Unit* target = GetTarget(); + Unit* caster = GetCaster(); + if (!caster) + return; + + if (!_healthLimitEffectIndex || target->GetHealthPct() < float(GetEffectInfo(*_healthLimitEffectIndex).CalcValue(caster))) + caster->CastSpell(target, SPELL_DK_SOUL_REAPER_DAMAGE, CastSpellExtraArgsInit{ + .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR, + .TriggeringAura = aurEff + }); + } + + void RemoveEffect(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) const + { + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEATH) + return; + + Player* caster = Object::ToPlayer(GetCaster()); + if (!caster) + return; + + if (caster->isHonorOrXPTarget(GetTarget())) + caster->CastSpell(caster, SPELL_DK_RUNIC_CORRUPTION, CastSpellExtraArgsInit{ + .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR, + .TriggeringAura = aurEff + }); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_dk_soul_reaper::HandleOnTick, _auraEffectIndex, SPELL_AURA_PERIODIC_DUMMY); + AfterEffectRemove += AuraEffectRemoveFn(spell_dk_soul_reaper::RemoveEffect, _auraEffectIndex, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + +private: + SpellEffIndex _auraEffectIndex; + Optional<SpellEffIndex> _healthLimitEffectIndex; +}; + // Called by 383312 Abomination Limb and 49576 - Death Grip // 454822 - Subduing Grasp class spell_dk_subduing_grasp : public SpellScript @@ -1197,7 +1289,10 @@ void AddSC_deathknight_spell_scripts() RegisterSpellScript(spell_dk_pet_skeleton_transform); RegisterSpellScript(spell_dk_pvp_4p_bonus); RegisterSpellScript(spell_dk_raise_dead); + RegisterSpellScript(spell_dk_reaper_of_souls); RegisterSpellScript(spell_dk_rime); + RegisterSpellScriptWithArgs(spell_dk_soul_reaper, "spell_dk_soul_reaper", EFFECT_1, EFFECT_2); + RegisterSpellScriptWithArgs(spell_dk_soul_reaper, "spell_dk_soul_reaper_reaper_of_souls", EFFECT_0, Optional<SpellEffIndex>()); RegisterSpellScript(spell_dk_subduing_grasp); RegisterSpellScript(spell_dk_t20_2p_rune_empowered); RegisterSpellScript(spell_dk_vampiric_blood); |
