diff options
-rw-r--r-- | src/server/scripts/Spells/spell_warlock.cpp | 1814 |
1 files changed, 755 insertions, 1059 deletions
diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index de993e04165..290f75546b3 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -139,42 +139,31 @@ private: }; // -710 - Banish -class spell_warl_banish : public SpellScriptLoader +class spell_warl_banish : public SpellScript { - public: - spell_warl_banish() : SpellScriptLoader("spell_warl_banish") { } - - class spell_warl_banish_SpellScript : public SpellScript - { - PrepareSpellScript(spell_warl_banish_SpellScript); - - public: - spell_warl_banish_SpellScript() {} - - private: - void HandleBanish(SpellMissInfo missInfo) - { - if (missInfo != SPELL_MISS_IMMUNE) - return; + PrepareSpellScript(spell_warl_banish); - if (Unit* target = GetHitUnit()) - { - // Casting Banish on a banished target will remove applied aura - if (Aura * banishAura = target->GetAura(GetSpellInfo()->Id, GetCaster()->GetGUID())) - banishAura->Remove(); - } - } +public: + spell_warl_banish() {} - void Register() override - { - BeforeHit += BeforeSpellHitFn(spell_warl_banish_SpellScript::HandleBanish); - } - }; +private: + void HandleBanish(SpellMissInfo missInfo) + { + if (missInfo != SPELL_MISS_IMMUNE) + return; - SpellScript* GetSpellScript() const override + if (Unit* target = GetHitUnit()) { - return new spell_warl_banish_SpellScript(); + // Casting Banish on a banished target will remove applied aura + if (Aura * banishAura = target->GetAura(GetSpellInfo()->Id, GetCaster()->GetGUID())) + banishAura->Remove(); } + } + + void Register() override + { + BeforeHit += BeforeSpellHitFn(spell_warl_banish::HandleBanish); + } }; // -6201 - Create Healthstone (and ranks) @@ -259,892 +248,688 @@ uint32 const spell_warl_create_healthstone::spell_warl_create_healthstone_SpellS }; // -603 - Curse of Doom -class spell_warl_curse_of_doom : public SpellScriptLoader +class spell_warl_curse_of_doom : public AuraScript { - public: - spell_warl_curse_of_doom() : SpellScriptLoader("spell_warl_curse_of_doom") { } + PrepareAuraScript(spell_warl_curse_of_doom); - class spell_warl_curse_of_doom_AuraScript : public AuraScript - { - PrepareAuraScript(spell_warl_curse_of_doom_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_WARLOCK_CURSE_OF_DOOM_EFFECT }); - } - - bool Load() override - { - return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER; - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_WARLOCK_CURSE_OF_DOOM_EFFECT }); + } - void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - if (!GetCaster()) - return; + bool Load() override + { + return GetCaster() && GetCaster()->GetTypeId() == TYPEID_PLAYER; + } - AuraRemoveMode removeMode = GetTargetApplication()->GetRemoveMode(); - if (removeMode != AURA_REMOVE_BY_DEATH || !IsExpired()) - return; + void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + if (!GetCaster()) + return; - if (GetCaster()->ToPlayer()->isHonorOrXPTarget(GetTarget())) - GetCaster()->CastSpell(GetTarget(), SPELL_WARLOCK_CURSE_OF_DOOM_EFFECT, aurEff); - } + AuraRemoveMode removeMode = GetTargetApplication()->GetRemoveMode(); + if (removeMode != AURA_REMOVE_BY_DEATH || !IsExpired()) + return; - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_warl_curse_of_doom_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); - } - }; + if (GetCaster()->ToPlayer()->isHonorOrXPTarget(GetTarget())) + GetCaster()->CastSpell(GetTarget(), SPELL_WARLOCK_CURSE_OF_DOOM_EFFECT, aurEff); + } - AuraScript* GetAuraScript() const override - { - return new spell_warl_curse_of_doom_AuraScript(); - } + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_warl_curse_of_doom::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); + } }; // -63156 - Decimation -class spell_warl_decimation : public SpellScriptLoader +class spell_warl_decimation : public AuraScript { - public: - spell_warl_decimation() : SpellScriptLoader("spell_warl_decimation") { } - - class spell_warl_decimation_AuraScript : public AuraScript - { - PrepareAuraScript(spell_warl_decimation_AuraScript); + PrepareAuraScript(spell_warl_decimation); - bool CheckProc(ProcEventInfo& eventInfo) - { - if (SpellInfo const* spellInfo = eventInfo.GetSpellInfo()) - if (eventInfo.GetActionTarget()->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellInfo, eventInfo.GetActor())) - return true; - - return false; - } + bool CheckProc(ProcEventInfo& eventInfo) + { + if (SpellInfo const* spellInfo = eventInfo.GetSpellInfo()) + if (eventInfo.GetActionTarget()->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellInfo, eventInfo.GetActor())) + return true; - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_warl_decimation_AuraScript::CheckProc); - } - }; + return false; + } - AuraScript* GetAuraScript() const override - { - return new spell_warl_decimation_AuraScript(); - } + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_warl_decimation::CheckProc); + } }; // 48018 - Demonic Circle: Summon -class spell_warl_demonic_circle_summon : public SpellScriptLoader +class spell_warl_demonic_circle_summon : public AuraScript { - public: - spell_warl_demonic_circle_summon() : SpellScriptLoader("spell_warl_demonic_circle_summon") { } + PrepareAuraScript(spell_warl_demonic_circle_summon); - class spell_warl_demonic_circle_summon_AuraScript : public AuraScript - { - PrepareAuraScript(spell_warl_demonic_circle_summon_AuraScript); - - void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes mode) - { - // If effect is removed by expire remove the summoned demonic circle too. - if (!(mode & AURA_EFFECT_HANDLE_REAPPLY)) - GetTarget()->RemoveGameObject(GetId(), true); - - GetTarget()->RemoveAura(SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST); - } + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes mode) + { + // If effect is removed by expire remove the summoned demonic circle too. + if (!(mode & AURA_EFFECT_HANDLE_REAPPLY)) + GetTarget()->RemoveGameObject(GetId(), true); - void HandleDummyTick(AuraEffect const* /*aurEff*/) - { - if (GameObject* circle = GetTarget()->GetGameObject(GetId())) - { - // Here we check if player is in demonic circle teleport range, if so add - // WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST; allowing him to cast the WARLOCK_DEMONIC_CIRCLE_TELEPORT. - // If not in range remove the WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST. + GetTarget()->RemoveAura(SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST); + } - SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_WARLOCK_DEMONIC_CIRCLE_TELEPORT); + void HandleDummyTick(AuraEffect const* /*aurEff*/) + { + if (GameObject* circle = GetTarget()->GetGameObject(GetId())) + { + // Here we check if player is in demonic circle teleport range, if so add + // WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST; allowing him to cast the WARLOCK_DEMONIC_CIRCLE_TELEPORT. + // If not in range remove the WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST. - if (GetTarget()->IsWithinDist(circle, spellInfo->GetMaxRange(true))) - { - if (!GetTarget()->HasAura(SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST)) - GetTarget()->CastSpell(GetTarget(), SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST, true); - } - else - GetTarget()->RemoveAura(SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST); - } - } + SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_WARLOCK_DEMONIC_CIRCLE_TELEPORT); - void Register() override + if (GetTarget()->IsWithinDist(circle, spellInfo->GetMaxRange(true))) { - OnEffectRemove += AuraEffectApplyFn(spell_warl_demonic_circle_summon_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_warl_demonic_circle_summon_AuraScript::HandleDummyTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + if (!GetTarget()->HasAura(SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST)) + GetTarget()->CastSpell(GetTarget(), SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST, true); } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_warl_demonic_circle_summon_AuraScript(); + else + GetTarget()->RemoveAura(SPELL_WARLOCK_DEMONIC_CIRCLE_ALLOW_CAST); } + } + + void Register() override + { + OnEffectRemove += AuraEffectApplyFn(spell_warl_demonic_circle_summon::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_warl_demonic_circle_summon::HandleDummyTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } }; // 48020 - Demonic Circle: Teleport -class spell_warl_demonic_circle_teleport : public SpellScriptLoader +class spell_warl_demonic_circle_teleport : public AuraScript { - public: - spell_warl_demonic_circle_teleport() : SpellScriptLoader("spell_warl_demonic_circle_teleport") { } + PrepareAuraScript(spell_warl_demonic_circle_teleport); - class spell_warl_demonic_circle_teleport_AuraScript : public AuraScript + void HandleTeleport(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Player* player = GetTarget()->ToPlayer()) { - PrepareAuraScript(spell_warl_demonic_circle_teleport_AuraScript); - - void HandleTeleport(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Player* player = GetTarget()->ToPlayer()) - { - if (GameObject* circle = player->GetGameObject(SPELL_WARLOCK_DEMONIC_CIRCLE_SUMMON)) - { - player->NearTeleportTo(circle->GetPositionX(), circle->GetPositionY(), circle->GetPositionZ(), circle->GetOrientation()); - player->RemoveMovementImpairingAuras(false); - } - } - } - - void Register() override + if (GameObject* circle = player->GetGameObject(SPELL_WARLOCK_DEMONIC_CIRCLE_SUMMON)) { - OnEffectApply += AuraEffectApplyFn(spell_warl_demonic_circle_teleport_AuraScript::HandleTeleport, EFFECT_0, SPELL_AURA_MECHANIC_IMMUNITY, AURA_EFFECT_HANDLE_REAL); + player->NearTeleportTo(circle->GetPositionX(), circle->GetPositionY(), circle->GetPositionZ(), circle->GetOrientation()); + player->RemoveMovementImpairingAuras(false); } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_warl_demonic_circle_teleport_AuraScript(); } + } + + void Register() override + { + OnEffectApply += AuraEffectApplyFn(spell_warl_demonic_circle_teleport::HandleTeleport, EFFECT_0, SPELL_AURA_MECHANIC_IMMUNITY, AURA_EFFECT_HANDLE_REAL); + } }; // 47193 - Demonic Empowerment -class spell_warl_demonic_empowerment : public SpellScriptLoader +class spell_warl_demonic_empowerment : public SpellScript { - public: - spell_warl_demonic_empowerment() : SpellScriptLoader("spell_warl_demonic_empowerment") { } + PrepareSpellScript(spell_warl_demonic_empowerment); - class spell_warl_demonic_empowerment_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( { - PrepareSpellScript(spell_warl_demonic_empowerment_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo( - { - SPELL_WARLOCK_DEMONIC_EMPOWERMENT_SUCCUBUS, - SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER, - SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELGUARD, - SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELHUNTER, - SPELL_WARLOCK_DEMONIC_EMPOWERMENT_IMP - }); - } + SPELL_WARLOCK_DEMONIC_EMPOWERMENT_SUCCUBUS, + SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER, + SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELGUARD, + SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELHUNTER, + SPELL_WARLOCK_DEMONIC_EMPOWERMENT_IMP + }); + } - void HandleScriptEffect(SpellEffIndex /*effIndex*/) + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + if (Creature* targetCreature = GetHitCreature()) + { + if (targetCreature->IsPet()) { - if (Creature* targetCreature = GetHitCreature()) + CreatureTemplate const* ci = sObjectMgr->GetCreatureTemplate(targetCreature->GetEntry()); + ASSERT(ci); + switch (ci->family) { - if (targetCreature->IsPet()) + case CREATURE_FAMILY_SUCCUBUS: + targetCreature->CastSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_SUCCUBUS, true); + break; + case CREATURE_FAMILY_VOIDWALKER: { - CreatureTemplate const* ci = sObjectMgr->GetCreatureTemplate(targetCreature->GetEntry()); - ASSERT(ci); - switch (ci->family) - { - case CREATURE_FAMILY_SUCCUBUS: - targetCreature->CastSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_SUCCUBUS, true); - break; - case CREATURE_FAMILY_VOIDWALKER: - { - SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER); - int32 hp = targetCreature->CountPctFromMaxHealth(GetCaster()->CalculateSpellDamage(spellInfo, EFFECT_0)); - CastSpellExtraArgs args(TRIGGERED_FULL_MASK); - args.AddSpellBP0(hp); - targetCreature->CastSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER, args); - //unitTarget->CastSpell(unitTarget, 54441, true); - break; - } - case CREATURE_FAMILY_FELGUARD: - targetCreature->CastSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELGUARD, true); - break; - case CREATURE_FAMILY_FELHUNTER: - targetCreature->CastSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELHUNTER, true); - break; - case CREATURE_FAMILY_IMP: - targetCreature->CastSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_IMP, true); - break; - default: - break; - } + SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER); + int32 hp = targetCreature->CountPctFromMaxHealth(GetCaster()->CalculateSpellDamage(spellInfo, EFFECT_0)); + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.AddSpellBP0(hp); + targetCreature->CastSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_VOIDWALKER, args); + //unitTarget->CastSpell(unitTarget, 54441, true); + break; } + case CREATURE_FAMILY_FELGUARD: + targetCreature->CastSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELGUARD, true); + break; + case CREATURE_FAMILY_FELHUNTER: + targetCreature->CastSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_FELHUNTER, true); + break; + case CREATURE_FAMILY_IMP: + targetCreature->CastSpell(targetCreature, SPELL_WARLOCK_DEMONIC_EMPOWERMENT_IMP, true); + break; + default: + break; } } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_warl_demonic_empowerment_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_warl_demonic_empowerment_SpellScript(); } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_warl_demonic_empowerment::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } }; // -1120 - Drain Soul -class spell_warl_drain_soul : public SpellScriptLoader +class spell_warl_drain_soul : public AuraScript { - public: - spell_warl_drain_soul() : SpellScriptLoader("spell_warl_drain_soul") { } + PrepareAuraScript(spell_warl_drain_soul); - class spell_warl_drain_soul_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( { - PrepareAuraScript(spell_warl_drain_soul_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo( - { - SPELL_WARLOCK_IMPROVED_DRAIN_SOUL_R1, - SPELL_WARLOCK_IMPROVED_DRAIN_SOUL_PROC, - SPELL_WARLOCK_CREATE_SOULSHARD, - SPELL_WARLOCK_GLYPH_OF_DRAIN_SOUL_AURA, - SPELL_WARLOCK_GLYPH_OF_DRAIN_SOUL_PROC - }); - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - // Drain Soul's proc tries to happen each time the warlock lands a killing blow on a unit while channeling. - // Make sure that dying unit is afflicted by the caster's Drain Soul debuff in order to avoid a false positive. - - Unit* caster = GetCaster(); - Unit* victim = eventInfo.GetProcTarget(); - - if (caster && victim) - return victim->GetAuraApplicationOfRankedSpell(SPELL_WARLOCK_DRAIN_SOUL_R1, caster->GetGUID()) != 0; + SPELL_WARLOCK_IMPROVED_DRAIN_SOUL_R1, + SPELL_WARLOCK_IMPROVED_DRAIN_SOUL_PROC, + SPELL_WARLOCK_CREATE_SOULSHARD, + SPELL_WARLOCK_GLYPH_OF_DRAIN_SOUL_AURA, + SPELL_WARLOCK_GLYPH_OF_DRAIN_SOUL_PROC + }); + } - return false; - } + bool CheckProc(ProcEventInfo& eventInfo) + { + // Drain Soul's proc tries to happen each time the warlock lands a killing blow on a unit while channeling. + // Make sure that dying unit is afflicted by the caster's Drain Soul debuff in order to avoid a false positive. - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); + Unit* caster = GetCaster(); + Unit* victim = eventInfo.GetProcTarget(); - Unit* caster = eventInfo.GetActor(); - // Improved Drain Soul - Aura const* impDrainSoul = caster->GetAuraOfRankedSpell(SPELL_WARLOCK_IMPROVED_DRAIN_SOUL_R1, caster->GetGUID()); - if (!impDrainSoul) - return; + if (caster && victim) + return victim->GetAuraApplicationOfRankedSpell(SPELL_WARLOCK_DRAIN_SOUL_R1, caster->GetGUID()) != 0; - int32 amount = CalculatePct(caster->GetMaxPower(POWER_MANA), impDrainSoul->GetSpellInfo()->Effects[EFFECT_2].CalcValue()); - CastSpellExtraArgs args(aurEff); - args.AddSpellBP0(amount); - caster->CastSpell(nullptr, SPELL_WARLOCK_IMPROVED_DRAIN_SOUL_PROC, args); - } + return false; + } - void HandleTick(AuraEffect const* aurEff) - { - Unit* caster = GetCaster(); - Unit* target = GetTarget(); - if (caster && caster->GetTypeId() == TYPEID_PLAYER && caster->ToPlayer()->isHonorOrXPTarget(target)) - { - if (roll_chance_i(20)) - { - caster->CastSpell(caster, SPELL_WARLOCK_CREATE_SOULSHARD, aurEff); - // Glyph of Drain Soul - chance to create an additional Soul Shard - if (AuraEffect* aur = caster->GetAuraEffect(SPELL_WARLOCK_GLYPH_OF_DRAIN_SOUL_AURA, EFFECT_0)) - if (roll_chance_i(aur->GetMiscValue())) - caster->CastSpell(caster, SPELL_WARLOCK_GLYPH_OF_DRAIN_SOUL_PROC, aur); - } - } - } + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + + Unit* caster = eventInfo.GetActor(); + // Improved Drain Soul + Aura const* impDrainSoul = caster->GetAuraOfRankedSpell(SPELL_WARLOCK_IMPROVED_DRAIN_SOUL_R1, caster->GetGUID()); + if (!impDrainSoul) + return; + + int32 amount = CalculatePct(caster->GetMaxPower(POWER_MANA), impDrainSoul->GetSpellInfo()->Effects[EFFECT_2].CalcValue()); + CastSpellExtraArgs args(aurEff); + args.AddSpellBP0(amount); + caster->CastSpell(nullptr, SPELL_WARLOCK_IMPROVED_DRAIN_SOUL_PROC, args); + } - void Register() override + void HandleTick(AuraEffect const* aurEff) + { + Unit* caster = GetCaster(); + Unit* target = GetTarget(); + if (caster && caster->GetTypeId() == TYPEID_PLAYER && caster->ToPlayer()->isHonorOrXPTarget(target)) + { + if (roll_chance_i(20)) { - DoCheckProc += AuraCheckProcFn(spell_warl_drain_soul_AuraScript::CheckProc); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_warl_drain_soul_AuraScript::HandleTick, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE); - OnEffectProc += AuraEffectProcFn(spell_warl_drain_soul_AuraScript::HandleProc, EFFECT_2, SPELL_AURA_PROC_TRIGGER_SPELL); + caster->CastSpell(caster, SPELL_WARLOCK_CREATE_SOULSHARD, aurEff); + // Glyph of Drain Soul - chance to create an additional Soul Shard + if (AuraEffect* aur = caster->GetAuraEffect(SPELL_WARLOCK_GLYPH_OF_DRAIN_SOUL_AURA, EFFECT_0)) + if (roll_chance_i(aur->GetMiscValue())) + caster->CastSpell(caster, SPELL_WARLOCK_GLYPH_OF_DRAIN_SOUL_PROC, aur); } - - }; - - AuraScript* GetAuraScript() const override - { - return new spell_warl_drain_soul_AuraScript(); } + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_warl_drain_soul::CheckProc); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_warl_drain_soul::HandleTick, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE); + OnEffectProc += AuraEffectProcFn(spell_warl_drain_soul::HandleProc, EFFECT_2, SPELL_AURA_PROC_TRIGGER_SPELL); + } }; // 47422 - Everlasting Affliction -class spell_warl_everlasting_affliction : public SpellScriptLoader +class spell_warl_everlasting_affliction : public SpellScript { - public: - spell_warl_everlasting_affliction() : SpellScriptLoader("spell_warl_everlasting_affliction") { } + PrepareSpellScript(spell_warl_everlasting_affliction); - class spell_warl_everlasting_affliction_SpellScript : public SpellScript + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (Unit* target = GetHitUnit()) { - PrepareSpellScript(spell_warl_everlasting_affliction_SpellScript); - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (Unit* target = GetHitUnit()) - { - // Refresh corruption on target - if (AuraEffect* aur = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x2, 0, 0, caster->GetGUID())) - { - aur->ChangeAmount(aur->CalculateAmount(aur->GetCaster()), false); - aur->CalculatePeriodic(caster, false, false); - aur->GetBase()->RefreshDuration(true); - } - } - } - - void Register() override + // Refresh corruption on target + if (AuraEffect* aur = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_WARLOCK, 0x2, 0, 0, caster->GetGUID())) { - OnEffectHitTarget += SpellEffectFn(spell_warl_everlasting_affliction_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + aur->ChangeAmount(aur->CalculateAmount(aur->GetCaster()), false); + aur->CalculatePeriodic(caster, false, false); + aur->GetBase()->RefreshDuration(true); } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_warl_everlasting_affliction_SpellScript(); } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_warl_everlasting_affliction::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } }; // -47230 - Fel Synergy -class spell_warl_fel_synergy : public SpellScriptLoader +class spell_warl_fel_synergy : public AuraScript { - public: - spell_warl_fel_synergy() : SpellScriptLoader("spell_warl_fel_synergy") { } - - class spell_warl_fel_synergy_AuraScript : public AuraScript - { - PrepareAuraScript(spell_warl_fel_synergy_AuraScript); + PrepareAuraScript(spell_warl_fel_synergy); - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_WARLOCK_FEL_SYNERGY_HEAL }); - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - DamageInfo* damageInfo = eventInfo.GetDamageInfo(); - if (!damageInfo || !damageInfo->GetDamage()) - return false; + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_WARLOCK_FEL_SYNERGY_HEAL }); + } - return GetTarget()->GetGuardianPet() != nullptr; - } + bool CheckProc(ProcEventInfo& eventInfo) + { + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + if (!damageInfo || !damageInfo->GetDamage()) + return false; - void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); + return GetTarget()->GetGuardianPet() != nullptr; + } - int32 heal = CalculatePct(static_cast<int32>(eventInfo.GetDamageInfo()->GetDamage()), aurEff->GetAmount()); - CastSpellExtraArgs args(aurEff); - args.AddSpellBP0(heal); - GetTarget()->CastSpell(nullptr, SPELL_WARLOCK_FEL_SYNERGY_HEAL, args); // TARGET_UNIT_PET - } + void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_warl_fel_synergy_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_warl_fel_synergy_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; + int32 heal = CalculatePct(static_cast<int32>(eventInfo.GetDamageInfo()->GetDamage()), aurEff->GetAmount()); + CastSpellExtraArgs args(aurEff); + args.AddSpellBP0(heal); + GetTarget()->CastSpell(nullptr, SPELL_WARLOCK_FEL_SYNERGY_HEAL, args); // TARGET_UNIT_PET + } - AuraScript* GetAuraScript() const override - { - return new spell_warl_fel_synergy_AuraScript(); - } + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_warl_fel_synergy::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_warl_fel_synergy::OnProc, EFFECT_0, SPELL_AURA_DUMMY); + } }; // -18094 - Nightfall // 56218 - Glyph of Corruption -class spell_warl_glyph_of_corruption_nightfall : public SpellScriptLoader +class spell_warl_glyph_of_corruption_nightfall : public AuraScript { - public: - spell_warl_glyph_of_corruption_nightfall() : SpellScriptLoader("spell_warl_glyph_of_corruption_nightfall") { } - - class spell_warl_glyph_of_corruption_nightfall_AuraScript : public AuraScript - { - PrepareAuraScript(spell_warl_glyph_of_corruption_nightfall_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_WARLOCK_SHADOW_TRANCE }); - } + PrepareAuraScript(spell_warl_glyph_of_corruption_nightfall); - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - Unit* caster = eventInfo.GetActor(); - caster->CastSpell(caster, SPELL_WARLOCK_SHADOW_TRANCE, aurEff); - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_WARLOCK_SHADOW_TRANCE }); + } - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_warl_glyph_of_corruption_nightfall_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* caster = eventInfo.GetActor(); + caster->CastSpell(caster, SPELL_WARLOCK_SHADOW_TRANCE, aurEff); + } - AuraScript* GetAuraScript() const override - { - return new spell_warl_glyph_of_corruption_nightfall_AuraScript(); - } + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_warl_glyph_of_corruption_nightfall::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } }; // 63320 - Glyph of Life Tap -class spell_warl_glyph_of_life_tap : public SpellScriptLoader +class spell_warl_glyph_of_life_tap : public AuraScript { -public: - spell_warl_glyph_of_life_tap() : SpellScriptLoader("spell_warl_glyph_of_life_tap") { } + PrepareAuraScript(spell_warl_glyph_of_life_tap); - class spell_warl_glyph_of_life_tap_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_warl_glyph_of_life_tap_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_WARLOCK_GLYPH_OF_LIFE_TAP_TRIGGERED }); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - Unit* caster = eventInfo.GetActor(); - caster->CastSpell(caster, SPELL_WARLOCK_GLYPH_OF_LIFE_TAP_TRIGGERED, aurEff); - } + return ValidateSpellInfo({ SPELL_WARLOCK_GLYPH_OF_LIFE_TAP_TRIGGERED }); + } - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_warl_glyph_of_life_tap_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* caster = eventInfo.GetActor(); + caster->CastSpell(caster, SPELL_WARLOCK_GLYPH_OF_LIFE_TAP_TRIGGERED, aurEff); + } - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_warl_glyph_of_life_tap_AuraScript(); + OnEffectProc += AuraEffectProcFn(spell_warl_glyph_of_life_tap::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); } }; // 63310 - Glyph of Shadowflame -class spell_warl_glyph_of_shadowflame : public SpellScriptLoader +class spell_warl_glyph_of_shadowflame : public AuraScript { - public: - spell_warl_glyph_of_shadowflame() : SpellScriptLoader("spell_warl_glyph_of_shadowflame") { } - - class spell_warl_glyph_of_shadowflame_AuraScript : public AuraScript - { - PrepareAuraScript(spell_warl_glyph_of_shadowflame_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_WARLOCK_GLYPH_OF_SHADOWFLAME }); - } + PrepareAuraScript(spell_warl_glyph_of_shadowflame); - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_WARLOCK_GLYPH_OF_SHADOWFLAME, aurEff); - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_WARLOCK_GLYPH_OF_SHADOWFLAME }); + } - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_warl_glyph_of_shadowflame_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_WARLOCK_GLYPH_OF_SHADOWFLAME, aurEff); + } - AuraScript* GetAuraScript() const override - { - return new spell_warl_glyph_of_shadowflame_AuraScript(); - } + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_warl_glyph_of_shadowflame::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } }; // -48181 - Haunt -class spell_warl_haunt : public SpellScriptLoader +class spell_warl_haunt : public SpellScript { - public: - spell_warl_haunt() : SpellScriptLoader("spell_warl_haunt") { } - - class spell_warl_haunt_SpellScript : public SpellScript - { - PrepareSpellScript(spell_warl_haunt_SpellScript); - - void HandleAfterHit() - { - if (Aura* aura = GetHitAura()) - if (AuraEffect* aurEff = aura->GetEffect(EFFECT_1)) - aurEff->SetAmount(CalculatePct(GetHitDamage(), aurEff->GetAmount())); - } + PrepareSpellScript(spell_warl_haunt); - void Register() override - { - AfterHit += SpellHitFn(spell_warl_haunt_SpellScript::HandleAfterHit); - } - }; - - class spell_warl_haunt_AuraScript : public AuraScript - { - PrepareAuraScript(spell_warl_haunt_AuraScript); + void HandleAfterHit() + { + if (Aura* aura = GetHitAura()) + if (AuraEffect* aurEff = aura->GetEffect(EFFECT_1)) + aurEff->SetAmount(CalculatePct(GetHitDamage(), aurEff->GetAmount())); + } - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_WARLOCK_HAUNT_HEAL }); - } + void Register() override + { + AfterHit += SpellHitFn(spell_warl_haunt::HandleAfterHit); + } +}; - void HandleRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - { - CastSpellExtraArgs args(aurEff); - args.OriginalCaster = GetCasterGUID(); - args.AddSpellBP0(aurEff->GetAmount()); - GetTarget()->CastSpell(caster, SPELL_WARLOCK_HAUNT_HEAL, args); - } - } +class spell_warl_haunt_aura : public AuraScript +{ + PrepareAuraScript(spell_warl_haunt_aura); - void Register() override - { - OnEffectRemove += AuraEffectApplyFn(spell_warl_haunt_AuraScript::HandleRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - } - }; + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_WARLOCK_HAUNT_HEAL }); + } - SpellScript* GetSpellScript() const override + void HandleRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) { - return new spell_warl_haunt_SpellScript(); + CastSpellExtraArgs args(aurEff); + args.OriginalCaster = GetCasterGUID(); + args.AddSpellBP0(aurEff->GetAmount()); + GetTarget()->CastSpell(caster, SPELL_WARLOCK_HAUNT_HEAL, args); } + } - AuraScript* GetAuraScript() const override - { - return new spell_warl_haunt_AuraScript(); - } + void Register() override + { + OnEffectRemove += AuraEffectApplyFn(spell_warl_haunt_aura::HandleRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + } }; // -755 - Health Funnel -class spell_warl_health_funnel : public SpellScriptLoader +class spell_warl_health_funnel : public AuraScript { - public: - spell_warl_health_funnel() : SpellScriptLoader("spell_warl_health_funnel") { } - - class spell_warl_health_funnel_AuraScript : public AuraScript - { - PrepareAuraScript(spell_warl_health_funnel_AuraScript); - - void ApplyEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* caster = GetCaster(); - if (!caster) - return; - - Unit* target = GetTarget(); - if (caster->HasAura(SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R2)) - target->CastSpell(target, SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2, true); - else if (caster->HasAura(SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R1)) - target->CastSpell(target, SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R1, true); - } + PrepareAuraScript(spell_warl_health_funnel); - void RemoveEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - target->RemoveAurasDueToSpell(SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R1); - target->RemoveAurasDueToSpell(SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2); - } + void ApplyEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* caster = GetCaster(); + if (!caster) + return; + + Unit* target = GetTarget(); + if (caster->HasAura(SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R2)) + target->CastSpell(target, SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2, true); + else if (caster->HasAura(SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_R1)) + target->CastSpell(target, SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R1, true); + } - void Register() override - { - OnEffectRemove += AuraEffectRemoveFn(spell_warl_health_funnel_AuraScript::RemoveEffect, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL); - OnEffectApply += AuraEffectApplyFn(spell_warl_health_funnel_AuraScript::ApplyEffect, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL); - } - }; + void RemoveEffect(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + target->RemoveAurasDueToSpell(SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R1); + target->RemoveAurasDueToSpell(SPELL_WARLOCK_IMPROVED_HEALTH_FUNNEL_BUFF_R2); + } - AuraScript* GetAuraScript() const override - { - return new spell_warl_health_funnel_AuraScript(); - } + void Register() override + { + OnEffectRemove += AuraEffectRemoveFn(spell_warl_health_funnel::RemoveEffect, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL); + OnEffectApply += AuraEffectApplyFn(spell_warl_health_funnel::ApplyEffect, EFFECT_0, SPELL_AURA_PERIODIC_HEAL, AURA_EFFECT_HANDLE_REAL); + } }; // -1454 - Life Tap -class spell_warl_life_tap : public SpellScriptLoader +class spell_warl_life_tap : public SpellScript { - public: - spell_warl_life_tap() : SpellScriptLoader("spell_warl_life_tap") { } + PrepareSpellScript(spell_warl_life_tap); - class spell_warl_life_tap_SpellScript : public SpellScript - { - PrepareSpellScript(spell_warl_life_tap_SpellScript); - - bool Load() override - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ SPELL_WARLOCK_LIFE_TAP_ENERGIZE, SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2 }); - } + bool Load() override + { + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - int32 base = GetEffectValue(); + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_WARLOCK_LIFE_TAP_ENERGIZE, SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2 }); + } - float penalty = caster->CalculateSpellpowerCoefficientLevelPenalty(GetSpellInfo()); - float fmana = (float)base + caster->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + SPELL_SCHOOL_SHADOW) * 0.5f * penalty; + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + int32 base = GetEffectValue(); - // Improved Life Tap mod - if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_WARLOCK, WARLOCK_ICON_ID_IMPROVED_LIFE_TAP, 0)) - AddPct(fmana, aurEff->GetAmount()); - int32 mana = round(fmana); + float penalty = caster->CalculateSpellpowerCoefficientLevelPenalty(GetSpellInfo()); + float fmana = (float)base + caster->GetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + SPELL_SCHOOL_SHADOW) * 0.5f * penalty; - // Shouldn't Appear in Combat Log - caster->ModifyHealth(-base); + // Improved Life Tap mod + if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_WARLOCK, WARLOCK_ICON_ID_IMPROVED_LIFE_TAP, 0)) + AddPct(fmana, aurEff->GetAmount()); + int32 mana = round(fmana); - CastSpellExtraArgs args; - args.AddSpellBP0(mana); - caster->CastSpell(caster, SPELL_WARLOCK_LIFE_TAP_ENERGIZE, args); + // Shouldn't Appear in Combat Log + caster->ModifyHealth(-base); - // Mana Feed - int32 manaFeedVal = 0; - if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_WARLOCK, WARLOCK_ICON_ID_MANA_FEED, 0)) - manaFeedVal = aurEff->GetAmount(); + CastSpellExtraArgs args; + args.AddSpellBP0(mana); + caster->CastSpell(caster, SPELL_WARLOCK_LIFE_TAP_ENERGIZE, args); - if (manaFeedVal > 0) - { - ApplyPct(manaFeedVal, mana); - CastSpellExtraArgs manaFeedArgs(TRIGGERED_FULL_MASK); - manaFeedArgs.AddSpellBP0(manaFeedVal); - caster->CastSpell(caster, SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2, manaFeedArgs); - } - } + // Mana Feed + int32 manaFeedVal = 0; + if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_AURA_ADD_FLAT_MODIFIER, SPELLFAMILY_WARLOCK, WARLOCK_ICON_ID_MANA_FEED, 0)) + manaFeedVal = aurEff->GetAmount(); - SpellCastResult CheckCast() - { - if (int32(GetCaster()->GetHealth()) > int32(GetSpellInfo()->Effects[EFFECT_0].CalcValue())) - return SPELL_CAST_OK; - return SPELL_FAILED_FIZZLE; - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_warl_life_tap_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - OnCheckCast += SpellCheckCastFn(spell_warl_life_tap_SpellScript::CheckCast); - } - }; - - SpellScript* GetSpellScript() const override + if (manaFeedVal > 0) { - return new spell_warl_life_tap_SpellScript(); + ApplyPct(manaFeedVal, mana); + CastSpellExtraArgs manaFeedArgs(TRIGGERED_FULL_MASK); + manaFeedArgs.AddSpellBP0(manaFeedVal); + caster->CastSpell(caster, SPELL_WARLOCK_LIFE_TAP_ENERGIZE_2, manaFeedArgs); } + } + + SpellCastResult CheckCast() + { + if (int32(GetCaster()->GetHealth()) > int32(GetSpellInfo()->Effects[EFFECT_0].CalcValue())) + return SPELL_CAST_OK; + return SPELL_FAILED_FIZZLE; + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_warl_life_tap::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + OnCheckCast += SpellCheckCastFn(spell_warl_life_tap::CheckCast); + } }; // -30299 - Nether Protection -class spell_warl_nether_protection : public SpellScriptLoader +class spell_warl_nether_protection : public AuraScript { -public: - spell_warl_nether_protection() : SpellScriptLoader("spell_warl_nether_protection") { } + PrepareAuraScript(spell_warl_nether_protection); - class spell_warl_nether_protection_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_warl_nether_protection_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override + return ValidateSpellInfo( { - return ValidateSpellInfo( - { - SPELL_WARLOCK_NETHER_PROTECTION_HOLY, - SPELL_WARLOCK_NETHER_PROTECTION_FIRE, - SPELL_WARLOCK_NETHER_PROTECTION_NATURE, - SPELL_WARLOCK_NETHER_PROTECTION_FROST, - SPELL_WARLOCK_NETHER_PROTECTION_SHADOW, - SPELL_WARLOCK_NETHER_PROTECTION_ARCANE - }); - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - if (DamageInfo* damageInfo = eventInfo.GetDamageInfo()) - { - switch (GetFirstSchoolInMask(damageInfo->GetSchoolMask())) - { - case SPELL_SCHOOL_HOLY: - case SPELL_SCHOOL_FIRE: - case SPELL_SCHOOL_NATURE: - case SPELL_SCHOOL_FROST: - case SPELL_SCHOOL_SHADOW: - case SPELL_SCHOOL_ARCANE: - return true; - default: - break; - } - } - - return false; - } + SPELL_WARLOCK_NETHER_PROTECTION_HOLY, + SPELL_WARLOCK_NETHER_PROTECTION_FIRE, + SPELL_WARLOCK_NETHER_PROTECTION_NATURE, + SPELL_WARLOCK_NETHER_PROTECTION_FROST, + SPELL_WARLOCK_NETHER_PROTECTION_SHADOW, + SPELL_WARLOCK_NETHER_PROTECTION_ARCANE + }); + } - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + bool CheckProc(ProcEventInfo& eventInfo) + { + if (DamageInfo* damageInfo = eventInfo.GetDamageInfo()) { - PreventDefaultAction(); - uint32 triggerspell = 0; - - switch (GetFirstSchoolInMask(eventInfo.GetDamageInfo()->GetSchoolMask())) + switch (GetFirstSchoolInMask(damageInfo->GetSchoolMask())) { case SPELL_SCHOOL_HOLY: - triggerspell = SPELL_WARLOCK_NETHER_PROTECTION_HOLY; - break; case SPELL_SCHOOL_FIRE: - triggerspell = SPELL_WARLOCK_NETHER_PROTECTION_FIRE; - break; case SPELL_SCHOOL_NATURE: - triggerspell = SPELL_WARLOCK_NETHER_PROTECTION_NATURE; - break; case SPELL_SCHOOL_FROST: - triggerspell = SPELL_WARLOCK_NETHER_PROTECTION_FROST; - break; case SPELL_SCHOOL_SHADOW: - triggerspell = SPELL_WARLOCK_NETHER_PROTECTION_SHADOW; - break; case SPELL_SCHOOL_ARCANE: - triggerspell = SPELL_WARLOCK_NETHER_PROTECTION_ARCANE; - break; + return true; default: - return; + break; } - - if (Unit* target = eventInfo.GetActionTarget()) - target->CastSpell(target, triggerspell, aurEff); } - void Register() override + return false; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + uint32 triggerspell = 0; + + switch (GetFirstSchoolInMask(eventInfo.GetDamageInfo()->GetSchoolMask())) { - DoCheckProc += AuraCheckProcFn(spell_warl_nether_protection_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_warl_nether_protection_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + case SPELL_SCHOOL_HOLY: + triggerspell = SPELL_WARLOCK_NETHER_PROTECTION_HOLY; + break; + case SPELL_SCHOOL_FIRE: + triggerspell = SPELL_WARLOCK_NETHER_PROTECTION_FIRE; + break; + case SPELL_SCHOOL_NATURE: + triggerspell = SPELL_WARLOCK_NETHER_PROTECTION_NATURE; + break; + case SPELL_SCHOOL_FROST: + triggerspell = SPELL_WARLOCK_NETHER_PROTECTION_FROST; + break; + case SPELL_SCHOOL_SHADOW: + triggerspell = SPELL_WARLOCK_NETHER_PROTECTION_SHADOW; + break; + case SPELL_SCHOOL_ARCANE: + triggerspell = SPELL_WARLOCK_NETHER_PROTECTION_ARCANE; + break; + default: + return; } - }; - AuraScript* GetAuraScript() const override + if (Unit* target = eventInfo.GetActionTarget()) + target->CastSpell(target, triggerspell, aurEff); + } + + void Register() override { - return new spell_warl_nether_protection_AuraScript(); + DoCheckProc += AuraCheckProcFn(spell_warl_nether_protection::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_warl_nether_protection::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); } }; // 54909, 53646 - Demonic Pact -class spell_warl_demonic_pact : public SpellScriptLoader +class spell_warl_demonic_pact : public AuraScript { - public: - spell_warl_demonic_pact() : SpellScriptLoader("spell_warl_demonic_pact") { } - - class spell_warl_demonic_pact_AuraScript : public AuraScript - { - PrepareAuraScript(spell_warl_demonic_pact_AuraScript); + PrepareAuraScript(spell_warl_demonic_pact); - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_WARLOCK_DEMONIC_PACT_PROC }); - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetActor() && eventInfo.GetActor()->IsPet(); - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_WARLOCK_DEMONIC_PACT_PROC }); + } - void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); + bool CheckProc(ProcEventInfo& eventInfo) + { + return eventInfo.GetActor() && eventInfo.GetActor()->IsPet(); + } - if (Unit* owner = eventInfo.GetActor()->GetOwner()) - { - if (AuraEffect* aurEff = owner->GetDummyAuraEffect(SPELLFAMILY_WARLOCK, WARLOCK_ICON_ID_DEMONIC_PACT, EFFECT_0)) - { - int32 bp = static_cast<int32>((aurEff->GetAmount() * owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) + 100.0f) / 100.0f); - CastSpellExtraArgs args(aurEff); - args.AddSpellBP0(bp); - args.AddSpellMod(SPELLVALUE_BASE_POINT1, bp); - owner->CastSpell(nullptr, SPELL_WARLOCK_DEMONIC_PACT_PROC, args); - } - } - } + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); - void Register() override + if (Unit* owner = eventInfo.GetActor()->GetOwner()) + { + if (AuraEffect* aurEff = owner->GetDummyAuraEffect(SPELLFAMILY_WARLOCK, WARLOCK_ICON_ID_DEMONIC_PACT, EFFECT_0)) { - DoCheckProc += AuraCheckProcFn(spell_warl_demonic_pact_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_warl_demonic_pact_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + int32 bp = static_cast<int32>((aurEff->GetAmount() * owner->SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_MAGIC) + 100.0f) / 100.0f); + CastSpellExtraArgs args(aurEff); + args.AddSpellBP0(bp); + args.AddSpellMod(SPELLVALUE_BASE_POINT1, bp); + owner->CastSpell(nullptr, SPELL_WARLOCK_DEMONIC_PACT_PROC, args); } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_warl_demonic_pact_AuraScript(); } + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_warl_demonic_pact::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_warl_demonic_pact::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); + } }; // 18541 - Ritual of Doom Effect -class spell_warl_ritual_of_doom_effect : public SpellScriptLoader +class spell_warl_ritual_of_doom_effect : public SpellScript { - public: - spell_warl_ritual_of_doom_effect() : SpellScriptLoader("spell_warl_ritual_of_doom_effect") { } - - class spell_warl_ritual_of_doom_effect_SpellScript : public SpellScript - { - PrepareSpellScript(spell_warl_ritual_of_doom_effect_SpellScript); + PrepareSpellScript(spell_warl_ritual_of_doom_effect); - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - caster->CastSpell(caster, GetEffectValue(), true); - } - - void Register() override - { - OnEffectHit += SpellEffectFn(spell_warl_ritual_of_doom_effect_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + caster->CastSpell(caster, GetEffectValue(), true); + } - SpellScript* GetSpellScript() const override - { - return new spell_warl_ritual_of_doom_effect_SpellScript(); - } + void Register() override + { + OnEffectHit += SpellEffectFn(spell_warl_ritual_of_doom_effect::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } }; // 6358 - Seduction -class spell_warl_seduction : public SpellScriptLoader +class spell_warl_seduction : public SpellScript { - public: - spell_warl_seduction() : SpellScriptLoader("spell_warl_seduction") { } - - class spell_warl_seduction_SpellScript : public SpellScript - { - PrepareSpellScript(spell_warl_seduction_SpellScript); + PrepareSpellScript(spell_warl_seduction); - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_WARLOCK_GLYPH_OF_SUCCUBUS }); - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* owner = GetCaster()->GetOwner(); - if (!owner || !owner->HasAura(SPELL_WARLOCK_GLYPH_OF_SUCCUBUS)) - return; - - Unit* target = GetHitUnit(); - target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE, ObjectGuid::Empty, target->GetAura(32409)); // SW:D shall not be removed. - target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); - target->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH); - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_WARLOCK_GLYPH_OF_SUCCUBUS }); + } - void Register() override - { - OnEffectLaunchTarget += SpellEffectFn(spell_warl_seduction_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_APPLY_AURA); - } - }; + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* owner = GetCaster()->GetOwner(); + if (!owner || !owner->HasAura(SPELL_WARLOCK_GLYPH_OF_SUCCUBUS)) + return; + + Unit* target = GetHitUnit(); + target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE, ObjectGuid::Empty, target->GetAura(32409)); // SW:D shall not be removed. + target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); + target->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH); + } - SpellScript* GetSpellScript() const override - { - return new spell_warl_seduction_SpellScript(); - } + void Register() override + { + OnEffectLaunchTarget += SpellEffectFn(spell_warl_seduction::HandleDummy, EFFECT_0, SPELL_EFFECT_APPLY_AURA); + } }; // -27285 - Seed of Corruption @@ -1172,66 +957,55 @@ class spell_warl_seed_of_corruption : public SpellScript }; // -27243 - Seed of Corruption -class spell_warl_seed_of_corruption_dummy : public SpellScriptLoader +class spell_warl_seed_of_corruption_dummy : public AuraScript { - public: - spell_warl_seed_of_corruption_dummy() : SpellScriptLoader("spell_warl_seed_of_corruption_dummy") { } - - class spell_warl_seed_of_corruption_dummy_AuraScript : public AuraScript - { - PrepareAuraScript(spell_warl_seed_of_corruption_dummy_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_WARLOCK_SEED_OF_CORRUPTION_DAMAGE_R1 }); - } + PrepareAuraScript(spell_warl_seed_of_corruption_dummy); - void CalculateBuffer(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) - { - Unit* caster = GetCaster(); - if (!caster) - return; + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_WARLOCK_SEED_OF_CORRUPTION_DAMAGE_R1 }); + } - // effect 1 scales with 14% of caster's SP (DBC data) - amount = caster->SpellDamageBonusDone(GetUnitOwner(), GetSpellInfo(), amount, SPELL_DIRECT_DAMAGE, aurEff->GetEffIndex(), GetAura()->GetDonePct()); - } + void CalculateBuffer(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) + { + Unit* caster = GetCaster(); + if (!caster) + return; - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - DamageInfo* damageInfo = eventInfo.GetDamageInfo(); - if (!damageInfo || !damageInfo->GetDamage()) - return; + // effect 1 scales with 14% of caster's SP (DBC data) + amount = caster->SpellDamageBonusDone(GetUnitOwner(), GetSpellInfo(), amount, SPELL_DIRECT_DAMAGE, aurEff->GetEffIndex(), GetAura()->GetDonePct()); + } - int32 amount = aurEff->GetAmount() - damageInfo->GetDamage(); - if (amount > 0) - { - const_cast<AuraEffect*>(aurEff)->SetAmount(amount); - if (!GetTarget()->HealthBelowPctDamaged(1, damageInfo->GetDamage())) - return; - } + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + if (!damageInfo || !damageInfo->GetDamage()) + return; - Remove(); + int32 amount = aurEff->GetAmount() - damageInfo->GetDamage(); + if (amount > 0) + { + const_cast<AuraEffect*>(aurEff)->SetAmount(amount); + if (!GetTarget()->HealthBelowPctDamaged(1, damageInfo->GetDamage())) + return; + } - Unit* caster = GetCaster(); - if (!caster) - return; + Remove(); - uint32 spellId = sSpellMgr->GetSpellWithRank(SPELL_WARLOCK_SEED_OF_CORRUPTION_DAMAGE_R1, GetSpellInfo()->GetRank()); - caster->CastSpell(eventInfo.GetActionTarget(), spellId, aurEff); - } + Unit* caster = GetCaster(); + if (!caster) + return; - void Register() override - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_seed_of_corruption_dummy_AuraScript::CalculateBuffer, EFFECT_1, SPELL_AURA_DUMMY); - OnEffectProc += AuraEffectProcFn(spell_warl_seed_of_corruption_dummy_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); - } - }; + uint32 spellId = sSpellMgr->GetSpellWithRank(SPELL_WARLOCK_SEED_OF_CORRUPTION_DAMAGE_R1, GetSpellInfo()->GetRank()); + caster->CastSpell(eventInfo.GetActionTarget(), spellId, aurEff); + } - AuraScript* GetAuraScript() const override - { - return new spell_warl_seed_of_corruption_dummy_AuraScript(); - } + void Register() override + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_seed_of_corruption_dummy::CalculateBuffer, EFFECT_1, SPELL_AURA_DUMMY); + OnEffectProc += AuraEffectProcFn(spell_warl_seed_of_corruption_dummy::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); + } }; // 32863 - Seed of Corruption @@ -1241,365 +1015,287 @@ class spell_warl_seed_of_corruption_dummy : public SpellScriptLoader // 44141 - Seed of Corruption // 70388 - Seed of Corruption // Monster spells, triggered only on amount drop (not on death) -class spell_warl_seed_of_corruption_generic : public SpellScriptLoader +class spell_warl_seed_of_corruption_generic : public AuraScript { - public: - spell_warl_seed_of_corruption_generic() : SpellScriptLoader("spell_warl_seed_of_corruption_generic") { } - - class spell_warl_seed_of_corruption_generic_AuraScript : public AuraScript - { - PrepareAuraScript(spell_warl_seed_of_corruption_generic_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_WARLOCK_SEED_OF_CORRUPTION_GENERIC }); - } + PrepareAuraScript(spell_warl_seed_of_corruption_generic); - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - DamageInfo* damageInfo = eventInfo.GetDamageInfo(); - if (!damageInfo || !damageInfo->GetDamage()) - return; + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_WARLOCK_SEED_OF_CORRUPTION_GENERIC }); + } - int32 amount = aurEff->GetAmount() - damageInfo->GetDamage(); - if (amount > 0) - { - const_cast<AuraEffect*>(aurEff)->SetAmount(amount); - return; - } + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + if (!damageInfo || !damageInfo->GetDamage()) + return; - Remove(); + int32 amount = aurEff->GetAmount() - damageInfo->GetDamage(); + if (amount > 0) + { + const_cast<AuraEffect*>(aurEff)->SetAmount(amount); + return; + } - Unit* caster = GetCaster(); - if (!caster) - return; + Remove(); - caster->CastSpell(eventInfo.GetActionTarget(), SPELL_WARLOCK_SEED_OF_CORRUPTION_GENERIC, aurEff); - } + Unit* caster = GetCaster(); + if (!caster) + return; - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_warl_seed_of_corruption_generic_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); - } - }; + caster->CastSpell(eventInfo.GetActionTarget(), SPELL_WARLOCK_SEED_OF_CORRUPTION_GENERIC, aurEff); + } - AuraScript* GetAuraScript() const override - { - return new spell_warl_seed_of_corruption_generic_AuraScript(); - } + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_warl_seed_of_corruption_generic::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); + } }; // -6229 - Shadow Ward -class spell_warl_shadow_ward : public SpellScriptLoader +class spell_warl_shadow_ward : public AuraScript { - public: - spell_warl_shadow_ward() : SpellScriptLoader("spell_warl_shadow_ward") { } + PrepareAuraScript(spell_warl_shadow_ward); - class spell_warl_shadow_ward_AuraScript : public AuraScript + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) + { + canBeRecalculated = false; + if (Unit* caster = GetCaster()) { - PrepareAuraScript(spell_warl_shadow_ward_AuraScript); - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) - { - canBeRecalculated = false; - if (Unit* caster = GetCaster()) - { - // +80.68% from sp bonus - float bonus = 0.8068f; - - bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask()); - bonus *= caster->CalculateSpellpowerCoefficientLevelPenalty(GetSpellInfo()); + // +80.68% from sp bonus + float bonus = 0.8068f; - amount += int32(bonus); - } - } - - void Register() override - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_shadow_ward_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); - } - }; + bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask()); + bonus *= caster->CalculateSpellpowerCoefficientLevelPenalty(GetSpellInfo()); - AuraScript* GetAuraScript() const override - { - return new spell_warl_shadow_ward_AuraScript(); + amount += int32(bonus); } + } + + void Register() override + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_shadow_ward::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + } }; // 63108 - Siphon Life -class spell_warl_siphon_life : public SpellScriptLoader +class spell_warl_siphon_life : public AuraScript { - public: - spell_warl_siphon_life() : SpellScriptLoader("spell_warl_siphon_life") { } + PrepareAuraScript(spell_warl_siphon_life); - class spell_warl_siphon_life_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( { - PrepareAuraScript(spell_warl_siphon_life_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo( - { - SPELL_WARLOCK_SIPHON_LIFE_HEAL, - SPELL_WARLOCK_GLYPH_OF_SIPHON_LIFE - }); - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - DamageInfo* damageInfo = eventInfo.GetDamageInfo(); - if (!damageInfo || !damageInfo->GetDamage()) - return false; + SPELL_WARLOCK_SIPHON_LIFE_HEAL, + SPELL_WARLOCK_GLYPH_OF_SIPHON_LIFE + }); + } - return GetTarget()->IsAlive(); - } + bool CheckProc(ProcEventInfo& eventInfo) + { + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + if (!damageInfo || !damageInfo->GetDamage()) + return false; - void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); + return GetTarget()->IsAlive(); + } - int32 amount = CalculatePct(static_cast<int32>(eventInfo.GetDamageInfo()->GetDamage()), aurEff->GetAmount()); - // Glyph of Siphon Life - if (AuraEffect const* glyph = GetTarget()->GetAuraEffect(SPELL_WARLOCK_GLYPH_OF_SIPHON_LIFE, EFFECT_0)) - AddPct(amount, glyph->GetAmount()); + void OnProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); - CastSpellExtraArgs args(aurEff); - args.AddSpellBP0(amount); - GetTarget()->CastSpell(GetTarget(), SPELL_WARLOCK_SIPHON_LIFE_HEAL, args); - } + int32 amount = CalculatePct(static_cast<int32>(eventInfo.GetDamageInfo()->GetDamage()), aurEff->GetAmount()); + // Glyph of Siphon Life + if (AuraEffect const* glyph = GetTarget()->GetAuraEffect(SPELL_WARLOCK_GLYPH_OF_SIPHON_LIFE, EFFECT_0)) + AddPct(amount, glyph->GetAmount()); - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_warl_siphon_life_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_warl_siphon_life_AuraScript::OnProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; + CastSpellExtraArgs args(aurEff); + args.AddSpellBP0(amount); + GetTarget()->CastSpell(GetTarget(), SPELL_WARLOCK_SIPHON_LIFE_HEAL, args); + } - AuraScript* GetAuraScript() const override - { - return new spell_warl_siphon_life_AuraScript(); - } + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_warl_siphon_life::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_warl_siphon_life::OnProc, EFFECT_0, SPELL_AURA_DUMMY); + } }; // -30293 - Soul Leech -class spell_warl_soul_leech : public SpellScriptLoader +class spell_warl_soul_leech : public AuraScript { - public: - spell_warl_soul_leech() : SpellScriptLoader("spell_warl_soul_leech") { } + PrepareAuraScript(spell_warl_soul_leech); - class spell_warl_soul_leech_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( { - PrepareAuraScript(spell_warl_soul_leech_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo( - { - SPELL_WARLOCK_SOUL_LEECH_HEAL, - SPELL_WARLOCK_IMP_SOUL_LEECH_R1, - SPELL_WARLOCK_SOUL_LEECH_PET_MANA_1, - SPELL_WARLOCK_SOUL_LEECH_PET_MANA_2, - SPELL_WARLOCK_SOUL_LEECH_CASTER_MANA_1, - SPELL_WARLOCK_SOUL_LEECH_CASTER_MANA_2, - SPELL_REPLENISHMENT - }); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - static uint32 const casterMana[2] = { SPELL_WARLOCK_SOUL_LEECH_CASTER_MANA_1, SPELL_WARLOCK_SOUL_LEECH_CASTER_MANA_2 }; - static uint32 const petMana[2] = { SPELL_WARLOCK_SOUL_LEECH_PET_MANA_1, SPELL_WARLOCK_SOUL_LEECH_PET_MANA_2 }; + SPELL_WARLOCK_SOUL_LEECH_HEAL, + SPELL_WARLOCK_IMP_SOUL_LEECH_R1, + SPELL_WARLOCK_SOUL_LEECH_PET_MANA_1, + SPELL_WARLOCK_SOUL_LEECH_PET_MANA_2, + SPELL_WARLOCK_SOUL_LEECH_CASTER_MANA_1, + SPELL_WARLOCK_SOUL_LEECH_CASTER_MANA_2, + SPELL_REPLENISHMENT + }); + } - PreventDefaultAction(); - DamageInfo* damageInfo = eventInfo.GetDamageInfo(); - if (!damageInfo || !damageInfo->GetDamage()) - return; + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + static uint32 const casterMana[2] = { SPELL_WARLOCK_SOUL_LEECH_CASTER_MANA_1, SPELL_WARLOCK_SOUL_LEECH_CASTER_MANA_2 }; + static uint32 const petMana[2] = { SPELL_WARLOCK_SOUL_LEECH_PET_MANA_1, SPELL_WARLOCK_SOUL_LEECH_PET_MANA_2 }; - Unit* caster = eventInfo.GetActor(); - CastSpellExtraArgs args(TRIGGERED_FULL_MASK); - args.AddSpellBP0(CalculatePct(damageInfo->GetDamage(), aurEff->GetAmount())); - caster->CastSpell(caster, SPELL_WARLOCK_SOUL_LEECH_HEAL, args); + PreventDefaultAction(); + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + if (!damageInfo || !damageInfo->GetDamage()) + return; - // Improved Soul Leech code below - AuraEffect const* impSoulLeech = GetTarget()->GetAuraEffectOfRankedSpell(SPELL_WARLOCK_IMP_SOUL_LEECH_R1, EFFECT_1, aurEff->GetCasterGUID()); - if (!impSoulLeech) - return; + Unit* caster = eventInfo.GetActor(); + CastSpellExtraArgs args(TRIGGERED_FULL_MASK); + args.AddSpellBP0(CalculatePct(damageInfo->GetDamage(), aurEff->GetAmount())); + caster->CastSpell(caster, SPELL_WARLOCK_SOUL_LEECH_HEAL, args); - uint8 impSoulLeechRank = impSoulLeech->GetSpellInfo()->GetRank(); - uint32 selfSpellId = casterMana[impSoulLeechRank - 1]; - uint32 petSpellId = petMana[impSoulLeechRank - 1]; + // Improved Soul Leech code below + AuraEffect const* impSoulLeech = GetTarget()->GetAuraEffectOfRankedSpell(SPELL_WARLOCK_IMP_SOUL_LEECH_R1, EFFECT_1, aurEff->GetCasterGUID()); + if (!impSoulLeech) + return; - caster->CastSpell(nullptr, selfSpellId, aurEff); - caster->CastSpell(nullptr, petSpellId, aurEff); + uint8 impSoulLeechRank = impSoulLeech->GetSpellInfo()->GetRank(); + uint32 selfSpellId = casterMana[impSoulLeechRank - 1]; + uint32 petSpellId = petMana[impSoulLeechRank - 1]; - if (roll_chance_i(impSoulLeech->GetAmount())) - caster->CastSpell(nullptr, SPELL_REPLENISHMENT, aurEff); - } + caster->CastSpell(nullptr, selfSpellId, aurEff); + caster->CastSpell(nullptr, petSpellId, aurEff); - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_warl_soul_leech_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; + if (roll_chance_i(impSoulLeech->GetAmount())) + caster->CastSpell(nullptr, SPELL_REPLENISHMENT, aurEff); + } - AuraScript* GetAuraScript() const override - { - return new spell_warl_soul_leech_AuraScript(); - } + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_warl_soul_leech::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } }; // 29858 - Soulshatter -class spell_warl_soulshatter : public SpellScriptLoader +class spell_warl_soulshatter : public SpellScript { - public: - spell_warl_soulshatter() : SpellScriptLoader("spell_warl_soulshatter") { } - - class spell_warl_soulshatter_SpellScript : public SpellScript - { - PrepareSpellScript(spell_warl_soulshatter_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_WARLOCK_SOULSHATTER_EFFECT }); - } + PrepareSpellScript(spell_warl_soulshatter); - void HandleDummy(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (Unit* target = GetHitUnit()) - if (target->GetThreatManager().IsThreatenedBy(caster, true)) - caster->CastSpell(target, SPELL_WARLOCK_SOULSHATTER_EFFECT, true); - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_WARLOCK_SOULSHATTER_EFFECT }); + } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_warl_soulshatter_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; + void HandleDummy(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (Unit* target = GetHitUnit()) + if (target->GetThreatManager().IsThreatenedBy(caster, true)) + caster->CastSpell(target, SPELL_WARLOCK_SOULSHATTER_EFFECT, true); + } - SpellScript* GetSpellScript() const override - { - return new spell_warl_soulshatter_SpellScript(); - } + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_warl_soulshatter::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } }; // 37377 - Shadowflame // 39437 - Shadowflame Hellfire and RoF template <uint32 TriggerSpellId> -class spell_warl_t4_2p_bonus : public SpellScriptLoader +class spell_warl_t4_2p_bonus : public AuraScript { - public: - spell_warl_t4_2p_bonus(char const* ScriptName) : SpellScriptLoader(ScriptName) { } - - template <uint32 Trigger> - class spell_warl_t4_2p_bonus_AuraScript : public AuraScript - { - PrepareAuraScript(spell_warl_t4_2p_bonus_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ Trigger }); - } + PrepareAuraScript(spell_warl_t4_2p_bonus); - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - Unit* caster = eventInfo.GetActor(); - caster->CastSpell(caster, Trigger, aurEff); - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ TriggerSpellId }); + } - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_warl_t4_2p_bonus_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* caster = eventInfo.GetActor(); + caster->CastSpell(caster, TriggerSpellId, aurEff); + } - AuraScript* GetAuraScript() const override - { - return new spell_warl_t4_2p_bonus_AuraScript<TriggerSpellId>(); - } + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_warl_t4_2p_bonus::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } }; // -30108 - Unstable Affliction -class spell_warl_unstable_affliction : public SpellScriptLoader +class spell_warl_unstable_affliction : public AuraScript { - public: - spell_warl_unstable_affliction() : SpellScriptLoader("spell_warl_unstable_affliction") { } + PrepareAuraScript(spell_warl_unstable_affliction); - class spell_warl_unstable_affliction_AuraScript : public AuraScript - { - PrepareAuraScript(spell_warl_unstable_affliction_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL }); - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL }); + } - void HandleDispel(DispelInfo* dispelInfo) + void HandleDispel(DispelInfo* dispelInfo) + { + if (Unit* caster = GetCaster()) + { + if (AuraEffect const* aurEff = GetEffect(EFFECT_0)) { - if (Unit* caster = GetCaster()) + if (Unit* target = dispelInfo->GetDispeller()->ToUnit()) { - if (AuraEffect const* aurEff = GetEffect(EFFECT_0)) - { - if (Unit* target = dispelInfo->GetDispeller()->ToUnit()) - { - int32 bp = aurEff->GetAmount(); - bp = target->SpellDamageBonusTaken(caster, aurEff->GetSpellInfo(), bp, DOT); - bp *= 9; - - // backfire damage and silence - CastSpellExtraArgs args(aurEff); - args.AddSpellBP0(bp); - caster->CastSpell(target, SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL, args); - } - } - } - } + int32 bp = aurEff->GetAmount(); + bp = target->SpellDamageBonusTaken(caster, aurEff->GetSpellInfo(), bp, DOT); + bp *= 9; - void Register() override - { - AfterDispel += AuraDispelFn(spell_warl_unstable_affliction_AuraScript::HandleDispel); + // backfire damage and silence + CastSpellExtraArgs args(aurEff); + args.AddSpellBP0(bp); + caster->CastSpell(target, SPELL_WARLOCK_UNSTABLE_AFFLICTION_DISPEL, args); + } } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_warl_unstable_affliction_AuraScript(); } + } + + void Register() override + { + AfterDispel += AuraDispelFn(spell_warl_unstable_affliction::HandleDispel); + } }; void AddSC_warlock_spell_scripts() { RegisterSpellScript(spell_warl_curse_of_agony); - new spell_warl_banish(); + RegisterSpellScript(spell_warl_banish); new spell_warl_create_healthstone(); - new spell_warl_curse_of_doom(); - new spell_warl_decimation(); - new spell_warl_demonic_circle_summon(); - new spell_warl_demonic_circle_teleport(); - new spell_warl_demonic_empowerment(); - new spell_warl_demonic_pact(); - new spell_warl_drain_soul(); - new spell_warl_everlasting_affliction(); - new spell_warl_fel_synergy(); - new spell_warl_glyph_of_life_tap(); - new spell_warl_glyph_of_shadowflame(); - new spell_warl_haunt(); - new spell_warl_health_funnel(); - new spell_warl_glyph_of_corruption_nightfall(); - new spell_warl_life_tap(); - new spell_warl_nether_protection(); - new spell_warl_ritual_of_doom_effect(); - new spell_warl_seduction(); + RegisterSpellScript(spell_warl_curse_of_doom); + RegisterSpellScript(spell_warl_decimation); + RegisterSpellScript(spell_warl_demonic_circle_summon); + RegisterSpellScript(spell_warl_demonic_circle_teleport); + RegisterSpellScript(spell_warl_demonic_empowerment); + RegisterSpellScript(spell_warl_demonic_pact); + RegisterSpellScript(spell_warl_drain_soul); + RegisterSpellScript(spell_warl_everlasting_affliction); + RegisterSpellScript(spell_warl_fel_synergy); + RegisterSpellScript(spell_warl_glyph_of_life_tap); + RegisterSpellScript(spell_warl_glyph_of_shadowflame); + RegisterSpellAndAuraScriptPair(spell_warl_haunt, spell_warl_haunt_aura); + RegisterSpellScript(spell_warl_health_funnel); + RegisterSpellScript(spell_warl_glyph_of_corruption_nightfall); + RegisterSpellScript(spell_warl_life_tap); + RegisterSpellScript(spell_warl_nether_protection); + RegisterSpellScript(spell_warl_ritual_of_doom_effect); + RegisterSpellScript(spell_warl_seduction); RegisterSpellScript(spell_warl_seed_of_corruption); - new spell_warl_seed_of_corruption_dummy(); - new spell_warl_seed_of_corruption_generic(); - new spell_warl_shadow_ward(); - new spell_warl_siphon_life(); - new spell_warl_soul_leech(); - new spell_warl_soulshatter(); - new spell_warl_t4_2p_bonus<SPELL_WARLOCK_FLAMESHADOW>("spell_warl_t4_2p_bonus_shadow"); - new spell_warl_t4_2p_bonus<SPELL_WARLOCK_SHADOWFLAME>("spell_warl_t4_2p_bonus_fire"); - new spell_warl_unstable_affliction(); + RegisterSpellScript(spell_warl_seed_of_corruption_dummy); + RegisterSpellScript(spell_warl_seed_of_corruption_generic); + RegisterSpellScript(spell_warl_shadow_ward); + RegisterSpellScript(spell_warl_siphon_life); + RegisterSpellScript(spell_warl_soul_leech); + RegisterSpellScript(spell_warl_soulshatter); + RegisterSpellScriptWithArgs(spell_warl_t4_2p_bonus<SPELL_WARLOCK_FLAMESHADOW>, "spell_warl_t4_2p_bonus_shadow"); + RegisterSpellScriptWithArgs(spell_warl_t4_2p_bonus<SPELL_WARLOCK_SHADOWFLAME>, "spell_warl_t4_2p_bonus_fire"); + RegisterSpellScript(spell_warl_unstable_affliction); } |