diff --git a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp index b857b3211fa..3f25aaba4f0 100644 --- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/boss_magtheridon.cpp @@ -117,502 +117,423 @@ enum Misc ACTION_START_CHANNELERS_EVENT = 2 }; -class boss_magtheridon : public CreatureScript +struct boss_magtheridon : public BossAI { - public: + boss_magtheridon(Creature* creature) : BossAI(creature, DATA_MAGTHERIDON), _channelersCount(5) { } - boss_magtheridon() : CreatureScript("boss_magtheridon") { } - - struct boss_magtheridonAI : public BossAI - { - boss_magtheridonAI(Creature* creature) : BossAI(creature, DATA_MAGTHERIDON), _channelersCount(5) { } - - void Reset() override - { - _Reset(); - DoCastSelf(SPELL_SHADOW_CAGE_C); - me->SummonCreatureGroup(SUMMON_GROUP_CHANNELERS); - events.SetPhase(PHASE_BANISH); - _channelersCount = 5; - events.ScheduleEvent(EVENT_TAUNT, Minutes(4), Minutes(5)); - } - - void CombatStart() - { - events.CancelEvent(EVENT_START_FIGHT); - events.CancelEvent(EVENT_NEARLY_EMOTE); - events.ScheduleEvent(EVENT_RELEASED, 6s); - Talk(EMOTE_BREAKS_FREE, me); - Talk(SAY_FREE); - me->RemoveAurasDueToSpell(SPELL_SHADOW_CAGE_C); - } - - void EnterEvadeMode(EvadeReason /*why*/) override - { - summons.DespawnAll(); - events.Reset(); - instance->SetData(DATA_MANTICRON_CUBE, ACTION_DISABLE); - instance->SetData(DATA_COLLAPSE, ACTION_DISABLE); - instance->SetData(DATA_COLLAPSE_2, ACTION_DISABLE); - - _DespawnAtEvade(); - } - - void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override - { - if (summon->GetEntry() == NPC_HELLFIRE_CHANNELLER && events.IsInPhase(PHASE_1)) - { - _channelersCount--; - - if (_channelersCount == 0) - CombatStart(); - } - } - - void DoAction(int32 action) override - { - if (action == ACTION_START_CHANNELERS_EVENT && events.IsInPhase(PHASE_BANISH)) - { - events.SetPhase(PHASE_1); - Talk(EMOTE_WEAKEN, me); - summons.DoZoneInCombat(NPC_HELLFIRE_CHANNELLER); - events.ScheduleEvent(EVENT_START_FIGHT, 2min); - events.ScheduleEvent(EVENT_NEARLY_EMOTE, 1min); - events.CancelEvent(EVENT_TAUNT); - instance->SetBossState(DATA_MAGTHERIDON, IN_PROGRESS); - instance->SetData(DATA_CALL_WARDERS, ACTION_ENABLE); - } - } - - void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override - { - if (spellInfo->Id == SPELL_SHADOW_CAGE) - Talk(SAY_BANISHED); - } - - void DamageTaken(Unit* /*who*/, uint32& damage) override - { - if (me->HealthBelowPctDamaged(30, damage) && !events.IsInPhase(PHASE_3)) - { - events.SetPhase(PHASE_3); - me->SetReactState(REACT_PASSIVE); - me->AttackStop(); - Talk(SAY_COLLAPSE); - instance->SetData(DATA_COLLAPSE, ACTION_ENABLE); - DoCastAOE(SPELL_CAMERA_SHAKE); - events.ScheduleEvent(EVENT_COLLAPSE, 6s); - } - } - - void JustDied(Unit* /*killer*/) override - { - Talk(SAY_DEATH); - _JustDied(); - instance->SetData(DATA_MANTICRON_CUBE, ACTION_DISABLE); - } - - void KilledUnit(Unit* who) override - { - if (who->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_SLAY); - } - - void UpdateAI(uint32 diff) override - { - if (!events.IsInPhase(PHASE_BANISH) && !events.IsInPhase(PHASE_1) && !UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_BERSERK: - DoCastSelf(SPELL_BERSERK); - break; - case EVENT_CLEAVE: - DoCastVictim(SPELL_CLEAVE); - events.Repeat(Seconds(10)); - break; - case EVENT_BLAZE: - DoCastAOE(SPELL_BLAZE_TARGET, { SPELLVALUE_MAX_TARGETS, 1 }); - events.Repeat(Seconds(20)); - break; - case EVENT_QUAKE: - DoCastAOE(SPELL_QUAKE, { SPELLVALUE_MAX_TARGETS, 5 }); - events.Repeat(Seconds(60)); - break; - case EVENT_START_FIGHT: - CombatStart(); - break; - case EVENT_RELEASED: - me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); - me->SetImmuneToPC(false); - DoZoneInCombat(); - events.SetPhase(PHASE_2); - instance->SetData(DATA_MANTICRON_CUBE, ACTION_ENABLE); - events.ScheduleEvent(EVENT_CLEAVE, 10s); - events.ScheduleEvent(EVENT_BLAST_NOVA, 1min); - events.ScheduleEvent(EVENT_BLAZE, 20s); - events.ScheduleEvent(EVENT_QUAKE, 35s); - events.ScheduleEvent(EVENT_BERSERK, 20min); - break; - case EVENT_COLLAPSE: - instance->SetData(DATA_COLLAPSE_2, ACTION_ENABLE); - events.ScheduleEvent(EVENT_DEBRIS_KNOCKDOWN, 4s); - break; - case EVENT_DEBRIS_KNOCKDOWN: - if (Creature* trigger = instance->GetCreature(DATA_WORLD_TRIGGER)) - { - trigger->CastSpell(trigger, SPELL_DEBRIS_KNOCKDOWN, true); - me->SetReactState(REACT_AGGRESSIVE); - events.ScheduleEvent(EVENT_DEBRIS, 20s); - } - break; - case EVENT_DEBRIS: - DoCastAOE(SPELL_DEBRIS_SERVERSIDE); - events.Repeat(Seconds(20)); - break; - case EVENT_NEARLY_EMOTE: - Talk(EMOTE_NEARLY_FREE, me); - break; - case EVENT_BLAST_NOVA: - Talk(EMOTE_BLAST_NOVA, me); - DoCastAOE(SPELL_BLAST_NOVA); - events.Repeat(Seconds(55)); - break; - case EVENT_TAUNT: - Talk(SAY_TAUNT); - events.Repeat(Minutes(4), Minutes(5)); - break; - default: - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - - DoMeleeAttackIfReady(); - } - - private: - uint8 _channelersCount; - - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetMagtheridonsLairAI(creature); - } -}; - -class npc_hellfire_channeler : public CreatureScript -{ - public: - npc_hellfire_channeler() : CreatureScript("npc_hellfire_channeler") { } - - struct npc_hellfire_channelerAI : public ScriptedAI - { - npc_hellfire_channelerAI(Creature* creature) : ScriptedAI(creature), _instance(me->GetInstanceScript()), _canCastDarkMending(true) - { - SetBoundary(_instance->GetBossBoundary(DATA_MAGTHERIDON)); - } - - void Reset() override - { - _events.Reset(); - DoCastSelf(SPELL_SHADOW_GRASP_C); - me->SetReactState(REACT_DEFENSIVE); - } - - void JustEngagedWith(Unit* /*who*/) override - { - me->InterruptNonMeleeSpells(false); - - if (Creature* magtheridon = _instance->GetCreature(DATA_MAGTHERIDON)) - magtheridon->AI()->DoAction(ACTION_START_CHANNELERS_EVENT); - - _events.ScheduleEvent(EVENT_SHADOWBOLT, 20s); - _events.ScheduleEvent(EVENT_CHECK_FRIEND, 1s); - _events.ScheduleEvent(EVENT_ABYSSAL, 30s); - _events.ScheduleEvent(EVENT_FEAR, 15s, 20s); - - } - - void JustDied(Unit* /*killer*/) override - { - DoCastAOE(SPELL_SOUL_TRANSFER); - - // Channelers killed by "Hit Kill" need trigger combat event too. It's needed for Cata+ - if (Creature* magtheridon = _instance->GetCreature(DATA_MAGTHERIDON)) - magtheridon->AI()->DoAction(ACTION_START_CHANNELERS_EVENT); - } - - void JustSummoned(Creature* summon) override - { - if (Creature* magtheridon = _instance->GetCreature(DATA_MAGTHERIDON)) - magtheridon->AI()->JustSummoned(summon); - - DoZoneInCombat(summon); - } - - void EnterEvadeMode(EvadeReason /*why*/) override - { - if (_instance->GetBossState(DATA_MAGTHERIDON) == IN_PROGRESS) - if (Creature* magtheridon = _instance->GetCreature(DATA_MAGTHERIDON)) - magtheridon->AI()->EnterEvadeMode(EVADE_REASON_OTHER); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - _events.Update(diff); - - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_SHADOWBOLT: - DoCastAOE(SPELL_SHADOW_BOLT_VOLLEY); - _events.Repeat(Seconds(15), Seconds(20)); - break; - case EVENT_FEAR: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) - DoCast(target, SPELL_FEAR); - _events.Repeat(Seconds(25), Seconds(40)); - break; - case EVENT_CHECK_FRIEND: - if (_canCastDarkMending) - { - if (Unit* target = DoSelectBelowHpPctFriendlyWithEntry(NPC_HELLFIRE_CHANNELLER, 30.0f, 51, false)) - { - DoCast(target, SPELL_DARK_MENDING); - _canCastDarkMending = false; - _events.ScheduleEvent(EVENT_DARK_MENDING, 10s, 20s); - } - } - _events.Repeat(Seconds(1)); - break; - case EVENT_DARK_MENDING: - _canCastDarkMending = true; - break; - case EVENT_ABYSSAL: - DoCastVictim(SPELL_BURNING_ABYSSAL); - _events.Repeat(Seconds(60)); - break; - default: - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - - DoMeleeAttackIfReady(); - } - - private: - InstanceScript* _instance; - EventMap _events; - bool _canCastDarkMending; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetMagtheridonsLairAI(creature); - } -}; - -class npc_magtheridon_room : public CreatureScript -{ -public: - npc_magtheridon_room() : CreatureScript("npc_magtheridon_room") { } - struct npc_magtheridon_roomAI : public PassiveAI + void Reset() override { - npc_magtheridon_roomAI(Creature* creature) : PassiveAI(creature) { } - - void Reset() override - { - DoCastSelf(SPELL_DEBRIS_VISUAL); - - _scheduler.Schedule(Seconds(5), [this](TaskContext /*context*/) - { - DoCastAOE(SPELL_DEBRIS_DAMAGE); - }); - } - - void UpdateAI(uint32 diff) override - { - _scheduler.Update(diff); - } - - private: - TaskScheduler _scheduler; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetMagtheridonsLairAI(creature); + _Reset(); + DoCastSelf(SPELL_SHADOW_CAGE_C); + me->SummonCreatureGroup(SUMMON_GROUP_CHANNELERS); + events.SetPhase(PHASE_BANISH); + _channelersCount = 5; + events.ScheduleEvent(EVENT_TAUNT, Minutes(4), Minutes(5)); } + + void CombatStart() + { + events.CancelEvent(EVENT_START_FIGHT); + events.CancelEvent(EVENT_NEARLY_EMOTE); + events.ScheduleEvent(EVENT_RELEASED, 6s); + Talk(EMOTE_BREAKS_FREE, me); + Talk(SAY_FREE); + me->RemoveAurasDueToSpell(SPELL_SHADOW_CAGE_C); + } + + void EnterEvadeMode(EvadeReason /*why*/) override + { + summons.DespawnAll(); + events.Reset(); + instance->SetData(DATA_MANTICRON_CUBE, ACTION_DISABLE); + instance->SetData(DATA_COLLAPSE, ACTION_DISABLE); + instance->SetData(DATA_COLLAPSE_2, ACTION_DISABLE); + + _DespawnAtEvade(); + } + + void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override + { + if (summon->GetEntry() == NPC_HELLFIRE_CHANNELLER && events.IsInPhase(PHASE_1)) + { + _channelersCount--; + + if (_channelersCount == 0) + CombatStart(); + } + } + + void DoAction(int32 action) override + { + if (action == ACTION_START_CHANNELERS_EVENT && events.IsInPhase(PHASE_BANISH)) + { + events.SetPhase(PHASE_1); + Talk(EMOTE_WEAKEN, me); + summons.DoZoneInCombat(NPC_HELLFIRE_CHANNELLER); + events.ScheduleEvent(EVENT_START_FIGHT, 2min); + events.ScheduleEvent(EVENT_NEARLY_EMOTE, 1min); + events.CancelEvent(EVENT_TAUNT); + instance->SetBossState(DATA_MAGTHERIDON, IN_PROGRESS); + instance->SetData(DATA_CALL_WARDERS, ACTION_ENABLE); + } + } + + void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override + { + if (spellInfo->Id == SPELL_SHADOW_CAGE) + Talk(SAY_BANISHED); + } + + void DamageTaken(Unit* /*who*/, uint32& damage) override + { + if (me->HealthBelowPctDamaged(30, damage) && !events.IsInPhase(PHASE_3)) + { + events.SetPhase(PHASE_3); + me->SetReactState(REACT_PASSIVE); + me->AttackStop(); + Talk(SAY_COLLAPSE); + instance->SetData(DATA_COLLAPSE, ACTION_ENABLE); + DoCastAOE(SPELL_CAMERA_SHAKE); + events.ScheduleEvent(EVENT_COLLAPSE, 6s); + } + } + + void JustDied(Unit* /*killer*/) override + { + Talk(SAY_DEATH); + _JustDied(); + instance->SetData(DATA_MANTICRON_CUBE, ACTION_DISABLE); + } + + void KilledUnit(Unit* who) override + { + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void UpdateAI(uint32 diff) override + { + if (!events.IsInPhase(PHASE_BANISH) && !events.IsInPhase(PHASE_1) && !UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_BERSERK: + DoCastSelf(SPELL_BERSERK); + break; + case EVENT_CLEAVE: + DoCastVictim(SPELL_CLEAVE); + events.Repeat(Seconds(10)); + break; + case EVENT_BLAZE: + DoCastAOE(SPELL_BLAZE_TARGET, { SPELLVALUE_MAX_TARGETS, 1 }); + events.Repeat(Seconds(20)); + break; + case EVENT_QUAKE: + DoCastAOE(SPELL_QUAKE, { SPELLVALUE_MAX_TARGETS, 5 }); + events.Repeat(Seconds(60)); + break; + case EVENT_START_FIGHT: + CombatStart(); + break; + case EVENT_RELEASED: + me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); + me->SetImmuneToPC(false); + DoZoneInCombat(); + events.SetPhase(PHASE_2); + instance->SetData(DATA_MANTICRON_CUBE, ACTION_ENABLE); + events.ScheduleEvent(EVENT_CLEAVE, 10s); + events.ScheduleEvent(EVENT_BLAST_NOVA, 1min); + events.ScheduleEvent(EVENT_BLAZE, 20s); + events.ScheduleEvent(EVENT_QUAKE, 35s); + events.ScheduleEvent(EVENT_BERSERK, 20min); + break; + case EVENT_COLLAPSE: + instance->SetData(DATA_COLLAPSE_2, ACTION_ENABLE); + events.ScheduleEvent(EVENT_DEBRIS_KNOCKDOWN, 4s); + break; + case EVENT_DEBRIS_KNOCKDOWN: + if (Creature* trigger = instance->GetCreature(DATA_WORLD_TRIGGER)) + { + trigger->CastSpell(trigger, SPELL_DEBRIS_KNOCKDOWN, true); + me->SetReactState(REACT_AGGRESSIVE); + events.ScheduleEvent(EVENT_DEBRIS, 20s); + } + break; + case EVENT_DEBRIS: + DoCastAOE(SPELL_DEBRIS_SERVERSIDE); + events.Repeat(Seconds(20)); + break; + case EVENT_NEARLY_EMOTE: + Talk(EMOTE_NEARLY_FREE, me); + break; + case EVENT_BLAST_NOVA: + Talk(EMOTE_BLAST_NOVA, me); + DoCastAOE(SPELL_BLAST_NOVA); + events.Repeat(Seconds(55)); + break; + case EVENT_TAUNT: + Talk(SAY_TAUNT); + events.Repeat(Minutes(4), Minutes(5)); + break; + default: + break; + } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } + + DoMeleeAttackIfReady(); + } + +private: + uint8 _channelersCount; }; -class go_manticron_cube : public GameObjectScript +struct npc_hellfire_channeler : public ScriptedAI { -public: - go_manticron_cube() : GameObjectScript("go_manticron_cube") { } - - struct go_manticron_cubeAI : public GameObjectAI + npc_hellfire_channeler(Creature* creature) : ScriptedAI(creature), _instance(me->GetInstanceScript()), _canCastDarkMending(true) { - go_manticron_cubeAI(GameObject* go) : GameObjectAI(go) { } + SetBoundary(_instance->GetBossBoundary(DATA_MAGTHERIDON)); + } - bool OnGossipHello(Player* player) override + void Reset() override + { + _events.Reset(); + DoCastSelf(SPELL_SHADOW_GRASP_C); + me->SetReactState(REACT_DEFENSIVE); + } + + void JustEngagedWith(Unit* /*who*/) override + { + me->InterruptNonMeleeSpells(false); + + if (Creature* magtheridon = _instance->GetCreature(DATA_MAGTHERIDON)) + magtheridon->AI()->DoAction(ACTION_START_CHANNELERS_EVENT); + + _events.ScheduleEvent(EVENT_SHADOWBOLT, 20s); + _events.ScheduleEvent(EVENT_CHECK_FRIEND, 1s); + _events.ScheduleEvent(EVENT_ABYSSAL, 30s); + _events.ScheduleEvent(EVENT_FEAR, 15s, 20s); + + } + + void JustDied(Unit* /*killer*/) override + { + DoCastAOE(SPELL_SOUL_TRANSFER); + + // Channelers killed by "Hit Kill" need trigger combat event too. It's needed for Cata+ + if (Creature* magtheridon = _instance->GetCreature(DATA_MAGTHERIDON)) + magtheridon->AI()->DoAction(ACTION_START_CHANNELERS_EVENT); + } + + void JustSummoned(Creature* summon) override + { + if (Creature* magtheridon = _instance->GetCreature(DATA_MAGTHERIDON)) + magtheridon->AI()->JustSummoned(summon); + + DoZoneInCombat(summon); + } + + void EnterEvadeMode(EvadeReason /*why*/) override + { + if (_instance->GetBossState(DATA_MAGTHERIDON) == IN_PROGRESS) + if (Creature* magtheridon = _instance->GetCreature(DATA_MAGTHERIDON)) + magtheridon->AI()->EnterEvadeMode(EVADE_REASON_OTHER); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + _events.Update(diff); + + while (uint32 eventId = _events.ExecuteEvent()) { - if (player->HasAura(SPELL_MIND_EXHAUSTION) || player->HasAura(SPELL_SHADOW_GRASP)) - return true; + switch (eventId) + { + case EVENT_SHADOWBOLT: + DoCastAOE(SPELL_SHADOW_BOLT_VOLLEY); + _events.Repeat(Seconds(15), Seconds(20)); + break; + case EVENT_FEAR: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) + DoCast(target, SPELL_FEAR); + _events.Repeat(Seconds(25), Seconds(40)); + break; + case EVENT_CHECK_FRIEND: + if (_canCastDarkMending) + { + if (Unit* target = DoSelectBelowHpPctFriendlyWithEntry(NPC_HELLFIRE_CHANNELLER, 30.0f, 51, false)) + { + DoCast(target, SPELL_DARK_MENDING); + _canCastDarkMending = false; + _events.ScheduleEvent(EVENT_DARK_MENDING, 10s, 20s); + } + } + _events.Repeat(Seconds(1)); + break; + case EVENT_DARK_MENDING: + _canCastDarkMending = true; + break; + case EVENT_ABYSSAL: + DoCastVictim(SPELL_BURNING_ABYSSAL); + _events.Repeat(Seconds(60)); + break; + default: + break; + } - if (Creature* trigger = player->FindNearestCreature(NPC_HELFIRE_RAID_TRIGGER, 10.0f)) - trigger->CastSpell(nullptr, SPELL_SHADOW_GRASP_VISUAL); - - player->CastSpell(nullptr, SPELL_SHADOW_GRASP, true); - return true; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } - }; - GameObjectAI* GetAI(GameObject* go) const override + DoMeleeAttackIfReady(); + } + +private: + InstanceScript* _instance; + EventMap _events; + bool _canCastDarkMending; +}; + +struct npc_magtheridon_room : public PassiveAI +{ + npc_magtheridon_room(Creature* creature) : PassiveAI(creature) { } + + void Reset() override { - return GetMagtheridonsLairAI(go); + DoCastSelf(SPELL_DEBRIS_VISUAL); + + _scheduler.Schedule(Seconds(5), [this](TaskContext /*context*/) + { + DoCastAOE(SPELL_DEBRIS_DAMAGE); + }); + } + + void UpdateAI(uint32 diff) override + { + _scheduler.Update(diff); + } + +private: + TaskScheduler _scheduler; +}; + +struct go_manticron_cube : public GameObjectAI +{ + go_manticron_cube(GameObject* go) : GameObjectAI(go) { } + + bool OnGossipHello(Player* player) override + { + if (player->HasAura(SPELL_MIND_EXHAUSTION) || player->HasAura(SPELL_SHADOW_GRASP)) + return true; + + if (Creature* trigger = player->FindNearestCreature(NPC_HELFIRE_RAID_TRIGGER, 10.0f)) + trigger->CastSpell(nullptr, SPELL_SHADOW_GRASP_VISUAL); + + player->CastSpell(nullptr, SPELL_SHADOW_GRASP, true); + return true; } }; // 30541 - Blaze -class spell_magtheridon_blaze_target : public SpellScriptLoader +class spell_magtheridon_blaze_target : public SpellScript { - public: - spell_magtheridon_blaze_target() : SpellScriptLoader("spell_magtheridon_blaze_target") { } + PrepareSpellScript(spell_magtheridon_blaze_target); - class spell_magtheridon_blaze_target_SpellScript : public SpellScript - { - PrepareSpellScript(spell_magtheridon_blaze_target_SpellScript); + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_BLAZE }); + } - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_BLAZE }); - } + void HandleAura() + { + GetHitUnit()->CastSpell(GetHitUnit(), SPELL_BLAZE); + } - void HandleAura() - { - GetHitUnit()->CastSpell(GetHitUnit(), SPELL_BLAZE); - } - - void Register() override - { - OnHit += SpellHitFn(spell_magtheridon_blaze_target_SpellScript::HandleAura); - } - - }; - - SpellScript* GetSpellScript() const override - { - return new spell_magtheridon_blaze_target_SpellScript(); - } + void Register() override + { + OnHit += SpellHitFn(spell_magtheridon_blaze_target::HandleAura); + } }; // 30410 - Shadow Grasp -class spell_magtheridon_shadow_grasp : public SpellScriptLoader +class spell_magtheridon_shadow_grasp : public AuraScript { - public: - spell_magtheridon_shadow_grasp() : SpellScriptLoader("spell_magtheridon_shadow_grasp") { } + PrepareAuraScript(spell_magtheridon_shadow_grasp); - class spell_magtheridon_shadow_grasp_AuraScript : public AuraScript - { - PrepareAuraScript(spell_magtheridon_shadow_grasp_AuraScript); + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_MIND_EXHAUSTION }); + } - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_MIND_EXHAUSTION }); - } + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->InterruptNonMeleeSpells(false); + if (Unit* caster = GetCaster()) + caster->CastSpell(caster, SPELL_MIND_EXHAUSTION, true); + } - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->InterruptNonMeleeSpells(false); - if (Unit* caster = GetCaster()) - caster->CastSpell(caster, SPELL_MIND_EXHAUSTION, true); - } - - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_magtheridon_shadow_grasp_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_magtheridon_shadow_grasp_AuraScript(); - } + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_magtheridon_shadow_grasp::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } }; // 30166 - Shadow Grasp (Visual Effect) -class spell_magtheridon_shadow_grasp_visual : public SpellScriptLoader +class spell_magtheridon_shadow_grasp_visual : public AuraScript { - public: - spell_magtheridon_shadow_grasp_visual() : SpellScriptLoader("spell_magtheridon_shadow_grasp_visual") { } + PrepareAuraScript(spell_magtheridon_shadow_grasp_visual); - class spell_magtheridon_shadow_grasp_visual_AuraScript : public AuraScript + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo( { - PrepareAuraScript(spell_magtheridon_shadow_grasp_visual_AuraScript); + SPELL_SHADOW_CAGE, + SPELL_SHADOW_GRASP_VISUAL + }); + } - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo( - { - SPELL_SHADOW_CAGE, - SPELL_SHADOW_GRASP_VISUAL - }); - } + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); - void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); + if (target->GetAuraCount(SPELL_SHADOW_GRASP_VISUAL) == 5) + target->CastSpell(target, SPELL_SHADOW_CAGE, true); + } - if (target->GetAuraCount(SPELL_SHADOW_GRASP_VISUAL) == 5) - target->CastSpell(target, SPELL_SHADOW_CAGE, true); - } + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveAurasDueToSpell(SPELL_SHADOW_CAGE); + } - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - GetTarget()->RemoveAurasDueToSpell(SPELL_SHADOW_CAGE); - } - - void Register() override - { - AfterEffectApply += AuraEffectApplyFn(spell_magtheridon_shadow_grasp_visual_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - AfterEffectRemove += AuraEffectRemoveFn(spell_magtheridon_shadow_grasp_visual_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_magtheridon_shadow_grasp_visual_AuraScript(); - } + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_magtheridon_shadow_grasp_visual::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_magtheridon_shadow_grasp_visual::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } }; void AddSC_boss_magtheridon() { - new boss_magtheridon(); - new npc_hellfire_channeler(); - new npc_magtheridon_room(); - new go_manticron_cube(); - new spell_magtheridon_blaze_target(); - new spell_magtheridon_shadow_grasp(); - new spell_magtheridon_shadow_grasp_visual(); + RegisterMagtheridonsLairCreatureAI(boss_magtheridon); + RegisterMagtheridonsLairCreatureAI(npc_hellfire_channeler); + RegisterMagtheridonsLairCreatureAI(npc_magtheridon_room); + RegisterMagtheridonsLairGameObjectAI(go_manticron_cube); + RegisterSpellScript(spell_magtheridon_blaze_target); + RegisterSpellScript(spell_magtheridon_shadow_grasp); + RegisterSpellScript(spell_magtheridon_shadow_grasp_visual); } diff --git a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/magtheridons_lair.h b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/magtheridons_lair.h index cd0b441fada..3e90f04825b 100644 --- a/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/magtheridons_lair.h +++ b/src/server/scripts/Outland/HellfireCitadel/MagtheridonsLair/magtheridons_lair.h @@ -80,4 +80,7 @@ inline AI* GetMagtheridonsLairAI(T* obj) return GetInstanceAI(obj, MLScriptName); } +#define RegisterMagtheridonsLairCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetMagtheridonsLairAI) +#define RegisterMagtheridonsLairGameObjectAI(ai_name) RegisterGameObjectAIWithFactory(ai_name, GetMagtheridonsLairAI) + #endif