From f65283c35a99c7b3f13113beff74c31eefc80c9c Mon Sep 17 00:00:00 2001 From: Jelle Meeus Date: Sat, 22 Jun 2024 10:19:43 +0200 Subject: [PATCH 01/20] refactor(Scripts/TempestKeep): Spell Scripts use registry macros (#19123) * init sql * instance_the_eye aura:spell_the_eye_countercharge_aura * instance_the_botanica aura:spell_botanica_call_of_the_falcon_aura * instance_the_botanica aura:spell_botanica_shift_form_aura * arcatraz aura:spell_arcatraz_soul_steal_aura --- .../rev_1719036750384415139.sql | 5 + .../TempestKeep/Eye/instance_the_eye.cpp | 31 +-- .../Outland/TempestKeep/arcatraz/arcatraz.cpp | 48 ++--- .../botanica/instance_the_botanica.cpp | 194 ++++++++---------- 4 files changed, 122 insertions(+), 156 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1719036750384415139.sql diff --git a/data/sql/updates/pending_db_world/rev_1719036750384415139.sql b/data/sql/updates/pending_db_world/rev_1719036750384415139.sql new file mode 100644 index 000000000..081ab49c6 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1719036750384415139.sql @@ -0,0 +1,5 @@ +-- +UPDATE `spell_script_names` SET `ScriptName`='spell_the_eye_countercharge_aura' WHERE `spell_id`=35035; +UPDATE `spell_script_names` SET `ScriptName`='spell_botanica_call_of_the_falcon_aura' WHERE `spell_id`=34852; +UPDATE `spell_script_names` SET `ScriptName`='spell_botanica_shift_form_aura' WHERE `spell_id`=34201; +UPDATE `spell_script_names` SET `ScriptName`='spell_arcatraz_soul_steal_aura' WHERE `spell_id`=36778; diff --git a/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp b/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp index 5164b994d..4da9dbc14 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp @@ -145,37 +145,26 @@ public: } }; -class spell_the_eye_countercharge : public SpellScriptLoader +class spell_the_eye_countercharge_aura : public AuraScript { -public: - spell_the_eye_countercharge() : SpellScriptLoader("spell_the_eye_countercharge") { } + PrepareAuraScript(spell_the_eye_countercharge_aura); - class spell_the_eye_counterchargeScript : public AuraScript + bool PrepareProc(ProcEventInfo& /*eventInfo*/) { - PrepareAuraScript(spell_the_eye_counterchargeScript); + // xinef: prevent charge drop + PreventDefaultAction(); + return true; + } - bool PrepareProc(ProcEventInfo& /*eventInfo*/) - { - // xinef: prevent charge drop - PreventDefaultAction(); - return true; - } - - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_the_eye_counterchargeScript::PrepareProc); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_the_eye_counterchargeScript(); + DoCheckProc += AuraCheckProcFn(spell_the_eye_countercharge_aura::PrepareProc); } }; void AddSC_instance_the_eye() { new instance_the_eye(); - new spell_the_eye_countercharge(); + RegisterSpellScript(spell_the_eye_countercharge_aura); } diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp index 424e3b1e2..fbe462b86 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp @@ -585,37 +585,31 @@ public: } }; -class spell_arcatraz_soul_steal : public SpellScriptLoader +class spell_arcatraz_soul_steal_aura : public AuraScript { -public: - spell_arcatraz_soul_steal() : SpellScriptLoader("spell_arcatraz_soul_steal") { } + PrepareAuraScript(spell_arcatraz_soul_steal_aura); - class spell_arcatraz_soul_steal_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_arcatraz_soul_steal_AuraScript) + return ValidateSpellInfo({ SPELL_SOUL_STEAL }); + } - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - caster->CastSpell(caster, SPELL_SOUL_STEAL, true); - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - caster->RemoveAurasDueToSpell(SPELL_SOUL_STEAL); - } - - void Register() override - { - OnEffectApply += AuraEffectApplyFn(spell_arcatraz_soul_steal_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_arcatraz_soul_steal_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - return new spell_arcatraz_soul_steal_AuraScript(); + if (Unit* caster = GetCaster()) + caster->CastSpell(caster, SPELL_SOUL_STEAL, true); + } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) + caster->RemoveAurasDueToSpell(SPELL_SOUL_STEAL); + } + + void Register() override + { + OnEffectApply += AuraEffectApplyFn(spell_arcatraz_soul_steal_aura::HandleEffectApply, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_arcatraz_soul_steal_aura::HandleEffectRemove, EFFECT_0, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, AURA_EFFECT_HANDLE_REAL); } }; @@ -624,6 +618,6 @@ void AddSC_arcatraz() new npc_millhouse_manastorm(); new npc_warden_mellichar(); - new spell_arcatraz_soul_steal(); + RegisterSpellScript(spell_arcatraz_soul_steal_aura); } diff --git a/src/server/scripts/Outland/TempestKeep/botanica/instance_the_botanica.cpp b/src/server/scripts/Outland/TempestKeep/botanica/instance_the_botanica.cpp index b4687846b..02c20d600 100644 --- a/src/server/scripts/Outland/TempestKeep/botanica/instance_the_botanica.cpp +++ b/src/server/scripts/Outland/TempestKeep/botanica/instance_the_botanica.cpp @@ -42,136 +42,114 @@ public: } }; -class spell_botanica_call_of_the_falcon : public SpellScriptLoader +class spell_botanica_call_of_the_falcon_aura : public AuraScript { -public: - spell_botanica_call_of_the_falcon() : SpellScriptLoader("spell_botanica_call_of_the_falcon") { } + PrepareAuraScript(spell_botanica_call_of_the_falcon_aura); - class spell_botanica_call_of_the_falcon_AuraScript : public AuraScript + bool Load() override { - PrepareAuraScript(spell_botanica_call_of_the_falcon_AuraScript) - - bool Load() override - { - _falconSet.clear(); - return true; - } - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - std::list creatureList; - GetUnitOwner()->GetCreaturesWithEntryInRange(creatureList, 80.0f, NPC_BLOODFALCON); - for (std::list::const_iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr) - { - (*itr)->TauntApply(GetUnitOwner()); - (*itr)->AddThreat(GetUnitOwner(), 10000000.0f); - _falconSet.insert((*itr)->GetGUID()); - } - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - for (ObjectGuid const& guid : _falconSet) - if (Creature* falcon = ObjectAccessor::GetCreature(*GetUnitOwner(), guid)) - { - falcon->TauntFadeOut(GetUnitOwner()); - falcon->AddThreat(GetUnitOwner(), -10000000.0f); - } - } - - void Register() override - { - OnEffectApply += AuraEffectApplyFn(spell_botanica_call_of_the_falcon_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_botanica_call_of_the_falcon_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - - private: - GuidSet _falconSet; - }; - - AuraScript* GetAuraScript() const override - { - return new spell_botanica_call_of_the_falcon_AuraScript(); + _falconSet.clear(); + return true; } + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + std::list creatureList; + GetUnitOwner()->GetCreaturesWithEntryInRange(creatureList, 80.0f, NPC_BLOODFALCON); + for (std::list::const_iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr) + { + (*itr)->TauntApply(GetUnitOwner()); + (*itr)->AddThreat(GetUnitOwner(), 10000000.0f); + _falconSet.insert((*itr)->GetGUID()); + } + } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + for (ObjectGuid const& guid : _falconSet) + if (Creature* falcon = ObjectAccessor::GetCreature(*GetUnitOwner(), guid)) + { + falcon->TauntFadeOut(GetUnitOwner()); + falcon->AddThreat(GetUnitOwner(), -10000000.0f); + } + } + + void Register() override + { + OnEffectApply += AuraEffectApplyFn(spell_botanica_call_of_the_falcon_aura::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_botanica_call_of_the_falcon_aura::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + +private: + GuidSet _falconSet; }; -class spell_botanica_shift_form : public SpellScriptLoader +class spell_botanica_shift_form_aura : public AuraScript { -public: - spell_botanica_shift_form() : SpellScriptLoader("spell_botanica_shift_form") { } + PrepareAuraScript(spell_botanica_shift_form_aura); - class spell_botanica_shift_form_AuraScript : public AuraScript + bool Load() override { - PrepareAuraScript(spell_botanica_shift_form_AuraScript); + _lastSchool = 0; + _lastForm = 0; + _swapTime = 0; + return true; + } - bool Load() override + bool CheckProc(ProcEventInfo& eventInfo) + { + if (SpellInfo const* spellInfo = eventInfo.GetSpellInfo()) { - _lastSchool = 0; - _lastForm = 0; - _swapTime = 0; - return true; - } + if ((spellInfo->GetSchoolMask() & _lastSchool) && _swapTime > GameTime::GetGameTime().count()) + return false; - bool CheckProc(ProcEventInfo& eventInfo) - { - if (SpellInfo const* spellInfo = eventInfo.GetSpellInfo()) + uint32 form = 0; + switch (GetFirstSchoolInMask(spellInfo->GetSchoolMask())) { - if ((spellInfo->GetSchoolMask() & _lastSchool) && _swapTime > GameTime::GetGameTime().count()) - return false; - - uint32 form = 0; - switch (GetFirstSchoolInMask(spellInfo->GetSchoolMask())) - { - case SPELL_SCHOOL_FIRE: - form = SPELL_FIRE_FORM; - break; - case SPELL_SCHOOL_FROST: - form = SPELL_FROST_FORM; - break; - case SPELL_SCHOOL_ARCANE: - form = SPELL_ARCANE_FORM; - break; - case SPELL_SCHOOL_SHADOW: - form = SPELL_SHADOW_FORM; - break; - default: - break; - } - - if (form) - { - _swapTime = GameTime::GetGameTime().count() + 6; - _lastSchool = spellInfo->GetSchoolMask(); - GetUnitOwner()->RemoveAurasDueToSpell(_lastForm); - _lastForm = form; - GetUnitOwner()->CastSpell(GetUnitOwner(), _lastForm, true); - } + case SPELL_SCHOOL_FIRE: + form = SPELL_FIRE_FORM; + break; + case SPELL_SCHOOL_FROST: + form = SPELL_FROST_FORM; + break; + case SPELL_SCHOOL_ARCANE: + form = SPELL_ARCANE_FORM; + break; + case SPELL_SCHOOL_SHADOW: + form = SPELL_SHADOW_FORM; + break; + default: + break; } - return false; + if (form) + { + _swapTime = GameTime::GetGameTime().count() + 6; + _lastSchool = spellInfo->GetSchoolMask(); + GetUnitOwner()->RemoveAurasDueToSpell(_lastForm); + _lastForm = form; + GetUnitOwner()->CastSpell(GetUnitOwner(), _lastForm, true); + } } - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_botanica_shift_form_AuraScript::CheckProc); - } - - private: - uint32 _lastSchool; - uint32 _lastForm; - uint32 _swapTime; - }; - - AuraScript* GetAuraScript() const override - { - return new spell_botanica_shift_form_AuraScript(); + return false; } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_botanica_shift_form_aura::CheckProc); + } + +private: + uint32 _lastSchool; + uint32 _lastForm; + uint32 _swapTime; }; void AddSC_instance_the_botanica() { new instance_the_botanica(); - new spell_botanica_call_of_the_falcon(); - new spell_botanica_shift_form(); + RegisterSpellScript(spell_botanica_call_of_the_falcon_aura); + RegisterSpellScript(spell_botanica_shift_form_aura); } From 9f348fc96d57263b8bbb6ae109f66cc6dee45bc3 Mon Sep 17 00:00:00 2001 From: Jelle Meeus Date: Sat, 22 Jun 2024 10:20:06 +0200 Subject: [PATCH 02/20] refactor(Scripts/BlackTemple): Spell Scripts use registry macros (#19122) --- .../rev_1719035147610263349.sql | 26 + .../Outland/BlackTemple/boss_bloodboil.cpp | 70 +- .../Outland/BlackTemple/boss_illidan.cpp | 612 ++++++++---------- .../BlackTemple/boss_mother_shahraz.cpp | 267 ++++---- .../BlackTemple/boss_reliquary_of_souls.cpp | 275 ++++---- .../Outland/BlackTemple/illidari_council.cpp | 260 +++----- .../BlackTemple/instance_black_temple.cpp | 482 ++++++-------- 7 files changed, 828 insertions(+), 1164 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1719035147610263349.sql diff --git a/data/sql/updates/pending_db_world/rev_1719035147610263349.sql b/data/sql/updates/pending_db_world/rev_1719035147610263349.sql new file mode 100644 index 000000000..b80982c51 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1719035147610263349.sql @@ -0,0 +1,26 @@ +-- +UPDATE `spell_script_names` SET `ScriptName`='spell_mother_shahraz_random_periodic_aura' WHERE `spell_id`=40867; +UPDATE `spell_script_names` SET `ScriptName`='spell_mother_shahraz_beam_periodic_aura' WHERE `spell_id` IN (40862,40863,40865,40866); +UPDATE `spell_script_names` SET `ScriptName`='spell_mother_shahraz_saber_lash_aura' WHERE `spell_id`=40816; +UPDATE `spell_script_names` SET `ScriptName`='spell_illidari_council_balance_of_power_aura' WHERE `spell_id`=41341; +UPDATE `spell_script_names` SET `ScriptName`='spell_illidari_council_reflective_shield_aura' WHERE `spell_id`=41475; +UPDATE `spell_script_names` SET `ScriptName`='spell_illidari_council_deadly_strike_aura' WHERE `spell_id`=41480; +UPDATE `spell_script_names` SET `ScriptName`='spell_reliquary_of_souls_aura_of_suffering_aura' WHERE `spell_id`=41292; +UPDATE `spell_script_names` SET `ScriptName`='spell_reliquary_of_souls_aura_of_desire_aura' WHERE `spell_id`=41350; +UPDATE `spell_script_names` SET `ScriptName`='spell_reliquary_of_souls_aura_of_anger_aura' WHERE `spell_id`=41337; +UPDATE `spell_script_names` SET `ScriptName`='spell_reliquary_of_souls_spite_aura' WHERE `spell_id`=41376; +UPDATE `spell_script_names` SET `ScriptName`='spell_black_template_harpooners_mark_aura' WHERE `spell_id`=40084; +UPDATE `spell_script_names` SET `ScriptName`='spell_black_temple_curse_of_the_bleakheart_aura' WHERE `spell_id`=41170; +UPDATE `spell_script_names` SET `ScriptName`='spell_black_temple_skeleton_shot_aura' WHERE `spell_id`=41171; +UPDATE `spell_script_names` SET `ScriptName`='spell_black_temple_wyvern_sting_aura' WHERE `spell_id`=41186; +UPDATE `spell_script_names` SET `ScriptName`='spell_black_temple_charge_rage_aura' WHERE `spell_id`=39575; +UPDATE `spell_script_names` SET `ScriptName`='spell_black_temple_shadow_inferno_aura' WHERE `spell_id`=39645; +UPDATE `spell_script_names` SET `ScriptName`='spell_black_temple_spell_absorption_aura' WHERE `spell_id`=41034; +UPDATE `spell_script_names` SET `ScriptName`='spell_black_temple_consuming_strikes_aura' WHERE `spell_id`=41248; +UPDATE `spell_script_names` SET `ScriptName`='spell_black_temple_curse_of_vitality_aura' WHERE `spell_id`=41351; +UPDATE `spell_script_names` SET `ScriptName`='spell_black_temple_dementia_aura' WHERE `spell_id`=41404; +UPDATE `spell_script_names` SET `ScriptName`='spell_illidan_parasitic_shadowfiend_aura' WHERE `spell_id`=41917; +UPDATE `spell_script_names` SET `ScriptName`='spell_illidan_tear_of_azzinoth_summon_channel_aura' WHERE `spell_id`=39857; +UPDATE `spell_script_names` SET `ScriptName`='spell_illidan_demon_transform1_aura' WHERE `spell_id`=40511; +UPDATE `spell_script_names` SET `ScriptName`='spell_illidan_demon_transform2_aura' WHERE `spell_id`=40398; +UPDATE `spell_script_names` SET `ScriptName`='spell_illidan_cage_trap_stun_aura' WHERE `spell_id`=40760; diff --git a/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp b/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp index 6d97a0fe6..e5fecceb4 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_bloodboil.cpp @@ -198,73 +198,51 @@ public: }; }; -class spell_gurtogg_bloodboil : public SpellScriptLoader +class spell_gurtogg_bloodboil : public SpellScript { -public: - spell_gurtogg_bloodboil() : SpellScriptLoader("spell_gurtogg_bloodboil") { } + PrepareSpellScript(spell_gurtogg_bloodboil); - class spell_gurtogg_bloodboil_SpellScript : public SpellScript + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_gurtogg_bloodboil_SpellScript); + if (targets.empty()) + return; - void FilterTargets(std::list& targets) + targets.sort(Acore::ObjectDistanceOrderPred(GetCaster(), false)); + if (targets.size() > GetSpellValue()->MaxAffectedTargets) { - if (targets.empty()) - return; - - targets.sort(Acore::ObjectDistanceOrderPred(GetCaster(), false)); - if (targets.size() > GetSpellValue()->MaxAffectedTargets) - { - std::list::iterator itr = targets.begin(); - std::advance(itr, GetSpellValue()->MaxAffectedTargets); - targets.erase(itr, targets.end()); - } + std::list::iterator itr = targets.begin(); + std::advance(itr, GetSpellValue()->MaxAffectedTargets); + targets.erase(itr, targets.end()); } + } - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gurtogg_bloodboil_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_gurtogg_bloodboil_SpellScript(); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_gurtogg_bloodboil::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); } }; -class spell_gurtogg_eject : public SpellScriptLoader +class spell_gurtogg_eject : public SpellScript { -public: - spell_gurtogg_eject() : SpellScriptLoader("spell_gurtogg_eject") { } + PrepareSpellScript(spell_gurtogg_eject); - class spell_gurtogg_eject_SpellScript : public SpellScript + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_gurtogg_eject_SpellScript); + PreventHitEffect(effIndex); + if (Unit* target = GetHitUnit()) + GetCaster()->GetThreatMgr().ModifyThreatByPercent(target, -20); + } - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitEffect(effIndex); - if (Unit* target = GetHitUnit()) - GetCaster()->GetThreatMgr().ModifyThreatByPercent(target, -20); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_gurtogg_eject_SpellScript::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_gurtogg_eject_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_gurtogg_eject::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); } }; void AddSC_boss_gurtogg_bloodboil() { new boss_gurtogg_bloodboil(); - new spell_gurtogg_bloodboil(); - new spell_gurtogg_eject(); + RegisterSpellScript(spell_gurtogg_bloodboil); + RegisterSpellScript(spell_gurtogg_eject); } diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp index ebc2d0589..9d930d21a 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp @@ -1023,419 +1023,337 @@ public: } }; -class spell_illidan_draw_soul : public SpellScriptLoader +class spell_illidan_draw_soul : public SpellScript { -public: - spell_illidan_draw_soul() : SpellScriptLoader("spell_illidan_draw_soul") { } + PrepareSpellScript(spell_illidan_draw_soul); - class spell_illidan_draw_soul_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_illidan_draw_soul_SpellScript); + return ValidateSpellInfo({ SPELL_DRAW_SOUL_HEAL }); + } - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - target->CastSpell(GetCaster(), SPELL_DRAW_SOUL_HEAL, true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_illidan_draw_soul_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void HandleScriptEffect(SpellEffIndex effIndex) { - return new spell_illidan_draw_soul_SpellScript(); + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + target->CastSpell(GetCaster(), SPELL_DRAW_SOUL_HEAL, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_illidan_draw_soul::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); } }; -class spell_illidan_parasitic_shadowfiend : public SpellScriptLoader +class spell_illidan_parasitic_shadowfiend_aura : public AuraScript { -public: - spell_illidan_parasitic_shadowfiend() : SpellScriptLoader("spell_illidan_parasitic_shadowfiend") { } + PrepareAuraScript(spell_illidan_parasitic_shadowfiend_aura); - class spell_illidan_parasitic_shadowfiend_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_illidan_parasitic_shadowfiend_AuraScript) + return ValidateSpellInfo({ SPELL_SUMMON_PARASITIC_SHADOWFIENDS }); + } - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (!GetTarget()->HasAura(SPELL_SHADOW_PRISON) && GetTarget()->GetInstanceScript() && GetTarget()->GetInstanceScript()->IsEncounterInProgress()) - GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_PARASITIC_SHADOWFIENDS, true); - } - - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_illidan_parasitic_shadowfiend_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - return new spell_illidan_parasitic_shadowfiend_AuraScript(); + if (!GetTarget()->HasAura(SPELL_SHADOW_PRISON) && GetTarget()->GetInstanceScript() && GetTarget()->GetInstanceScript()->IsEncounterInProgress()) + GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_PARASITIC_SHADOWFIENDS, true); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_illidan_parasitic_shadowfiend_aura::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); } }; -class spell_illidan_parasitic_shadowfiend_trigger : public SpellScriptLoader +class spell_illidan_parasitic_shadowfiend_trigger : public SpellScript { -public: - spell_illidan_parasitic_shadowfiend_trigger() : SpellScriptLoader("spell_illidan_parasitic_shadowfiend_trigger") { } + PrepareSpellScript(spell_illidan_parasitic_shadowfiend_trigger); - class spell_illidan_parasitic_shadowfiend_trigger_AuraScript : public AuraScript + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareAuraScript(spell_illidan_parasitic_shadowfiend_trigger_AuraScript) - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (!GetTarget()->HasAura(SPELL_SHADOW_PRISON) && GetTarget()->GetInstanceScript() && GetTarget()->GetInstanceScript()->IsEncounterInProgress()) - GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_PARASITIC_SHADOWFIENDS, true); - } - - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_illidan_parasitic_shadowfiend_trigger_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_illidan_parasitic_shadowfiend_trigger_AuraScript(); + PreventHitDefaultEffect(effIndex); + if (Creature* target = GetHitCreature()) + target->DespawnOrUnsummon(1); } - class spell_illidan_parasitic_shadowfiend_trigger_SpellScript : public SpellScript + void Register() override { - PrepareSpellScript(spell_illidan_parasitic_shadowfiend_trigger_SpellScript); - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Creature* target = GetHitCreature()) - target->DespawnOrUnsummon(1); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_illidan_parasitic_shadowfiend_trigger_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_illidan_parasitic_shadowfiend_trigger_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_illidan_parasitic_shadowfiend_trigger::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); } }; -class spell_illidan_glaive_throw : public SpellScriptLoader +class spell_illidan_parasitic_shadowfiend_trigger_aura : public AuraScript { -public: - spell_illidan_glaive_throw() : SpellScriptLoader("spell_illidan_glaive_throw") { } + PrepareAuraScript(spell_illidan_parasitic_shadowfiend_trigger_aura); - class spell_illidan_glaive_throw_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_illidan_glaive_throw_SpellScript); + return ValidateSpellInfo({ SPELL_SUMMON_PARASITIC_SHADOWFIENDS }); + } - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitEffect(effIndex); - if (Unit* target = GetHitUnit()) - target->CastSpell(target, SPELL_SUMMON_GLAIVE, true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_illidan_glaive_throw_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - return new spell_illidan_glaive_throw_SpellScript(); + if (!GetTarget()->HasAura(SPELL_SHADOW_PRISON) && GetTarget()->GetInstanceScript() && GetTarget()->GetInstanceScript()->IsEncounterInProgress()) + GetTarget()->CastSpell(GetTarget(), SPELL_SUMMON_PARASITIC_SHADOWFIENDS, true); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_illidan_parasitic_shadowfiend_trigger_aura::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); } }; -class spell_illidan_tear_of_azzinoth_summon_channel : public SpellScriptLoader +class spell_illidan_glaive_throw : public SpellScript { -public: - spell_illidan_tear_of_azzinoth_summon_channel() : SpellScriptLoader("spell_illidan_tear_of_azzinoth_summon_channel") { } + PrepareSpellScript(spell_illidan_glaive_throw); - class spell_illidan_tear_of_azzinoth_summon_channel_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_illidan_tear_of_azzinoth_summon_channel_AuraScript); + return ValidateSpellInfo({ SPELL_SUMMON_GLAIVE }); + } - void OnPeriodic(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - if (Unit* caster = GetCaster()) - { - if (GetTarget()->GetDistance2d(caster) > 25.0f) - { - SetDuration(0); - GetTarget()->CastSpell(GetTarget(), SPELL_UNCAGED_WRATH, true); - } - } - - // xinef: ugly hax, dunno how it really works on blizz - Map::PlayerList const& pl = GetTarget()->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) - if (Player* player = itr->GetSource()) - if (player->GetPositionX() > 693.4f || player->GetPositionY() < 271.8f || player->GetPositionX() < 658.43f || player->GetPositionY() > 338.68f) - { - GetTarget()->CastSpell(player, SPELL_CHARGE, true); - break; - } - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_illidan_tear_of_azzinoth_summon_channel_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override + void HandleDummy(SpellEffIndex effIndex) { - return new spell_illidan_tear_of_azzinoth_summon_channel_AuraScript(); + PreventHitEffect(effIndex); + if (Unit* target = GetHitUnit()) + target->CastSpell(target, SPELL_SUMMON_GLAIVE, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_illidan_glaive_throw::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; -class spell_illidan_shadow_prison : public SpellScriptLoader +class spell_illidan_tear_of_azzinoth_summon_channel_aura : public AuraScript { -public: - spell_illidan_shadow_prison() : SpellScriptLoader("spell_illidan_shadow_prison") { } + PrepareAuraScript(spell_illidan_tear_of_azzinoth_summon_channel_aura); - class spell_illidan_shadow_prison_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_illidan_shadow_prison_SpellScript); - - void FilterTargets(std::list& targets) - { - targets.remove_if(PlayerOrPetCheck()); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_illidan_shadow_prison_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_illidan_shadow_prison_SpellScript(); + return ValidateSpellInfo({ SPELL_UNCAGED_WRATH, SPELL_CHARGE }); } -}; -class spell_illidan_demon_transform1 : public SpellScriptLoader -{ -public: - spell_illidan_demon_transform1() : SpellScriptLoader("spell_illidan_demon_transform1") { } - - class spell_illidan_demon_transform1_AuraScript : public AuraScript + void OnPeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_illidan_demon_transform1_AuraScript); - - bool Load() override + PreventDefaultAction(); + if (Unit* caster = GetCaster()) { - return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; - } - - void OnPeriodic(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - SetDuration(0); - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_DEMON_TRANSFORM_2, true); - GetUnitOwner()->ToCreature()->LoadEquipment(0, true); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_illidan_demon_transform1_AuraScript::OnPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_illidan_demon_transform1_AuraScript(); - } -}; - -class spell_illidan_demon_transform2 : public SpellScriptLoader -{ -public: - spell_illidan_demon_transform2() : SpellScriptLoader("spell_illidan_demon_transform2") { } - - class spell_illidan_demon_transform2_AuraScript : public AuraScript - { - PrepareAuraScript(spell_illidan_demon_transform2_AuraScript); - - bool Load() override - { - return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; - } - - void OnPeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - - if (aurEff->GetTickNumber() == 1) - { - if (GetUnitOwner()->GetDisplayId() == GetUnitOwner()->GetNativeDisplayId()) - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_DEMON_FORM, true); - else - GetUnitOwner()->RemoveAurasDueToSpell(SPELL_DEMON_FORM); - } - else if (aurEff->GetTickNumber() == 2) + if (GetTarget()->GetDistance2d(caster) > 25.0f) { SetDuration(0); - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_DEMON_TRANSFORM_3, true); - if (Aura* aura = GetUnitOwner()->GetAura(SPELL_DEMON_TRANSFORM_3)) - aura->SetDuration(4500); - - if (!GetUnitOwner()->HasAura(SPELL_DEMON_FORM)) - GetUnitOwner()->ToCreature()->LoadEquipment(1, true); + GetTarget()->CastSpell(GetTarget(), SPELL_UNCAGED_WRATH, true); } } - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_illidan_demon_transform2_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_illidan_demon_transform2_AuraScript(); - } -}; - -class spell_illidan_flame_burst : public SpellScriptLoader -{ -public: - spell_illidan_flame_burst() : SpellScriptLoader("spell_illidan_flame_burst") { } - - class spell_illidan_flame_burst_SpellScript : public SpellScript - { - PrepareSpellScript(spell_illidan_flame_burst_SpellScript); - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitEffect(effIndex); - if (Unit* target = GetHitUnit()) - target->CastSpell(target, SPELL_FLAME_BURST_EFFECT, true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_illidan_flame_burst_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_illidan_flame_burst_SpellScript(); - } -}; - -class spell_illidan_found_target : public SpellScriptLoader -{ -public: - spell_illidan_found_target() : SpellScriptLoader("spell_illidan_found_target") { } - - class spell_illidan_found_target_SpellScript : public SpellScript - { - PrepareSpellScript(spell_illidan_found_target_SpellScript); - - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitEffect(effIndex); - if (Unit* target = GetHitUnit()) - if (GetCaster()->GetDistance(target) < 2.0f) + // xinef: ugly hax, dunno how it really works on blizz + Map::PlayerList const& pl = GetTarget()->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) + if (Player* player = itr->GetSource()) + if (player->GetPositionX() > 693.4f || player->GetPositionY() < 271.8f || player->GetPositionX() < 658.43f || player->GetPositionY() > 338.68f) { - GetCaster()->CastSpell(target, SPELL_CONSUME_SOUL, true); - GetCaster()->CastSpell(GetCaster(), SPELL_FIND_TARGET, true); + GetTarget()->CastSpell(player, SPELL_CHARGE, true); + break; } - } + } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_illidan_found_target_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_illidan_found_target_SpellScript(); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_illidan_tear_of_azzinoth_summon_channel_aura::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; -class spell_illidan_cage_trap : public SpellScriptLoader +class spell_illidan_shadow_prison : public SpellScript { -public: - spell_illidan_cage_trap() : SpellScriptLoader("spell_illidan_cage_trap") { } + PrepareSpellScript(spell_illidan_shadow_prison); - class spell_illidan_cage_trap_SpellScript : public SpellScript + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_illidan_cage_trap_SpellScript); + targets.remove_if(PlayerOrPetCheck()); + } - bool Load() override - { - return GetCaster()->GetTypeId() == TYPEID_UNIT; - } - - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitEffect(effIndex); - if (Creature* target = GetHitCreature()) - if (GetCaster()->GetExactDist2d(target) < 4.0f) - { - target->AI()->DoAction(ACTION_ILLIDAN_CAGED); - target->CastSpell(target, SPELL_CAGE_TRAP, true); - GetCaster()->ToCreature()->DespawnOrUnsummon(1); - if (GameObject* gobject = GetCaster()->FindNearestGameObject(GO_CAGE_TRAP, 10.0f)) - gobject->SetLootState(GO_JUST_DEACTIVATED); - } - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_illidan_cage_trap_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_illidan_cage_trap_SpellScript(); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_illidan_shadow_prison::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); } }; -class spell_illidan_cage_trap_stun : public SpellScriptLoader +class spell_illidan_demon_transform1_aura : public AuraScript { -public: - spell_illidan_cage_trap_stun() : SpellScriptLoader("spell_illidan_cage_trap_stun") { } + PrepareAuraScript(spell_illidan_demon_transform1_aura); - class spell_illidan_cage_trap_stun_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_illidan_cage_trap_stun_AuraScript); + return ValidateSpellInfo({ SPELL_DEMON_TRANSFORM_2 }); + } - void OnPeriodic(AuraEffect const* /*aurEff*/) + bool Load() override + { + return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; + } + + void OnPeriodic(AuraEffect const* /*aurEff*/) + { + PreventDefaultAction(); + SetDuration(0); + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_DEMON_TRANSFORM_2, true); + GetUnitOwner()->ToCreature()->LoadEquipment(0, true); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_illidan_demon_transform1_aura::OnPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } +}; + +class spell_illidan_demon_transform2_aura : public AuraScript +{ + PrepareAuraScript(spell_illidan_demon_transform2_aura); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DEMON_FORM, SPELL_DEMON_TRANSFORM_3 }); + } + + bool Load() override + { + return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; + } + + void OnPeriodic(AuraEffect const* aurEff) + { + PreventDefaultAction(); + + if (aurEff->GetTickNumber() == 1) + { + if (GetUnitOwner()->GetDisplayId() == GetUnitOwner()->GetNativeDisplayId()) + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_DEMON_FORM, true); + else + GetUnitOwner()->RemoveAurasDueToSpell(SPELL_DEMON_FORM); + } + else if (aurEff->GetTickNumber() == 2) { - PreventDefaultAction(); SetDuration(0); + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_DEMON_TRANSFORM_3, true); + if (Aura* aura = GetUnitOwner()->GetAura(SPELL_DEMON_TRANSFORM_3)) + aura->SetDuration(4500); - for (uint32 i = SPELL_CAGED_SUMMON1; i <= SPELL_CAGED_SUMMON8; ++i) - GetTarget()->CastSpell(GetTarget(), i, true); - GetTarget()->CastSpell(GetTarget(), SPELL_CAGED_DEBUFF, true); + if (!GetUnitOwner()->HasAura(SPELL_DEMON_FORM)) + GetUnitOwner()->ToCreature()->LoadEquipment(1, true); } + } - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_illidan_cage_trap_stun_AuraScript::OnPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_illidan_cage_trap_stun_AuraScript(); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_illidan_demon_transform2_aura::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } +}; + +class spell_illidan_flame_burst : public SpellScript +{ + PrepareSpellScript(spell_illidan_flame_burst); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_FLAME_BURST_EFFECT }); + } + + void HandleScriptEffect(SpellEffIndex effIndex) + { + PreventHitEffect(effIndex); + if (Unit* target = GetHitUnit()) + target->CastSpell(target, SPELL_FLAME_BURST_EFFECT, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_illidan_flame_burst::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_illidan_found_target : public SpellScript +{ + PrepareSpellScript(spell_illidan_found_target); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_CONSUME_SOUL, SPELL_FIND_TARGET }); + } + + void HandleDummy(SpellEffIndex effIndex) + { + PreventHitEffect(effIndex); + if (Unit* target = GetHitUnit()) + if (GetCaster()->GetDistance(target) < 2.0f) + { + GetCaster()->CastSpell(target, SPELL_CONSUME_SOUL, true); + GetCaster()->CastSpell(GetCaster(), SPELL_FIND_TARGET, true); + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_illidan_found_target::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +class spell_illidan_cage_trap : public SpellScript +{ + PrepareSpellScript(spell_illidan_cage_trap); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_CAGE_TRAP }); + } + + bool Load() override + { + return GetCaster()->GetTypeId() == TYPEID_UNIT; + } + + void HandleScriptEffect(SpellEffIndex effIndex) + { + PreventHitEffect(effIndex); + if (Creature* target = GetHitCreature()) + if (GetCaster()->GetExactDist2d(target) < 4.0f) + { + target->AI()->DoAction(ACTION_ILLIDAN_CAGED); + target->CastSpell(target, SPELL_CAGE_TRAP, true); + GetCaster()->ToCreature()->DespawnOrUnsummon(1); + if (GameObject* gobject = GetCaster()->FindNearestGameObject(GO_CAGE_TRAP, 10.0f)) + gobject->SetLootState(GO_JUST_DEACTIVATED); + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_illidan_cage_trap::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +class spell_illidan_cage_trap_stun_aura : public AuraScript +{ + PrepareAuraScript(spell_illidan_cage_trap_stun_aura); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_CAGED_DEBUFF, SPELL_CAGED_SUMMON1, SPELL_CAGED_SUMMON1+1, SPELL_CAGED_SUMMON1+2, SPELL_CAGED_SUMMON1+3, SPELL_CAGED_SUMMON1+4, SPELL_CAGED_SUMMON1+5, SPELL_CAGED_SUMMON1+6, SPELL_CAGED_SUMMON8 }); + } + + void OnPeriodic(AuraEffect const* /*aurEff*/) + { + PreventDefaultAction(); + SetDuration(0); + + for (uint32 i = SPELL_CAGED_SUMMON1; i <= SPELL_CAGED_SUMMON8; ++i) + GetTarget()->CastSpell(GetTarget(), i, true); + GetTarget()->CastSpell(GetTarget(), SPELL_CAGED_DEBUFF, true); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_illidan_cage_trap_stun_aura::OnPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; @@ -1443,17 +1361,17 @@ void AddSC_boss_illidan() { new boss_illidan_stormrage(); new npc_akama_illidan(); - new spell_illidan_draw_soul(); - new spell_illidan_parasitic_shadowfiend(); - new spell_illidan_parasitic_shadowfiend_trigger(); - new spell_illidan_glaive_throw(); - new spell_illidan_tear_of_azzinoth_summon_channel(); - new spell_illidan_shadow_prison(); - new spell_illidan_demon_transform1(); - new spell_illidan_demon_transform2(); - new spell_illidan_flame_burst(); - new spell_illidan_found_target(); - new spell_illidan_cage_trap(); - new spell_illidan_cage_trap_stun(); + RegisterSpellScript(spell_illidan_draw_soul); + RegisterSpellScript(spell_illidan_parasitic_shadowfiend_aura); + RegisterSpellAndAuraScriptPair(spell_illidan_parasitic_shadowfiend_trigger, spell_illidan_parasitic_shadowfiend_trigger_aura); + RegisterSpellScript(spell_illidan_glaive_throw); + RegisterSpellScript(spell_illidan_tear_of_azzinoth_summon_channel_aura); + RegisterSpellScript(spell_illidan_shadow_prison); + RegisterSpellScript(spell_illidan_demon_transform1_aura); + RegisterSpellScript(spell_illidan_demon_transform2_aura); + RegisterSpellScript(spell_illidan_flame_burst); + RegisterSpellScript(spell_illidan_found_target); + RegisterSpellScript(spell_illidan_cage_trap); + RegisterSpellScript(spell_illidan_cage_trap_stun_aura); } diff --git a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp index d54cedf3a..eb642e0a5 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_mother_shahraz.cpp @@ -171,213 +171,162 @@ public: }; }; -class spell_mother_shahraz_random_periodic : public SpellScriptLoader +class spell_mother_shahraz_random_periodic_aura : public AuraScript { -public: - spell_mother_shahraz_random_periodic() : SpellScriptLoader("spell_mother_shahraz_random_periodic") { } + PrepareAuraScript(spell_mother_shahraz_random_periodic_aura); - class spell_mother_shahraz_random_periodic_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_mother_shahraz_random_periodic_AuraScript); + return ValidateSpellInfo({ SPELL_SINFUL_PERIODIC, SPELL_SINISTER_PERIODIC, SPELL_VILE_PERIODIC, SPELL_WICKED_PERIODIC }); + } - void Update(AuraEffect const* effect) - { - PreventDefaultAction(); - if (effect->GetTickNumber() % 5 == 1) - GetUnitOwner()->CastSpell(GetUnitOwner(), RAND(SPELL_SINFUL_PERIODIC, SPELL_SINISTER_PERIODIC, SPELL_VILE_PERIODIC, SPELL_WICKED_PERIODIC), true); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_mother_shahraz_random_periodic_AuraScript::Update, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override + void Update(AuraEffect const* effect) { - return new spell_mother_shahraz_random_periodic_AuraScript(); + PreventDefaultAction(); + if (effect->GetTickNumber() % 5 == 1) + GetUnitOwner()->CastSpell(GetUnitOwner(), RAND(SPELL_SINFUL_PERIODIC, SPELL_SINISTER_PERIODIC, SPELL_VILE_PERIODIC, SPELL_WICKED_PERIODIC), true); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_mother_shahraz_random_periodic_aura::Update, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; -class spell_mother_shahraz_beam_periodic : public SpellScriptLoader +class spell_mother_shahraz_beam_periodic_aura : public AuraScript { -public: - spell_mother_shahraz_beam_periodic() : SpellScriptLoader("spell_mother_shahraz_beam_periodic") { } + PrepareAuraScript(spell_mother_shahraz_beam_periodic_aura); - class spell_mother_shahraz_beam_periodic_AuraScript : public AuraScript + void Update(AuraEffect const* effect) { - PrepareAuraScript(spell_mother_shahraz_beam_periodic_AuraScript); + PreventDefaultAction(); + if (Unit* target = GetUnitOwner()->GetAI()->SelectTarget(SelectTargetMethod::Random, 0)) + GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, true); + } - void Update(AuraEffect const* effect) - { - PreventDefaultAction(); - if (Unit* target = GetUnitOwner()->GetAI()->SelectTarget(SelectTargetMethod::Random, 0)) - GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, true); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_mother_shahraz_beam_periodic_AuraScript::Update, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_mother_shahraz_beam_periodic_AuraScript(); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_mother_shahraz_beam_periodic_aura::Update, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; -class spell_mother_shahraz_saber_lash : public SpellScriptLoader +class spell_mother_shahraz_saber_lash_aura : public AuraScript { -public: - spell_mother_shahraz_saber_lash() : SpellScriptLoader("spell_mother_shahraz_saber_lash") { } + PrepareAuraScript(spell_mother_shahraz_saber_lash_aura); - class spell_mother_shahraz_saber_lash_AuraScript : public AuraScript + bool CheckProc(ProcEventInfo& /*eventInfo*/) { - PrepareAuraScript(spell_mother_shahraz_saber_lash_AuraScript); + return false; + } - bool CheckProc(ProcEventInfo& /*eventInfo*/) - { - return false; - } - - void Update(AuraEffect const* effect) - { - PreventDefaultAction(); - if (Unit* target = GetUnitOwner()->GetVictim()) - GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, true); - } - - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_mother_shahraz_saber_lash_AuraScript::CheckProc); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_mother_shahraz_saber_lash_AuraScript::Update, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override + void Update(AuraEffect const* effect) { - return new spell_mother_shahraz_saber_lash_AuraScript(); + PreventDefaultAction(); + if (Unit* target = GetUnitOwner()->GetVictim()) + GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, true); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_mother_shahraz_saber_lash_aura::CheckProc); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_mother_shahraz_saber_lash_aura::Update, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; -class spell_mother_shahraz_fatal_attraction : public SpellScriptLoader +class spell_mother_shahraz_fatal_attraction : public SpellScript { -public: - spell_mother_shahraz_fatal_attraction() : SpellScriptLoader("spell_mother_shahraz_fatal_attraction") { } + PrepareSpellScript(spell_mother_shahraz_fatal_attraction); - class spell_mother_shahraz_fatal_attraction_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_mother_shahraz_fatal_attraction_SpellScript); - - void FilterTargets(std::list& targets) - { - targets.remove_if(Acore::UnitAuraCheck(true, SPELL_SABER_LASH_IMMUNITY)); - if (targets.size() <= 1) - FinishCast(SPELL_FAILED_DONT_REPORT); - } - - void SetDest(SpellDestination& dest) - { - std::list const* targetsInfo = GetSpell()->GetUniqueTargetInfo(); - for (std::list::const_iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit) - if (Unit* target = ObjectAccessor::GetUnit(*GetCaster(), ihit->targetGUID)) - { - dest.Relocate(*target); - if (roll_chance_i(50)) - break; - } - } - - void HandleTeleportUnits(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - GetCaster()->CastSpell(target, SPELL_FATAL_ATTRACTION_AURA, true); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mother_shahraz_fatal_attraction_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); - OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_mother_shahraz_fatal_attraction_SpellScript::SetDest, EFFECT_1, TARGET_DEST_CASTER_RANDOM); - OnEffectHitTarget += SpellEffectFn(spell_mother_shahraz_fatal_attraction_SpellScript::HandleTeleportUnits, EFFECT_1, SPELL_EFFECT_TELEPORT_UNITS); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_mother_shahraz_fatal_attraction_SpellScript(); + return ValidateSpellInfo({ SPELL_FATAL_ATTRACTION_AURA }); } -}; -class spell_mother_shahraz_fatal_attraction_dummy : public SpellScriptLoader -{ -public: - spell_mother_shahraz_fatal_attraction_dummy() : SpellScriptLoader("spell_mother_shahraz_fatal_attraction_dummy") { } - - class spell_mother_shahraz_fatal_attraction_dummy_SpellScript : public SpellScript + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_mother_shahraz_fatal_attraction_dummy_SpellScript); + targets.remove_if(Acore::UnitAuraCheck(true, SPELL_SABER_LASH_IMMUNITY)); + if (targets.size() <= 1) + FinishCast(SPELL_FAILED_DONT_REPORT); + } - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) + void SetDest(SpellDestination& dest) + { + std::list const* targetsInfo = GetSpell()->GetUniqueTargetInfo(); + for (std::list::const_iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit) + if (Unit* target = ObjectAccessor::GetUnit(*GetCaster(), ihit->targetGUID)) { - target->CastSpell(target, SPELL_FATAL_ATTRACTION_DAMAGE, true); - if (AuraEffect* aurEff = target->GetAuraEffect(SPELL_FATAL_ATTRACTION_AURA, EFFECT_1)) - aurEff->SetAmount(aurEff->GetTickNumber()); + dest.Relocate(*target); + if (roll_chance_i(50)) + break; } - } + } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_mother_shahraz_fatal_attraction_dummy_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override + void HandleTeleportUnits(SpellEffIndex /*effIndex*/) { - return new spell_mother_shahraz_fatal_attraction_dummy_SpellScript(); + if (Unit* target = GetHitUnit()) + GetCaster()->CastSpell(target, SPELL_FATAL_ATTRACTION_AURA, true); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mother_shahraz_fatal_attraction::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_mother_shahraz_fatal_attraction::SetDest, EFFECT_1, TARGET_DEST_CASTER_RANDOM); + OnEffectHitTarget += SpellEffectFn(spell_mother_shahraz_fatal_attraction::HandleTeleportUnits, EFFECT_1, SPELL_EFFECT_TELEPORT_UNITS); } }; -class spell_mother_shahraz_fatal_attraction_aura : public SpellScriptLoader +class spell_mother_shahraz_fatal_attraction_dummy : public SpellScript { -public: - spell_mother_shahraz_fatal_attraction_aura() : SpellScriptLoader("spell_mother_shahraz_fatal_attraction_aura") { } + PrepareSpellScript(spell_mother_shahraz_fatal_attraction_dummy); - class spell_mother_shahraz_fatal_attraction_aura_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_mother_shahraz_fatal_attraction_aura_AuraScript); + return ValidateSpellInfo({ SPELL_FATAL_ATTRACTION_DAMAGE }); + } - void Update(AuraEffect const* effect) - { - if (effect->GetTickNumber() > uint32(effect->GetAmount() + 1)) - { - PreventDefaultAction(); - SetDuration(0); - } - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_mother_shahraz_fatal_attraction_aura_AuraScript::Update, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override + void HandleDummy(SpellEffIndex /*effIndex*/) { - return new spell_mother_shahraz_fatal_attraction_aura_AuraScript(); + if (Unit* target = GetHitUnit()) + { + target->CastSpell(target, SPELL_FATAL_ATTRACTION_DAMAGE, true); + if (AuraEffect* aurEff = target->GetAuraEffect(SPELL_FATAL_ATTRACTION_AURA, EFFECT_1)) + aurEff->SetAmount(aurEff->GetTickNumber()); + } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_mother_shahraz_fatal_attraction_dummy::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +class spell_mother_shahraz_fatal_attraction_aura : public AuraScript +{ + PrepareAuraScript(spell_mother_shahraz_fatal_attraction_aura); + + void Update(AuraEffect const* effect) + { + if (effect->GetTickNumber() > uint32(effect->GetAmount() + 1)) + { + PreventDefaultAction(); + SetDuration(0); + } + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_mother_shahraz_fatal_attraction_aura::Update, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; void AddSC_boss_mother_shahraz() { new boss_mother_shahraz(); - new spell_mother_shahraz_random_periodic(); - new spell_mother_shahraz_beam_periodic(); - new spell_mother_shahraz_saber_lash(); - new spell_mother_shahraz_fatal_attraction(); - new spell_mother_shahraz_fatal_attraction_dummy(); - new spell_mother_shahraz_fatal_attraction_aura(); + RegisterSpellScript(spell_mother_shahraz_random_periodic_aura); + RegisterSpellScript(spell_mother_shahraz_beam_periodic_aura); + RegisterSpellScript(spell_mother_shahraz_saber_lash_aura); + RegisterSpellScript(spell_mother_shahraz_fatal_attraction); + RegisterSpellScript(spell_mother_shahraz_fatal_attraction_dummy); + RegisterSpellScript(spell_mother_shahraz_fatal_attraction_aura); } diff --git a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp index 4ca74ecae..8054df37c 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_reliquary_of_souls.cpp @@ -582,200 +582,155 @@ public: }; }; -class spell_reliquary_of_souls_aura_of_suffering : public SpellScriptLoader +class spell_reliquary_of_souls_aura_of_suffering_aura : public AuraScript { -public: - spell_reliquary_of_souls_aura_of_suffering() : SpellScriptLoader("spell_reliquary_of_souls_aura_of_suffering") { } + PrepareAuraScript(spell_reliquary_of_souls_aura_of_suffering_aura); - class spell_reliquary_of_souls_aura_of_suffering_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_reliquary_of_souls_aura_of_suffering_AuraScript) + return ValidateSpellInfo({ SPELL_AURA_OF_SUFFERING_TRIGGER }); + } - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->CastSpell(GetTarget(), SPELL_AURA_OF_SUFFERING_TRIGGER, true); - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->RemoveAurasDueToSpell(SPELL_AURA_OF_SUFFERING_TRIGGER); - } - - void Register() override - { - OnEffectApply += AuraEffectApplyFn(spell_reliquary_of_souls_aura_of_suffering_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_reliquary_of_souls_aura_of_suffering_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - return new spell_reliquary_of_souls_aura_of_suffering_AuraScript(); + GetTarget()->CastSpell(GetTarget(), SPELL_AURA_OF_SUFFERING_TRIGGER, true); + } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveAurasDueToSpell(SPELL_AURA_OF_SUFFERING_TRIGGER); + } + + void Register() override + { + OnEffectApply += AuraEffectApplyFn(spell_reliquary_of_souls_aura_of_suffering_aura::HandleEffectApply, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_reliquary_of_souls_aura_of_suffering_aura::HandleEffectRemove, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT, AURA_EFFECT_HANDLE_REAL); } }; -class spell_reliquary_of_souls_fixate : public SpellScriptLoader +class spell_reliquary_of_souls_fixate : public SpellScript { -public: - spell_reliquary_of_souls_fixate() : SpellScriptLoader("spell_reliquary_of_souls_fixate") { } + PrepareSpellScript(spell_reliquary_of_souls_fixate); - class spell_reliquary_of_souls_fixate_SpellScript : public SpellScript + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_reliquary_of_souls_fixate_SpellScript); + if (targets.empty()) + return; - void FilterTargets(std::list& targets) - { - if (targets.empty()) - return; - - targets.sort(Acore::ObjectDistanceOrderPred(GetCaster())); - WorldObject* target = targets.front(); - targets.clear(); - targets.push_back(target); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_reliquary_of_souls_fixate_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_reliquary_of_souls_fixate_SpellScript(); + targets.sort(Acore::ObjectDistanceOrderPred(GetCaster())); + WorldObject* target = targets.front(); + targets.clear(); + targets.push_back(target); } - class spell_reliquary_of_souls_fixate_AuraScript : public AuraScript + void Register() override { - PrepareAuraScript(spell_reliquary_of_souls_fixate_AuraScript) - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - caster->RemoveAurasDueToSpell(GetSpellInfo()->Effects[EFFECT_1].TriggerSpell, GetTarget()->GetGUID()); - } - - void Register() override - { - OnEffectRemove += AuraEffectRemoveFn(spell_reliquary_of_souls_fixate_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_reliquary_of_souls_fixate_AuraScript(); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_reliquary_of_souls_fixate::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENEMY); } }; -class spell_reliquary_of_souls_aura_of_desire : public SpellScriptLoader +class spell_reliquary_of_souls_fixate_aura : public AuraScript { -public: - spell_reliquary_of_souls_aura_of_desire() : SpellScriptLoader("spell_reliquary_of_souls_aura_of_desire") { } + PrepareAuraScript(spell_reliquary_of_souls_fixate_aura); - class spell_reliquary_of_souls_aura_of_desire_AuraScript : public AuraScript + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_reliquary_of_souls_aura_of_desire_AuraScript); + if (Unit* caster = GetCaster()) + caster->RemoveAurasDueToSpell(GetSpellInfo()->Effects[EFFECT_1].TriggerSpell, GetTarget()->GetGUID()); + } - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetActor() && eventInfo.GetActionTarget(); - } - - void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - eventInfo.GetActionTarget()->CastCustomSpell(SPELL_AURA_OF_DESIRE_DAMAGE, SPELLVALUE_BASE_POINT0, eventInfo.GetDamageInfo()->GetDamage() / 2, eventInfo.GetActor(), true); - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_2)) - amount = std::max(-100, -5 * int32(effect->GetTickNumber())); - } - - void Update(AuraEffect const* /*effect*/) - { - PreventDefaultAction(); - if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_1)) - effect->RecalculateAmount(); - } - - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_reliquary_of_souls_aura_of_desire_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_reliquary_of_souls_aura_of_desire_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_reliquary_of_souls_aura_of_desire_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_INCREASE_ENERGY_PERCENT); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_reliquary_of_souls_aura_of_desire_AuraScript::Update, EFFECT_2, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_reliquary_of_souls_aura_of_desire_AuraScript(); + OnEffectRemove += AuraEffectRemoveFn(spell_reliquary_of_souls_fixate_aura::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; -class spell_reliquary_of_souls_aura_of_anger : public SpellScriptLoader +class spell_reliquary_of_souls_aura_of_desire_aura : public AuraScript { -public: - spell_reliquary_of_souls_aura_of_anger() : SpellScriptLoader("spell_reliquary_of_souls_aura_of_anger") { } + PrepareAuraScript(spell_reliquary_of_souls_aura_of_desire_aura); - class spell_reliquary_of_souls_aura_of_anger_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_reliquary_of_souls_aura_of_anger_AuraScript); + return ValidateSpellInfo({ SPELL_AURA_OF_DESIRE_DAMAGE }); + } - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_0)) - amount = amount * effect->GetTickNumber(); - } - - void Update(AuraEffect const* /*effect*/) - { - if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_0)) - effect->RecalculateAmount(); - if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_1)) - effect->RecalculateAmount(); - } - - void Register() override - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_reliquary_of_souls_aura_of_anger_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_reliquary_of_souls_aura_of_anger_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_reliquary_of_souls_aura_of_anger_AuraScript::Update, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const override + bool CheckProc(ProcEventInfo& eventInfo) { - return new spell_reliquary_of_souls_aura_of_anger_AuraScript(); + return eventInfo.GetActor() && eventInfo.GetActionTarget(); + } + + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActionTarget()->CastCustomSpell(SPELL_AURA_OF_DESIRE_DAMAGE, SPELLVALUE_BASE_POINT0, eventInfo.GetDamageInfo()->GetDamage() / 2, eventInfo.GetActor(), true); + } + + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) + { + if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_2)) + amount = std::max(-100, -5 * int32(effect->GetTickNumber())); + } + + void Update(AuraEffect const* /*effect*/) + { + PreventDefaultAction(); + if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_1)) + effect->RecalculateAmount(); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_reliquary_of_souls_aura_of_desire_aura::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_reliquary_of_souls_aura_of_desire_aura::HandleProc, EFFECT_0, SPELL_AURA_MOD_HEALING_PCT); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_reliquary_of_souls_aura_of_desire_aura::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_INCREASE_ENERGY_PERCENT); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_reliquary_of_souls_aura_of_desire_aura::Update, EFFECT_2, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; -class spell_reliquary_of_souls_spite : public SpellScriptLoader +class spell_reliquary_of_souls_aura_of_anger_aura : public AuraScript { -public: - spell_reliquary_of_souls_spite() : SpellScriptLoader("spell_reliquary_of_souls_spite") { } + PrepareAuraScript(spell_reliquary_of_souls_aura_of_anger_aura); - class spell_reliquary_of_souls_spite_AuraScript : public AuraScript + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_reliquary_of_souls_spite_AuraScript) + if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_0)) + amount = amount * effect->GetTickNumber(); + } - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - caster->CastSpell(GetTarget(), SPELL_SPITE_DAMAGE, true); - } - - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_reliquary_of_souls_spite_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DAMAGE_IMMUNITY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + void Update(AuraEffect const* /*effect*/) { - return new spell_reliquary_of_souls_spite_AuraScript(); + if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_0)) + effect->RecalculateAmount(); + if (AuraEffect* effect = GetAura()->GetEffect(EFFECT_1)) + effect->RecalculateAmount(); + } + + void Register() override + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_reliquary_of_souls_aura_of_anger_aura::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_reliquary_of_souls_aura_of_anger_aura::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_reliquary_of_souls_aura_of_anger_aura::Update, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + } +}; + +class spell_reliquary_of_souls_spite_aura : public AuraScript +{ + PrepareAuraScript(spell_reliquary_of_souls_spite_aura); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_SPITE_DAMAGE }); + } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) + caster->CastSpell(GetTarget(), SPELL_SPITE_DAMAGE, true); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_reliquary_of_souls_spite_aura::HandleEffectRemove, EFFECT_0, SPELL_AURA_DAMAGE_IMMUNITY, AURA_EFFECT_HANDLE_REAL); } }; @@ -785,10 +740,10 @@ void AddSC_boss_reliquary_of_souls() new boss_essence_of_suffering(); new boss_essence_of_desire(); new boss_essence_of_anger(); - new spell_reliquary_of_souls_aura_of_suffering(); - new spell_reliquary_of_souls_fixate(); - new spell_reliquary_of_souls_aura_of_desire(); - new spell_reliquary_of_souls_aura_of_anger(); - new spell_reliquary_of_souls_spite(); + RegisterSpellScript(spell_reliquary_of_souls_aura_of_suffering_aura); + RegisterSpellAndAuraScriptPair(spell_reliquary_of_souls_fixate, spell_reliquary_of_souls_fixate_aura); + RegisterSpellScript(spell_reliquary_of_souls_aura_of_desire_aura); + RegisterSpellScript(spell_reliquary_of_souls_aura_of_anger_aura); + RegisterSpellScript(spell_reliquary_of_souls_spite_aura); } diff --git a/src/server/scripts/Outland/BlackTemple/illidari_council.cpp b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp index 44d4cae96..c7be8416d 100644 --- a/src/server/scripts/Outland/BlackTemple/illidari_council.cpp +++ b/src/server/scripts/Outland/BlackTemple/illidari_council.cpp @@ -556,191 +556,141 @@ public: }; }; -class spell_illidari_council_balance_of_power : public SpellScriptLoader +class spell_illidari_council_balance_of_power_aura : public AuraScript { -public: - spell_illidari_council_balance_of_power() : SpellScriptLoader("spell_illidari_council_balance_of_power") { } + PrepareAuraScript(spell_illidari_council_balance_of_power_aura); - class spell_illidari_council_balance_of_power_AuraScript : public AuraScript + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_illidari_council_balance_of_power_AuraScript); + // Set absorbtion amount to unlimited (no absorb) + amount = -1; + } - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - // Set absorbtion amount to unlimited (no absorb) - amount = -1; - } - - void Register() override - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_illidari_council_balance_of_power_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_illidari_council_balance_of_power_AuraScript(); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_illidari_council_balance_of_power_aura::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); } }; -class spell_illidari_council_empyreal_balance : public SpellScriptLoader +class spell_illidari_council_empyreal_balance : public SpellScript { -public: - spell_illidari_council_empyreal_balance() : SpellScriptLoader("spell_illidari_council_empyreal_balance") { } + PrepareSpellScript(spell_illidari_council_empyreal_balance); - class spell_illidari_council_empyreal_balance_SpellScript : public SpellScript + bool Load() override { - PrepareSpellScript(spell_illidari_council_empyreal_balance_SpellScript); + _sharedHealth = 0; + _sharedHealthMax = 0; + _targetCount = 0; + return GetCaster()->GetTypeId() == TYPEID_UNIT; + } - bool Load() override + void HandleDummy(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) { - _sharedHealth = 0; - _sharedHealthMax = 0; - _targetCount = 0; - return GetCaster()->GetTypeId() == TYPEID_UNIT; + _targetCount++; + _sharedHealth += target->GetHealth(); + _sharedHealthMax += target->GetMaxHealth(); + } + } + + void HandleAfterCast() + { + if (_targetCount != 4) + { + GetCaster()->ToCreature()->AI()->EnterEvadeMode(); + return; } - void HandleDummy(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) + float pct = (_sharedHealth / _sharedHealthMax) * 100.0f; + std::list const* targetsInfo = GetSpell()->GetUniqueTargetInfo(); + for (std::list::const_iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit) + if (Creature* target = ObjectAccessor::GetCreature(*GetCaster(), ihit->targetGUID)) { - _targetCount++; - _sharedHealth += target->GetHealth(); - _sharedHealthMax += target->GetMaxHealth(); + target->LowerPlayerDamageReq(target->GetMaxHealth()); + target->SetHealth(CalculatePct(target->GetMaxHealth(), pct)); } - } + } - void HandleAfterCast() + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_illidari_council_empyreal_balance::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + AfterCast += SpellCastFn(spell_illidari_council_empyreal_balance::HandleAfterCast); + } + +private: + float _sharedHealth; + float _sharedHealthMax; + uint8 _targetCount; +}; + +class spell_illidari_council_reflective_shield_aura : public AuraScript +{ + PrepareAuraScript(spell_illidari_council_reflective_shield_aura); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_REFLECTIVE_SHIELD_T }); + } + + void ReflectDamage(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount) + { + Unit* target = GetTarget(); + if (dmgInfo.GetAttacker() == target) + return; + + int32 bp = absorbAmount / 2; + target->CastCustomSpell(dmgInfo.GetAttacker(), SPELL_REFLECTIVE_SHIELD_T, &bp, nullptr, nullptr, true, nullptr, aurEff); + } + + void Register() override + { + AfterEffectAbsorb += AuraEffectAbsorbFn(spell_illidari_council_reflective_shield_aura::ReflectDamage, EFFECT_0); + } +}; + +class spell_illidari_council_judgement : public SpellScript +{ + PrepareSpellScript(spell_illidari_council_judgement); + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + Unit::AuraEffectList const& auras = GetCaster()->GetAuraEffectsByType(SPELL_AURA_DUMMY); + for (Unit::AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i) { - if (_targetCount != 4) - { - GetCaster()->ToCreature()->AI()->EnterEvadeMode(); - return; - } - - float pct = (_sharedHealth / _sharedHealthMax) * 100.0f; - std::list const* targetsInfo = GetSpell()->GetUniqueTargetInfo(); - for (std::list::const_iterator ihit = targetsInfo->begin(); ihit != targetsInfo->end(); ++ihit) - if (Creature* target = ObjectAccessor::GetCreature(*GetCaster(), ihit->targetGUID)) + if ((*i)->GetSpellInfo()->GetSpellSpecific() == SPELL_SPECIFIC_SEAL && (*i)->GetEffIndex() == EFFECT_2) + if (sSpellMgr->GetSpellInfo((*i)->GetAmount())) { - target->LowerPlayerDamageReq(target->GetMaxHealth()); - target->SetHealth(CalculatePct(target->GetMaxHealth(), pct)); + GetCaster()->CastSpell(GetHitUnit(), (*i)->GetAmount(), true); + break; } } + } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_illidari_council_empyreal_balance_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - AfterCast += SpellCastFn(spell_illidari_council_empyreal_balance_SpellScript::HandleAfterCast); - } - - private: - float _sharedHealth; - float _sharedHealthMax; - uint8 _targetCount; - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_illidari_council_empyreal_balance_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_illidari_council_judgement::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; -class spell_illidari_council_reflective_shield : public SpellScriptLoader +class spell_illidari_council_deadly_strike_aura : public AuraScript { -public: - spell_illidari_council_reflective_shield() : SpellScriptLoader("spell_illidari_council_reflective_shield") { } + PrepareAuraScript(spell_illidari_council_deadly_strike_aura); - class spell_illidari_council_reflective_shield_AuraScript : public AuraScript + void Update(AuraEffect const* effect) { - PrepareAuraScript(spell_illidari_council_reflective_shield_AuraScript); - - void ReflectDamage(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount) + PreventDefaultAction(); + if (Unit* target = GetUnitOwner()->GetAI()->SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) { - Unit* target = GetTarget(); - if (dmgInfo.GetAttacker() == target) - return; - - int32 bp = absorbAmount / 2; - target->CastCustomSpell(dmgInfo.GetAttacker(), SPELL_REFLECTIVE_SHIELD_T, &bp, nullptr, nullptr, true, nullptr, aurEff); + GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, true); + GetUnitOwner()->m_Events.AddEvent(new VerasEnvenom(*GetUnitOwner(), target->GetGUID()), GetUnitOwner()->m_Events.CalculateTime(urand(1500, 3500))); } - - void Register() override - { - AfterEffectAbsorb += AuraEffectAbsorbFn(spell_illidari_council_reflective_shield_AuraScript::ReflectDamage, EFFECT_0); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_illidari_council_reflective_shield_AuraScript(); } -}; -class spell_illidari_council_judgement : public SpellScriptLoader -{ -public: - spell_illidari_council_judgement() : SpellScriptLoader("spell_illidari_council_judgement") { } - - class spell_illidari_council_judgement_SpellScript : public SpellScript + void Register() override { - PrepareSpellScript(spell_illidari_council_judgement_SpellScript); - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - Unit::AuraEffectList const& auras = GetCaster()->GetAuraEffectsByType(SPELL_AURA_DUMMY); - for (Unit::AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i) - { - if ((*i)->GetSpellInfo()->GetSpellSpecific() == SPELL_SPECIFIC_SEAL && (*i)->GetEffIndex() == EFFECT_2) - if (sSpellMgr->GetSpellInfo((*i)->GetAmount())) - { - GetCaster()->CastSpell(GetHitUnit(), (*i)->GetAmount(), true); - break; - } - } - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_illidari_council_judgement_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_illidari_council_judgement_SpellScript(); - } -}; - -class spell_illidari_council_deadly_strike : public SpellScriptLoader -{ -public: - spell_illidari_council_deadly_strike() : SpellScriptLoader("spell_illidari_council_deadly_strike") { } - - class spell_illidari_council_deadly_strike_AuraScript : public AuraScript - { - PrepareAuraScript(spell_illidari_council_deadly_strike_AuraScript); - - void Update(AuraEffect const* effect) - { - PreventDefaultAction(); - if (Unit* target = GetUnitOwner()->GetAI()->SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) - { - GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, true); - GetUnitOwner()->m_Events.AddEvent(new VerasEnvenom(*GetUnitOwner(), target->GetGUID()), GetUnitOwner()->m_Events.CalculateTime(urand(1500, 3500))); - } - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_illidari_council_deadly_strike_AuraScript::Update, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_illidari_council_deadly_strike_AuraScript(); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_illidari_council_deadly_strike_aura::Update, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; @@ -751,10 +701,10 @@ void AddSC_boss_illidari_council() new boss_lady_malande(); new boss_veras_darkshadow(); new boss_high_nethermancer_zerevor(); - new spell_illidari_council_balance_of_power(); - new spell_illidari_council_empyreal_balance(); - new spell_illidari_council_reflective_shield(); - new spell_illidari_council_judgement(); - new spell_illidari_council_deadly_strike(); + RegisterSpellScript(spell_illidari_council_balance_of_power_aura); + RegisterSpellScript(spell_illidari_council_empyreal_balance); + RegisterSpellScript(spell_illidari_council_reflective_shield_aura); + RegisterSpellScript(spell_illidari_council_judgement); + RegisterSpellScript(spell_illidari_council_deadly_strike_aura); } diff --git a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp index 75dbcd67a..61f774c5b 100644 --- a/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp +++ b/src/server/scripts/Outland/BlackTemple/instance_black_temple.cpp @@ -188,402 +188,290 @@ public: } }; -class spell_black_template_harpooners_mark : public SpellScriptLoader +class spell_black_template_harpooners_mark_aura : public AuraScript { -public: - spell_black_template_harpooners_mark() : SpellScriptLoader("spell_black_template_harpooners_mark") { } + PrepareAuraScript(spell_black_template_harpooners_mark_aura); - class spell_black_template_harpooners_mark_AuraScript : public AuraScript + bool Load() override { - PrepareAuraScript(spell_black_template_harpooners_mark_AuraScript) + _turtleSet.clear(); + return true; + } - bool Load() override + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + std::list creatureList; + GetUnitOwner()->GetCreaturesWithEntryInRange(creatureList, 80.0f, NPC_DRAGON_TURTLE); + for (std::list::const_iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr) { - _turtleSet.clear(); - return true; + (*itr)->TauntApply(GetUnitOwner()); + (*itr)->AddThreat(GetUnitOwner(), 10000000.0f); + _turtleSet.insert((*itr)->GetGUID()); } + } - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - std::list creatureList; - GetUnitOwner()->GetCreaturesWithEntryInRange(creatureList, 80.0f, NPC_DRAGON_TURTLE); - for (std::list::const_iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr) + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + for (ObjectGuid const& guid : _turtleSet) + if (Creature* turtle = ObjectAccessor::GetCreature(*GetUnitOwner(), guid)) { - (*itr)->TauntApply(GetUnitOwner()); - (*itr)->AddThreat(GetUnitOwner(), 10000000.0f); - _turtleSet.insert((*itr)->GetGUID()); + turtle->TauntFadeOut(GetUnitOwner()); + turtle->AddThreat(GetUnitOwner(), -10000000.0f); } - } + } - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - for (ObjectGuid const& guid : _turtleSet) - if (Creature* turtle = ObjectAccessor::GetCreature(*GetUnitOwner(), guid)) - { - turtle->TauntFadeOut(GetUnitOwner()); - turtle->AddThreat(GetUnitOwner(), -10000000.0f); - } - } - - void Register() override - { - OnEffectApply += AuraEffectApplyFn(spell_black_template_harpooners_mark_AuraScript::HandleEffectApply, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_black_template_harpooners_mark_AuraScript::HandleEffectRemove, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - - private: - GuidSet _turtleSet; - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_black_template_harpooners_mark_AuraScript(); + OnEffectApply += AuraEffectApplyFn(spell_black_template_harpooners_mark_aura::HandleEffectApply, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_black_template_harpooners_mark_aura::HandleEffectRemove, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); + } + +private: + GuidSet _turtleSet; +}; + +class spell_black_template_free_friend : public SpellScript +{ + PrepareSpellScript(spell_black_template_free_friend); + + void HandleScriptEffect(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + target->RemoveAurasWithMechanic(IMMUNE_TO_MOVEMENT_IMPAIRMENT_AND_LOSS_CONTROL_MASK); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_black_template_free_friend::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; -class spell_black_template_free_friend : public SpellScriptLoader +class spell_black_temple_curse_of_the_bleakheart_aura : public AuraScript { -public: - spell_black_template_free_friend() : SpellScriptLoader("spell_black_template_free_friend") { } + PrepareAuraScript(spell_black_temple_curse_of_the_bleakheart_aura); - class spell_black_template_free_friend_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_black_template_free_friend_SpellScript); + return ValidateSpellInfo({ SPELL_CHEST_PAINS }); + } - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - target->RemoveAurasWithMechanic(IMMUNE_TO_MOVEMENT_IMPAIRMENT_AND_LOSS_CONTROL_MASK); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_black_template_free_friend_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void CalcPeriodic(AuraEffect const* /*effect*/, bool& isPeriodic, int32& amplitude) { - return new spell_black_template_free_friend_SpellScript(); + isPeriodic = true; + amplitude = 5000; + } + + void Update(AuraEffect const* /*effect*/) + { + PreventDefaultAction(); + if (roll_chance_i(20)) + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_CHEST_PAINS, true); + } + + void Register() override + { + DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_black_temple_curse_of_the_bleakheart_aura::CalcPeriodic, EFFECT_0, SPELL_AURA_DUMMY); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_temple_curse_of_the_bleakheart_aura::Update, EFFECT_0, SPELL_AURA_DUMMY); } }; -class spell_black_temple_curse_of_the_bleakheart : public SpellScriptLoader +class spell_black_temple_skeleton_shot_aura : public AuraScript { -public: - spell_black_temple_curse_of_the_bleakheart() : SpellScriptLoader("spell_black_temple_curse_of_the_bleakheart") { } + PrepareAuraScript(spell_black_temple_skeleton_shot_aura); - class spell_black_temple_curse_of_the_bleakheart_AuraScript : public AuraScript + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_black_temple_curse_of_the_bleakheart_AuraScript); + if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_DEATH) + GetTarget()->CastSpell(GetTarget(), GetSpellInfo()->Effects[EFFECT_2].CalcValue(), true); + } - void CalcPeriodic(AuraEffect const* /*effect*/, bool& isPeriodic, int32& amplitude) - { - isPeriodic = true; - amplitude = 5000; - } - - void Update(AuraEffect const* /*effect*/) - { - PreventDefaultAction(); - if (roll_chance_i(20)) - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_CHEST_PAINS, true); - } - - void Register() override - { - DoEffectCalcPeriodic += AuraEffectCalcPeriodicFn(spell_black_temple_curse_of_the_bleakheart_AuraScript::CalcPeriodic, EFFECT_0, SPELL_AURA_DUMMY); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_temple_curse_of_the_bleakheart_AuraScript::Update, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_black_temple_curse_of_the_bleakheart_AuraScript(); + AfterEffectRemove += AuraEffectRemoveFn(spell_black_temple_skeleton_shot_aura::HandleEffectRemove, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); } }; -class spell_black_temple_skeleton_shot : public SpellScriptLoader +class spell_black_temple_wyvern_sting_aura : public AuraScript { -public: - spell_black_temple_skeleton_shot() : SpellScriptLoader("spell_black_temple_skeleton_shot") { } + PrepareAuraScript(spell_black_temple_wyvern_sting_aura); - class spell_black_temple_skeleton_shot_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_black_temple_skeleton_shot_AuraScript) + return ValidateSpellInfo({ SPELL_WYVERN_STING }); + } - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_DEATH) - GetTarget()->CastSpell(GetTarget(), GetSpellInfo()->Effects[EFFECT_2].CalcValue(), true); - } - - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_black_temple_skeleton_shot_AuraScript::HandleEffectRemove, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - return new spell_black_temple_skeleton_shot_AuraScript(); + if (Unit* caster = GetCaster()) + caster->CastSpell(GetTarget(), SPELL_WYVERN_STING, true); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_black_temple_wyvern_sting_aura::HandleEffectRemove, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); } }; -class spell_black_temple_wyvern_sting : public SpellScriptLoader +class spell_black_temple_charge_rage_aura : public AuraScript { -public: - spell_black_temple_wyvern_sting() : SpellScriptLoader("spell_black_temple_wyvern_sting") { } + PrepareAuraScript(spell_black_temple_charge_rage_aura); - class spell_black_temple_wyvern_sting_AuraScript : public AuraScript + void Update(AuraEffect const* effect) { - PrepareAuraScript(spell_black_temple_wyvern_sting_AuraScript) + PreventDefaultAction(); + if (Unit* target = GetUnitOwner()->SelectNearbyNoTotemTarget((Unit*)nullptr, 50.0f)) + GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, true); + } - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - caster->CastSpell(GetTarget(), SPELL_WYVERN_STING, true); - } - - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_black_temple_wyvern_sting_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_black_temple_wyvern_sting_AuraScript(); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_temple_charge_rage_aura::Update, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; -class spell_black_temple_charge_rage : public SpellScriptLoader +class spell_black_temple_shadow_inferno_aura : public AuraScript { -public: - spell_black_temple_charge_rage() : SpellScriptLoader("spell_black_temple_charge_rage") { } + PrepareAuraScript(spell_black_temple_shadow_inferno_aura); - class spell_black_temple_charge_rage_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_black_temple_charge_rage_AuraScript); + return ValidateSpellInfo({ SPELL_SHADOW_INFERNO_DAMAGE }); + } - void Update(AuraEffect const* effect) - { - PreventDefaultAction(); - if (Unit* target = GetUnitOwner()->SelectNearbyNoTotemTarget((Unit*)nullptr, 50.0f)) - GetUnitOwner()->CastSpell(target, GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, true); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_temple_charge_rage_AuraScript::Update, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override + void Update(AuraEffect const* effect) { - return new spell_black_temple_charge_rage_AuraScript(); + PreventDefaultAction(); + GetUnitOwner()->CastCustomSpell(SPELL_SHADOW_INFERNO_DAMAGE, SPELLVALUE_BASE_POINT0, effect->GetAmount(), GetUnitOwner(), TRIGGERED_FULL_MASK); + GetAura()->GetEffect(effect->GetEffIndex())->SetAmount(effect->GetAmount() + 500); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_temple_shadow_inferno_aura::Update, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; -class spell_black_temple_shadow_inferno : public SpellScriptLoader +class spell_black_temple_spell_absorption_aura : public AuraScript { -public: - spell_black_temple_shadow_inferno() : SpellScriptLoader("spell_black_temple_shadow_inferno") { } + PrepareAuraScript(spell_black_temple_spell_absorption_aura); - class spell_black_temple_shadow_inferno_AuraScript : public AuraScript + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { - PrepareAuraScript(spell_black_temple_shadow_inferno_AuraScript); + // Set absorbtion amount to unlimited + amount = -1; + } - void Update(AuraEffect const* effect) - { - PreventDefaultAction(); - GetUnitOwner()->CastCustomSpell(SPELL_SHADOW_INFERNO_DAMAGE, SPELLVALUE_BASE_POINT0, effect->GetAmount(), GetUnitOwner(), TRIGGERED_FULL_MASK); - GetAura()->GetEffect(effect->GetEffIndex())->SetAmount(effect->GetAmount() + 500); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_temple_shadow_inferno_AuraScript::Update, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override + void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) { - return new spell_black_temple_shadow_inferno_AuraScript(); + absorbAmount = dmgInfo.GetDamage(); + } + + void Update(AuraEffect const* effect) + { + PreventDefaultAction(); + uint32 count = GetUnitOwner()->GetAuraCount(SPELL_CHAOTIC_CHARGE); + if (count == 0) + return; + + GetUnitOwner()->CastCustomSpell(GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, SPELLVALUE_BASE_POINT0, effect->GetAmount()*count, GetUnitOwner(), TRIGGERED_FULL_MASK); + GetUnitOwner()->RemoveAurasDueToSpell(SPELL_CHAOTIC_CHARGE); + } + + void Register() override + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_black_temple_spell_absorption_aura::CalculateAmount, EFFECT_2, SPELL_AURA_SCHOOL_ABSORB); + OnEffectAbsorb += AuraEffectAbsorbFn(spell_black_temple_spell_absorption_aura::Absorb, EFFECT_2); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_temple_spell_absorption_aura::Update, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE); } }; -class spell_black_temple_spell_absorption : public SpellScriptLoader +class spell_black_temple_bloodbolt : public SpellScript { -public: - spell_black_temple_spell_absorption() : SpellScriptLoader("spell_black_temple_spell_absorption") { } + PrepareSpellScript(spell_black_temple_bloodbolt); - class spell_black_temple_spell_absorption_AuraScript : public AuraScript + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareAuraScript(spell_black_temple_spell_absorption_AuraScript); + PreventHitEffect(effIndex); + if (Unit* target = GetHitUnit()) + GetCaster()->CastSpell(target, GetEffectValue(), true); + } - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - // Set absorbtion amount to unlimited - amount = -1; - } - - void Absorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) - { - absorbAmount = dmgInfo.GetDamage(); - } - - void Update(AuraEffect const* effect) - { - PreventDefaultAction(); - uint32 count = GetUnitOwner()->GetAuraCount(SPELL_CHAOTIC_CHARGE); - if (count == 0) - return; - - GetUnitOwner()->CastCustomSpell(GetSpellInfo()->Effects[effect->GetEffIndex()].TriggerSpell, SPELLVALUE_BASE_POINT0, effect->GetAmount()*count, GetUnitOwner(), TRIGGERED_FULL_MASK); - GetUnitOwner()->RemoveAurasDueToSpell(SPELL_CHAOTIC_CHARGE); - } - - void Register() override - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_black_temple_spell_absorption_AuraScript::CalculateAmount, EFFECT_2, SPELL_AURA_SCHOOL_ABSORB); - OnEffectAbsorb += AuraEffectAbsorbFn(spell_black_temple_spell_absorption_AuraScript::Absorb, EFFECT_2); - OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_temple_spell_absorption_AuraScript::Update, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_black_temple_spell_absorption_AuraScript(); + OnEffectHitTarget += SpellEffectFn(spell_black_temple_bloodbolt::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; -class spell_black_temple_bloodbolt : public SpellScriptLoader +class spell_black_temple_consuming_strikes_aura : public AuraScript { -public: - spell_black_temple_bloodbolt() : SpellScriptLoader("spell_black_temple_bloodbolt") { } + PrepareAuraScript(spell_black_temple_consuming_strikes_aura); - class spell_black_temple_bloodbolt_SpellScript : public SpellScript + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) { - PrepareSpellScript(spell_black_temple_bloodbolt_SpellScript); + PreventDefaultAction(); + GetTarget()->CastCustomSpell(GetSpellInfo()->Effects[EFFECT_1].CalcValue(), SPELLVALUE_BASE_POINT0, eventInfo.GetDamageInfo()->GetDamage(), GetTarget(), true); + } - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitEffect(effIndex); - if (Unit* target = GetHitUnit()) - GetCaster()->CastSpell(target, GetEffectValue(), true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_black_temple_bloodbolt_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_black_temple_bloodbolt_SpellScript(); + OnEffectProc += AuraEffectProcFn(spell_black_temple_consuming_strikes_aura::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); } }; -class spell_black_temple_consuming_strikes : public SpellScriptLoader +class spell_black_temple_curse_of_vitality_aura : public AuraScript { -public: - spell_black_temple_consuming_strikes() : SpellScriptLoader("spell_black_temple_consuming_strikes") { } + PrepareAuraScript(spell_black_temple_curse_of_vitality_aura); - class spell_black_temple_consuming_strikes_AuraScript : public AuraScript + void OnPeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_black_temple_consuming_strikes_AuraScript); + if (GetUnitOwner()->HealthBelowPct(50)) + SetDuration(0); + } - void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - GetTarget()->CastCustomSpell(GetSpellInfo()->Effects[EFFECT_1].CalcValue(), SPELLVALUE_BASE_POINT0, eventInfo.GetDamageInfo()->GetDamage(), GetTarget(), true); - } - - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_black_temple_consuming_strikes_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_PROC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_black_temple_consuming_strikes_AuraScript(); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_temple_curse_of_vitality_aura::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); } }; -class spell_black_temple_curse_of_vitality : public SpellScriptLoader +class spell_black_temple_dementia_aura : public AuraScript { -public: - spell_black_temple_curse_of_vitality() : SpellScriptLoader("spell_black_temple_curse_of_vitality") { } + PrepareAuraScript(spell_black_temple_dementia_aura); - class spell_black_temple_curse_of_vitality_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_black_temple_curse_of_vitality_AuraScript); - - void OnPeriodic(AuraEffect const* /*aurEff*/) - { - if (GetUnitOwner()->HealthBelowPct(50)) - SetDuration(0); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_temple_curse_of_vitality_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_black_temple_curse_of_vitality_AuraScript(); + return ValidateSpellInfo({ SPELL_DEMENTIA1, SPELL_DEMENTIA2 }); } -}; -class spell_black_temple_dementia : public SpellScriptLoader -{ -public: - spell_black_temple_dementia() : SpellScriptLoader("spell_black_temple_dementia") { } - - class spell_black_temple_dementia_AuraScript : public AuraScript + void OnPeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_black_temple_dementia_AuraScript); + if (roll_chance_i(50)) + GetTarget()->CastSpell(GetTarget(), SPELL_DEMENTIA1, true); + else + GetTarget()->CastSpell(GetTarget(), SPELL_DEMENTIA2, true); + } - void OnPeriodic(AuraEffect const* /*aurEff*/) - { - if (roll_chance_i(50)) - GetTarget()->CastSpell(GetTarget(), SPELL_DEMENTIA1, true); - else - GetTarget()->CastSpell(GetTarget(), SPELL_DEMENTIA2, true); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_temple_dementia_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_black_temple_dementia_AuraScript(); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_black_temple_dementia_aura::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); } }; void AddSC_instance_black_temple() { new instance_black_temple(); - new spell_black_template_harpooners_mark(); - new spell_black_template_free_friend(); - new spell_black_temple_curse_of_the_bleakheart(); - new spell_black_temple_skeleton_shot(); - new spell_black_temple_wyvern_sting(); - new spell_black_temple_charge_rage(); - new spell_black_temple_shadow_inferno(); - new spell_black_temple_spell_absorption(); - new spell_black_temple_bloodbolt(); - new spell_black_temple_consuming_strikes(); - new spell_black_temple_curse_of_vitality(); - new spell_black_temple_dementia(); + RegisterSpellScript(spell_black_template_harpooners_mark_aura); + RegisterSpellScript(spell_black_template_free_friend); + RegisterSpellScript(spell_black_temple_curse_of_the_bleakheart_aura); + RegisterSpellScript(spell_black_temple_skeleton_shot_aura); + RegisterSpellScript(spell_black_temple_wyvern_sting_aura); + RegisterSpellScript(spell_black_temple_charge_rage_aura); + RegisterSpellScript(spell_black_temple_shadow_inferno_aura); + RegisterSpellScript(spell_black_temple_spell_absorption_aura); + RegisterSpellScript(spell_black_temple_bloodbolt); + RegisterSpellScript(spell_black_temple_consuming_strikes_aura); + RegisterSpellScript(spell_black_temple_curse_of_vitality_aura); + RegisterSpellScript(spell_black_temple_dementia_aura); } From dbec1a14417a968e6f874a637330ceac8cd16020 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 22 Jun 2024 08:20:43 +0000 Subject: [PATCH 03/20] chore(DB): import pending files Referenced commit(s): f65283c35a99c7b3f13113beff74c31eefc80c9c --- .../rev_1719035147610263349.sql => db_world/2024_06_22_03.sql} | 1 + .../rev_1719036750384415139.sql => db_world/2024_06_22_04.sql} | 1 + 2 files changed, 2 insertions(+) rename data/sql/updates/{pending_db_world/rev_1719035147610263349.sql => db_world/2024_06_22_03.sql} (98%) rename data/sql/updates/{pending_db_world/rev_1719036750384415139.sql => db_world/2024_06_22_04.sql} (90%) diff --git a/data/sql/updates/pending_db_world/rev_1719035147610263349.sql b/data/sql/updates/db_world/2024_06_22_03.sql similarity index 98% rename from data/sql/updates/pending_db_world/rev_1719035147610263349.sql rename to data/sql/updates/db_world/2024_06_22_03.sql index b80982c51..09f208aae 100644 --- a/data/sql/updates/pending_db_world/rev_1719035147610263349.sql +++ b/data/sql/updates/db_world/2024_06_22_03.sql @@ -1,3 +1,4 @@ +-- DB update 2024_06_22_02 -> 2024_06_22_03 -- UPDATE `spell_script_names` SET `ScriptName`='spell_mother_shahraz_random_periodic_aura' WHERE `spell_id`=40867; UPDATE `spell_script_names` SET `ScriptName`='spell_mother_shahraz_beam_periodic_aura' WHERE `spell_id` IN (40862,40863,40865,40866); diff --git a/data/sql/updates/pending_db_world/rev_1719036750384415139.sql b/data/sql/updates/db_world/2024_06_22_04.sql similarity index 90% rename from data/sql/updates/pending_db_world/rev_1719036750384415139.sql rename to data/sql/updates/db_world/2024_06_22_04.sql index 081ab49c6..28857bc7d 100644 --- a/data/sql/updates/pending_db_world/rev_1719036750384415139.sql +++ b/data/sql/updates/db_world/2024_06_22_04.sql @@ -1,3 +1,4 @@ +-- DB update 2024_06_22_03 -> 2024_06_22_04 -- UPDATE `spell_script_names` SET `ScriptName`='spell_the_eye_countercharge_aura' WHERE `spell_id`=35035; UPDATE `spell_script_names` SET `ScriptName`='spell_botanica_call_of_the_falcon_aura' WHERE `spell_id`=34852; From 842918c08cc91aaf052e7cf8c1002981907e11da Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sat, 22 Jun 2024 06:52:46 -0300 Subject: [PATCH 04/20] =?UTF-8?q?fix(DB/Creature):=20Fix=20Dragonmaw=20Win?= =?UTF-8?q?d=20Rider=20and=20Sky=20Stalker=20taunt=20immu=E2=80=A6=20(#191?= =?UTF-8?q?20)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix(DB/Creature): Fix Dragonmaw Wind Rider and Sky Stalker taunt immunity --- data/sql/updates/pending_db_world/rev_1719017127223217300.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1719017127223217300.sql diff --git a/data/sql/updates/pending_db_world/rev_1719017127223217300.sql b/data/sql/updates/pending_db_world/rev_1719017127223217300.sql new file mode 100644 index 000000000..c93096e13 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1719017127223217300.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template` SET `flags_extra` = `flags_extra` |256 WHERE `entry` IN (23030, 23330); From 5dfecab7cf6cee4327cb6ad5f03f80ee6a4cd7f1 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sat, 22 Jun 2024 06:52:58 -0300 Subject: [PATCH 05/20] =?UTF-8?q?fix(DB/Spells):=20Scourgebane=20Draugh=20?= =?UTF-8?q?&=20Infusion=20should=20stack=20with=20flask=E2=80=A6=20(#19119?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix(DB/Spells): Scourgebane Draugh & Infusion should stack with flasks and elixirs --- data/sql/updates/pending_db_world/rev_1719016208690175900.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1719016208690175900.sql diff --git a/data/sql/updates/pending_db_world/rev_1719016208690175900.sql b/data/sql/updates/pending_db_world/rev_1719016208690175900.sql new file mode 100644 index 000000000..1023f9bef --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1719016208690175900.sql @@ -0,0 +1,2 @@ +-- +DELETE FROM `spell_group` WHERE `spell_id` IN (28486, 28488); From 3b3d848c054ce009a6eb649cb8e678560e6f7945 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sat, 22 Jun 2024 06:53:10 -0300 Subject: [PATCH 06/20] fix(DB/Creature): Fix Dragonmaw Wind Rider interrupt immunity (#19118) fix(DB/Creature): Fix Dragonmaw Wind Rider immunities --- data/sql/updates/pending_db_world/rev_1719015578865296300.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1719015578865296300.sql diff --git a/data/sql/updates/pending_db_world/rev_1719015578865296300.sql b/data/sql/updates/pending_db_world/rev_1719015578865296300.sql new file mode 100644 index 000000000..1f96a38e6 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1719015578865296300.sql @@ -0,0 +1,2 @@ +-- +UPDATE `creature_template` SET `mechanic_immune_mask` = `mechanic_immune_mask`|33554432 WHERE `entry` = 23330; From add74214377745c103a52ccfb80039703ba35c12 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 22 Jun 2024 09:53:37 +0000 Subject: [PATCH 07/20] chore(DB): import pending files Referenced commit(s): 842918c08cc91aaf052e7cf8c1002981907e11da --- .../rev_1719015578865296300.sql => db_world/2024_06_22_05.sql} | 1 + .../rev_1719016208690175900.sql => db_world/2024_06_22_06.sql} | 1 + .../rev_1719017127223217300.sql => db_world/2024_06_22_07.sql} | 1 + 3 files changed, 3 insertions(+) rename data/sql/updates/{pending_db_world/rev_1719015578865296300.sql => db_world/2024_06_22_05.sql} (72%) rename data/sql/updates/{pending_db_world/rev_1719016208690175900.sql => db_world/2024_06_22_06.sql} (59%) rename data/sql/updates/{pending_db_world/rev_1719017127223217300.sql => db_world/2024_06_22_07.sql} (70%) diff --git a/data/sql/updates/pending_db_world/rev_1719015578865296300.sql b/data/sql/updates/db_world/2024_06_22_05.sql similarity index 72% rename from data/sql/updates/pending_db_world/rev_1719015578865296300.sql rename to data/sql/updates/db_world/2024_06_22_05.sql index 1f96a38e6..ca5dfb3cb 100644 --- a/data/sql/updates/pending_db_world/rev_1719015578865296300.sql +++ b/data/sql/updates/db_world/2024_06_22_05.sql @@ -1,2 +1,3 @@ +-- DB update 2024_06_22_04 -> 2024_06_22_05 -- UPDATE `creature_template` SET `mechanic_immune_mask` = `mechanic_immune_mask`|33554432 WHERE `entry` = 23330; diff --git a/data/sql/updates/pending_db_world/rev_1719016208690175900.sql b/data/sql/updates/db_world/2024_06_22_06.sql similarity index 59% rename from data/sql/updates/pending_db_world/rev_1719016208690175900.sql rename to data/sql/updates/db_world/2024_06_22_06.sql index 1023f9bef..4ebece510 100644 --- a/data/sql/updates/pending_db_world/rev_1719016208690175900.sql +++ b/data/sql/updates/db_world/2024_06_22_06.sql @@ -1,2 +1,3 @@ +-- DB update 2024_06_22_05 -> 2024_06_22_06 -- DELETE FROM `spell_group` WHERE `spell_id` IN (28486, 28488); diff --git a/data/sql/updates/pending_db_world/rev_1719017127223217300.sql b/data/sql/updates/db_world/2024_06_22_07.sql similarity index 70% rename from data/sql/updates/pending_db_world/rev_1719017127223217300.sql rename to data/sql/updates/db_world/2024_06_22_07.sql index c93096e13..55d12c5ec 100644 --- a/data/sql/updates/pending_db_world/rev_1719017127223217300.sql +++ b/data/sql/updates/db_world/2024_06_22_07.sql @@ -1,2 +1,3 @@ +-- DB update 2024_06_22_06 -> 2024_06_22_07 -- UPDATE `creature_template` SET `flags_extra` = `flags_extra` |256 WHERE `entry` IN (23030, 23330); From dba80c88045b16b4ce81650eac94b918670a99fa Mon Sep 17 00:00:00 2001 From: Jelle Meeus Date: Sat, 22 Jun 2024 12:37:10 +0200 Subject: [PATCH 08/20] fix(DB/Conditions): Thrall's WCB fixup (#19125) fixup --- .../updates/pending_db_world/rev_1719050119960028055.sql | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1719050119960028055.sql diff --git a/data/sql/updates/pending_db_world/rev_1719050119960028055.sql b/data/sql/updates/pending_db_world/rev_1719050119960028055.sql new file mode 100644 index 000000000..1f77d5149 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1719050119960028055.sql @@ -0,0 +1,6 @@ +-- +DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 13) AND (`SourceEntry` = 16609); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 7, 16609, 0, 0, 6, 0, 67, 0, 0, 0, 0, 0, '', 'Warchief\'s Blessing - Player must be Horde'), +(13, 7, 16609, 0, 0, 27, 0, 63, 4, 0, 0, 0, 0, '', 'Warchief\'s Blessing - Player must be level 63 or lower'), +(13, 7, 16609, 0, 0, 5, 0, 76, 240, 0, 0, 0, 0, '', 'Warchief\'s Blessing - Player must be at least Friendly with Orgrimmar'); From 2555dbd7271e545c0f6db2e9dcb6d6da8526565e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 22 Jun 2024 10:38:00 +0000 Subject: [PATCH 09/20] chore(DB): import pending files Referenced commit(s): dba80c88045b16b4ce81650eac94b918670a99fa --- .../rev_1719050119960028055.sql => db_world/2024_06_22_08.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1719050119960028055.sql => db_world/2024_06_22_08.sql} (94%) diff --git a/data/sql/updates/pending_db_world/rev_1719050119960028055.sql b/data/sql/updates/db_world/2024_06_22_08.sql similarity index 94% rename from data/sql/updates/pending_db_world/rev_1719050119960028055.sql rename to data/sql/updates/db_world/2024_06_22_08.sql index 1f77d5149..81ac07719 100644 --- a/data/sql/updates/pending_db_world/rev_1719050119960028055.sql +++ b/data/sql/updates/db_world/2024_06_22_08.sql @@ -1,3 +1,4 @@ +-- DB update 2024_06_22_07 -> 2024_06_22_08 -- DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 13) AND (`SourceEntry` = 16609); INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES From 9c7cf93cd8e082aa63d9dbe94f115a94616587f6 Mon Sep 17 00:00:00 2001 From: Jelle Meeus Date: Sat, 22 Jun 2024 20:22:24 +0200 Subject: [PATCH 10/20] refactor(Scripts/Hodir): spellscripts use registry macros (#19126) --- .../rev_1719051177326126718.sql | 5 + .../Northrend/Ulduar/Ulduar/boss_hodir.cpp | 520 ++++++++---------- .../Northrend/Ulduar/Ulduar/boss_ignis.cpp | 4 +- .../Northrend/Ulduar/Ulduar/boss_xt002.cpp | 4 +- 4 files changed, 231 insertions(+), 302 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1719051177326126718.sql diff --git a/data/sql/updates/pending_db_world/rev_1719051177326126718.sql b/data/sql/updates/pending_db_world/rev_1719051177326126718.sql new file mode 100644 index 000000000..03b39ff84 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1719051177326126718.sql @@ -0,0 +1,5 @@ +-- +UPDATE `spell_script_names` SET `ScriptName`='spell_hodir_storm_power_aura' WHERE `spell_id` IN (63711,65134); +UPDATE `spell_script_names` SET `ScriptName`='spell_hodir_storm_cloud_aura' WHERE `spell_id` IN (65123,65133); +UPDATE `spell_script_names` SET `ScriptName`='spell_hodir_toasty_fire_aura' WHERE `spell_id`=62821; +UPDATE `spell_script_names` SET `ScriptName`='spell_hodir_starlight_aura' WHERE `spell_id`=62807; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp index 972763b30..a8eac4757 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_hodir.cpp @@ -1180,159 +1180,133 @@ public: }; }; -class spell_hodir_shatter_chest : public SpellScriptLoader +class spell_hodir_shatter_chest : public SpellScript { -public: - spell_hodir_shatter_chest() : SpellScriptLoader("spell_hodir_shatter_chest") { } + PrepareSpellScript(spell_hodir_shatter_chest); - class spell_hodir_shatter_chestSpellScript : public SpellScript + void DestroyWinterCache(SpellEffIndex effIndex) { - PrepareSpellScript(spell_hodir_shatter_chestSpellScript) + PreventHitDefaultEffect(effIndex); - void destroyWinterCache(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - - if (Unit* hodir = GetCaster()) - hodir->GetAI()->DoAction(EVENT_FAIL_HM); - } - - void Register() override - { - OnEffectHit += SpellEffectFn(spell_hodir_shatter_chestSpellScript::destroyWinterCache, EFFECT_0, SPELL_EFFECT_TRIGGER_MISSILE); - }; - }; - - SpellScript* GetSpellScript() const override - { - return new spell_hodir_shatter_chestSpellScript(); + if (Unit* hodir = GetCaster()) + hodir->GetAI()->DoAction(EVENT_FAIL_HM); } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_hodir_shatter_chest::DestroyWinterCache, EFFECT_0, SPELL_EFFECT_TRIGGER_MISSILE); + }; }; -class spell_hodir_biting_cold_main_aura : public SpellScriptLoader +class spell_hodir_biting_cold_main_aura : public AuraScript { -public: - spell_hodir_biting_cold_main_aura() : SpellScriptLoader("spell_hodir_biting_cold_main_aura") { } + PrepareAuraScript(spell_hodir_biting_cold_main_aura); - class spell_hodir_biting_cold_main_aura_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_hodir_biting_cold_main_aura_AuraScript) - - void HandleEffectPeriodic(AuraEffect const* aurEff) - { - if ((aurEff->GetTickNumber() % 4) == 0) - if (Unit* target = GetTarget()) - if (target->GetTypeId() == TYPEID_PLAYER - && !target->isMoving() - && !target->HasAura(SPELL_BITING_COLD_PLAYER_AURA) - && !target->HasAura(SPELL_MAGE_TOASTY_FIRE_AURA)) - target->CastSpell(target, SPELL_BITING_COLD_PLAYER_AURA, true); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_hodir_biting_cold_main_aura_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_hodir_biting_cold_main_aura_AuraScript(); + return ValidateSpellInfo({ SPELL_BITING_COLD_PLAYER_AURA, SPELL_MAGE_TOASTY_FIRE_AURA }); } -}; -class spell_hodir_biting_cold_player_aura : public SpellScriptLoader -{ -public: - spell_hodir_biting_cold_player_aura() : SpellScriptLoader("spell_hodir_biting_cold_player_aura") { } - - class spell_hodir_biting_cold_player_aura_AuraScript : public AuraScript + void HandleEffectPeriodic(AuraEffect const* aurEff) { - PrepareAuraScript(spell_hodir_biting_cold_player_aura_AuraScript) - - uint8 counter {0}; - bool prev {false}; - - void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) - { + if ((aurEff->GetTickNumber() % 4) == 0) if (Unit* target = GetTarget()) - { - if (target->GetMapId() == 603) - SetDuration(GetMaxDuration()); - if (target->HasAura(SPELL_FLASH_FREEZE_TRAPPED_PLAYER)) - return; - if (target->isMoving() || target->HasAura(SPELL_MAGE_TOASTY_FIRE_AURA)) - { - if (prev) - { - ModStackAmount(-1); - prev = false; - } - else - prev = true; + if (target->GetTypeId() == TYPEID_PLAYER + && !target->isMoving() + && !target->HasAura(SPELL_BITING_COLD_PLAYER_AURA) + && !target->HasAura(SPELL_MAGE_TOASTY_FIRE_AURA)) + target->CastSpell(target, SPELL_BITING_COLD_PLAYER_AURA, true); + } - if (counter >= 2) - counter -= 2; - else if (counter) - --counter; + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_hodir_biting_cold_main_aura::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } +}; + +class spell_hodir_biting_cold_player_aura : public AuraScript +{ + PrepareAuraScript(spell_hodir_biting_cold_player_aura); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_FLASH_FREEZE_TRAPPED_PLAYER, SPELL_MAGE_TOASTY_FIRE_AURA, SPELL_BITING_COLD_DAMAGE }); + } + + bool Load() override + { + _counter = 0; + _prev = false; + return true; + } + + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) + { + if (Unit* target = GetTarget()) + { + if (target->GetMapId() == 603) + SetDuration(GetMaxDuration()); + if (target->HasAura(SPELL_FLASH_FREEZE_TRAPPED_PLAYER)) + return; + if (target->isMoving() || target->HasAura(SPELL_MAGE_TOASTY_FIRE_AURA)) + { + if (_prev) + { + ModStackAmount(-1); + _prev = false; } else - { - prev = false; - ++counter; - if (counter >= 4) - { - if (GetStackAmount() == 2) // increasing from 2 to 3 (not checking >= to improve performance) - if (InstanceScript* pInstance = target->GetInstanceScript()) - if (Creature* hodir = pInstance->instance->GetCreature(pInstance->GetGuidData(TYPE_HODIR))) - hodir->AI()->SetData(2, 1); - ModStackAmount(1); - counter = 0; - } - } + _prev = true; - const int32 dmg = 200 * pow(2.0f, GetStackAmount()); - target->CastCustomSpell(target, SPELL_BITING_COLD_DAMAGE, &dmg, 0, 0, true); + if (_counter >= 2) + _counter -= 2; + else if (_counter) + --_counter; + } + else + { + _prev = false; + ++_counter; + if (_counter >= 4) + { + if (GetStackAmount() == 2) // increasing from 2 to 3 (not checking >= to improve performance) + if (InstanceScript* pInstance = target->GetInstanceScript()) + if (Creature* hodir = pInstance->instance->GetCreature(pInstance->GetGuidData(TYPE_HODIR))) + hodir->AI()->SetData(2, 1); + ModStackAmount(1); + _counter = 0; + } } - } - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_hodir_biting_cold_player_aura_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + const int32 dmg = 200 * pow(2.0f, GetStackAmount()); + target->CastCustomSpell(target, SPELL_BITING_COLD_DAMAGE, &dmg, 0, 0, true); } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_hodir_biting_cold_player_aura_AuraScript(); } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_hodir_biting_cold_player_aura::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + +private: + uint8 _counter; + bool _prev; }; -class spell_hodir_periodic_icicle : public SpellScriptLoader +class spell_hodir_periodic_icicle : public SpellScript { -public: - spell_hodir_periodic_icicle() : SpellScriptLoader("spell_hodir_periodic_icicle") { } + PrepareSpellScript(spell_hodir_periodic_icicle); - class spell_hodir_periodic_icicle_SpellScript : public SpellScript + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_hodir_periodic_icicle_SpellScript); + targets.remove_if(Acore::ObjectTypeIdCheck(TYPEID_PLAYER, false)); + targets.remove_if(Acore::UnitAuraCheck(true, SPELL_FLASH_FREEZE_TRAPPED_PLAYER)); + Acore::Containers::RandomResize(targets, 1); + } - void FilterTargets(std::list& targets) - { - targets.remove_if(Acore::ObjectTypeIdCheck(TYPEID_PLAYER, false)); - targets.remove_if(Acore::UnitAuraCheck(true, SPELL_FLASH_FREEZE_TRAPPED_PLAYER)); - Acore::Containers::RandomResize(targets, 1); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_hodir_periodic_icicle_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_hodir_periodic_icicle_SpellScript(); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_hodir_periodic_icicle::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); } }; @@ -1349,150 +1323,156 @@ public: } }; -class spell_hodir_flash_freeze : public SpellScriptLoader +class spell_hodir_flash_freeze : public SpellScript { -public: - spell_hodir_flash_freeze() : SpellScriptLoader("spell_hodir_flash_freeze") { } + PrepareSpellScript(spell_hodir_flash_freeze); - class spell_hodir_flash_freeze_SpellScript : public SpellScript + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_hodir_flash_freeze_SpellScript); + targets.remove_if(FlashFreezeCheck()); + } - void FilterTargets(std::list& targets) - { - targets.remove_if(FlashFreezeCheck()); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_hodir_flash_freeze_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_hodir_flash_freeze_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - class spell_hodir_flash_freeze_AuraScript : public AuraScript + void Register() override { - PrepareAuraScript(spell_hodir_flash_freeze_AuraScript) + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_hodir_flash_freeze::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_hodir_flash_freeze::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); + } +}; - void HandleEffectPeriodic(AuraEffect const* aurEff) +class spell_hodir_flash_freeze_aura : public AuraScript +{ + PrepareAuraScript(spell_hodir_flash_freeze_aura); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_FLASH_FREEZE_INSTAKILL, SPELL_FLASH_FREEZE_TRAPPED_PLAYER, SPELL_FLASH_FREEZE_TRAPPED_NPC }); + } + + void HandleEffectPeriodic(AuraEffect const* aurEff) + { + if (aurEff->GetTotalTicks() > 0 && aurEff->GetTickNumber() == uint32(aurEff->GetTotalTicks()) - 1) { - if (aurEff->GetTotalTicks() > 0 && aurEff->GetTickNumber() == uint32(aurEff->GetTotalTicks()) - 1) + Unit* target = GetTarget(); + Unit* caster = GetCaster(); + if (!target || !caster || caster->GetTypeId() != TYPEID_UNIT) + return; + + if (Aura* aur = target->GetAura(target->GetTypeId() == TYPEID_PLAYER ? SPELL_FLASH_FREEZE_TRAPPED_PLAYER : SPELL_FLASH_FREEZE_TRAPPED_NPC)) { - Unit* target = GetTarget(); - Unit* caster = GetCaster(); - if (!target || !caster || caster->GetTypeId() != TYPEID_UNIT) - return; - - if (Aura* aur = target->GetAura(target->GetTypeId() == TYPEID_PLAYER ? SPELL_FLASH_FREEZE_TRAPPED_PLAYER : SPELL_FLASH_FREEZE_TRAPPED_NPC)) + if (Unit* caster2 = aur->GetCaster()) { - if (Unit* caster2 = aur->GetCaster()) + if (caster2->GetTypeId() == TYPEID_UNIT) { - if (caster2->GetTypeId() == TYPEID_UNIT) - { - caster2->ToCreature()->DespawnOrUnsummon(); - } - } - target->CastSpell(target, SPELL_FLASH_FREEZE_INSTAKILL, true); - return; - } - if (target->GetTypeId() == TYPEID_PLAYER) - { - caster->ToCreature()->AI()->SetData(1, 1); - if( Creature* c = target->SummonCreature(NPC_FLASH_FREEZE_PLR, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 5 * 60 * 1000) ) - { - c->CastSpell(target, SPELL_FLASH_FREEZE_TRAPPED_PLAYER, true); - caster->ToCreature()->AI()->JustSummoned(c); + caster2->ToCreature()->DespawnOrUnsummon(); } } - else if (target->GetTypeId() == TYPEID_UNIT) + target->CastSpell(target, SPELL_FLASH_FREEZE_INSTAKILL, true); + return; + } + if (target->GetTypeId() == TYPEID_PLAYER) + { + caster->ToCreature()->AI()->SetData(1, 1); + if( Creature* c = target->SummonCreature(NPC_FLASH_FREEZE_PLR, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 5 * 60 * 1000) ) { - if( Creature* c = target->SummonCreature(NPC_FLASH_FREEZE_NPC, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2000) ) - { - c->CastSpell(target, SPELL_FLASH_FREEZE_TRAPPED_NPC, true); - caster->ToCreature()->AI()->JustSummoned(c); - } + c->CastSpell(target, SPELL_FLASH_FREEZE_TRAPPED_PLAYER, true); + caster->ToCreature()->AI()->JustSummoned(c); + } + } + else if (target->GetTypeId() == TYPEID_UNIT) + { + if( Creature* c = target->SummonCreature(NPC_FLASH_FREEZE_NPC, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0.0f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2000) ) + { + c->CastSpell(target, SPELL_FLASH_FREEZE_TRAPPED_NPC, true); + caster->ToCreature()->AI()->JustSummoned(c); } } } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_hodir_flash_freeze_AuraScript::HandleEffectPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_hodir_flash_freeze_SpellScript(); } - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_hodir_flash_freeze_AuraScript(); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_hodir_flash_freeze_aura::HandleEffectPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY); } }; -class spell_hodir_storm_power : public SpellScriptLoader +class spell_hodir_storm_power_aura : public AuraScript { -public: - spell_hodir_storm_power() : SpellScriptLoader("spell_hodir_storm_power") { } + PrepareAuraScript(spell_hodir_storm_power_aura); - class spell_hodir_storm_power_AuraScript : public AuraScript + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_hodir_storm_power_AuraScript) + if (Unit* caster = GetCaster()) + if (Aura* a = caster->GetAura(GetId() == SPELL_SHAMAN_STORM_POWER_10 ? SPELL_SHAMAN_STORM_CLOUD_10 : SPELL_SHAMAN_STORM_CLOUD_25)) + a->ModStackAmount(-1); + } - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - if (Aura* a = caster->GetAura(GetId() == SPELL_SHAMAN_STORM_POWER_10 ? SPELL_SHAMAN_STORM_CLOUD_10 : SPELL_SHAMAN_STORM_CLOUD_25)) - a->ModStackAmount(-1); - } - - void HandleAfterEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* target = GetTarget()) - if (target->GetTypeId() == TYPEID_PLAYER) - target->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2, GetId(), 0, GetCaster()); - } - - void Register() override - { - OnEffectApply += AuraEffectApplyFn(spell_hodir_storm_power_AuraScript::OnApply, EFFECT_0, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, AURA_EFFECT_HANDLE_REAL); - AfterEffectApply += AuraEffectApplyFn(spell_hodir_storm_power_AuraScript::HandleAfterEffectApply, EFFECT_0, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT_MASK); - } - }; - - AuraScript* GetAuraScript() const override + void HandleAfterEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - return new spell_hodir_storm_power_AuraScript(); + if (Unit* target = GetTarget()) + if (target->GetTypeId() == TYPEID_PLAYER) + target->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2, GetId(), 0, GetCaster()); + } + + void Register() override + { + OnEffectApply += AuraEffectApplyFn(spell_hodir_storm_power_aura::OnApply, EFFECT_0, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, AURA_EFFECT_HANDLE_REAL); + AfterEffectApply += AuraEffectApplyFn(spell_hodir_storm_power_aura::HandleAfterEffectApply, EFFECT_0, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT_MASK); } }; -class spell_hodir_storm_cloud : public SpellScriptLoader +class spell_hodir_storm_cloud_aura : public AuraScript { -public: - spell_hodir_storm_cloud() : SpellScriptLoader("spell_hodir_storm_cloud") { } + PrepareAuraScript(spell_hodir_storm_cloud_aura); - class spell_hodir_storm_cloud_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_hodir_storm_cloud_AuraScript) + return ValidateSpellInfo({ SPELL_SHAMAN_STORM_CLOUD_10, SPELL_SHAMAN_STORM_POWER_10, SPELL_SHAMAN_STORM_POWER_25 }); + } - void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - if (Unit* target = GetTarget()) - target->CastSpell((Unit*)nullptr, (GetId() == SPELL_SHAMAN_STORM_CLOUD_10 ? SPELL_SHAMAN_STORM_POWER_10 : SPELL_SHAMAN_STORM_POWER_25), true); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_hodir_storm_cloud_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { - return new spell_hodir_storm_cloud_AuraScript(); + PreventDefaultAction(); + if (Unit* target = GetTarget()) + target->CastSpell((Unit*)nullptr, (GetId() == SPELL_SHAMAN_STORM_CLOUD_10 ? SPELL_SHAMAN_STORM_POWER_10 : SPELL_SHAMAN_STORM_POWER_25), true); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_hodir_storm_cloud_aura::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } +}; + +class spell_hodir_toasty_fire_aura : public AuraScript +{ + PrepareAuraScript(spell_hodir_toasty_fire_aura); + + void HandleAfterEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* target = GetTarget()) + if (target->GetTypeId() == TYPEID_PLAYER) + target->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2, SPELL_MAGE_TOASTY_FIRE_AURA, 0, GetCaster()); + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_hodir_toasty_fire_aura::HandleAfterEffectApply, EFFECT_0, SPELL_AURA_MOD_STAT, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT_MASK); + } +}; + +class spell_hodir_starlight_aura : public AuraScript +{ + PrepareAuraScript(spell_hodir_starlight_aura); + + void HandleAfterEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* target = GetTarget()) + if (target->GetTypeId() == TYPEID_PLAYER) + target->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2, SPELL_DRUID_STARLIGHT_AREA_AURA, 0, GetCaster()); + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_hodir_starlight_aura::HandleAfterEffectApply, EFFECT_0, SPELL_AURA_MELEE_SLOW, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT_MASK); } }; @@ -1562,62 +1542,6 @@ public: } }; -class spell_hodir_toasty_fire : public SpellScriptLoader -{ -public: - spell_hodir_toasty_fire() : SpellScriptLoader("spell_hodir_toasty_fire") { } - - class spell_hodir_toasty_fire_AuraScript : public AuraScript - { - PrepareAuraScript(spell_hodir_toasty_fire_AuraScript); - - void HandleAfterEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* target = GetTarget()) - if (target->GetTypeId() == TYPEID_PLAYER) - target->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2, SPELL_MAGE_TOASTY_FIRE_AURA, 0, GetCaster()); - } - - void Register() override - { - AfterEffectApply += AuraEffectApplyFn(spell_hodir_toasty_fire_AuraScript::HandleAfterEffectApply, EFFECT_0, SPELL_AURA_MOD_STAT, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT_MASK); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_hodir_toasty_fire_AuraScript(); - } -}; - -class spell_hodir_starlight : public SpellScriptLoader -{ -public: - spell_hodir_starlight() : SpellScriptLoader("spell_hodir_starlight") { } - - class spell_hodir_starlight_AuraScript : public AuraScript - { - PrepareAuraScript(spell_hodir_starlight_AuraScript); - - void HandleAfterEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* target = GetTarget()) - if (target->GetTypeId() == TYPEID_PLAYER) - target->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2, SPELL_DRUID_STARLIGHT_AREA_AURA, 0, GetCaster()); - } - - void Register() override - { - AfterEffectApply += AuraEffectApplyFn(spell_hodir_starlight_AuraScript::HandleAfterEffectApply, EFFECT_0, SPELL_AURA_MELEE_SLOW, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT_MASK); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_hodir_starlight_AuraScript(); - } -}; - void AddSC_boss_hodir() { new boss_hodir(); @@ -1630,13 +1554,15 @@ void AddSC_boss_hodir() new npc_ulduar_hodir_shaman(); new npc_ulduar_hodir_mage(); - new spell_hodir_biting_cold_main_aura(); - new spell_hodir_biting_cold_player_aura(); - new spell_hodir_periodic_icicle(); - new spell_hodir_flash_freeze(); - new spell_hodir_storm_power(); - new spell_hodir_storm_cloud(); - new spell_hodir_shatter_chest(); + RegisterSpellScript(spell_hodir_shatter_chest); + RegisterSpellScript(spell_hodir_biting_cold_main_aura); + RegisterSpellScript(spell_hodir_biting_cold_player_aura); + RegisterSpellScript(spell_hodir_periodic_icicle); + RegisterSpellAndAuraScriptPair(spell_hodir_flash_freeze, spell_hodir_flash_freeze_aura); + RegisterSpellScript(spell_hodir_storm_power_aura); + RegisterSpellScript(spell_hodir_storm_cloud_aura); + RegisterSpellScript(spell_hodir_toasty_fire_aura); + RegisterSpellScript(spell_hodir_starlight_aura); new achievement_cheese_the_freeze(); new achievement_getting_cold_in_here(); @@ -1644,6 +1570,4 @@ void AddSC_boss_hodir() new achievement_i_have_the_coolest_friends(); new achievement_staying_buffed_all_winter_10(); new achievement_staying_buffed_all_winter_25(); - new spell_hodir_toasty_fire(); - new spell_hodir_starlight(); } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp index 26ae69145..8c66fc036 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_ignis.cpp @@ -432,7 +432,7 @@ class spell_ignis_scorch_aura : public AuraScript bool Validate(SpellInfo const* /*spellInfo*/) override { - return ValidateSpellInfo( { SPELL_SCORCHED_GROUND_10, SPELL_SCORCHED_GROUND_25 }); + return ValidateSpellInfo({ SPELL_SCORCHED_GROUND_10, SPELL_SCORCHED_GROUND_25 }); } void HandleEffectPeriodic(AuraEffect const* aurEff) @@ -458,7 +458,7 @@ class spell_ignis_grab_initial : public SpellScript bool Validate(SpellInfo const* /*spellInfo*/) override { - return ValidateSpellInfo( { SPELL_GRAB_TRIGGERED }); + return ValidateSpellInfo({ SPELL_GRAB_TRIGGERED }); } void HandleScript(SpellEffIndex /*effIndex*/) diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp index 7a2fde768..362256a0a 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp @@ -882,7 +882,7 @@ class spell_xt002_tympanic_tantrum : public SpellScript // 64234, 63024 - Gravity Bomb enum GravityBomb { - SPELL_GRAVTY_BOMB_10 = 63025 + SPELL_GRAVITY_BOMB_TRIGGER_10 = 63025 }; class spell_xt002_gravity_bomb : public SpellScript @@ -917,7 +917,7 @@ class spell_xt002_gravity_bomb_aura : public AuraScript if (xt002->HasAura(aurEff->GetAmount())) // Heartbreak aura indicating hard mode if (Creature* creature = xt002->SummonCreature(NPC_VOID_ZONE, player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 180000)) { - int32 damage = GetSpellInfo()->Id == SPELL_GRAVTY_BOMB_10 ? 5000 : 7500; + int32 damage = GetSpellInfo()->Id == SPELL_GRAVITY_BOMB_TRIGGER_10 ? 5000 : 7500; creature->CastCustomSpell(creature, SPELL_VOID_ZONE_DAMAGE, &damage, 0, 0, true); } } From b055faf8eec50c6cdf39a2144df902992528e7d4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 22 Jun 2024 18:23:20 +0000 Subject: [PATCH 11/20] chore(DB): import pending files Referenced commit(s): 9c7cf93cd8e082aa63d9dbe94f115a94616587f6 --- .../rev_1719051177326126718.sql => db_world/2024_06_22_09.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1719051177326126718.sql => db_world/2024_06_22_09.sql} (90%) diff --git a/data/sql/updates/pending_db_world/rev_1719051177326126718.sql b/data/sql/updates/db_world/2024_06_22_09.sql similarity index 90% rename from data/sql/updates/pending_db_world/rev_1719051177326126718.sql rename to data/sql/updates/db_world/2024_06_22_09.sql index 03b39ff84..ca5cb1da1 100644 --- a/data/sql/updates/pending_db_world/rev_1719051177326126718.sql +++ b/data/sql/updates/db_world/2024_06_22_09.sql @@ -1,3 +1,4 @@ +-- DB update 2024_06_22_08 -> 2024_06_22_09 -- UPDATE `spell_script_names` SET `ScriptName`='spell_hodir_storm_power_aura' WHERE `spell_id` IN (63711,65134); UPDATE `spell_script_names` SET `ScriptName`='spell_hodir_storm_cloud_aura' WHERE `spell_id` IN (65123,65133); From cd9dff503258445958922be5643829aa21a8461e Mon Sep 17 00:00:00 2001 From: Jelle Meeus Date: Sun, 23 Jun 2024 19:17:19 +0200 Subject: [PATCH 12/20] refactor(Scripts/Northrend): dungeons Spell Scripts registry macros (#19134) * instance_azjol_nerub spell:spell_azjol_nerub_fixate * instance_azjol_nerub aura:spell_azjol_nerub_web_wrap_aura * boss_hadronox aura:spell_hadronox_summon_periodic_aura * boss_hadronox aura:spell_hadronox_leech_poison_aura * boss_argent_challenge spell:spell_eadric_radiance * boss_argent_challenge spell:spell_toc5_light_rain * boss_argent_challenge aura:spell_reflective_shield_aura * fixup! boss_argent_challenge aura:spell_reflective_shield_aura * instance_drak_tharon_keep aura:spell_dtk_raise_dead_aura * instance_drak_tharon_keep spell:spell_dtk_summon_random_drakkari * boss_trollgore spell:spell_trollgore_consume * boss_trollgore aura:spell_trollgore_corpse_explode_aura * boss_trollgore spell:spell_trollgore_invader_taunt * boss_novos spell:spell_novos_despawn_crystal_handler * boss_novos aura:spell_novos_crystal_handler_death_aura * boss_novos spell:spell_novos_summon_minions * boss_tharon_ja aura:spell_tharon_ja_curse_of_life_aura * boss_tharon_ja aura:spell_tharon_ja_dummy_aura * boss_tharon_ja spell:spell_tharon_ja_clear_gift_of_tharon_ja * boss_dred aura:spell_dred_grievious_bite_aura * boss_dred spell:spell_dred_raptor_call * boss_moorabi aura:spell_moorabi_mojo_frenzy_aura * boss_slad_ran aura:spell_sladran_grip_of_sladran_aura * boss_drakkari_colossus spell:spell_drakkari_colossus_emerge * boss_drakkari_colossus spell:spell_drakkari_colossus_surge * boss_drakkari_colossus spell:spell_drakkari_colossus_face_me * boss_gal_darah spell:spell_galdarah_impaling_charge * boss_gal_darah spell:spell_galdarah_transform * boss_malygos spell:spell_eoe_ph3_surge_of_power * oculus aura:spell_oculus_stop_time_aura * oculus aura:spell_oculus_evasive_maneuvers_aura * oculus spell:spell_oculus_shock_lance * oculus aura:spell_oculus_temporal_rift_aura * oculus spell:spell_oculus_touch_the_nightmare * oculus aura:spell_oculus_dream_funnel_aura * oculus spell:spell_oculus_call_ruby_emerald_amber_drake * oculus aura:spell_oculus_ride_ruby_emerald_amber_drake_que_aura * oculus aura:spell_oculus_evasive_charges_aura * oculus aura:spell_oculus_soar_aura * oculus aura:spell_oculus_rider_aura * oculus aura:spell_oculus_drake_flag_aura * boss_magus_telestra aura:spell_boss_magus_telestra_summon_telestra_clones_aura * boss_magus_telestra spell:spell_boss_magus_telestra_gravity_well * utgarde_keep aura:spell_ticking_time_bomb_aura * boss_keleseth aura:spell_frost_tomb_aura * boss_svala pair:spell_svala_ritual_strike * boss_moragg aura:spell_optic_link_aura * violet_hold aura:spell_destroy_door_seal_aura * forge_of_souls aura:spell_shield_of_bones_aura * boss_devourer_of_souls aura:spell_wailing_souls_periodic_aura * boss_bronjahm spell:spell_bronjahm_magic_bane * boss_bronjahm aura:spell_bronjahm_soulstorm_channel_ooc_aura * boss_bronjahm aura:spell_bronjahm_soulstorm_visual_aura * boss_bronjahm spell:spell_bronjahm_soulstorm_targeting * boss_krickandick aura:spell_krick_explosive_barrage_aura * boss_krickandick aura:spell_exploding_orb_auto_grow_aura * pit_of_saron aura:spell_pos_empowered_blizzard_aura * pit_of_saron spell:spell_pos_slave_trigger_closest * pit_of_saron spell:spell_pos_rimefang_frost_nova * pit_of_saron aura:spell_pos_blight_aura * pit_of_saron aura:spell_pos_glacial_strike_aura * boss_forgemaster_garfrost spell:spell_garfrost_permafrost * halls_of_reflection aura:spell_hor_gunship_cannon_fire_aura * boss_marwyn aura:spell_hor_shared_suffering_aura * fixup! forge_of_souls aura:spell_shield_of_bones_aura * fixup! boss_bronjahm aura:spell_bronjahm_soulstorm_channel_ooc_aura * fixup! boss_bronjahm aura:spell_bronjahm_soulstorm_visual_aura * fixup! pit_of_saron aura:spell_pos_empowered_blizzard_aura * fixup! halls_of_reflection aura:spell_hor_gunship_cannon_fire_aura * fixup! boss_marwyn aura:spell_hor_shared_suffering_aura --- .../rev_1719137457631116516.sql | 37 + .../AzjolNerub/AzjolNerub/boss_hadronox.cpp | 109 ++- .../AzjolNerub/instance_azjol_nerub.cpp | 67 +- .../boss_argent_challenge.cpp | 143 ++-- .../Northrend/DraktharonKeep/boss_dred.cpp | 64 +- .../Northrend/DraktharonKeep/boss_novos.cpp | 99 +-- .../DraktharonKeep/boss_tharon_ja.cpp | 118 ++-- .../DraktharonKeep/boss_trollgore.cpp | 113 ++- .../instance_drak_tharon_keep.cpp | 71 +- .../ForgeOfSouls/boss_bronjahm.cpp | 169 ++--- .../ForgeOfSouls/boss_devourer_of_souls.cpp | 96 ++- .../ForgeOfSouls/forge_of_souls.cpp | 67 +- .../HallsOfReflection/boss_marwyn.cpp | 69 +- .../HallsOfReflection/halls_of_reflection.cpp | 47 +- .../PitOfSaron/boss_forgemaster_garfrost.cpp | 107 ++- .../PitOfSaron/boss_krickandick.cpp | 102 ++- .../FrozenHalls/PitOfSaron/pit_of_saron.cpp | 224 +++--- .../Gundrak/boss_drakkari_colossus.cpp | 97 +-- .../Northrend/Gundrak/boss_gal_darah.cpp | 68 +- .../Northrend/Gundrak/boss_moorabi.cpp | 35 +- .../Northrend/Gundrak/boss_slad_ran.cpp | 42 +- .../Nexus/EyeOfEternity/boss_malygos.cpp | 81 +-- .../Nexus/Nexus/boss_magus_telestra.cpp | 147 ++-- .../scripts/Northrend/Nexus/Oculus/oculus.cpp | 666 ++++++++---------- .../UtgardeKeep/UtgardeKeep/boss_keleseth.cpp | 38 +- .../UtgardeKeep/UtgardeKeep/utgarde_keep.cpp | 43 +- .../UtgardePinnacle/boss_svala.cpp | 62 +- .../Northrend/VioletHold/boss_moragg.cpp | 33 +- .../Northrend/VioletHold/violet_hold.cpp | 33 +- 29 files changed, 1282 insertions(+), 1765 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1719137457631116516.sql diff --git a/data/sql/updates/pending_db_world/rev_1719137457631116516.sql b/data/sql/updates/pending_db_world/rev_1719137457631116516.sql new file mode 100644 index 000000000..28a78991a --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1719137457631116516.sql @@ -0,0 +1,37 @@ +-- +UPDATE `spell_script_names` SET `ScriptName`='spell_azjol_nerub_web_wrap_aura' WHERE `spell_id`=52086; +UPDATE `spell_script_names` SET `ScriptName`='spell_hadronox_summon_periodic_crypt_fiend_aura' WHERE `spell_id`=53037; +UPDATE `spell_script_names` SET `ScriptName`='spell_hadronox_leech_poison_aura' WHERE `spell_id` IN (53030,59417); +UPDATE `spell_script_names` SET `ScriptName`='spell_reflective_shield_aura' WHERE `spell_id`=66515; +UPDATE `spell_script_names` SET `ScriptName`='spell_dtk_raise_dead_aura' WHERE `spell_id` IN (48597,48605); +UPDATE `spell_script_names` SET `ScriptName`='spell_trollgore_corpse_explode_aura' WHERE `spell_id` IN (49555,59807); +UPDATE `spell_script_names` SET `ScriptName`='spell_novos_crystal_handler_death_aura' WHERE `spell_id`=47336; +UPDATE `spell_script_names` SET `ScriptName`='spell_tharon_ja_curse_of_life_aura' WHERE `spell_id` IN (49527,59972); +UPDATE `spell_script_names` SET `ScriptName`='spell_tharon_ja_dummy_aura' WHERE `spell_id`=49551; +UPDATE `spell_script_names` SET `ScriptName`='spell_dred_grievious_bite_aura' WHERE `spell_id`=48920; +UPDATE `spell_script_names` SET `ScriptName`='spell_moorabi_mojo_frenzy_aura' WHERE `spell_id`=55163; +UPDATE `spell_script_names` SET `ScriptName`='spell_sladran_grip_of_sladran_aura' WHERE `spell_id`=55093; +UPDATE `spell_script_names` SET `ScriptName`='spell_oculus_stop_time_aura' WHERE `spell_id`=49838; +UPDATE `spell_script_names` SET `ScriptName`='spell_oculus_evasive_maneuvers_aura' WHERE `spell_id`=50240; +UPDATE `spell_script_names` SET `ScriptName`='spell_oculus_temporal_rift_aura' WHERE `spell_id`=49592; +UPDATE `spell_script_names` SET `ScriptName`='spell_oculus_dream_funnel_aura' WHERE `spell_id`=50344; +UPDATE `spell_script_names` SET `ScriptName`='spell_oculus_ride_ruby_emerald_amber_drake_que_aura' WHERE `spell_id` IN (49427,49459,49463); +UPDATE `spell_script_names` SET `ScriptName`='spell_oculus_evasive_charges_aura' WHERE `spell_id`=50241; +UPDATE `spell_script_names` SET `ScriptName`='spell_oculus_soar_aura' WHERE `spell_id`=50325; +UPDATE `spell_script_names` SET `ScriptName`='spell_oculus_drake_flag_aura' WHERE `spell_id`=53797; +UPDATE `spell_script_names` SET `ScriptName`='spell_boss_magus_telestra_summon_telestra_clones_aura' WHERE `spell_id`=47710; +UPDATE `spell_script_names` SET `ScriptName`='spell_ticking_time_bomb_aura' WHERE `spell_id`=59686; +UPDATE `spell_script_names` SET `ScriptName`='spell_frost_tomb_aura' WHERE `spell_id`=42672; +UPDATE `spell_script_names` SET `ScriptName`='spell_optic_link_aura' WHERE `spell_id`=54396; +UPDATE `spell_script_names` SET `ScriptName`='spell_destroy_door_seal_aura' WHERE `spell_id`=58040; +UPDATE `spell_script_names` SET `ScriptName`='spell_shield_of_bones_aura' WHERE `spell_id` IN (69069,70207); +UPDATE `spell_script_names` SET `ScriptName`='spell_wailing_souls_periodic_aura' WHERE `spell_id`=68875; +UPDATE `spell_script_names` SET `ScriptName`='spell_bronjahm_soulstorm_channel_ooc_aura' WHERE `spell_id`=69008; +UPDATE `spell_script_names` SET `ScriptName`='spell_bronjahm_soulstorm_visual_aura' WHERE `spell_id`=68870; +UPDATE `spell_script_names` SET `ScriptName`='spell_krick_explosive_barrage_aura' WHERE `spell_id`=69012; +UPDATE `spell_script_names` SET `ScriptName`='spell_exploding_orb_auto_grow_aura' WHERE `spell_id`=69020; +UPDATE `spell_script_names` SET `ScriptName`='spell_pos_empowered_blizzard_aura' WHERE `spell_id`=70132; +UPDATE `spell_script_names` SET `ScriptName`='spell_pos_blight_aura' WHERE `spell_id` IN (69603,69604,70285,70286); +UPDATE `spell_script_names` SET `ScriptName`='spell_pos_glacial_strike_aura' WHERE `spell_id` IN (70292,71316,71317); +UPDATE `spell_script_names` SET `ScriptName`='spell_hor_gunship_cannon_fire_aura' WHERE `spell_id`=70017; +UPDATE `spell_script_names` SET `ScriptName`='spell_hor_shared_suffering_aura' WHERE `spell_id` IN (72368,72369); diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp index c1003c512..299b3d66b 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp @@ -323,50 +323,41 @@ public: } }; -class spell_hadronox_summon_periodic : public SpellScriptLoader +class spell_hadronox_summon_periodic_aura : public AuraScript { + PrepareAuraScript(spell_hadronox_summon_periodic_aura); + public: - spell_hadronox_summon_periodic(const char* name, uint32 delay, uint32 spellEntry) : SpellScriptLoader(name), _delay(delay), _spellEntry(spellEntry) { } + spell_hadronox_summon_periodic_aura(uint32 delay, uint32 spellEntry) : _delay(delay), _spellEntry(spellEntry) { } - class spell_hadronox_summon_periodic_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - public: - spell_hadronox_summon_periodic_AuraScript(uint32 delay, uint32 spellEntry) : _delay(delay), _spellEntry(spellEntry) { } - PrepareAuraScript(spell_hadronox_summon_periodic_AuraScript); + return ValidateSpellInfo({ SPELL_WEB_FRONT_DOORS }); + } - void HandlePeriodic(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - Unit* owner = GetUnitOwner(); - if (InstanceScript* instance = owner->GetInstanceScript()) - if (instance->GetBossState(DATA_HADRONOX_EVENT) != DONE) - { - if (!owner->HasAura(SPELL_WEB_FRONT_DOORS)) - owner->CastSpell(owner, _spellEntry, true); - else if (!instance->IsEncounterInProgress()) - owner->RemoveAurasDueToSpell(SPELL_WEB_FRONT_DOORS); - } - } - - void OnApply(AuraEffect const* auraEffect, AuraEffectHandleModes) - { - GetAura()->GetEffect(auraEffect->GetEffIndex())->SetPeriodicTimer(_delay); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_hadronox_summon_periodic_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - OnEffectApply += AuraEffectApplyFn(spell_hadronox_summon_periodic_AuraScript::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - - private: - uint32 _delay; - uint32 _spellEntry; - }; - - AuraScript* GetAuraScript() const override + void HandlePeriodic(AuraEffect const* /*aurEff*/) { - return new spell_hadronox_summon_periodic_AuraScript(_delay, _spellEntry); + PreventDefaultAction(); + Unit* owner = GetUnitOwner(); + if (InstanceScript* instance = owner->GetInstanceScript()) + if (instance->GetBossState(DATA_HADRONOX_EVENT) != DONE) + { + if (!owner->HasAura(SPELL_WEB_FRONT_DOORS)) + owner->CastSpell(owner, _spellEntry, true); + else if (!instance->IsEncounterInProgress()) + owner->RemoveAurasDueToSpell(SPELL_WEB_FRONT_DOORS); + } + } + + void OnApply(AuraEffect const* auraEffect, AuraEffectHandleModes) + { + GetAura()->GetEffect(auraEffect->GetEffIndex())->SetPeriodicTimer(_delay); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_hadronox_summon_periodic_aura::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + OnEffectApply += AuraEffectApplyFn(spell_hadronox_summon_periodic_aura::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); } private: @@ -374,31 +365,25 @@ private: uint32 _spellEntry; }; -class spell_hadronox_leech_poison : public SpellScriptLoader +class spell_hadronox_leech_poison_aura : public AuraScript { -public: - spell_hadronox_leech_poison() : SpellScriptLoader("spell_hadronox_leech_poison") { } + PrepareAuraScript(spell_hadronox_leech_poison_aura); - class spell_hadronox_leech_poison_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_hadronox_leech_poison_AuraScript) + return ValidateSpellInfo({ SPELL_LEECH_POISON_HEAL }); + } - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_DEATH) - if (Unit* caster = GetCaster()) - caster->CastSpell(caster, SPELL_LEECH_POISON_HEAL, true); - } - - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_hadronox_leech_poison_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_LEECH, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - return new spell_hadronox_leech_poison_AuraScript(); + if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_DEATH) + if (Unit* caster = GetCaster()) + caster->CastSpell(caster, SPELL_LEECH_POISON_HEAL, true); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_hadronox_leech_poison_aura::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_LEECH, AURA_EFFECT_HANDLE_REAL); } }; @@ -422,10 +407,10 @@ void AddSC_boss_hadronox() { new boss_hadronox(); new npc_anub_ar_crusher(); - new spell_hadronox_summon_periodic("spell_hadronox_summon_periodic_champion", 15000, SPELL_SUMMON_ANUBAR_CHAMPION); - new spell_hadronox_summon_periodic("spell_hadronox_summon_periodic_necromancer", 10000, SPELL_SUMMON_ANUBAR_NECROMANCER); - new spell_hadronox_summon_periodic("spell_hadronox_summon_periodic_crypt_fiend", 5000, SPELL_SUMMON_ANUBAR_CRYPT_FIEND); - new spell_hadronox_leech_poison(); + RegisterSpellScriptWithArgs(spell_hadronox_summon_periodic_aura, "spell_hadronox_summon_periodic_champion", 15000, SPELL_SUMMON_ANUBAR_CHAMPION); + RegisterSpellScriptWithArgs(spell_hadronox_summon_periodic_aura, "spell_hadronox_summon_periodic_necromancer", 10000, SPELL_SUMMON_ANUBAR_NECROMANCER); + RegisterSpellScriptWithArgs(spell_hadronox_summon_periodic_aura, "spell_hadronox_summon_periodic_crypt_fiend", 5000, SPELL_SUMMON_ANUBAR_CRYPT_FIEND); + RegisterSpellScript(spell_hadronox_leech_poison_aura); new achievement_hadronox_denied(); } diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp index 88c820c97..d4c9b8a33 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp @@ -114,65 +114,48 @@ public: } }; -class spell_azjol_nerub_fixate : public SpellScriptLoader +class spell_azjol_nerub_fixate : public SpellScript { -public: - spell_azjol_nerub_fixate() : SpellScriptLoader("spell_azjol_nerub_fixate") { } + PrepareSpellScript(spell_azjol_nerub_fixate); - class spell_azjol_nerub_fixate_SpellScript : public SpellScript + void HandleScriptEffect(SpellEffIndex effIndex) { - PrepareSpellScript(spell_azjol_nerub_fixate_SpellScript); + PreventHitDefaultEffect(effIndex); + if (Unit* target = GetHitUnit()) + target->CastSpell(GetCaster(), GetEffectValue(), true); + } - void HandleScriptEffect(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - if (Unit* target = GetHitUnit()) - target->CastSpell(GetCaster(), GetEffectValue(), true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_azjol_nerub_fixate_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_azjol_nerub_fixate_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_azjol_nerub_fixate::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; -class spell_azjol_nerub_web_wrap : public SpellScriptLoader +class spell_azjol_nerub_web_wrap_aura : public AuraScript { -public: - spell_azjol_nerub_web_wrap() : SpellScriptLoader("spell_azjol_nerub_web_wrap") { } + PrepareAuraScript(spell_azjol_nerub_web_wrap_aura); - class spell_azjol_nerub_web_wrap_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_azjol_nerub_web_wrap_AuraScript); + return ValidateSpellInfo({ SPELL_WEB_WRAP_TRIGGER }); + } - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (!target->HasAura(SPELL_WEB_WRAP_TRIGGER)) - target->CastSpell(target, SPELL_WEB_WRAP_TRIGGER, true); - } - - void Register() override - { - OnEffectRemove += AuraEffectRemoveFn(spell_azjol_nerub_web_wrap_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_ROOT, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - return new spell_azjol_nerub_web_wrap_AuraScript(); + Unit* target = GetTarget(); + if (!target->HasAura(SPELL_WEB_WRAP_TRIGGER)) + target->CastSpell(target, SPELL_WEB_WRAP_TRIGGER, true); + } + + void Register() override + { + OnEffectRemove += AuraEffectRemoveFn(spell_azjol_nerub_web_wrap_aura::OnRemove, EFFECT_0, SPELL_AURA_MOD_ROOT, AURA_EFFECT_HANDLE_REAL); } }; void AddSC_instance_azjol_nerub() { new instance_azjol_nerub(); - new spell_azjol_nerub_fixate(); - new spell_azjol_nerub_web_wrap(); + RegisterSpellScript(spell_azjol_nerub_fixate); + RegisterSpellScript(spell_azjol_nerub_web_wrap_aura); } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp index 2cbe8078c..10d5cee1b 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheChampion/boss_argent_challenge.cpp @@ -734,104 +734,81 @@ public: } }; -class spell_eadric_radiance : public SpellScriptLoader +class spell_eadric_radiance : public SpellScript { -public: - spell_eadric_radiance() : SpellScriptLoader("spell_eadric_radiance") { } + PrepareSpellScript(spell_eadric_radiance); - class spell_eadric_radiance_SpellScript : public SpellScript + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_eadric_radiance_SpellScript); + std::list tmplist; + for( std::list::const_iterator itr = targets.begin(); itr != targets.end(); ++itr) + if( (*itr)->ToUnit()->HasInArc(M_PI, GetCaster()) ) + tmplist.push_back(*itr); - void FilterTargets(std::list& targets) - { - std::list tmplist; - for( std::list::const_iterator itr = targets.begin(); itr != targets.end(); ++itr) - if( (*itr)->ToUnit()->HasInArc(M_PI, GetCaster()) ) - tmplist.push_back(*itr); + targets.clear(); + for( std::list::iterator itr = tmplist.begin(); itr != tmplist.end(); ++itr ) + targets.push_back(*itr); + } - targets.clear(); - for( std::list::iterator itr = tmplist.begin(); itr != tmplist.end(); ++itr ) - targets.push_back(*itr); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_eadric_radiance_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_eadric_radiance_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_eadric_radiance_SpellScript(); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_eadric_radiance::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_eadric_radiance::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); } }; -class spell_toc5_light_rain : public SpellScriptLoader +class spell_toc5_light_rain : public SpellScript { -public: - spell_toc5_light_rain() : SpellScriptLoader("spell_toc5_light_rain") { } + PrepareSpellScript(spell_toc5_light_rain); - class spell_toc5_light_rain_SpellScript : public SpellScript + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_toc5_light_rain_SpellScript); - - void FilterTargets(std::list& targets) + for( std::list::iterator itr = targets.begin(); itr != targets.end(); ) { - for( std::list::iterator itr = targets.begin(); itr != targets.end(); ) - { - if ((*itr)->GetTypeId() == TYPEID_UNIT) - if ((*itr)->ToCreature()->GetEntry() == NPC_FOUNTAIN_OF_LIGHT) - { - targets.erase(itr); - itr = targets.begin(); - continue; - } - ++itr; - } - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_toc5_light_rain_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_toc5_light_rain_SpellScript(); - } -}; - -class spell_reflective_shield : public SpellScriptLoader -{ -public: - spell_reflective_shield() : SpellScriptLoader("spell_reflective_shield") { } - - class spell_reflective_shield_AuraScript : public AuraScript - { - PrepareAuraScript(spell_reflective_shield_AuraScript) - - void HandleAfterEffectAbsorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) - { - if( Unit* attacker = dmgInfo.GetAttacker() ) - if( GetOwner() && attacker->GetGUID() != GetOwner()->GetGUID() ) + if ((*itr)->GetTypeId() == TYPEID_UNIT) + if ((*itr)->ToCreature()->GetEntry() == NPC_FOUNTAIN_OF_LIGHT) { - int32 damage = (int32)(absorbAmount * 0.25f); - GetOwner()->ToUnit()->CastCustomSpell(attacker, 33619, &damage, nullptr, nullptr, true); + targets.erase(itr); + itr = targets.begin(); + continue; } + ++itr; } + } - void Register() override - { - AfterEffectAbsorb += AuraEffectAbsorbFn(spell_reflective_shield_AuraScript::HandleAfterEffectAbsorb, EFFECT_0); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_reflective_shield_AuraScript(); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_toc5_light_rain::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ALLY); + } +}; + +enum ReflectiveShield +{ + SPELL_REFLECTIVE_SHIELD_DAMAGE = 33619 +}; + +class spell_reflective_shield_aura : public AuraScript +{ + PrepareAuraScript(spell_reflective_shield_aura); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_REFLECTIVE_SHIELD_DAMAGE }); + } + + void HandleAfterEffectAbsorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) + { + if( Unit* attacker = dmgInfo.GetAttacker() ) + if( GetOwner() && attacker->GetGUID() != GetOwner()->GetGUID() ) + { + int32 damage = (int32)(absorbAmount * 0.25f); + GetOwner()->ToUnit()->CastCustomSpell(attacker, SPELL_REFLECTIVE_SHIELD_DAMAGE, &damage, nullptr, nullptr, true); + } + } + + void Register() override + { + AfterEffectAbsorb += AuraEffectAbsorbFn(spell_reflective_shield_aura::HandleAfterEffectAbsorb, EFFECT_0); } }; @@ -841,8 +818,8 @@ void AddSC_boss_argent_challenge() new boss_paletress(); new npc_memory(); new npc_argent_soldier(); - new spell_eadric_radiance(); - new spell_toc5_light_rain(); - new spell_reflective_shield(); + RegisterSpellScript(spell_eadric_radiance); + RegisterSpellScript(spell_toc5_light_rain); + RegisterSpellScript(spell_reflective_shield_aura); } diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_dred.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_dred.cpp index 4a99eb18e..9f27a5284 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_dred.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_dred.cpp @@ -155,60 +155,38 @@ public: }; }; -class spell_dred_grievious_bite : public SpellScriptLoader +class spell_dred_grievious_bite_aura : public AuraScript { -public: - spell_dred_grievious_bite() : SpellScriptLoader("spell_dred_grievious_bite") { } + PrepareAuraScript(spell_dred_grievious_bite_aura); - class spell_dred_grievious_bite_AuraScript : public AuraScript + void OnPeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_dred_grievious_bite_AuraScript); + if (Unit* target = GetTarget()) + if (target->GetHealth() == target->GetMaxHealth()) + { + PreventDefaultAction(); + SetDuration(0); + } + } - void OnPeriodic(AuraEffect const* /*aurEff*/) - { - if (Unit* target = GetTarget()) - if (target->GetHealth() == target->GetMaxHealth()) - { - PreventDefaultAction(); - SetDuration(0); - } - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_dred_grievious_bite_AuraScript::OnPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_dred_grievious_bite_AuraScript(); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_dred_grievious_bite_aura::OnPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE); } }; -class spell_dred_raptor_call : public SpellScriptLoader +class spell_dred_raptor_call : public SpellScript { -public: - spell_dred_raptor_call() : SpellScriptLoader("spell_dred_raptor_call") { } + PrepareSpellScript(spell_dred_raptor_call); - class spell_dred_raptor_call_SpellScript : public SpellScript + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_dred_raptor_call_SpellScript); + GetCaster()->SummonCreature(RAND(NPC_DRAKKARI_GUTRIPPER, NPC_DRAKKARI_SCYTHECLAW), -522.02f, -718.89f, 30.26f, 2.41f); + } - void HandleDummy(SpellEffIndex /*effIndex*/) - { - GetCaster()->SummonCreature(RAND(NPC_DRAKKARI_GUTRIPPER, NPC_DRAKKARI_SCYTHECLAW), -522.02f, -718.89f, 30.26f, 2.41f); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_dred_raptor_call_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_dred_raptor_call_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_dred_raptor_call::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; @@ -231,7 +209,7 @@ public: void AddSC_boss_dred() { new boss_dred(); - new spell_dred_grievious_bite(); - new spell_dred_raptor_call(); + RegisterSpellScript(spell_dred_grievious_bite_aura); + RegisterSpellScript(spell_dred_raptor_call); new achievement_better_off_dred(); } diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp index 0c46d4e2b..bc5f69985 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_novos.cpp @@ -268,85 +268,62 @@ public: } }; -class spell_novos_despawn_crystal_handler : public SpellScriptLoader +class spell_novos_despawn_crystal_handler : public SpellScript { -public: - spell_novos_despawn_crystal_handler() : SpellScriptLoader("spell_novos_despawn_crystal_handler") { } + PrepareSpellScript(spell_novos_despawn_crystal_handler); - class spell_novos_despawn_crystal_handler_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_novos_despawn_crystal_handler_SpellScript); + return ValidateSpellInfo({ SPELL_BEAM_CHANNEL }); + } - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - target->CastSpell(GetCaster(), SPELL_BEAM_CHANNEL, true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_novos_despawn_crystal_handler_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - return new spell_novos_despawn_crystal_handler_SpellScript(); + if (Unit* target = GetHitUnit()) + target->CastSpell(GetCaster(), SPELL_BEAM_CHANNEL, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_novos_despawn_crystal_handler::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; -class spell_novos_crystal_handler_death : public SpellScriptLoader +class spell_novos_crystal_handler_death_aura : public AuraScript { -public: - spell_novos_crystal_handler_death() : SpellScriptLoader("spell_novos_crystal_handler_death") { } + PrepareAuraScript(spell_novos_crystal_handler_death_aura); - class spell_novos_crystal_handler_death_AuraScript : public AuraScript + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_novos_crystal_handler_death_AuraScript) + GetUnitOwner()->InterruptNonMeleeSpells(false); + if (GameObject* crystal = GetUnitOwner()->FindNearestGameObjectOfType(GAMEOBJECT_TYPE_DOOR, 5.0f)) + crystal->SetGoState(GO_STATE_READY); + } - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->InterruptNonMeleeSpells(false); - if (GameObject* crystal = GetUnitOwner()->FindNearestGameObjectOfType(GAMEOBJECT_TYPE_DOOR, 5.0f)) - crystal->SetGoState(GO_STATE_READY); - } - - void Register() override - { - OnEffectApply += AuraEffectApplyFn(spell_novos_crystal_handler_death_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_novos_crystal_handler_death_AuraScript(); + OnEffectApply += AuraEffectApplyFn(spell_novos_crystal_handler_death_aura::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; -class spell_novos_summon_minions : public SpellScriptLoader +class spell_novos_summon_minions : public SpellScript { -public: - spell_novos_summon_minions() : SpellScriptLoader("spell_novos_summon_minions") { } + PrepareSpellScript(spell_novos_summon_minions); - class spell_novos_summon_minions_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_novos_summon_minions_SpellScript); + return ValidateSpellInfo({ SPELL_COPY_OF_SUMMON_MINIONS }); + } - void HandleScript(SpellEffIndex /*effIndex*/) - { - for (uint8 i = 0; i < 4; ++i) - GetCaster()->CastSpell((Unit*)nullptr, SPELL_COPY_OF_SUMMON_MINIONS, true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_novos_summon_minions_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void HandleScript(SpellEffIndex /*effIndex*/) { - return new spell_novos_summon_minions_SpellScript(); + for (uint8 i = 0; i < 4; ++i) + GetCaster()->CastSpell((Unit*)nullptr, SPELL_COPY_OF_SUMMON_MINIONS, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_novos_summon_minions::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; @@ -364,8 +341,8 @@ public: void AddSC_boss_novos() { new boss_novos(); - new spell_novos_despawn_crystal_handler(); - new spell_novos_crystal_handler_death(); - new spell_novos_summon_minions(); + RegisterSpellScript(spell_novos_despawn_crystal_handler); + RegisterSpellScript(spell_novos_crystal_handler_death_aura); + RegisterSpellScript(spell_novos_summon_minions); new achievement_oh_novos(); } diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp index 45987b505..2015c0ef3 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_tharon_ja.cpp @@ -208,107 +208,79 @@ public: }; }; -class spell_tharon_ja_curse_of_life : public SpellScriptLoader +class spell_tharon_ja_curse_of_life_aura : public AuraScript { -public: - spell_tharon_ja_curse_of_life() : SpellScriptLoader("spell_tharon_ja_curse_of_life") { } + PrepareAuraScript(spell_tharon_ja_curse_of_life_aura); - class spell_tharon_ja_curse_of_life_AuraScript : public AuraScript + void OnPeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_tharon_ja_curse_of_life_AuraScript); - - void OnPeriodic(AuraEffect const* /*aurEff*/) + if (GetUnitOwner()->HealthBelowPct(50)) { - if (GetUnitOwner()->HealthBelowPct(50)) - { - PreventDefaultAction(); - SetDuration(0); - } + PreventDefaultAction(); + SetDuration(0); } + } - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_tharon_ja_curse_of_life_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_tharon_ja_curse_of_life_AuraScript(); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_tharon_ja_curse_of_life_aura::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); } }; -class spell_tharon_ja_dummy : public SpellScriptLoader +class spell_tharon_ja_dummy_aura : public AuraScript { -public: - spell_tharon_ja_dummy() : SpellScriptLoader("spell_tharon_ja_dummy") { } + PrepareAuraScript(spell_tharon_ja_dummy_aura); - class spell_tharon_ja_dummy_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_tharon_ja_dummy_AuraScript) + return ValidateSpellInfo({ SPELL_FLESH_VISUAL, SPELL_GIFT_OF_THARON_JA, SPELL_TURN_BONES }); + } - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - PreventDefaultAction(); - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_FLESH_VISUAL, true); - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_GIFT_OF_THARON_JA, true); - GetUnitOwner()->SetDisplayId(GetUnitOwner()->GetNativeDisplayId() + 1); - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - PreventDefaultAction(); - GetUnitOwner()->GetThreatMgr().ResetAllThreat(); - GetUnitOwner()->GetMotionMaster()->Clear(); - GetUnitOwner()->CastSpell((Unit*)nullptr, SPELL_TURN_BONES, false); - GetUnitOwner()->GetAI()->DoAction(ACTION_TURN_BONES); - } - - void Register() override - { - OnEffectApply += AuraEffectApplyFn(spell_tharon_ja_dummy_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - OnEffectRemove += AuraEffectRemoveFn(spell_tharon_ja_dummy_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - return new spell_tharon_ja_dummy_AuraScript(); + PreventDefaultAction(); + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_FLESH_VISUAL, true); + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_GIFT_OF_THARON_JA, true); + GetUnitOwner()->SetDisplayId(GetUnitOwner()->GetNativeDisplayId() + 1); + } + + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + PreventDefaultAction(); + GetUnitOwner()->GetThreatMgr().ResetAllThreat(); + GetUnitOwner()->GetMotionMaster()->Clear(); + GetUnitOwner()->CastSpell((Unit*)nullptr, SPELL_TURN_BONES, false); + GetUnitOwner()->GetAI()->DoAction(ACTION_TURN_BONES); + } + + void Register() override + { + OnEffectApply += AuraEffectApplyFn(spell_tharon_ja_dummy_aura::HandleEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + OnEffectRemove += AuraEffectRemoveFn(spell_tharon_ja_dummy_aura::HandleEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); } }; -class spell_tharon_ja_clear_gift_of_tharon_ja : public SpellScriptLoader +class spell_tharon_ja_clear_gift_of_tharon_ja : public SpellScript { -public: - spell_tharon_ja_clear_gift_of_tharon_ja() : SpellScriptLoader("spell_tharon_ja_clear_gift_of_tharon_ja") { } + PrepareSpellScript(spell_tharon_ja_clear_gift_of_tharon_ja); - class spell_tharon_ja_clear_gift_of_tharon_ja_SpellScript : public SpellScript + void HandleScript(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_tharon_ja_clear_gift_of_tharon_ja_SpellScript); + if (Unit* target = GetHitUnit()) + target->RemoveAura(SPELL_GIFT_OF_THARON_JA); + } - void HandleScript(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - target->RemoveAura(SPELL_GIFT_OF_THARON_JA); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_tharon_ja_clear_gift_of_tharon_ja_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_tharon_ja_clear_gift_of_tharon_ja_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_tharon_ja_clear_gift_of_tharon_ja::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; void AddSC_boss_tharon_ja() { new boss_tharon_ja(); - new spell_tharon_ja_curse_of_life(); - new spell_tharon_ja_dummy(); - new spell_tharon_ja_clear_gift_of_tharon_ja(); + RegisterSpellScript(spell_tharon_ja_curse_of_life_aura); + RegisterSpellScript(spell_tharon_ja_dummy_aura); + RegisterSpellScript(spell_tharon_ja_clear_gift_of_tharon_ja); } diff --git a/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp index 66238c2ee..bd10397c9 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/boss_trollgore.cpp @@ -171,92 +171,69 @@ public: } }; -class spell_trollgore_consume : public SpellScriptLoader +class spell_trollgore_consume : public SpellScript { -public: - spell_trollgore_consume() : SpellScriptLoader("spell_trollgore_consume") { } + PrepareSpellScript(spell_trollgore_consume); - class spell_trollgore_consume_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_trollgore_consume_SpellScript); + return ValidateSpellInfo({ SPELL_CONSUME_AURA }); + } - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - target->CastSpell(GetCaster(), SPELL_CONSUME_AURA, true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_trollgore_consume_SpellScript::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - return new spell_trollgore_consume_SpellScript(); + if (Unit* target = GetHitUnit()) + target->CastSpell(GetCaster(), SPELL_CONSUME_AURA, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_trollgore_consume::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); } }; -class spell_trollgore_corpse_explode : public SpellScriptLoader +class spell_trollgore_corpse_explode_aura : public AuraScript { -public: - spell_trollgore_corpse_explode() : SpellScriptLoader("spell_trollgore_corpse_explode") { } + PrepareAuraScript(spell_trollgore_corpse_explode_aura); - class spell_trollgore_corpse_explode_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_trollgore_corpse_explode_AuraScript); + return ValidateSpellInfo({ SPELL_CORPSE_EXPLODE_DAMAGE }); + } - void PeriodicTick(AuraEffect const* aurEff) - { - if (aurEff->GetTickNumber() == 2) - if (Unit* caster = GetCaster()) - caster->CastSpell(GetTarget(), SPELL_CORPSE_EXPLODE_DAMAGE, true); - } - - void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Creature* target = GetTarget()->ToCreature()) - target->DespawnOrUnsummon(1); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_trollgore_corpse_explode_AuraScript::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - AfterEffectRemove += AuraEffectRemoveFn(spell_trollgore_corpse_explode_AuraScript::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + void PeriodicTick(AuraEffect const* aurEff) { - return new spell_trollgore_corpse_explode_AuraScript(); + if (aurEff->GetTickNumber() == 2) + if (Unit* caster = GetCaster()) + caster->CastSpell(GetTarget(), SPELL_CORPSE_EXPLODE_DAMAGE, true); + } + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Creature* target = GetTarget()->ToCreature()) + target->DespawnOrUnsummon(1); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_trollgore_corpse_explode_aura::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + AfterEffectRemove += AuraEffectRemoveFn(spell_trollgore_corpse_explode_aura::HandleRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; -class spell_trollgore_invader_taunt : public SpellScriptLoader +class spell_trollgore_invader_taunt : public SpellScript { -public: - spell_trollgore_invader_taunt() : SpellScriptLoader("spell_trollgore_invader_taunt") { } + PrepareSpellScript(spell_trollgore_invader_taunt); - class spell_trollgore_invader_taunt_SpellScript : public SpellScript + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_trollgore_invader_taunt_SpellScript); + if (Unit* target = GetHitUnit()) + target->CastSpell(GetCaster(), uint32(GetEffectValue()), true); + } - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - target->CastSpell(GetCaster(), uint32(GetEffectValue()), true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_trollgore_invader_taunt_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_trollgore_invader_taunt_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_trollgore_invader_taunt::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; @@ -279,8 +256,8 @@ public: void AddSC_boss_trollgore() { new boss_trollgore(); - new spell_trollgore_consume(); - new spell_trollgore_corpse_explode(); - new spell_trollgore_invader_taunt(); + RegisterSpellScript(spell_trollgore_consume); + RegisterSpellScript(spell_trollgore_corpse_explode_aura); + RegisterSpellScript(spell_trollgore_invader_taunt); new achievement_consumption_junction(); } diff --git a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp index bfac4e97c..477f2c3fb 100644 --- a/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp +++ b/src/server/scripts/Northrend/DraktharonKeep/instance_drak_tharon_keep.cpp @@ -77,67 +77,50 @@ public: } }; -class spell_dtk_raise_dead : public SpellScriptLoader +class spell_dtk_raise_dead_aura : public AuraScript { -public: - spell_dtk_raise_dead() : SpellScriptLoader("spell_dtk_raise_dead") { } + PrepareAuraScript(spell_dtk_raise_dead_aura); - class spell_dtk_raise_dead_AuraScript : public AuraScript + bool Load() override { - PrepareAuraScript(spell_dtk_raise_dead_AuraScript) + return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; + } - bool Load() override - { - return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; - } - - void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->ToCreature()->DespawnOrUnsummon(1); - GetUnitOwner()->SummonCreature(NPC_RISEN_DRAKKARI_WARRIOR, *GetUnitOwner()); - } - - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_dtk_raise_dead_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - return new spell_dtk_raise_dead_AuraScript(); + GetUnitOwner()->ToCreature()->DespawnOrUnsummon(1); + GetUnitOwner()->SummonCreature(NPC_RISEN_DRAKKARI_WARRIOR, *GetUnitOwner()); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_dtk_raise_dead_aura::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; -class spell_dtk_summon_random_drakkari : public SpellScriptLoader +class spell_dtk_summon_random_drakkari : public SpellScript { -public: - spell_dtk_summon_random_drakkari() : SpellScriptLoader("spell_dtk_summon_random_drakkari") { } + PrepareSpellScript(spell_dtk_summon_random_drakkari); - class spell_dtk_summon_random_drakkari_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_dtk_summon_random_drakkari_SpellScript); + return ValidateSpellInfo({ SPELL_SUMMON_DRAKKARI_SHAMAN, SPELL_SUMMON_DRAKKARI_GUARDIAN }); + } - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - GetCaster()->CastSpell(GetCaster(), RAND(SPELL_SUMMON_DRAKKARI_SHAMAN, SPELL_SUMMON_DRAKKARI_GUARDIAN), true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_dtk_summon_random_drakkari_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - return new spell_dtk_summon_random_drakkari_SpellScript(); + GetCaster()->CastSpell(GetCaster(), RAND(SPELL_SUMMON_DRAKKARI_SHAMAN, SPELL_SUMMON_DRAKKARI_GUARDIAN), true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_dtk_summon_random_drakkari::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; void AddSC_instance_drak_tharon_keep() { new instance_drak_tharon_keep(); - new spell_dtk_raise_dead(); - new spell_dtk_summon_random_drakkari(); + RegisterSpellScript(spell_dtk_raise_dead_aura); + RegisterSpellScript(spell_dtk_summon_random_drakkari); } diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp index f02ba7c95..33595a114 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp @@ -47,6 +47,7 @@ enum eSpells SPELL_TELEPORT_VISUAL = 52096, SPELL_SOULSTORM_VISUAL = 68870, + SPELL_SOULSTORM_VISUAL2 = 68904, SPELL_SOULSTORM = 68872, }; @@ -263,136 +264,102 @@ public: } }; -class spell_bronjahm_magic_bane : public SpellScriptLoader +class spell_bronjahm_magic_bane : public SpellScript { -public: - spell_bronjahm_magic_bane() : SpellScriptLoader("spell_bronjahm_magic_bane") { } + PrepareSpellScript(spell_bronjahm_magic_bane); - class spell_bronjahm_magic_bane_SpellScript : public SpellScript + void RecalculateDamage() { - PrepareSpellScript(spell_bronjahm_magic_bane_SpellScript); + if (GetHitUnit()->getPowerType() != POWER_MANA) + return; - void RecalculateDamage() + if (Unit* caster = GetCaster()) { - if (GetHitUnit()->getPowerType() != POWER_MANA) - return; + const int32 maxDamage = caster->GetMap()->GetSpawnMode() == 1 ? 15000 : 10000; + int32 newDamage = GetHitDamage(); + newDamage += GetHitUnit()->GetMaxPower(POWER_MANA) / 2; + newDamage = std::min(maxDamage, newDamage); - if (Unit* caster = GetCaster()) - { - const int32 maxDamage = caster->GetMap()->GetSpawnMode() == 1 ? 15000 : 10000; - int32 newDamage = GetHitDamage(); - newDamage += GetHitUnit()->GetMaxPower(POWER_MANA) / 2; - newDamage = std::min(maxDamage, newDamage); - - SetHitDamage(newDamage); - } + SetHitDamage(newDamage); } + } - void Register() override - { - OnHit += SpellHitFn(spell_bronjahm_magic_bane_SpellScript::RecalculateDamage); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_bronjahm_magic_bane_SpellScript(); + OnHit += SpellHitFn(spell_bronjahm_magic_bane::RecalculateDamage); } }; -class spell_bronjahm_soulstorm_channel_ooc : public SpellScriptLoader +class spell_bronjahm_soulstorm_channel_ooc_aura : public AuraScript { -public: - spell_bronjahm_soulstorm_channel_ooc() : SpellScriptLoader("spell_bronjahm_soulstorm_channel_ooc") { } + PrepareAuraScript(spell_bronjahm_soulstorm_channel_ooc_aura); - class spell_bronjahm_soulstorm_channel_ooc_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_bronjahm_soulstorm_channel_ooc_AuraScript); + return ValidateSpellInfo({ SPELL_SOULSTORM_VISUAL2, SPELL_SOULSTORM_VISUAL2+1, SPELL_SOULSTORM_VISUAL2+2, SPELL_SOULSTORM_VISUAL2+3 }); + } - void HandlePeriodicTick(AuraEffect const* aurEff) - { - PreventDefaultAction(); - GetTarget()->CastSpell(GetTarget(), 68904 + (aurEff->GetTickNumber() % 4), true); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_bronjahm_soulstorm_channel_ooc_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override + void HandlePeriodicTick(AuraEffect const* aurEff) { - return new spell_bronjahm_soulstorm_channel_ooc_AuraScript(); + PreventDefaultAction(); + GetTarget()->CastSpell(GetTarget(), SPELL_SOULSTORM_VISUAL2 + (aurEff->GetTickNumber() % 4), true); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_bronjahm_soulstorm_channel_ooc_aura::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); } }; -class spell_bronjahm_soulstorm_visual : public SpellScriptLoader +class spell_bronjahm_soulstorm_visual_aura : public AuraScript { -public: - spell_bronjahm_soulstorm_visual() : SpellScriptLoader("spell_bronjahm_soulstorm_visual") { } + PrepareAuraScript(spell_bronjahm_soulstorm_visual_aura); - class spell_bronjahm_soulstorm_visual_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_bronjahm_soulstorm_visual_AuraScript); + return ValidateSpellInfo({ 68886, 68896, 68897, 68898 }); + } - void HandlePeriodicTick(AuraEffect const* aurEff) - { - PreventDefaultAction(); - uint32 spellId = 0; - switch (aurEff->GetTickNumber() % 4) - { - case 0: - spellId = 68886; - break; - case 1: - spellId = 68896; - break; - case 2: - spellId = 68897; - break; - case 3: - spellId = 68898; - break; - } - GetTarget()->CastSpell(GetTarget(), spellId, true); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_bronjahm_soulstorm_visual_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override + void HandlePeriodicTick(AuraEffect const* aurEff) { - return new spell_bronjahm_soulstorm_visual_AuraScript(); + PreventDefaultAction(); + uint32 spellId = 0; + switch (aurEff->GetTickNumber() % 4) + { + case 0: + spellId = 68886; + break; + case 1: + spellId = 68896; + break; + case 2: + spellId = 68897; + break; + case 3: + spellId = 68898; + break; + } + GetTarget()->CastSpell(GetTarget(), spellId, true); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_bronjahm_soulstorm_visual_aura::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); } }; -class spell_bronjahm_soulstorm_targeting : public SpellScriptLoader +class spell_bronjahm_soulstorm_targeting : public SpellScript { -public: - spell_bronjahm_soulstorm_targeting() : SpellScriptLoader("spell_bronjahm_soulstorm_targeting") { } + PrepareSpellScript(spell_bronjahm_soulstorm_targeting); - class spell_bronjahm_soulstorm_targeting_SpellScript : public SpellScript + void FilterTargets(std::list& targets) { - PrepareSpellScript(spell_bronjahm_soulstorm_targeting_SpellScript); + targets.remove_if(Acore::AllWorldObjectsInExactRange(GetCaster(), 10.0f, false)); + } - void FilterTargets(std::list& targets) - { - targets.remove_if(Acore::AllWorldObjectsInExactRange(GetCaster(), 10.0f, false)); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_bronjahm_soulstorm_targeting_SpellScript::FilterTargets, EFFECT_ALL, TARGET_UNIT_DEST_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_bronjahm_soulstorm_targeting_SpellScript(); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_bronjahm_soulstorm_targeting::FilterTargets, EFFECT_ALL, TARGET_UNIT_DEST_AREA_ENEMY); } }; @@ -401,9 +368,9 @@ void AddSC_boss_bronjahm() new boss_bronjahm(); new npc_fos_corrupted_soul_fragment(); - new spell_bronjahm_magic_bane(); - new spell_bronjahm_soulstorm_channel_ooc(); - new spell_bronjahm_soulstorm_visual(); - new spell_bronjahm_soulstorm_targeting(); + RegisterSpellScript(spell_bronjahm_magic_bane); + RegisterSpellScript(spell_bronjahm_soulstorm_channel_ooc_aura); + RegisterSpellScript(spell_bronjahm_soulstorm_visual_aura); + RegisterSpellScript(spell_bronjahm_soulstorm_targeting); } diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp index e2759b624..9a870e6a0 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_devourer_of_souls.cpp @@ -308,73 +308,67 @@ public: } }; -class spell_wailing_souls_periodic : public SpellScriptLoader +class spell_wailing_souls_periodic_aura : public AuraScript { -public: - spell_wailing_souls_periodic() : SpellScriptLoader("spell_wailing_souls_periodic") { } + PrepareAuraScript(spell_wailing_souls_periodic_aura); - class spell_wailing_souls_periodic_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_wailing_souls_periodic_AuraScript); + return ValidateSpellInfo({ SPELL_WAILING_SOULS_DMG_N }); + } - int8 dir; + int8 dir; - bool Load() override + bool Load() override + { + dir = urand(0, 1) ? 1 : -1; + return true; + } + + void HandlePeriodicTick(AuraEffect const* aurEff) + { + PreventDefaultAction(); + if (Unit* t = GetTarget()) { - dir = urand(0, 1) ? 1 : -1; - return true; - } - - void HandlePeriodicTick(AuraEffect const* aurEff) - { - PreventDefaultAction(); - if (Unit* t = GetTarget()) + if (aurEff->GetTickNumber() < 30) { - if (aurEff->GetTickNumber() < 30) - { - // spinning, casting, etc. - float diff = (2 * M_PI) / (4 * 30); - float new_o = t->GetOrientation() + diff * dir; - if (new_o >= 2 * M_PI) - new_o -= 2 * M_PI; - else if (new_o < 0) - new_o += 2 * M_PI; - t->UpdateOrientation(new_o); - t->SetFacingTo(new_o); - t->CastSpell(t, SPELL_WAILING_SOULS_DMG_N, true); - } - else if (aurEff->GetTickNumber() == 33) - { - t->SetControlled(false, UNIT_STATE_ROOT); - t->DisableRotate(false); - if (t->GetTypeId() == TYPEID_UNIT) - t->ToCreature()->SetReactState(REACT_AGGRESSIVE); - if (t->GetVictim()) - { - t->SetGuidValue(UNIT_FIELD_TARGET, t->GetVictim()->GetGUID()); - t->GetMotionMaster()->MoveChase(t->GetVictim()); - } - } - else if (aurEff->GetTickNumber() >= 34) - Remove(AURA_REMOVE_BY_EXPIRE); + // spinning, casting, etc. + float diff = (2 * M_PI) / (4 * 30); + float new_o = t->GetOrientation() + diff * dir; + if (new_o >= 2 * M_PI) + new_o -= 2 * M_PI; + else if (new_o < 0) + new_o += 2 * M_PI; + t->UpdateOrientation(new_o); + t->SetFacingTo(new_o); + t->CastSpell(t, SPELL_WAILING_SOULS_DMG_N, true); } + else if (aurEff->GetTickNumber() == 33) + { + t->SetControlled(false, UNIT_STATE_ROOT); + t->DisableRotate(false); + if (t->GetTypeId() == TYPEID_UNIT) + t->ToCreature()->SetReactState(REACT_AGGRESSIVE); + if (t->GetVictim()) + { + t->SetGuidValue(UNIT_FIELD_TARGET, t->GetVictim()->GetGUID()); + t->GetMotionMaster()->MoveChase(t->GetVictim()); + } + } + else if (aurEff->GetTickNumber() >= 34) + Remove(AURA_REMOVE_BY_EXPIRE); } + } - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_wailing_souls_periodic_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_wailing_souls_periodic_AuraScript(); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_wailing_souls_periodic_aura::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); } }; void AddSC_boss_devourer_of_souls() { new boss_devourer_of_souls(); - new spell_wailing_souls_periodic(); + RegisterSpellScript(spell_wailing_souls_periodic_aura); } diff --git a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp index 337c51f5f..8834b21f8 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/forge_of_souls.cpp @@ -256,45 +256,44 @@ public: } }; -class spell_shield_of_bones : public SpellScriptLoader +enum ShieldOfBones { -public: - spell_shield_of_bones() : SpellScriptLoader("spell_shield_of_bones") { } + SPELL_SHIELD_OF_BONES_DAMAGE = 69642 +}; - class spell_shield_of_bones_AuraScript : public AuraScript +class spell_shield_of_bones_aura : public AuraScript +{ + PrepareAuraScript(spell_shield_of_bones_aura); + + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_shield_of_bones_AuraScript); + return ValidateSpellInfo({ SPELL_SHIELD_OF_BONES_DAMAGE }); + } - int32 amount; - bool fired; + int32 amount; + bool fired; - bool Load() override - { - fired = false; - amount = 0; - return true; - } - - void HandleAfterEffectAbsorb(AuraEffect* /*aurEff*/, DamageInfo& /*dmgInfo*/, uint32& absorbAmount) - { - amount += absorbAmount; - if (!fired && amount >= GetSpellInfo()->Effects[EFFECT_0].BasePoints + 1) - if (Unit* caster = GetCaster()) - { - fired = true; - caster->CastSpell(caster, 69642, true); - } - } - - void Register() override - { - AfterEffectAbsorb += AuraEffectAbsorbFn(spell_shield_of_bones_AuraScript::HandleAfterEffectAbsorb, EFFECT_0); - } - }; - - AuraScript* GetAuraScript() const override + bool Load() override { - return new spell_shield_of_bones_AuraScript(); + fired = false; + amount = 0; + return true; + } + + void HandleAfterEffectAbsorb(AuraEffect* /*aurEff*/, DamageInfo& /*dmgInfo*/, uint32& absorbAmount) + { + amount += absorbAmount; + if (!fired && amount >= GetSpellInfo()->Effects[EFFECT_0].BasePoints + 1) + if (Unit* caster = GetCaster()) + { + fired = true; + caster->CastSpell(caster, SPELL_SHIELD_OF_BONES_DAMAGE, true); + } + } + + void Register() override + { + AfterEffectAbsorb += AuraEffectAbsorbFn(spell_shield_of_bones_aura::HandleAfterEffectAbsorb, EFFECT_0); } }; @@ -302,6 +301,6 @@ void AddSC_forge_of_souls() { new npc_fos_leader(); new npc_fos_leader_second(); - new spell_shield_of_bones(); + RegisterSpellScript(spell_shield_of_bones_aura); } diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp index 62be17b3e..c8366d0b9 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/boss_marwyn.cpp @@ -169,50 +169,49 @@ public: } }; -class spell_hor_shared_suffering : public SpellScriptLoader +enum SharedSufferingAura { -public: - spell_hor_shared_suffering() : SpellScriptLoader("spell_hor_shared_suffering") { } + SPELL_SHARED_SUFFERING_DAMAGE = 72373 +}; - class spell_hor_shared_sufferingAuraScript : public AuraScript +class spell_hor_shared_suffering_aura : public AuraScript +{ + PrepareAuraScript(spell_hor_shared_suffering_aura); + + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_hor_shared_sufferingAuraScript); + return ValidateSpellInfo({ SPELL_SHARED_SUFFERING_DAMAGE }); + } - void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_ENEMY_SPELL) // dispelled - if (Unit* caster = GetCaster()) - if (Map* map = caster->FindMap()) - if (Aura* a = aurEff->GetBase()) - { - uint32 count = 0; - uint32 ticks = 0; - uint32 dmgPerTick = a->GetSpellInfo()->Effects[0].BasePoints; - Map::PlayerList const& pl = map->GetPlayers(); - for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) - if (Player* p = itr->GetSource()) - if (p->IsAlive()) - ++count; - ticks = (a->GetDuration() / int32(a->GetSpellInfo()->Effects[0].Amplitude)) + 1; - int32 dmg = (ticks * dmgPerTick) / count; - caster->CastCustomSpell(GetTarget(), 72373, nullptr, &dmg, nullptr, true); - } - } - - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_hor_shared_sufferingAuraScript::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { - return new spell_hor_shared_sufferingAuraScript(); + if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_ENEMY_SPELL) // dispelled + if (Unit* caster = GetCaster()) + if (Map* map = caster->FindMap()) + if (Aura* a = aurEff->GetBase()) + { + uint32 count = 0; + uint32 ticks = 0; + uint32 dmgPerTick = a->GetSpellInfo()->Effects[0].BasePoints; + Map::PlayerList const& pl = map->GetPlayers(); + for (Map::PlayerList::const_iterator itr = pl.begin(); itr != pl.end(); ++itr) + if (Player* p = itr->GetSource()) + if (p->IsAlive()) + ++count; + ticks = (a->GetDuration() / int32(a->GetSpellInfo()->Effects[0].Amplitude)) + 1; + int32 dmg = (ticks * dmgPerTick) / count; + caster->CastCustomSpell(GetTarget(), SPELL_SHARED_SUFFERING_DAMAGE, nullptr, &dmg, nullptr, true); + } + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_hor_shared_suffering_aura::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); } }; void AddSC_boss_marwyn() { new boss_marwyn(); - new spell_hor_shared_suffering(); + RegisterSpellScript(spell_hor_shared_suffering_aura); } diff --git a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp index 0d814ddda..7ab37b5be 100644 --- a/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/HallsOfReflection/halls_of_reflection.cpp @@ -2315,34 +2315,33 @@ public: } }; -class spell_hor_gunship_cannon_fire : public SpellScriptLoader +enum GunshipCannonFire { -public: - spell_hor_gunship_cannon_fire() : SpellScriptLoader("spell_hor_gunship_cannon_fire") { } + SPELL_GUNSHIP_CANNON_FIRE = 70021 +}; - class spell_hor_gunship_cannon_fireAuraScript : public AuraScript +class spell_hor_gunship_cannon_fire_aura : public AuraScript +{ + PrepareAuraScript(spell_hor_gunship_cannon_fire_aura); + + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_hor_gunship_cannon_fireAuraScript) + return ValidateSpellInfo({ SPELL_GUNSHIP_CANNON_FIRE }); + } - void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - if (Unit* caster = GetCaster()) - if (Creature* c = caster->SummonCreature(WORLD_TRIGGER, CannonFirePos[caster->GetEntry() == NPC_JAINA_PART2 ? 0 : 1][urand(0, 2)], TEMPSUMMON_TIMED_DESPAWN, 1)) - { - c->CastSpell((Unit*)nullptr, 70021, true); - } - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_hor_gunship_cannon_fireAuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { - return new spell_hor_gunship_cannon_fireAuraScript(); + PreventDefaultAction(); + if (Unit* caster = GetCaster()) + if (Creature* creature = caster->SummonCreature(WORLD_TRIGGER, CannonFirePos[caster->GetEntry() == NPC_JAINA_PART2 ? 0 : 1][urand(0, 2)], TEMPSUMMON_TIMED_DESPAWN, 1)) + { + creature->CastSpell((Unit*)nullptr, SPELL_GUNSHIP_CANNON_FIRE, true); + } + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_hor_gunship_cannon_fire_aura::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; @@ -2403,7 +2402,7 @@ void AddSC_halls_of_reflection() new npc_hor_raging_ghoul(); new npc_hor_risen_witch_doctor(); new npc_hor_lumbering_abomination(); - new spell_hor_gunship_cannon_fire(); + RegisterSpellScript(spell_hor_gunship_cannon_fire_aura); new at_hor_battered_hilt_start(); new at_hor_battered_hilt_throw(); diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp index 8702d44f1..f4c3920c5 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_forgemaster_garfrost.cpp @@ -299,78 +299,67 @@ public: } }; -class spell_garfrost_permafrost : public SpellScriptLoader +class spell_garfrost_permafrost : public SpellScript { -public: - spell_garfrost_permafrost() : SpellScriptLoader("spell_garfrost_permafrost") { } + PrepareSpellScript(spell_garfrost_permafrost); - class spell_garfrost_permafrost_SpellScript : public SpellScript + std::list targetList; + + void Unload() override { - PrepareSpellScript(spell_garfrost_permafrost_SpellScript); + targetList.clear(); + } - std::list targetList; - - void Unload() override + void FilterTargets(std::list& targets) + { + if (Unit* caster = GetCaster()) { - targetList.clear(); - } + std::list blockList; + caster->GetGameObjectListWithEntryInGrid(blockList, GO_SARONITE_ROCK, 100.0f); - void FilterTargets(std::list& targets) - { - if (Unit* caster = GetCaster()) + if (!blockList.empty()) { - std::list blockList; - caster->GetGameObjectListWithEntryInGrid(blockList, GO_SARONITE_ROCK, 100.0f); - - if (!blockList.empty()) - { - for (std::list::iterator itrU = targets.begin(); itrU != targets.end(); ++itrU) - if (WorldObject* target = (*itrU)) + for (std::list::iterator itrU = targets.begin(); itrU != targets.end(); ++itrU) + if (WorldObject* target = (*itrU)) + { + bool valid = true; + if (!caster->IsWithinMeleeRange(target->ToUnit())) + for (std::list::const_iterator itr = blockList.begin(); itr != blockList.end(); ++itr) + if (!(*itr)->IsInvisibleDueToDespawn()) + if ((*itr)->IsInBetween(caster, target, 4.0f)) + { + valid = false; + break; + } + if (valid) { - bool valid = true; - if (!caster->IsWithinMeleeRange(target->ToUnit())) - for (std::list::const_iterator itr = blockList.begin(); itr != blockList.end(); ++itr) - if (!(*itr)->IsInvisibleDueToDespawn()) - if ((*itr)->IsInBetween(caster, target, 4.0f)) - { - valid = false; - break; - } - if (valid) - { - if (Aura* aur = target->ToUnit()->GetAura(70336)) - if (aur->GetStackAmount() >= 10 && caster->GetTypeId() == TYPEID_UNIT) - caster->ToCreature()->AI()->SetData(1, aur->GetStackAmount()); - targetList.push_back(*itrU); - } + if (Aura* aur = target->ToUnit()->GetAura(70336)) + if (aur->GetStackAmount() >= 10 && caster->GetTypeId() == TYPEID_UNIT) + caster->ToCreature()->AI()->SetData(1, aur->GetStackAmount()); + targetList.push_back(*itrU); } - } - else - { - targetList = targets; - return; - } + } + } + else + { + targetList = targets; + return; } - - targets = targetList; } - void FilterTargetsNext(std::list& targets) - { - targets = targetList; - } + targets = targetList; + } - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_garfrost_permafrost_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_garfrost_permafrost_SpellScript::FilterTargetsNext, EFFECT_1, TARGET_UNIT_DEST_AREA_ENEMY); - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_garfrost_permafrost_SpellScript::FilterTargetsNext, EFFECT_2, TARGET_UNIT_DEST_AREA_ENEMY); - } - }; - - SpellScript* GetSpellScript() const override + void FilterTargetsNext(std::list& targets) { - return new spell_garfrost_permafrost_SpellScript(); + targets = targetList; + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_garfrost_permafrost::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_garfrost_permafrost::FilterTargetsNext, EFFECT_1, TARGET_UNIT_DEST_AREA_ENEMY); + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_garfrost_permafrost::FilterTargetsNext, EFFECT_2, TARGET_UNIT_DEST_AREA_ENEMY); } }; @@ -378,6 +367,6 @@ void AddSC_boss_garfrost() { new boss_garfrost(); - new spell_garfrost_permafrost(); + RegisterSpellScript(spell_garfrost_permafrost); } diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp index 93d80b8f4..14f4332e9 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/boss_krickandick.cpp @@ -458,74 +458,62 @@ public: } }; -class spell_krick_explosive_barrage : public SpellScriptLoader +class spell_krick_explosive_barrage_aura : public AuraScript { -public: - spell_krick_explosive_barrage() : SpellScriptLoader("spell_krick_explosive_barrage") { } + PrepareAuraScript(spell_krick_explosive_barrage_aura); - class spell_krick_explosive_barrage_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_krick_explosive_barrage_AuraScript); + return ValidateSpellInfo({ SPELL_EXPLOSIVE_BARRAGE_SUMMON }); + } - void HandlePeriodicTick(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - if (Unit* caster = GetCaster()) - if (caster->GetTypeId() == TYPEID_UNIT) - { - Map::PlayerList const& players = caster->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) - if (Player* player = itr->GetSource()) - if (player->IsWithinDist(caster, 100.0f)) - caster->CastSpell(player, SPELL_EXPLOSIVE_BARRAGE_SUMMON, true); - } - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_krick_explosive_barrage_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override + void HandlePeriodicTick(AuraEffect const* /*aurEff*/) { - return new spell_krick_explosive_barrage_AuraScript(); + PreventDefaultAction(); + if (Unit* caster = GetCaster()) + if (caster->GetTypeId() == TYPEID_UNIT) + { + Map::PlayerList const& players = caster->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + if (Player* player = itr->GetSource()) + if (player->IsWithinDist(caster, 100.0f)) + caster->CastSpell(player, SPELL_EXPLOSIVE_BARRAGE_SUMMON, true); + } + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_krick_explosive_barrage_aura::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; -class spell_exploding_orb_auto_grow : public SpellScriptLoader +class spell_exploding_orb_auto_grow_aura : public AuraScript { -public: - spell_exploding_orb_auto_grow() : SpellScriptLoader("spell_exploding_orb_auto_grow") { } + PrepareAuraScript(spell_exploding_orb_auto_grow_aura); - class spell_exploding_orb_auto_grow_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_exploding_orb_auto_grow_AuraScript); + return ValidateSpellInfo({ SPELL_EXPLOSIVE_BARRAGE_DAMAGE, SPELL_HASTY_GROW, SPELL_AUTO_GROW, SPELL_EXPLODING_ORB_VISUAL }); + } - void HandlePeriodicTick(AuraEffect const* aurEff) - { - if (aurEff->GetTickNumber() >= 16) - if (Unit* target = GetTarget()) - { - PreventDefaultAction(); - target->CastSpell(target, SPELL_EXPLOSIVE_BARRAGE_DAMAGE, false); - target->RemoveAurasDueToSpell(SPELL_HASTY_GROW); - target->RemoveAurasDueToSpell(SPELL_AUTO_GROW); - target->RemoveAurasDueToSpell(SPELL_EXPLODING_ORB_VISUAL); - if (target->GetTypeId() == TYPEID_UNIT) - target->ToCreature()->DespawnOrUnsummon(2000); - } - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_exploding_orb_auto_grow_AuraScript::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override + void HandlePeriodicTick(AuraEffect const* aurEff) { - return new spell_exploding_orb_auto_grow_AuraScript(); + if (aurEff->GetTickNumber() >= 16) + if (Unit* target = GetTarget()) + { + PreventDefaultAction(); + target->CastSpell(target, SPELL_EXPLOSIVE_BARRAGE_DAMAGE, false); + target->RemoveAurasDueToSpell(SPELL_HASTY_GROW); + target->RemoveAurasDueToSpell(SPELL_AUTO_GROW); + target->RemoveAurasDueToSpell(SPELL_EXPLODING_ORB_VISUAL); + if (target->GetTypeId() == TYPEID_UNIT) + target->ToCreature()->DespawnOrUnsummon(2000); + } + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_exploding_orb_auto_grow_aura::HandlePeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; @@ -534,7 +522,7 @@ void AddSC_boss_ick() new boss_ick(); new boss_krick(); - new spell_krick_explosive_barrage(); - new spell_exploding_orb_auto_grow(); + RegisterSpellScript(spell_krick_explosive_barrage_aura); + RegisterSpellScript(spell_exploding_orb_auto_grow_aura); } diff --git a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp index 6ce6c7661..eb11f3bcd 100644 --- a/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/PitOfSaron/pit_of_saron.cpp @@ -1301,31 +1301,30 @@ public: } }; -class spell_pos_empowered_blizzard : public SpellScriptLoader +enum EmpoweredBlizzard { -public: - spell_pos_empowered_blizzard() : SpellScriptLoader("spell_pos_empowered_blizzard") { } + SPELL_EMPOWERED_BLIZZARD = 70131 +}; - class spell_pos_empowered_blizzardAuraScript : public AuraScript +class spell_pos_empowered_blizzard_aura : public AuraScript +{ + PrepareAuraScript(spell_pos_empowered_blizzard_aura); + + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_pos_empowered_blizzardAuraScript) + return ValidateSpellInfo({ SPELL_EMPOWERED_BLIZZARD }); + } - void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - if (Unit* caster = GetCaster()) - caster->CastSpell((float)urand(447, 480), (float)urand(200, 235), 528.71f, 70131, true); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_pos_empowered_blizzardAuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { - return new spell_pos_empowered_blizzardAuraScript(); + PreventDefaultAction(); + if (Unit* caster = GetCaster()) + caster->CastSpell((float)urand(447, 480), (float)urand(200, 235), 528.71f, SPELL_EMPOWERED_BLIZZARD, true); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_pos_empowered_blizzard_aura::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; @@ -1364,138 +1363,99 @@ private: Creature& _owner; }; -class spell_pos_slave_trigger_closest : public SpellScriptLoader +class spell_pos_slave_trigger_closest : public SpellScript { -public: - spell_pos_slave_trigger_closest() : SpellScriptLoader("spell_pos_slave_trigger_closest") { } + PrepareSpellScript(spell_pos_slave_trigger_closest); - class spell_pos_slave_trigger_closestSpellScript : public SpellScript + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_pos_slave_trigger_closestSpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - if (target->GetUInt32Value(UNIT_NPC_EMOTESTATE)) // prevent using multiple times - { - if (Unit* caster = GetCaster()) - if (Player* p = caster->ToPlayer()) - { - p->RewardPlayerAndGroupAtEvent(36764, caster); // alliance - p->RewardPlayerAndGroupAtEvent(36770, caster); // horde - - target->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); - if (Creature* c = target->ToCreature()) - { - c->DespawnOrUnsummon(7000); - c->AI()->Talk(0, p); - c->m_Events.AddEvent(new SlaveRunEvent(*c), c->m_Events.CalculateTime(3000)); - } - } - } - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_pos_slave_trigger_closestSpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_pos_slave_trigger_closestSpellScript(); - } -}; - -class spell_pos_rimefang_frost_nova : public SpellScriptLoader -{ -public: - spell_pos_rimefang_frost_nova() : SpellScriptLoader("spell_pos_rimefang_frost_nova") { } - - class spell_pos_rimefang_frost_novaSpellScript : public SpellScript - { - PrepareSpellScript(spell_pos_rimefang_frost_novaSpellScript); - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) + if (Unit* target = GetHitUnit()) + if (target->GetUInt32Value(UNIT_NPC_EMOTESTATE)) // prevent using multiple times + { if (Unit* caster = GetCaster()) - { - Unit::Kill(caster, target); - if (target->GetTypeId() == TYPEID_UNIT) - target->ToCreature()->DespawnOrUnsummon(30000); - } - } + if (Player* p = caster->ToPlayer()) + { + p->RewardPlayerAndGroupAtEvent(36764, caster); // alliance + p->RewardPlayerAndGroupAtEvent(36770, caster); // horde - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_pos_rimefang_frost_novaSpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; + target->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); + if (Creature* c = target->ToCreature()) + { + c->DespawnOrUnsummon(7000); + c->AI()->Talk(0, p); + c->m_Events.AddEvent(new SlaveRunEvent(*c), c->m_Events.CalculateTime(3000)); + } + } + } + } - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_pos_rimefang_frost_novaSpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_pos_slave_trigger_closest::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; -class spell_pos_blight : public SpellScriptLoader +class spell_pos_rimefang_frost_nova : public SpellScript { -public: - spell_pos_blight() : SpellScriptLoader("spell_pos_blight") { } + PrepareSpellScript(spell_pos_rimefang_frost_nova); - class spell_pos_blightAuraScript : public AuraScript + void HandleDummy(SpellEffIndex /*effIndex*/) { - PrepareAuraScript(spell_pos_blightAuraScript) + if (Unit* target = GetHitUnit()) + if (Unit* caster = GetCaster()) + { + Unit::Kill(caster, target); + if (target->GetTypeId() == TYPEID_UNIT) + target->ToCreature()->DespawnOrUnsummon(30000); + } + } - void HandleEffectPeriodic(AuraEffect const* aurEff) - { - if (aurEff->GetTotalTicks() >= 0 && aurEff->GetTickNumber() == uint32(aurEff->GetTotalTicks())) - if (Unit* target = GetTarget()) - target->CastSpell(target, 69604, true); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_pos_blightAuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_pos_blightAuraScript(); + OnEffectHitTarget += SpellEffectFn(spell_pos_rimefang_frost_nova::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; -class spell_pos_glacial_strike : public SpellScriptLoader +class spell_pos_blight_aura : public AuraScript { -public: - spell_pos_glacial_strike() : SpellScriptLoader("spell_pos_glacial_strike") { } + PrepareAuraScript(spell_pos_blight_aura); - class spell_pos_glacial_strikeAuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_pos_glacial_strikeAuraScript) + return ValidateSpellInfo({ 69604 }); + } - void HandleEffectPeriodic(AuraEffect const* aurEff) - { + void HandleEffectPeriodic(AuraEffect const* aurEff) + { + if (aurEff->GetTotalTicks() >= 0 && aurEff->GetTickNumber() == uint32(aurEff->GetTotalTicks())) if (Unit* target = GetTarget()) - if (target->GetHealth() == target->GetMaxHealth()) - { - PreventDefaultAction(); - aurEff->GetBase()->Remove(AURA_REMOVE_BY_EXPIRE); - return; - } - } + target->CastSpell(target, 69604, true); + } - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_pos_glacial_strikeAuraScript::HandleEffectPeriodic, EFFECT_2, SPELL_AURA_PERIODIC_DAMAGE_PERCENT); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_pos_glacial_strikeAuraScript(); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_pos_blight_aura::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + } +}; + +class spell_pos_glacial_strike_aura : public AuraScript +{ + PrepareAuraScript(spell_pos_glacial_strike_aura); + + void HandleEffectPeriodic(AuraEffect const* aurEff) + { + if (Unit* target = GetTarget()) + if (target->GetHealth() == target->GetMaxHealth()) + { + PreventDefaultAction(); + aurEff->GetBase()->Remove(AURA_REMOVE_BY_EXPIRE); + return; + } + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_pos_glacial_strike_aura::HandleEffectPeriodic, EFFECT_2, SPELL_AURA_PERIODIC_DAMAGE_PERCENT); } }; @@ -1537,11 +1497,11 @@ void AddSC_pit_of_saron() new npc_pos_freed_slave(); new npc_pos_leader_second(); - new spell_pos_empowered_blizzard(); - new spell_pos_slave_trigger_closest(); - new spell_pos_rimefang_frost_nova(); - new spell_pos_blight(); - new spell_pos_glacial_strike(); + RegisterSpellScript(spell_pos_empowered_blizzard_aura); + RegisterSpellScript(spell_pos_slave_trigger_closest); + RegisterSpellScript(spell_pos_rimefang_frost_nova); + RegisterSpellScript(spell_pos_blight_aura); + RegisterSpellScript(spell_pos_glacial_strike_aura); new at_tyrannus_event_starter(); } diff --git a/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp b/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp index f8680b99d..3dab952e3 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_drakkari_colossus.cpp @@ -406,86 +406,63 @@ public: }; }; -class spell_drakkari_colossus_emerge : public SpellScriptLoader +class spell_drakkari_colossus_emerge : public SpellScript { -public: - spell_drakkari_colossus_emerge() : SpellScriptLoader("spell_drakkari_colossus_emerge") { } + PrepareSpellScript(spell_drakkari_colossus_emerge); - class spell_drakkari_colossus_emerge_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_drakkari_colossus_emerge_SpellScript); + return ValidateSpellInfo({ SPELL_FREEZE_ANIM }); + } - void HandleDummy(SpellEffIndex /*effIndex*/) - { - GetCaster()->CastSpell(GetCaster(), SPELL_FREEZE_ANIM, true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_drakkari_colossus_emerge_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override + void HandleDummy(SpellEffIndex /*effIndex*/) { - return new spell_drakkari_colossus_emerge_SpellScript(); + GetCaster()->CastSpell(GetCaster(), SPELL_FREEZE_ANIM, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_drakkari_colossus_emerge::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; -class spell_drakkari_colossus_surge : public SpellScriptLoader +class spell_drakkari_colossus_surge : public SpellScript { -public: - spell_drakkari_colossus_surge() : SpellScriptLoader("spell_drakkari_colossus_surge") { } + PrepareSpellScript(spell_drakkari_colossus_surge); - class spell_drakkari_colossus_surge_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_drakkari_colossus_surge_SpellScript); + return ValidateSpellInfo({ SPELL_SURGE_DAMAGE }); + } - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - GetCaster()->CastSpell(target, SPELL_SURGE_DAMAGE, true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_drakkari_colossus_surge_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override + void HandleDummy(SpellEffIndex /*effIndex*/) { - return new spell_drakkari_colossus_surge_SpellScript(); + if (Unit* target = GetHitUnit()) + GetCaster()->CastSpell(target, SPELL_SURGE_DAMAGE, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_drakkari_colossus_surge::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; -class spell_drakkari_colossus_face_me : public SpellScriptLoader +class spell_drakkari_colossus_face_me : public SpellScript { -public: - spell_drakkari_colossus_face_me() : SpellScriptLoader("spell_drakkari_colossus_face_me") { } + PrepareSpellScript(spell_drakkari_colossus_face_me); - class spell_drakkari_colossus_face_me_SpellScript : public SpellScript + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_drakkari_colossus_face_me_SpellScript); - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) + if (Unit* target = GetHitUnit()) { - if (Unit* target = GetHitUnit()) - { - GetCaster()->SetInFront(target); - GetCaster()->SetFacingTo(GetCaster()->GetAngle(target)); - } + GetCaster()->SetInFront(target); + GetCaster()->SetFacingTo(GetCaster()->GetAngle(target)); } + } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_drakkari_colossus_face_me_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_drakkari_colossus_face_me_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_drakkari_colossus_face_me::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; @@ -494,8 +471,8 @@ void AddSC_boss_drakkari_colossus() new boss_drakkari_colossus(); new boss_drakkari_elemental(); new npc_living_mojo(); - new spell_drakkari_colossus_emerge(); - new spell_drakkari_colossus_surge(); - new spell_drakkari_colossus_face_me(); + RegisterSpellScript(spell_drakkari_colossus_emerge); + RegisterSpellScript(spell_drakkari_colossus_surge); + RegisterSpellScript(spell_drakkari_colossus_face_me); } diff --git a/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp b/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp index 4c9f70f9f..e22c3bce2 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_gal_darah.cpp @@ -219,57 +219,45 @@ public: }; }; -class spell_galdarah_impaling_charge : public SpellScriptLoader +class spell_galdarah_impaling_charge : public SpellScript { -public: - spell_galdarah_impaling_charge() : SpellScriptLoader("spell_galdarah_impaling_charge") { } + PrepareSpellScript(spell_galdarah_impaling_charge); - class spell_galdarah_impaling_charge_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_galdarah_impaling_charge_SpellScript); + return ValidateSpellInfo({ SPELL_IMPALING_CHARGE_VEHICLE }); + } - void HandleApplyAura(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - target->CastSpell(GetCaster(), SPELL_IMPALING_CHARGE_VEHICLE, true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_galdarah_impaling_charge_SpellScript::HandleApplyAura, EFFECT_1, SPELL_EFFECT_APPLY_AURA); - } - }; - - SpellScript* GetSpellScript() const override + void HandleApplyAura(SpellEffIndex /*effIndex*/) { - return new spell_galdarah_impaling_charge_SpellScript(); + if (Unit* target = GetHitUnit()) + target->CastSpell(GetCaster(), SPELL_IMPALING_CHARGE_VEHICLE, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_galdarah_impaling_charge::HandleApplyAura, EFFECT_1, SPELL_EFFECT_APPLY_AURA); } }; -class spell_galdarah_transform : public SpellScriptLoader +class spell_galdarah_transform : public SpellScript { -public: - spell_galdarah_transform() : SpellScriptLoader("spell_galdarah_transform") { } + PrepareSpellScript(spell_galdarah_transform); - class spell_galdarah_transform_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_galdarah_transform_SpellScript); + return ValidateSpellInfo({ SPELL_TRANSFORM_TO_RHINO }); + } - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - target->RemoveAurasDueToSpell(SPELL_TRANSFORM_TO_RHINO); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_galdarah_transform_SpellScript::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void HandleScriptEffect(SpellEffIndex /*effIndex*/) { - return new spell_galdarah_transform_SpellScript(); + if (Unit* target = GetHitUnit()) + target->RemoveAurasDueToSpell(SPELL_TRANSFORM_TO_RHINO); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_galdarah_transform::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; @@ -292,7 +280,7 @@ public: void AddSC_boss_gal_darah() { new boss_gal_darah(); - new spell_galdarah_impaling_charge(); - new spell_galdarah_transform(); + RegisterSpellScript(spell_galdarah_impaling_charge); + RegisterSpellScript(spell_galdarah_transform); new achievement_share_the_love(); } diff --git a/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp b/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp index 178c8e68b..9e1aac8e0 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_moorabi.cpp @@ -170,34 +170,23 @@ public: }; }; -class spell_moorabi_mojo_frenzy : public SpellScriptLoader +class spell_moorabi_mojo_frenzy_aura : public AuraScript { -public: - spell_moorabi_mojo_frenzy() : SpellScriptLoader("spell_moorabi_mojo_frenzy") { } + PrepareAuraScript(spell_moorabi_mojo_frenzy_aura); - class spell_moorabi_mojo_frenzy_AuraScript : public AuraScript + void HandlePeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_moorabi_mojo_frenzy_AuraScript); + PreventDefaultAction(); - void HandlePeriodic(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); + if (GetUnitOwner()->GetMap()->IsHeroic()) + GetUnitOwner()->SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f * (GetUnitOwner()->GetHealthPct()*GetUnitOwner()->GetHealthPct() / 10000.0f)); + else + GetUnitOwner()->SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f * (GetUnitOwner()->GetHealthPct() / 100.0f)); + } - if (GetUnitOwner()->GetMap()->IsHeroic()) - GetUnitOwner()->SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f * (GetUnitOwner()->GetHealthPct()*GetUnitOwner()->GetHealthPct() / 10000.0f)); - else - GetUnitOwner()->SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f * (GetUnitOwner()->GetHealthPct() / 100.0f)); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_moorabi_mojo_frenzy_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_moorabi_mojo_frenzy_AuraScript(); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_moorabi_mojo_frenzy_aura::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); } }; @@ -217,6 +206,6 @@ public: void AddSC_boss_moorabi() { new boss_moorabi(); - new spell_moorabi_mojo_frenzy(); + RegisterSpellScript(spell_moorabi_mojo_frenzy_aura); new achievement_less_rabi(); } diff --git a/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp b/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp index 9bb8b57ad..0ed90bd39 100644 --- a/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp +++ b/src/server/scripts/Northrend/Gundrak/boss_slad_ran.cpp @@ -200,34 +200,28 @@ public: }; }; -class spell_sladran_grip_of_sladran : public SpellScriptLoader +class spell_sladran_grip_of_sladran_aura : public AuraScript { -public: - spell_sladran_grip_of_sladran() : SpellScriptLoader("spell_sladran_grip_of_sladran") { } + PrepareAuraScript(spell_sladran_grip_of_sladran_aura); - class spell_sladran_grip_of_sladran_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_sladran_grip_of_sladran_AuraScript); + return ValidateSpellInfo({ SPELL_SNAKE_WRAP }); + } - void HandlePeriodic(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - if (GetStackAmount() >= 5) - { - SetDuration(0); - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SNAKE_WRAP, true); - } - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_sladran_grip_of_sladran_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override + void HandlePeriodic(AuraEffect const* /*aurEff*/) { - return new spell_sladran_grip_of_sladran_AuraScript(); + PreventDefaultAction(); + if (GetStackAmount() >= 5) + { + SetDuration(0); + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_SNAKE_WRAP, true); + } + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_sladran_grip_of_sladran_aura::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); } }; @@ -250,6 +244,6 @@ public: void AddSC_boss_slad_ran() { new boss_slad_ran(); - new spell_sladran_grip_of_sladran(); + RegisterSpellScript(spell_sladran_grip_of_sladran_aura); new achievement_snakes_whyd_it_have_to_be_snakes(); } diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp index dbb3413b6..3162814de 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp @@ -1488,59 +1488,48 @@ public: } }; -class spell_eoe_ph3_surge_of_power : public SpellScriptLoader +class spell_eoe_ph3_surge_of_power : public SpellScript { -public: - spell_eoe_ph3_surge_of_power() : SpellScriptLoader("spell_eoe_ph3_surge_of_power") { } + PrepareSpellScript(spell_eoe_ph3_surge_of_power); - class spell_eoe_ph3_surge_of_power_SpellScript : public SpellScript + ObjectGuid DrakeGUID[3]; + + bool Load() override { - PrepareSpellScript(spell_eoe_ph3_surge_of_power_SpellScript); - - ObjectGuid DrakeGUID[3]; - - bool Load() override - { - if (Unit* caster = GetCaster()) - if (Creature* c = caster->ToCreature()) - { - uint8 i = 0; - std::list drakes; - c->AI()->SelectTargetList(drakes, (c->GetMap()->GetSpawnMode() == 0 ? 1 : 3), SelectTargetMethod::Random, 0, 0.0f, false, true, 57403 /*only drakes have this aura*/); - for (std::list::iterator itr = drakes.begin(); itr != drakes.end() && i < 3; ++itr) - { - DrakeGUID[i++] = (*itr)->GetGUID(); - if (Vehicle* v = (*itr)->GetVehicleKit()) - if (Unit* p = v->GetPassenger(0)) - if (Player* plr = p->ToPlayer()) - c->AI()->Talk(EMOTE_SURGE_OF_POWER_WARNING_P3, plr); - } - } - - return true; - } - - void FilterTargets(std::list& targets) - { - if (Unit* caster = GetCaster()) + if (Unit* caster = GetCaster()) + if (Creature* c = caster->ToCreature()) { - targets.clear(); - for (uint8 i = 0; i < 3; ++i) - if (DrakeGUID[i]) - if (Unit* u = ObjectAccessor::GetUnit(*caster, DrakeGUID[i])) - targets.push_back(u); + uint8 i = 0; + std::list drakes; + c->AI()->SelectTargetList(drakes, (c->GetMap()->GetSpawnMode() == 0 ? 1 : 3), SelectTargetMethod::Random, 0, 0.0f, false, true, 57403 /*only drakes have this aura*/); + for (std::list::iterator itr = drakes.begin(); itr != drakes.end() && i < 3; ++itr) + { + DrakeGUID[i++] = (*itr)->GetGUID(); + if (Vehicle* v = (*itr)->GetVehicleKit()) + if (Unit* p = v->GetPassenger(0)) + if (Player* plr = p->ToPlayer()) + c->AI()->Talk(EMOTE_SURGE_OF_POWER_WARNING_P3, plr); + } } - } - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_eoe_ph3_surge_of_power_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - } - }; + return true; + } - SpellScript* GetSpellScript() const override + void FilterTargets(std::list& targets) { - return new spell_eoe_ph3_surge_of_power_SpellScript(); + if (Unit* caster = GetCaster()) + { + targets.clear(); + for (uint8 i = 0; i < 3; ++i) + if (DrakeGUID[i]) + if (Unit* u = ObjectAccessor::GetUnit(*caster, DrakeGUID[i])) + targets.push_back(u); + } + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_eoe_ph3_surge_of_power::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); } }; @@ -1556,5 +1545,5 @@ void AddSC_boss_malygos() new npc_hover_disk(); new npc_eoe_wyrmrest_skytalon(); - new spell_eoe_ph3_surge_of_power(); + RegisterSpellScript(spell_eoe_ph3_surge_of_power); } diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp index 4f4274f64..630460093 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp @@ -230,99 +230,82 @@ public: }; }; -class spell_boss_magus_telestra_summon_telestra_clones : public SpellScriptLoader +class spell_boss_magus_telestra_summon_telestra_clones_aura : public AuraScript { -public: - spell_boss_magus_telestra_summon_telestra_clones() : SpellScriptLoader("spell_boss_magus_telestra_summon_telestra_clones") { } + PrepareAuraScript(spell_boss_magus_telestra_summon_telestra_clones_aura); - class spell_boss_magus_telestra_summon_telestra_clones_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_boss_magus_telestra_summon_telestra_clones_AuraScript); + return ValidateSpellInfo({ SPELL_FIRE_MAGUS_SUMMON, SPELL_FROST_MAGUS_SUMMON, SPELL_ARCANE_MAGUS_SUMMON }); + } - bool Load() override - { - return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; - } - - void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_FIRE_MAGUS_SUMMON, true); - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_FROST_MAGUS_SUMMON, true); - GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_ARCANE_MAGUS_SUMMON, true); - - GetUnitOwner()->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); - GetUnitOwner()->SetControlled(true, UNIT_STATE_STUNNED); - GetUnitOwner()->ToCreature()->LoadEquipment(0, true); - } - - void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetUnitOwner()->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); - GetUnitOwner()->SetControlled(false, UNIT_STATE_STUNNED); - GetUnitOwner()->ToCreature()->LoadEquipment(1, true); - } - - void Register() override - { - AfterEffectApply += AuraEffectApplyFn(spell_boss_magus_telestra_summon_telestra_clones_AuraScript::HandleApply, EFFECT_1, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_boss_magus_telestra_summon_telestra_clones_AuraScript::HandleRemove, EFFECT_1, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + bool Load() override { - return new spell_boss_magus_telestra_summon_telestra_clones_AuraScript(); + return GetUnitOwner()->GetTypeId() == TYPEID_UNIT; + } + + void HandleApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_FIRE_MAGUS_SUMMON, true); + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_FROST_MAGUS_SUMMON, true); + GetUnitOwner()->CastSpell(GetUnitOwner(), SPELL_ARCANE_MAGUS_SUMMON, true); + + GetUnitOwner()->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); + GetUnitOwner()->SetControlled(true, UNIT_STATE_STUNNED); + GetUnitOwner()->ToCreature()->LoadEquipment(0, true); + } + + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetUnitOwner()->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); + GetUnitOwner()->SetControlled(false, UNIT_STATE_STUNNED); + GetUnitOwner()->ToCreature()->LoadEquipment(1, true); + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply, EFFECT_1, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_boss_magus_telestra_summon_telestra_clones_aura::HandleRemove, EFFECT_1, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL); } }; -class spell_boss_magus_telestra_gravity_well : public SpellScriptLoader +class spell_boss_magus_telestra_gravity_well : public SpellScript { -public: - spell_boss_magus_telestra_gravity_well() : SpellScriptLoader("spell_boss_magus_telestra_gravity_well") { } + PrepareSpellScript(spell_boss_magus_telestra_gravity_well); - class spell_boss_magus_telestra_gravity_well_SpellScript : public SpellScript + void SelectTarget(std::list& targets) { - PrepareSpellScript(spell_boss_magus_telestra_gravity_well_SpellScript); + targets.remove_if(Acore::RandomCheck(50)); + } - void SelectTarget(std::list& targets) - { - targets.remove_if(Acore::RandomCheck(50)); - } - - void HandlePull(SpellEffIndex effIndex) - { - PreventHitDefaultEffect(effIndex); - Unit* target = GetHitUnit(); - if (!target) - return; - - Position pos; - if (target->GetDistance(GetCaster()) < 5.0f) - { - pos.Relocate(GetCaster()->GetPositionX(), GetCaster()->GetPositionY(), GetCaster()->GetPositionZ() + 1.0f); - float o = frand(0, 2 * M_PI); - target->MovePositionToFirstCollision(pos, 20.0f, o); - pos.m_positionZ += frand(5.0f, 15.0f); - } - else - pos.Relocate(GetCaster()->GetPositionX(), GetCaster()->GetPositionY(), GetCaster()->GetPositionZ() + 1.0f); - - float speedXY = float(GetSpellInfo()->Effects[effIndex].MiscValue) * 0.1f; - float speedZ = target->GetDistance(pos) / speedXY * 0.5f * Movement::gravity; - - target->GetMotionMaster()->MoveJump(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), speedXY, speedZ); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_boss_magus_telestra_gravity_well_SpellScript::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnEffectHitTarget += SpellEffectFn(spell_boss_magus_telestra_gravity_well_SpellScript::HandlePull, EFFECT_0, SPELL_EFFECT_PULL_TOWARDS_DEST); - } - }; - - SpellScript* GetSpellScript() const override + void HandlePull(SpellEffIndex effIndex) { - return new spell_boss_magus_telestra_gravity_well_SpellScript(); + PreventHitDefaultEffect(effIndex); + Unit* target = GetHitUnit(); + if (!target) + return; + + Position pos; + if (target->GetDistance(GetCaster()) < 5.0f) + { + pos.Relocate(GetCaster()->GetPositionX(), GetCaster()->GetPositionY(), GetCaster()->GetPositionZ() + 1.0f); + float o = frand(0, 2 * M_PI); + target->MovePositionToFirstCollision(pos, 20.0f, o); + pos.m_positionZ += frand(5.0f, 15.0f); + } + else + pos.Relocate(GetCaster()->GetPositionX(), GetCaster()->GetPositionY(), GetCaster()->GetPositionZ() + 1.0f); + + float speedXY = float(GetSpellInfo()->Effects[effIndex].MiscValue) * 0.1f; + float speedZ = target->GetDistance(pos) / speedXY * 0.5f * Movement::gravity; + + target->GetMotionMaster()->MoveJump(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), speedXY, speedZ); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_boss_magus_telestra_gravity_well::SelectTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_boss_magus_telestra_gravity_well::HandlePull, EFFECT_0, SPELL_EFFECT_PULL_TOWARDS_DEST); } }; @@ -345,7 +328,7 @@ public: void AddSC_boss_magus_telestra() { new boss_magus_telestra(); - new spell_boss_magus_telestra_summon_telestra_clones(); - new spell_boss_magus_telestra_gravity_well(); + RegisterSpellScript(spell_boss_magus_telestra_summon_telestra_clones_aura); + RegisterSpellScript(spell_boss_magus_telestra_gravity_well); new achievement_split_personality(); } diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp index b28f79136..860a92fd9 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp @@ -532,486 +532,374 @@ public: }; // 49838 - Stop Time -class spell_oculus_stop_time : public SpellScriptLoader +class spell_oculus_stop_time_aura : public AuraScript { -public: - spell_oculus_stop_time() : SpellScriptLoader("spell_oculus_stop_time") { } + PrepareAuraScript(spell_oculus_stop_time_aura); - class spell_oculus_stop_time_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_oculus_stop_time_AuraScript); + return ValidateSpellInfo({ SPELL_AMBER_SHOCK_CHARGE }); + } - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_AMBER_SHOCK_CHARGE }); - } - - void Apply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* caster = GetCaster(); - if (!caster) - return; - - Unit* target = GetTarget(); - for (uint32 i = 0; i < 5; ++i) - caster->CastSpell(target, SPELL_AMBER_SHOCK_CHARGE, true); - } - - void Register() override - { - AfterEffectApply += AuraEffectApplyFn(spell_oculus_stop_time_AuraScript::Apply, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + void Apply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - return new spell_oculus_stop_time_AuraScript(); + Unit* caster = GetCaster(); + if (!caster) + return; + + Unit* target = GetTarget(); + for (uint32 i = 0; i < 5; ++i) + caster->CastSpell(target, SPELL_AMBER_SHOCK_CHARGE, true); + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_oculus_stop_time_aura::Apply, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); } }; // 50240 - Evasive Maneuvers -class spell_oculus_evasive_maneuvers : public SpellScriptLoader +class spell_oculus_evasive_maneuvers_aura : public AuraScript { -public: - spell_oculus_evasive_maneuvers() : SpellScriptLoader("spell_oculus_evasive_maneuvers") { } + PrepareAuraScript(spell_oculus_evasive_maneuvers_aura); - class spell_oculus_evasive_maneuvers_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_oculus_evasive_maneuvers_AuraScript); + return ValidateSpellInfo({ SPELL_RUBY_EVASIVE_CHARGES }); + } - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_RUBY_EVASIVE_CHARGES }); - } - - void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); - GetTarget()->RemoveAuraFromStack(SPELL_RUBY_EVASIVE_CHARGES); - if (!GetTarget()->HasAura(SPELL_RUBY_EVASIVE_CHARGES)) - SetDuration(0); - } - - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_oculus_evasive_maneuvers_AuraScript::HandleProc, EFFECT_2, SPELL_AURA_PROC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) { - return new spell_oculus_evasive_maneuvers_AuraScript(); + PreventDefaultAction(); + GetTarget()->RemoveAuraFromStack(SPELL_RUBY_EVASIVE_CHARGES); + if (!GetTarget()->HasAura(SPELL_RUBY_EVASIVE_CHARGES)) + SetDuration(0); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_oculus_evasive_maneuvers_aura::HandleProc, EFFECT_2, SPELL_AURA_PROC_TRIGGER_SPELL); } }; // 49840 - Shock Lance -class spell_oculus_shock_lance : public SpellScriptLoader +class spell_oculus_shock_lance : public SpellScript { -public: - spell_oculus_shock_lance() : SpellScriptLoader("spell_oculus_shock_lance") { } + PrepareSpellScript(spell_oculus_shock_lance); - class spell_oculus_shock_lance_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_oculus_shock_lance_SpellScript); + return ValidateSpellInfo({ SPELL_AMBER_SHOCK_CHARGE }); + } - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_AMBER_SHOCK_CHARGE }); - } - - void CalcDamage() - { - int32 damage = GetHitDamage(); - if (Unit* target = GetHitUnit()) - if (Aura* aura = target->GetAura(SPELL_AMBER_SHOCK_CHARGE, GetCaster()->GetGUID())) // shock charges from same caster - { - damage += aura->GetStackAmount() * 6525; - aura->Remove(); - } - - SetHitDamage(damage); - } - - void Register() override - { - OnHit += SpellHitFn(spell_oculus_shock_lance_SpellScript::CalcDamage); - } - }; - - SpellScript* GetSpellScript() const override + void CalcDamage() { - return new spell_oculus_shock_lance_SpellScript(); + int32 damage = GetHitDamage(); + if (Unit* target = GetHitUnit()) + if (Aura* aura = target->GetAura(SPELL_AMBER_SHOCK_CHARGE, GetCaster()->GetGUID())) // shock charges from same caster + { + damage += aura->GetStackAmount() * 6525; + aura->Remove(); + } + + SetHitDamage(damage); + } + + void Register() override + { + OnHit += SpellHitFn(spell_oculus_shock_lance::CalcDamage); } }; // 49592 - Temporal Rift -class spell_oculus_temporal_rift : public SpellScriptLoader +class spell_oculus_temporal_rift_aura : public AuraScript { -public: - spell_oculus_temporal_rift() : SpellScriptLoader("spell_oculus_temporal_rift") { } + PrepareAuraScript(spell_oculus_temporal_rift_aura); - class spell_oculus_temporal_rift_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_oculus_temporal_rift_AuraScript); + return ValidateSpellInfo({ SPELL_AMBER_SHOCK_CHARGE }); + } - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_AMBER_SHOCK_CHARGE }); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - DamageInfo* damageInfo = eventInfo.GetDamageInfo(); - - if (!damageInfo || !damageInfo->GetDamage()) - { - return; - } - - int32 amount = aurEff->GetAmount() + damageInfo->GetDamage(); - - uint8 num = amount / 15000; - if (amount >= 15000) - { - if (Unit* caster = GetCaster()) - for (uint8 i = 0; i < num; ++i ) - caster->CastSpell(GetTarget(), SPELL_AMBER_SHOCK_CHARGE, true); - } - - const_cast(aurEff)->SetAmount(amount - 15000 * num); - } - - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_oculus_temporal_rift_AuraScript::HandleProc, EFFECT_2, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) { - return new spell_oculus_temporal_rift_AuraScript(); + PreventDefaultAction(); + + DamageInfo* damageInfo = eventInfo.GetDamageInfo(); + + if (!damageInfo || !damageInfo->GetDamage()) + { + return; + } + + int32 amount = aurEff->GetAmount() + damageInfo->GetDamage(); + + uint8 num = amount / 15000; + if (amount >= 15000) + { + if (Unit* caster = GetCaster()) + for (uint8 i = 0; i < num; ++i ) + caster->CastSpell(GetTarget(), SPELL_AMBER_SHOCK_CHARGE, true); + } + + const_cast(aurEff)->SetAmount(amount - 15000 * num); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_oculus_temporal_rift_aura::HandleProc, EFFECT_2, SPELL_AURA_DUMMY); } }; // 50341 - Touch the Nightmare -class spell_oculus_touch_the_nightmare : public SpellScriptLoader +class spell_oculus_touch_the_nightmare : public SpellScript { -public: - spell_oculus_touch_the_nightmare() : SpellScriptLoader("spell_oculus_touch_the_nightmare") { } + PrepareSpellScript(spell_oculus_touch_the_nightmare); - class spell_oculus_touch_the_nightmare_SpellScript : public SpellScript + void HandleDamageCalc(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_oculus_touch_the_nightmare_SpellScript); + SetHitDamage(int32(GetCaster()->CountPctFromMaxHealth(30))); + } - void HandleDamageCalc(SpellEffIndex /*effIndex*/) - { - SetHitDamage(int32(GetCaster()->CountPctFromMaxHealth(30))); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_oculus_touch_the_nightmare_SpellScript::HandleDamageCalc, EFFECT_2, SPELL_EFFECT_SCHOOL_DAMAGE); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_oculus_touch_the_nightmare_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_oculus_touch_the_nightmare::HandleDamageCalc, EFFECT_2, SPELL_EFFECT_SCHOOL_DAMAGE); } }; // 50344 - Dream Funnel -class spell_oculus_dream_funnel : public SpellScriptLoader +class spell_oculus_dream_funnel_aura : public AuraScript { -public: - spell_oculus_dream_funnel() : SpellScriptLoader("spell_oculus_dream_funnel") { } + PrepareAuraScript(spell_oculus_dream_funnel_aura); - class spell_oculus_dream_funnel_AuraScript : public AuraScript + void HandleEffectCalcAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) { - PrepareAuraScript(spell_oculus_dream_funnel_AuraScript); + if (Unit* caster = GetCaster()) + amount = int32(caster->CountPctFromMaxHealth(5)); - void HandleEffectCalcAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) - { - if (Unit* caster = GetCaster()) - amount = int32(caster->CountPctFromMaxHealth(5)); + canBeRecalculated = false; + } - canBeRecalculated = false; - } - - void Register() override - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_oculus_dream_funnel_AuraScript::HandleEffectCalcAmount, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_oculus_dream_funnel_AuraScript::HandleEffectCalcAmount, EFFECT_2, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_oculus_dream_funnel_AuraScript(); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_oculus_dream_funnel_aura::HandleEffectCalcAmount, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_oculus_dream_funnel_aura::HandleEffectCalcAmount, EFFECT_2, SPELL_AURA_PERIODIC_DAMAGE); } }; -class spell_oculus_call_ruby_emerald_amber_drake : public SpellScriptLoader +class spell_oculus_call_ruby_emerald_amber_drake : public SpellScript { -public: - spell_oculus_call_ruby_emerald_amber_drake() : SpellScriptLoader("spell_oculus_call_ruby_emerald_amber_drake") { } + PrepareSpellScript(spell_oculus_call_ruby_emerald_amber_drake); - class spell_oculus_call_ruby_emerald_amber_drake_SpellScript : public SpellScript + void SetDest(SpellDestination& dest) { - PrepareSpellScript(spell_oculus_call_ruby_emerald_amber_drake_SpellScript); + // Adjust effect summon position + Position const offset = { 0.0f, 0.0f, 12.0f, 0.0f }; + dest.RelocateOffset(offset); + } - void SetDest(SpellDestination& dest) - { - // Adjust effect summon position - Position const offset = { 0.0f, 0.0f, 12.0f, 0.0f }; - dest.RelocateOffset(offset); - } - - void Register() override - { - OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_oculus_call_ruby_emerald_amber_drake_SpellScript::SetDest, EFFECT_0, TARGET_DEST_CASTER_FRONT); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_oculus_call_ruby_emerald_amber_drake_SpellScript(); + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_oculus_call_ruby_emerald_amber_drake::SetDest, EFFECT_0, TARGET_DEST_CASTER_FRONT); } }; -class spell_oculus_ride_ruby_emerald_amber_drake_que : public SpellScriptLoader +class spell_oculus_ride_ruby_emerald_amber_drake_que_aura : public AuraScript { -public: - spell_oculus_ride_ruby_emerald_amber_drake_que() : SpellScriptLoader("spell_oculus_ride_ruby_emerald_amber_drake_que") { } + PrepareAuraScript(spell_oculus_ride_ruby_emerald_amber_drake_que_aura); - class spell_oculus_ride_ruby_emerald_amber_drake_que_AuraScript : public AuraScript + void HandlePeriodic(AuraEffect const* aurEff) { - PrepareAuraScript(spell_oculus_ride_ruby_emerald_amber_drake_que_AuraScript); + // caster of the triggered spell is wrong for an unknown reason, handle it here correctly + PreventDefaultAction(); + if (Unit* caster = GetCaster()) + GetTarget()->CastSpell(caster, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true); + } - void HandlePeriodic(AuraEffect const* aurEff) + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_oculus_ride_ruby_emerald_amber_drake_que_aura::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } +}; + +class spell_oculus_evasive_charges_aura : public AuraScript +{ + PrepareAuraScript(spell_oculus_evasive_charges_aura); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_RUBY_EVASIVE_MANEUVERS }); + } + + void HandleOnEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) + caster->ModifyAuraState(AURA_STATE_UNKNOWN22, true); + } + + void HandleOnEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) { - // caster of the triggered spell is wrong for an unknown reason, handle it here correctly + caster->RemoveAurasDueToSpell(SPELL_RUBY_EVASIVE_MANEUVERS); + caster->ModifyAuraState(AURA_STATE_UNKNOWN22, false); + } + } + + void Register() override + { + OnEffectApply += AuraEffectApplyFn(spell_oculus_evasive_charges_aura::HandleOnEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + OnEffectRemove += AuraEffectRemoveFn(spell_oculus_evasive_charges_aura::HandleOnEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } +}; + +class spell_oculus_soar_aura : public AuraScript +{ + PrepareAuraScript(spell_oculus_soar_aura); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_SOAR_BUFF }); + } + + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) + { + Unit* caster = GetCaster(); + + if (!caster) + return; + + if (!caster->getAttackers().empty()) + { + if (caster->HasAura(SPELL_SOAR_BUFF)) + caster->RemoveAurasDueToSpell(SPELL_SOAR_BUFF); + PreventDefaultAction(); - if (Unit* caster = GetCaster()) - GetTarget()->CastSpell(caster, GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell, true); + return; } - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_oculus_ride_ruby_emerald_amber_drake_que_AuraScript::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; + if (!caster->HasAura(SPELL_SOAR_BUFF)) + caster->CastSpell(caster, SPELL_SOAR_BUFF, true); - AuraScript* GetAuraScript() const override + // We handle the health regen here, normal heal regen isn't working.... + if (caster->GetHealth() < caster->GetMaxHealth()) + caster->SetHealth(caster->GetHealth() + (uint32)((double)caster->GetMaxHealth() * 0.2)); + } + + void HandleOnEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - return new spell_oculus_ride_ruby_emerald_amber_drake_que_AuraScript(); + Unit* caster = GetCaster(); + + if (!caster) + return; + + if (!caster->HasAura(SPELL_SOAR_BUFF)) + caster->CastSpell(caster, SPELL_SOAR_BUFF, true); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_oculus_soar_aura::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + OnEffectApply += AuraEffectApplyFn(spell_oculus_soar_aura::HandleOnEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); } }; -class spell_oculus_evasive_charges : public SpellScriptLoader +class spell_oculus_rider_aura : public AuraScript { -public: - spell_oculus_evasive_charges() : SpellScriptLoader("spell_oculus_evasive_charges") { } + PrepareAuraScript(spell_oculus_rider_aura); - class spell_oculus_evasive_chargesAuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_oculus_evasive_chargesAuraScript); - - void HandleOnEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - caster->ModifyAuraState(AURA_STATE_UNKNOWN22, true); - } - - void HandleOnEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - { - caster->RemoveAurasDueToSpell(SPELL_RUBY_EVASIVE_MANEUVERS); - caster->ModifyAuraState(AURA_STATE_UNKNOWN22, false); - } - } - - void Register() override - { - OnEffectApply += AuraEffectApplyFn(spell_oculus_evasive_chargesAuraScript::HandleOnEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - OnEffectRemove += AuraEffectRemoveFn(spell_oculus_evasive_chargesAuraScript::HandleOnEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_oculus_evasive_chargesAuraScript(); + return ValidateSpellInfo({ SPELL_SOAR_TRIGGER, SPELL_RUBY_EVASIVE_AURA, SPELL_DRAKE_FLAG_VISUAL }); } -}; -class spell_oculus_soar : public SpellScriptLoader -{ -public: - spell_oculus_soar() : SpellScriptLoader("spell_oculus_soar") { } + ObjectGuid _drakeGUID; - class spell_oculus_soarAuraScript : public AuraScript + void HandleOnEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { - PrepareAuraScript(spell_oculus_soarAuraScript); + Unit* caster = GetCaster(); + if (!caster) + return; - void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) + Creature* drake = caster->GetVehicleCreatureBase(); + + if (!drake) + return; + + switch (aurEff->GetEffIndex()) { - Unit* caster = GetCaster(); - - if (!caster) - return; - - if (!caster->getAttackers().empty()) - { - if (caster->HasAura(SPELL_SOAR_BUFF)) - caster->RemoveAurasDueToSpell(SPELL_SOAR_BUFF); - + case EFFECT_1: + _drakeGUID = drake->GetGUID(); + caster->AddAura(SPELL_DRAKE_FLAG_VISUAL, caster); + caster->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); + caster->RemoveAurasByType(SPELL_AURA_MOD_SHAPESHIFT); + drake->CastSpell(drake, SPELL_SOAR_TRIGGER); + if (drake->GetEntry() == NPC_RUBY_DRAKE) + drake->CastSpell(drake, SPELL_RUBY_EVASIVE_AURA); + break; + case EFFECT_2: + caster->AddAura(SPELL_SCALE_STATS, drake); PreventDefaultAction(); - return; - } - - if (!caster->HasAura(SPELL_SOAR_BUFF)) - caster->CastSpell(caster, SPELL_SOAR_BUFF, true); - - // We handle the health regen here, normal heal regen isn't working.... - if (caster->GetHealth() < caster->GetMaxHealth()) - caster->SetHealth(caster->GetHealth() + (uint32)((double)caster->GetMaxHealth() * 0.2)); + break; } + } - void HandleOnEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* caster = GetCaster(); - - if (!caster) - return; - - if (!caster->HasAura(SPELL_SOAR_BUFF)) - caster->CastSpell(caster, SPELL_SOAR_BUFF, true); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_oculus_soarAuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - OnEffectApply += AuraEffectApplyFn(spell_oculus_soarAuraScript::HandleOnEffectApply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + void HandleOnEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { - return new spell_oculus_soarAuraScript(); + Unit* caster = GetCaster(); + + if (!caster) + return; + + Creature* drake = ObjectAccessor::GetCreature(*caster, _drakeGUID); + + if (drake) + { + drake->RemoveUnitFlag(UNIT_FLAG_POSSESSED); + drake->RemoveAurasDueToSpell(GetId()); + drake->RemoveAurasDueToSpell(SPELL_SOAR_TRIGGER); + drake->RemoveAurasDueToSpell(SPELL_RUBY_EVASIVE_AURA); + } + caster->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); + caster->RemoveAurasDueToSpell(SPELL_DRAKE_FLAG_VISUAL); + } + + void Register() override + { + OnEffectApply += AuraEffectApplyFn(spell_oculus_rider_aura::HandleOnEffectApply, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + OnEffectApply += AuraEffectApplyFn(spell_oculus_rider_aura::HandleOnEffectApply, EFFECT_2, SPELL_AURA_LINKED, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + OnEffectRemove += AuraEffectRemoveFn(spell_oculus_rider_aura::HandleOnEffectRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); } }; -class spell_oculus_rider_aura : public SpellScriptLoader +class spell_oculus_drake_flag_aura : public AuraScript { -public: - spell_oculus_rider_aura() : SpellScriptLoader("spell_oculus_rider_aura") { } + PrepareAuraScript(spell_oculus_drake_flag_aura); - class spell_oculus_rider_auraAuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_oculus_rider_auraAuraScript); + return ValidateSpellInfo({ SPELL_DRAKE_FLAG_VISUAL }); + } - ObjectGuid _drakeGUID; + void HandleOnEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* caster = GetCaster(); - void HandleOnEffectApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + if (!caster) + return; + + Creature* drake = caster->GetVehicleCreatureBase(); + + if (!drake) { - Unit* caster = GetCaster(); - if (!caster) - return; - - Creature* drake = caster->GetVehicleCreatureBase(); - - if (!drake) - return; - - switch (aurEff->GetEffIndex()) - { - case EFFECT_1: - _drakeGUID = drake->GetGUID(); - caster->AddAura(SPELL_DRAKE_FLAG_VISUAL, caster); - caster->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - caster->RemoveAurasByType(SPELL_AURA_MOD_SHAPESHIFT); - drake->CastSpell(drake, SPELL_SOAR_TRIGGER); - if (drake->GetEntry() == NPC_RUBY_DRAKE) - drake->CastSpell(drake, SPELL_RUBY_EVASIVE_AURA); - break; - case EFFECT_2: - caster->AddAura(SPELL_SCALE_STATS, drake); - PreventDefaultAction(); - break; - } - } - - void HandleOnEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* caster = GetCaster(); - - if (!caster) - return; - - Creature* drake = ObjectAccessor::GetCreature(*caster, _drakeGUID); - - if (drake) - { - drake->RemoveUnitFlag(UNIT_FLAG_POSSESSED); - drake->RemoveAurasDueToSpell(GetId()); - drake->RemoveAurasDueToSpell(SPELL_SOAR_TRIGGER); - drake->RemoveAurasDueToSpell(SPELL_RUBY_EVASIVE_AURA); - } caster->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); caster->RemoveAurasDueToSpell(SPELL_DRAKE_FLAG_VISUAL); } - - void Register() override - { - OnEffectApply += AuraEffectApplyFn(spell_oculus_rider_auraAuraScript::HandleOnEffectApply, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - OnEffectApply += AuraEffectApplyFn(spell_oculus_rider_auraAuraScript::HandleOnEffectApply, EFFECT_2, SPELL_AURA_LINKED, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - OnEffectRemove += AuraEffectRemoveFn(spell_oculus_rider_auraAuraScript::HandleOnEffectRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_oculus_rider_auraAuraScript(); } -}; -class spell_oculus_drake_flag : public SpellScriptLoader -{ -public: - spell_oculus_drake_flag() : SpellScriptLoader("spell_oculus_drake_flag") { } - - class spell_oculus_drake_flagAuraScript : public AuraScript + void Register() override { - PrepareAuraScript(spell_oculus_drake_flagAuraScript); - - void HandleOnEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* caster = GetCaster(); - - if (!caster) - return; - - Creature* drake = caster->GetVehicleCreatureBase(); - - if (!drake) - { - caster->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - caster->RemoveAurasDueToSpell(SPELL_DRAKE_FLAG_VISUAL); - } - } - - void Register() override - { - OnEffectApply += AuraEffectApplyFn(spell_oculus_drake_flagAuraScript::HandleOnEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_oculus_drake_flagAuraScript(); + OnEffectApply += AuraEffectApplyFn(spell_oculus_drake_flag_aura::HandleOnEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); } }; @@ -1021,17 +909,17 @@ void AddSC_oculus() new npc_oculus_drake(); new npc_centrifuge_construct(); - new spell_oculus_stop_time(); - new spell_oculus_evasive_maneuvers(); - new spell_oculus_shock_lance(); - new spell_oculus_temporal_rift(); - new spell_oculus_touch_the_nightmare(); - new spell_oculus_dream_funnel(); - new spell_oculus_call_ruby_emerald_amber_drake(); - new spell_oculus_ride_ruby_emerald_amber_drake_que(); - new spell_oculus_evasive_charges(); - new spell_oculus_soar(); - new spell_oculus_rider_aura(); - new spell_oculus_drake_flag(); + RegisterSpellScript(spell_oculus_stop_time_aura); + RegisterSpellScript(spell_oculus_evasive_maneuvers_aura); + RegisterSpellScript(spell_oculus_shock_lance); + RegisterSpellScript(spell_oculus_temporal_rift_aura); + RegisterSpellScript(spell_oculus_touch_the_nightmare); + RegisterSpellScript(spell_oculus_dream_funnel_aura); + RegisterSpellScript(spell_oculus_call_ruby_emerald_amber_drake); + RegisterSpellScript(spell_oculus_ride_ruby_emerald_amber_drake_que_aura); + RegisterSpellScript(spell_oculus_evasive_charges_aura); + RegisterSpellScript(spell_oculus_soar_aura); + RegisterSpellScript(spell_oculus_rider_aura); + RegisterSpellScript(spell_oculus_drake_flag_aura); } diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp index c4b99d783..17b3add83 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/boss_keleseth.cpp @@ -343,32 +343,26 @@ public: }; }; -class spell_frost_tomb : public SpellScriptLoader +class spell_frost_tomb_aura : public AuraScript { -public: - spell_frost_tomb() : SpellScriptLoader("spell_frost_tomb") { } + PrepareAuraScript(spell_frost_tomb_aura); - class spell_frost_tombAuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_frost_tombAuraScript); + return ValidateSpellInfo({ SPELL_FROST_TOMB_SUMMON }); + } - void HandleEffectPeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - if (aurEff->GetTickNumber() == 1) - if( Unit* target = GetTarget() ) - target->CastSpell((Unit*)nullptr, SPELL_FROST_TOMB_SUMMON, true); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_frost_tombAuraScript::HandleEffectPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override + void HandleEffectPeriodic(AuraEffect const* aurEff) { - return new spell_frost_tombAuraScript(); + PreventDefaultAction(); + if (aurEff->GetTickNumber() == 1) + if( Unit* target = GetTarget() ) + target->CastSpell((Unit*)nullptr, SPELL_FROST_TOMB_SUMMON, true); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_frost_tomb_aura::HandleEffectPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY); } }; @@ -377,6 +371,6 @@ void AddSC_boss_keleseth() new boss_keleseth(); new npc_frost_tomb(); new npc_vrykul_skeleton(); - new spell_frost_tomb(); + RegisterSpellScript(spell_frost_tomb_aura); } diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp index 2224becfd..6d755edd0 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp @@ -208,37 +208,26 @@ enum TickingTimeBomb SPELL_TICKING_TIME_BOMB_EXPLODE = 59687 }; -class spell_ticking_time_bomb : public SpellScriptLoader +class spell_ticking_time_bomb_aura : public AuraScript { -public: - spell_ticking_time_bomb() : SpellScriptLoader("spell_ticking_time_bomb") { } + PrepareAuraScript(spell_ticking_time_bomb_aura); - class spell_ticking_time_bomb_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareAuraScript(spell_ticking_time_bomb_AuraScript); + return ValidateSpellInfo({ SPELL_TICKING_TIME_BOMB_EXPLODE }); + } - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_TICKING_TIME_BOMB_EXPLODE }); - } - - void HandleOnEffectRemove(AuraEffect const* /* aurEff */, AuraEffectHandleModes /* mode */) - { - if (GetCaster() == GetTarget()) - { - GetTarget()->CastSpell(GetTarget(), SPELL_TICKING_TIME_BOMB_EXPLODE, true); - } - } - - void Register() override - { - OnEffectRemove += AuraEffectRemoveFn(spell_ticking_time_bomb_AuraScript::HandleOnEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override + void HandleOnEffectRemove(AuraEffect const* /* aurEff */, AuraEffectHandleModes /* mode */) { - return new spell_ticking_time_bomb_AuraScript(); + if (GetCaster() == GetTarget()) + { + GetTarget()->CastSpell(GetTarget(), SPELL_TICKING_TIME_BOMB_EXPLODE, true); + } + } + + void Register() override + { + OnEffectRemove += AuraEffectRemoveFn(spell_ticking_time_bomb_aura::HandleOnEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; @@ -247,6 +236,6 @@ void AddSC_utgarde_keep() new npc_dragonflayer_forge_master(); new npc_enslaved_proto_drake(); - new spell_ticking_time_bomb(); + RegisterSpellScript(spell_ticking_time_bomb_aura); } diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp index 3dc2daa59..9e940ccf8 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardePinnacle/boss_svala.cpp @@ -396,56 +396,40 @@ public: }; }; -class spell_svala_ritual_strike : public SpellScriptLoader +class spell_svala_ritual_strike : public SpellScript { -public: - spell_svala_ritual_strike() : SpellScriptLoader("spell_svala_ritual_strike") { } + PrepareSpellScript(spell_svala_ritual_strike); - class spell_svala_ritual_strike_SpellScript : public SpellScript + void HandleDummyEffect(SpellEffIndex /*effIndex*/) { - PrepareSpellScript(spell_svala_ritual_strike_SpellScript); - - void HandleDummyEffect(SpellEffIndex /*effIndex*/) + if (Unit* unitTarget = GetHitUnit()) { - if (Unit* unitTarget = GetHitUnit()) - { - if (unitTarget->GetTypeId() != TYPEID_UNIT) - return; + if (unitTarget->GetTypeId() != TYPEID_UNIT) + return; - Unit::DealDamage(GetCaster(), unitTarget, 7000, nullptr, DIRECT_DAMAGE); - } + Unit::DealDamage(GetCaster(), unitTarget, 7000, nullptr, DIRECT_DAMAGE); } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_svala_ritual_strike_SpellScript::HandleDummyEffect, EFFECT_2, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_svala_ritual_strike_SpellScript(); } - class spell_svala_ritual_strike_AuraScript : public AuraScript + void Register() override { - PrepareAuraScript(spell_svala_ritual_strike_AuraScript); + OnEffectHitTarget += SpellEffectFn(spell_svala_ritual_strike::HandleDummyEffect, EFFECT_2, SPELL_EFFECT_DUMMY); + } +}; - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) - { - // Set amount based on difficulty - amount = (GetCaster()->GetMap()->IsHeroic() ? 2000 : 1000); - } +class spell_svala_ritual_strike_aura : public AuraScript +{ + PrepareAuraScript(spell_svala_ritual_strike_aura); - void Register() override - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_svala_ritual_strike_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const override + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) { - return new spell_svala_ritual_strike_AuraScript(); + // Set amount based on difficulty + amount = (GetCaster()->GetMap()->IsHeroic() ? 2000 : 1000); + } + + void Register() override + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_svala_ritual_strike_aura::CalculateAmount, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE); } }; @@ -453,6 +437,6 @@ void AddSC_boss_svala() { new boss_svala(); new npc_ritual_channeler(); - new spell_svala_ritual_strike(); + RegisterSpellAndAuraScriptPair(spell_svala_ritual_strike, spell_svala_ritual_strike_aura); } diff --git a/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp b/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp index 3954527a9..39353696d 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp @@ -132,38 +132,27 @@ public: }; }; -class spell_optic_link : public SpellScriptLoader +class spell_optic_link_aura : public AuraScript { -public: - spell_optic_link() : SpellScriptLoader("spell_optic_link") { } + PrepareAuraScript(spell_optic_link_aura); - class spell_optic_linkAuraScript : public AuraScript + void HandleEffectPeriodic(AuraEffect const* aurEff) { - PrepareAuraScript(spell_optic_linkAuraScript) + if (Unit* target = GetTarget()) + if (Unit* caster = GetCaster()) + if (GetAura() && GetAura()->GetEffect(0)) + GetAura()->GetEffect(0)->SetAmount(aurEff->GetSpellInfo()->Effects[EFFECT_0].BasePoints + (((int32)target->GetExactDist(caster)) * 25) + (aurEff->GetTickNumber() * 100)); + } - void HandleEffectPeriodic(AuraEffect const* aurEff) - { - if (Unit* target = GetTarget()) - if (Unit* caster = GetCaster()) - if (GetAura() && GetAura()->GetEffect(0)) - GetAura()->GetEffect(0)->SetAmount(aurEff->GetSpellInfo()->Effects[EFFECT_0].BasePoints + (((int32)target->GetExactDist(caster)) * 25) + (aurEff->GetTickNumber() * 100)); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_optic_linkAuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_optic_linkAuraScript(); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_optic_link_aura::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); } }; void AddSC_boss_moragg() { new boss_moragg(); - new spell_optic_link(); + RegisterSpellScript(spell_optic_link_aura); } diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp index cad20b90a..976ad2be5 100644 --- a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp @@ -1157,32 +1157,21 @@ public: ** DESTROY DOOR SEAL SPELL SCRIPT ***********/ -class spell_destroy_door_seal : public SpellScriptLoader +class spell_destroy_door_seal_aura : public AuraScript { -public: - spell_destroy_door_seal() : SpellScriptLoader("spell_destroy_door_seal") { } + PrepareAuraScript(spell_destroy_door_seal_aura); - class spell_destroy_door_sealAuraScript : public AuraScript + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { - PrepareAuraScript(spell_destroy_door_sealAuraScript) + PreventDefaultAction(); + if (Unit* target = GetTarget()) + if (InstanceScript* pInstance = target->GetInstanceScript()) + pInstance->SetData(DATA_DECRASE_DOOR_HEALTH, 0); + } - void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - if (Unit* target = GetTarget()) - if (InstanceScript* pInstance = target->GetInstanceScript()) - pInstance->SetData(DATA_DECRASE_DOOR_HEALTH, 0); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_destroy_door_sealAuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override + void Register() override { - return new spell_destroy_door_sealAuraScript(); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_destroy_door_seal_aura::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); } }; @@ -1232,6 +1221,6 @@ void AddSC_violet_hold() new npc_azure_raider(); new npc_azure_stalker(); - new spell_destroy_door_seal(); + RegisterSpellScript(spell_destroy_door_seal_aura); RegisterCreatureAI(npc_violet_hold_defense_system); } From a1ce80768518096dab4d59624d5ca6e1b884e6dd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 23 Jun 2024 17:18:11 +0000 Subject: [PATCH 13/20] chore(DB): import pending files Referenced commit(s): cd9dff503258445958922be5643829aa21a8461e --- .../rev_1719137457631116516.sql => db_world/2024_06_23_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1719137457631116516.sql => db_world/2024_06_23_00.sql} (98%) diff --git a/data/sql/updates/pending_db_world/rev_1719137457631116516.sql b/data/sql/updates/db_world/2024_06_23_00.sql similarity index 98% rename from data/sql/updates/pending_db_world/rev_1719137457631116516.sql rename to data/sql/updates/db_world/2024_06_23_00.sql index 28a78991a..90903786c 100644 --- a/data/sql/updates/pending_db_world/rev_1719137457631116516.sql +++ b/data/sql/updates/db_world/2024_06_23_00.sql @@ -1,3 +1,4 @@ +-- DB update 2024_06_22_09 -> 2024_06_23_00 -- UPDATE `spell_script_names` SET `ScriptName`='spell_azjol_nerub_web_wrap_aura' WHERE `spell_id`=52086; UPDATE `spell_script_names` SET `ScriptName`='spell_hadronox_summon_periodic_crypt_fiend_aura' WHERE `spell_id`=53037; From 3d03cb64ba109fd845ca0e96a921d0385765d937 Mon Sep 17 00:00:00 2001 From: sudlud Date: Mon, 24 Jun 2024 10:10:31 +0200 Subject: [PATCH 14/20] =?UTF-8?q?fix(Scripts/Midsummer):=20fix=20handling?= =?UTF-8?q?=20of=20unwanted=20npc=20and=20gameobject=20s=E2=80=A6=20(#1914?= =?UTF-8?q?1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix(Scripts/Midsummer): fix handling of unwanted npc and gameobject spawns - properly spawn bonfire spell focus for city bonfires - properly despawn unwanted creatures and gameobjects which are spawned by linked traps - all midsummer bonfire gameobjects have a linked trap "181290 Midsummer Bonfire Spawn Trap" - the trap is linked to the spell "28784 Summon Midsummer Bonfire Bunnies" which then spawns npc "16592 Midsummer Bonfire", npc "16606 Midsummer Bonfire Despawner" and gameobject "181371 Midsummer Bonfire Spell Focus" i have no idea how this trap is beeing triggered, but it's doing only harm right now --- .../rev_1719166715720224400.sql | 5 ++++ src/server/scripts/Events/midsummer.cpp | 24 +++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1719166715720224400.sql diff --git a/data/sql/updates/pending_db_world/rev_1719166715720224400.sql b/data/sql/updates/pending_db_world/rev_1719166715720224400.sql new file mode 100644 index 000000000..36e55a35f --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1719166715720224400.sql @@ -0,0 +1,5 @@ +-- 16606 'Midsummer Bonfire Despawner' +-- add TRIGGER flag +UPDATE `creature_template` SET `flags_extra` = (`flags_extra` | 128) WHERE (`entry` = 16606); +-- Script +UPDATE `creature_template` SET `ScriptName` = 'npc_midsummer_bonfire_despawner' WHERE (`entry` = 16606); diff --git a/src/server/scripts/Events/midsummer.cpp b/src/server/scripts/Events/midsummer.cpp index 03cf34fb9..ee50e9919 100644 --- a/src/server/scripts/Events/midsummer.cpp +++ b/src/server/scripts/Events/midsummer.cpp @@ -31,6 +31,7 @@ enum eBonfire { + GO_MIDSUMMER_BONFIRE_SPELL_FOCUS = 181371, GO_MIDSUMMER_BONFIRE_CAMPFIRE_SPELL_FOCUS = 181377, GO_AHUNE_BONFIRE = 188073, @@ -182,6 +183,10 @@ struct npc_midsummer_bonfire : public ScriptedAI { npc_midsummer_bonfire(Creature* creature) : ScriptedAI(creature) { + // Midsummer Bonfire Spawn Trap also spawns this NPC (currently unwanted) + if (me->ToTempSummon()) + me->DespawnOrUnsummon(); + _isStampedOut = nullptr; _teamId = TEAM_NEUTRAL; _type = BONFIRE_TYPE_NONE; @@ -300,6 +305,7 @@ struct npc_midsummer_bonfire : public ScriptedAI if ((_bonfire = me->FindNearestGameObject(GoBonfireCity[i], 10.0f))) { _type = BONFIRE_TYPE_CITY; + Ignite(); return true; } } @@ -362,6 +368,23 @@ private: GameObject* _bonfire; }; +struct npc_midsummer_bonfire_despawner : public ScriptedAI +{ + npc_midsummer_bonfire_despawner(Creature* creature) : ScriptedAI(creature) + { + std::list gobjList; + me->GetGameObjectListWithEntryInGrid(gobjList, GO_MIDSUMMER_BONFIRE_SPELL_FOCUS, 10.0f); + for (std::list::const_iterator itr = gobjList.begin(); itr != gobjList.end(); ++itr) + { + // spawnID is 0 for temp spawns + if (0 == (*itr)->GetSpawnId()) + (*itr)->DespawnOrUnsummon(); + } + + me->DespawnOrUnsummon(); + } +}; + enum torchToss { GO_TORCH_TARGET_BRAZIER = 187708, @@ -1265,6 +1288,7 @@ void AddSC_event_midsummer_scripts() // NPCs RegisterCreatureAI(npc_midsummer_bonfire); + RegisterCreatureAI(npc_midsummer_bonfire_despawner); RegisterCreatureAI(npc_midsummer_torch_target); RegisterCreatureAI(npc_midsummer_ribbon_pole_target); From c87ed38011363f4f3d95313fc031cdf2e448096f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 24 Jun 2024 08:11:24 +0000 Subject: [PATCH 15/20] chore(DB): import pending files Referenced commit(s): 3d03cb64ba109fd845ca0e96a921d0385765d937 --- .../rev_1719166715720224400.sql => db_world/2024_06_24_00.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1719166715720224400.sql => db_world/2024_06_24_00.sql} (85%) diff --git a/data/sql/updates/pending_db_world/rev_1719166715720224400.sql b/data/sql/updates/db_world/2024_06_24_00.sql similarity index 85% rename from data/sql/updates/pending_db_world/rev_1719166715720224400.sql rename to data/sql/updates/db_world/2024_06_24_00.sql index 36e55a35f..be6fa54d3 100644 --- a/data/sql/updates/pending_db_world/rev_1719166715720224400.sql +++ b/data/sql/updates/db_world/2024_06_24_00.sql @@ -1,3 +1,4 @@ +-- DB update 2024_06_23_00 -> 2024_06_24_00 -- 16606 'Midsummer Bonfire Despawner' -- add TRIGGER flag UPDATE `creature_template` SET `flags_extra` = (`flags_extra` | 128) WHERE (`entry` = 16606); From 240314efb544521d50040538a03acdc6f0f69f35 Mon Sep 17 00:00:00 2001 From: Kitzunu <24550914+Kitzunu@users.noreply.github.com> Date: Mon, 24 Jun 2024 10:12:02 +0200 Subject: [PATCH 16/20] =?UTF-8?q?fix(Script/ICC):=20Make=20Plagueworks=20R?= =?UTF-8?q?elease=20Valves=20noninteractable=20afte=E2=80=A6=20(#19133)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix(Script/ICC): Make Plagueworks Release Valves noninteractable after use * closes https://github.com/azerothcore/azerothcore-wotlk/issues/19072 --- .../Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp index 427b6987d..165fde334 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/instance_icecrown_citadel.cpp @@ -1877,6 +1877,9 @@ public: case EVENT_FESTERGUT_VALVE_USED: if (!(PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE)) { + if (GameObject* goGas = instance->GetGameObject(GasReleaseValveGUID)) + goGas->SetGameObjectFlag(GO_FLAG_INTERACT_COND | GO_FLAG_NOT_SELECTABLE); + PutricideEventProgress |= PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE; if (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE) { @@ -1894,6 +1897,9 @@ public: case EVENT_ROTFACE_VALVE_USED: if (!(PutricideEventProgress & PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE)) { + if (GameObject* goOoze = instance->GetGameObject(OozeReleaseValveGUID)) + goOoze->SetGameObjectFlag(GO_FLAG_INTERACT_COND | GO_FLAG_NOT_SELECTABLE); + PutricideEventProgress |= PUTRICIDE_EVENT_FLAG_ROTFACE_VALVE; if (PutricideEventProgress & PUTRICIDE_EVENT_FLAG_FESTERGUT_VALVE) { From 4e2d76e16b3f8f83ec309164603027da78ba99f2 Mon Sep 17 00:00:00 2001 From: Jelle Meeus Date: Mon, 24 Jun 2024 10:12:42 +0200 Subject: [PATCH 17/20] refactor(Scripts/Northrend): fixup spell_hadronox_summon_periodic_crypt_fiend_aura (#19142) rename other args fixup https://github.com/azerothcore/azerothcore-wotlk/commit/cd9dff503258445958922be5643829aa21a8461e#commitcomment-143444310 --- .../updates/pending_db_world/rev_1719201621798878998.sql | 3 +++ .../Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1719201621798878998.sql diff --git a/data/sql/updates/pending_db_world/rev_1719201621798878998.sql b/data/sql/updates/pending_db_world/rev_1719201621798878998.sql new file mode 100644 index 000000000..4a44fb83f --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1719201621798878998.sql @@ -0,0 +1,3 @@ +-- +UPDATE `spell_script_names` SET `ScriptName`='spell_hadronox_summon_periodic_champion_aura' WHERE `spell_id`=53035; +UPDATE `spell_script_names` SET `ScriptName`='spell_hadronox_summon_periodic_necromancer_aura' WHERE `spell_id`=53036; diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp index 299b3d66b..41f15d89a 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp @@ -407,9 +407,9 @@ void AddSC_boss_hadronox() { new boss_hadronox(); new npc_anub_ar_crusher(); - RegisterSpellScriptWithArgs(spell_hadronox_summon_periodic_aura, "spell_hadronox_summon_periodic_champion", 15000, SPELL_SUMMON_ANUBAR_CHAMPION); - RegisterSpellScriptWithArgs(spell_hadronox_summon_periodic_aura, "spell_hadronox_summon_periodic_necromancer", 10000, SPELL_SUMMON_ANUBAR_NECROMANCER); - RegisterSpellScriptWithArgs(spell_hadronox_summon_periodic_aura, "spell_hadronox_summon_periodic_crypt_fiend", 5000, SPELL_SUMMON_ANUBAR_CRYPT_FIEND); + RegisterSpellScriptWithArgs(spell_hadronox_summon_periodic_aura, "spell_hadronox_summon_periodic_champion_aura", 15000, SPELL_SUMMON_ANUBAR_CHAMPION); + RegisterSpellScriptWithArgs(spell_hadronox_summon_periodic_aura, "spell_hadronox_summon_periodic_necromancer_aura", 10000, SPELL_SUMMON_ANUBAR_NECROMANCER); + RegisterSpellScriptWithArgs(spell_hadronox_summon_periodic_aura, "spell_hadronox_summon_periodic_crypt_fiend_aura", 5000, SPELL_SUMMON_ANUBAR_CRYPT_FIEND); RegisterSpellScript(spell_hadronox_leech_poison_aura); new achievement_hadronox_denied(); } From 80309c5f2392d21c55a638b1d8f43b1be6d1f974 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 24 Jun 2024 08:12:57 +0000 Subject: [PATCH 18/20] chore(DB): import pending files Referenced commit(s): 240314efb544521d50040538a03acdc6f0f69f35 --- .../rev_1719201621798878998.sql => db_world/2024_06_24_01.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1719201621798878998.sql => db_world/2024_06_24_01.sql} (84%) diff --git a/data/sql/updates/pending_db_world/rev_1719201621798878998.sql b/data/sql/updates/db_world/2024_06_24_01.sql similarity index 84% rename from data/sql/updates/pending_db_world/rev_1719201621798878998.sql rename to data/sql/updates/db_world/2024_06_24_01.sql index 4a44fb83f..9d8e2a677 100644 --- a/data/sql/updates/pending_db_world/rev_1719201621798878998.sql +++ b/data/sql/updates/db_world/2024_06_24_01.sql @@ -1,3 +1,4 @@ +-- DB update 2024_06_24_00 -> 2024_06_24_01 -- UPDATE `spell_script_names` SET `ScriptName`='spell_hadronox_summon_periodic_champion_aura' WHERE `spell_id`=53035; UPDATE `spell_script_names` SET `ScriptName`='spell_hadronox_summon_periodic_necromancer_aura' WHERE `spell_id`=53036; From 81225e4e603fbd39f6b1b9311191b3e131f60e97 Mon Sep 17 00:00:00 2001 From: avarishd <46330494+avarishd@users.noreply.github.com> Date: Mon, 24 Jun 2024 11:27:29 +0300 Subject: [PATCH 19/20] fix(DB/SAI): Torek's Assault not completing for party members (#19143) --- data/sql/updates/pending_db_world/rev_1719204209610400400.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 data/sql/updates/pending_db_world/rev_1719204209610400400.sql diff --git a/data/sql/updates/pending_db_world/rev_1719204209610400400.sql b/data/sql/updates/pending_db_world/rev_1719204209610400400.sql new file mode 100644 index 000000000..7b64b3949 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1719204209610400400.sql @@ -0,0 +1,2 @@ +-- Torek +UPDATE `smart_scripts` SET `target_type` = 16, `comment` = 'Torek - On Quest Accept - Store Party Targetlist' WHERE (`entryorguid` = 12858) AND (`source_type` = 0) AND (`id` = 1); From e264c4141f5fa9e3b29285dfb5be7be721129121 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 24 Jun 2024 08:28:20 +0000 Subject: [PATCH 20/20] chore(DB): import pending files Referenced commit(s): 81225e4e603fbd39f6b1b9311191b3e131f60e97 --- .../rev_1719204209610400400.sql => db_world/2024_06_24_02.sql} | 1 + 1 file changed, 1 insertion(+) rename data/sql/updates/{pending_db_world/rev_1719204209610400400.sql => db_world/2024_06_24_02.sql} (81%) diff --git a/data/sql/updates/pending_db_world/rev_1719204209610400400.sql b/data/sql/updates/db_world/2024_06_24_02.sql similarity index 81% rename from data/sql/updates/pending_db_world/rev_1719204209610400400.sql rename to data/sql/updates/db_world/2024_06_24_02.sql index 7b64b3949..fde60683a 100644 --- a/data/sql/updates/pending_db_world/rev_1719204209610400400.sql +++ b/data/sql/updates/db_world/2024_06_24_02.sql @@ -1,2 +1,3 @@ +-- DB update 2024_06_24_01 -> 2024_06_24_02 -- Torek UPDATE `smart_scripts` SET `target_type` = 16, `comment` = 'Torek - On Quest Accept - Store Party Targetlist' WHERE (`entryorguid` = 12858) AND (`source_type` = 0) AND (`id` = 1);