diff options
author | Aqua Deus <95978183+aquadeus@users.noreply.github.com> | 2025-07-04 23:12:05 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-07-04 23:12:05 +0200 |
commit | a8e6866a027c5078662fb407c1bc647e0ebe6ce3 (patch) | |
tree | 5560a90d11ab6b5d80acd78d2997767abe07eca9 /src | |
parent | 8223ce647a385f21302a745ae49a62286b986cff (diff) |
Scripts/Spells: Implement warlock talent Channel Demonfire (#31112)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Spells/spell_warlock.cpp | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index 298325b073e..5a4c66db974 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -47,6 +47,9 @@ enum WarlockSpells SPELL_WARLOCK_BILESCOURGE_BOMBERS = 267211, SPELL_WARLOCK_BILESCOURGE_BOMBERS_MISSILE = 267212, SPELL_WARLOCK_BILESCOURGE_BOMBERS_AREATRIGGER = 282248, + SPELL_WARLOCK_CHANNEL_DEMONFIRE_ACTIVATOR = 228312, + SPELL_WARLOCK_CHANNEL_DEMONFIRE_DAMAGE = 281362, + SPELL_WARLOCK_CHANNEL_DEMONFIRE_SELECTOR = 196449, SPELL_WARLOCK_CONFLAGRATE_DEBUFF = 265931, SPELL_WARLOCK_CONFLAGRATE_ENERGIZE = 245330, SPELL_WARLOCK_CORRUPTION_DAMAGE = 146739, @@ -332,6 +335,99 @@ class spell_warl_cataclysm : public SpellScript } }; +// 228312 - Immolate (attached to 157736 - Immolate and 445474 - Wither) +class spell_warl_channel_demonfire_activator : public AuraScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_WARLOCK_CHANNEL_DEMONFIRE_ACTIVATOR }); + } + + void ApplyEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const + { + if (Unit* caster = GetCaster()) + caster->CastSpell(caster, SPELL_WARLOCK_CHANNEL_DEMONFIRE_ACTIVATOR, CastSpellExtraArgsInit{ + .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR, + .SpellValueOverrides = { { SPELLVALUE_DURATION, GetDuration() } } + }); + } + + void RemoveEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const + { + Unit* caster = GetCaster(); + if (!caster) + return; + + Unit* validTarget = nullptr; + Trinity::UnitAuraCheck check(true, GetId(), caster->GetGUID()); + Trinity::UnitSearcher searcher(caster, validTarget, check); + Cell::VisitAllObjects(caster, searcher, 100.f); + + if (!validTarget) + caster->RemoveAurasDueToSpell(SPELL_WARLOCK_CHANNEL_DEMONFIRE_ACTIVATOR); + } + + void Register() override + { + OnEffectApply += AuraEffectApplyFn(spell_warl_channel_demonfire_activator::ApplyEffect, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + OnEffectRemove += AuraEffectRemoveFn(spell_warl_channel_demonfire_activator::RemoveEffect, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); + } +}; + +// 196447 - Channel Demonfire +class spell_warl_channel_demonfire_periodic : public AuraScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_WARLOCK_CHANNEL_DEMONFIRE_SELECTOR }); + } + + void HandleEffectPeriodic(AuraEffect const* aurEff) const + { + if (Unit* caster = GetCaster()) + caster->CastSpell(caster, SPELL_WARLOCK_CHANNEL_DEMONFIRE_SELECTOR, CastSpellExtraArgsInit{ + .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR, + .TriggeringAura = aurEff + }); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_warl_channel_demonfire_periodic::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } +}; + +// 196449 - Channel Demonfire +class spell_warl_channel_demonfire_selector : public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo ({ SPELL_WARLOCK_CHANNEL_DEMONFIRE_DAMAGE, SPELL_WARLOCK_IMMOLATE_PERIODIC, SPELL_WARLOCK_WITHER_TALENT, SPELL_WARLOCK_IMMOLATE_PERIODIC }); + } + + void FilterTargets(std::list<WorldObject*>& targets) const + { + uint32 auraFilter = GetCaster()->HasAura(SPELL_WARLOCK_WITHER_TALENT) + ? SPELL_WARLOCK_WITHER_PERIODIC + : SPELL_WARLOCK_IMMOLATE_PERIODIC; + targets.remove_if(Trinity::UnitAuraCheck(false, auraFilter, GetCaster()->GetGUID())); + } + + void HandleDamage(SpellEffIndex /*effIndex*/) const + { + GetCaster()->CastSpell(GetHitUnit(), SPELL_WARLOCK_CHANNEL_DEMONFIRE_DAMAGE, CastSpellExtraArgsInit{ + .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR, + .TriggeringSpell = GetSpell() + }); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warl_channel_demonfire_selector::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); + OnEffectLaunchTarget += SpellEffectFn(spell_warl_channel_demonfire_selector::HandleDamage, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + // 116858 - Chaos Bolt class spell_warl_chaos_bolt : public SpellScript { @@ -1701,6 +1797,9 @@ void AddSC_warlock_spell_scripts() RegisterAreaTriggerAI(at_warl_bilescourge_bombers); RegisterSpellAndAuraScriptPair(spell_warl_burning_rush, spell_warl_burning_rush_aura); RegisterSpellScript(spell_warl_cataclysm); + RegisterSpellScript(spell_warl_channel_demonfire_activator); + RegisterSpellScript(spell_warl_channel_demonfire_periodic); + RegisterSpellScript(spell_warl_channel_demonfire_selector); RegisterSpellScript(spell_warl_chaos_bolt); RegisterSpellScript(spell_warl_chaotic_energies); RegisterSpellScript(spell_warl_conflagrate); |