aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/scripts/Spells/spell_warlock.cpp1814
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);
}