diff options
Diffstat (limited to 'src')
5 files changed, 322 insertions, 388 deletions
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp index a773629a296..dfbdbf03349 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_baron_geddon.cpp @@ -49,115 +49,93 @@ enum Events EVENT_LIVING_BOMB = 3, }; -class boss_baron_geddon : public CreatureScript +struct boss_baron_geddon : public BossAI { - public: - boss_baron_geddon() : CreatureScript("boss_baron_geddon") { } - - struct boss_baron_geddonAI : public BossAI + boss_baron_geddon(Creature* creature) : BossAI(creature, BOSS_BARON_GEDDON) + { + } + + void JustEngagedWith(Unit* victim) override + { + BossAI::JustEngagedWith(victim); + events.ScheduleEvent(EVENT_INFERNO, 45s); + events.ScheduleEvent(EVENT_IGNITE_MANA, 30s); + events.ScheduleEvent(EVENT_LIVING_BOMB, 35s); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + // If we are <2% hp cast Armageddon + if (!HealthAbovePct(2)) { - boss_baron_geddonAI(Creature* creature) : BossAI(creature, BOSS_BARON_GEDDON) - { - } + me->InterruptNonMeleeSpells(true); + DoCast(me, SPELL_ARMAGEDDON); + Talk(EMOTE_SERVICE); + return; + } - void JustEngagedWith(Unit* victim) override - { - BossAI::JustEngagedWith(victim); - events.ScheduleEvent(EVENT_INFERNO, 45s); - events.ScheduleEvent(EVENT_IGNITE_MANA, 30s); - events.ScheduleEvent(EVENT_LIVING_BOMB, 35s); - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - void UpdateAI(uint32 diff) override + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - if (!UpdateVictim()) - return; - - events.Update(diff); - - // If we are <2% hp cast Armageddon - if (!HealthAbovePct(2)) - { - me->InterruptNonMeleeSpells(true); - DoCast(me, SPELL_ARMAGEDDON); - Talk(EMOTE_SERVICE); - return; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_INFERNO: - DoCast(me, SPELL_INFERNO); - events.ScheduleEvent(EVENT_INFERNO, 45s); - break; - case EVENT_IGNITE_MANA: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true, -SPELL_IGNITE_MANA)) - DoCast(target, SPELL_IGNITE_MANA); - events.ScheduleEvent(EVENT_IGNITE_MANA, 30s); - break; - case EVENT_LIVING_BOMB: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true)) - DoCast(target, SPELL_LIVING_BOMB); - events.ScheduleEvent(EVENT_LIVING_BOMB, 35s); - break; - default: - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - - DoMeleeAttackIfReady(); + case EVENT_INFERNO: + DoCast(me, SPELL_INFERNO); + events.ScheduleEvent(EVENT_INFERNO, 45s); + break; + case EVENT_IGNITE_MANA: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true, -SPELL_IGNITE_MANA)) + DoCast(target, SPELL_IGNITE_MANA); + events.ScheduleEvent(EVENT_IGNITE_MANA, 30s); + break; + case EVENT_LIVING_BOMB: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true)) + DoCast(target, SPELL_LIVING_BOMB); + events.ScheduleEvent(EVENT_LIVING_BOMB, 35s); + break; + default: + break; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetMoltenCoreAI<boss_baron_geddonAI>(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } + + DoMeleeAttackIfReady(); + } }; // 19695 - Inferno -class spell_baron_geddon_inferno : public SpellScriptLoader +class spell_baron_geddon_inferno : public AuraScript { - public: - spell_baron_geddon_inferno() : SpellScriptLoader("spell_baron_geddon_inferno") { } - - class spell_baron_geddon_inferno_AuraScript : public AuraScript - { - PrepareAuraScript(spell_baron_geddon_inferno_AuraScript); - - void OnPeriodic(AuraEffect const* aurEff) - { - PreventDefaultAction(); - int32 const damageForTick[8] = { 500, 500, 1000, 1000, 2000, 2000, 3000, 5000 }; - CastSpellExtraArgs args; - args.TriggerFlags = TRIGGERED_FULL_MASK; - args.TriggeringAura = aurEff; - args.AddSpellMod(SPELLVALUE_BASE_POINT0, damageForTick[aurEff->GetTickNumber() - 1]); - GetTarget()->CastSpell(nullptr, SPELL_INFERNO_DMG, args); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_baron_geddon_inferno_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_baron_geddon_inferno_AuraScript(); - } + PrepareAuraScript(spell_baron_geddon_inferno); + + void OnPeriodic(AuraEffect const* aurEff) + { + PreventDefaultAction(); + static const int32 damageForTick[8] = { 500, 500, 1000, 1000, 2000, 2000, 3000, 5000 }; + CastSpellExtraArgs args; + args.TriggerFlags = TRIGGERED_FULL_MASK; + args.TriggeringAura = aurEff; + args.AddSpellMod(SPELLVALUE_BASE_POINT0, damageForTick[aurEff->GetTickNumber() - 1]); + GetTarget()->CastSpell(nullptr, SPELL_INFERNO_DMG, args); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_baron_geddon_inferno::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } }; void AddSC_boss_baron_geddon() { - new boss_baron_geddon(); - new spell_baron_geddon_inferno(); + RegisterMoltenCoreCreatureAI(boss_baron_geddon); + RegisterSpellScript(spell_baron_geddon_inferno); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp index 07c9f7c029f..f55df0eb24e 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_gehennas.cpp @@ -40,72 +40,61 @@ enum Events EVENT_SHADOW_BOLT = 3, }; -class boss_gehennas : public CreatureScript +struct boss_gehennas : public BossAI { - public: - boss_gehennas() : CreatureScript("boss_gehennas") { } + boss_gehennas(Creature* creature) : BossAI(creature, BOSS_GEHENNAS) + { + } - struct boss_gehennasAI : public BossAI - { - boss_gehennasAI(Creature* creature) : BossAI(creature, BOSS_GEHENNAS) - { - } + void JustEngagedWith(Unit* victim) override + { + BossAI::JustEngagedWith(victim); + events.ScheduleEvent(EVENT_GEHENNAS_CURSE, 12s); + events.ScheduleEvent(EVENT_RAIN_OF_FIRE, 10s); + events.ScheduleEvent(EVENT_SHADOW_BOLT, 6s); + } - void JustEngagedWith(Unit* victim) override - { - BossAI::JustEngagedWith(victim); - events.ScheduleEvent(EVENT_GEHENNAS_CURSE, 12s); - events.ScheduleEvent(EVENT_RAIN_OF_FIRE, 10s); - events.ScheduleEvent(EVENT_SHADOW_BOLT, 6s); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - events.Update(diff); + events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_GEHENNAS_CURSE: - DoCastVictim(SPELL_GEHENNAS_CURSE); - events.ScheduleEvent(EVENT_GEHENNAS_CURSE, 22s, 30s); - break; - case EVENT_RAIN_OF_FIRE: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - DoCast(target, SPELL_RAIN_OF_FIRE); - events.ScheduleEvent(EVENT_RAIN_OF_FIRE, 4s, 12s); - break; - case EVENT_SHADOW_BOLT: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) - DoCast(target, SPELL_SHADOW_BOLT); - events.ScheduleEvent(EVENT_SHADOW_BOLT, 7s); - break; - default: - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - - DoMeleeAttackIfReady(); + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_GEHENNAS_CURSE: + DoCastVictim(SPELL_GEHENNAS_CURSE); + events.ScheduleEvent(EVENT_GEHENNAS_CURSE, 22s, 30s); + break; + case EVENT_RAIN_OF_FIRE: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + DoCast(target, SPELL_RAIN_OF_FIRE); + events.ScheduleEvent(EVENT_RAIN_OF_FIRE, 4s, 12s); + break; + case EVENT_SHADOW_BOLT: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) + DoCast(target, SPELL_SHADOW_BOLT); + events.ScheduleEvent(EVENT_SHADOW_BOLT, 7s); + break; + default: + break; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetMoltenCoreAI<boss_gehennasAI>(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } + + DoMeleeAttackIfReady(); + } }; void AddSC_boss_gehennas() { - new boss_gehennas(); + RegisterMoltenCoreCreatureAI(boss_gehennas); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp index c87c5ed0e35..f1a3699db70 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_lucifron.cpp @@ -40,70 +40,59 @@ enum Events EVENT_SHADOW_SHOCK = 3, }; -class boss_lucifron : public CreatureScript +struct boss_lucifron : public BossAI { - public: - boss_lucifron() : CreatureScript("boss_lucifron") { } + boss_lucifron(Creature* creature) : BossAI(creature, BOSS_LUCIFRON) + { + } - struct boss_lucifronAI : public BossAI - { - boss_lucifronAI(Creature* creature) : BossAI(creature, BOSS_LUCIFRON) - { - } + void JustEngagedWith(Unit* victim) override + { + BossAI::JustEngagedWith(victim); + events.ScheduleEvent(EVENT_IMPENDING_DOOM, 10s); + events.ScheduleEvent(EVENT_LUCIFRON_CURSE, 20s); + events.ScheduleEvent(EVENT_SHADOW_SHOCK, 6s); + } - void JustEngagedWith(Unit* victim) override - { - BossAI::JustEngagedWith(victim); - events.ScheduleEvent(EVENT_IMPENDING_DOOM, 10s); - events.ScheduleEvent(EVENT_LUCIFRON_CURSE, 20s); - events.ScheduleEvent(EVENT_SHADOW_SHOCK, 6s); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - events.Update(diff); + events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_IMPENDING_DOOM: - DoCastVictim(SPELL_IMPENDING_DOOM); - events.ScheduleEvent(EVENT_IMPENDING_DOOM, 20s); - break; - case EVENT_LUCIFRON_CURSE: - DoCastVictim(SPELL_LUCIFRON_CURSE); - events.ScheduleEvent(EVENT_LUCIFRON_CURSE, 15s); - break; - case EVENT_SHADOW_SHOCK: - DoCastVictim(SPELL_SHADOW_SHOCK); - events.ScheduleEvent(EVENT_SHADOW_SHOCK, 6s); - break; - default: - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - - DoMeleeAttackIfReady(); + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_IMPENDING_DOOM: + DoCastVictim(SPELL_IMPENDING_DOOM); + events.ScheduleEvent(EVENT_IMPENDING_DOOM, 20s); + break; + case EVENT_LUCIFRON_CURSE: + DoCastVictim(SPELL_LUCIFRON_CURSE); + events.ScheduleEvent(EVENT_LUCIFRON_CURSE, 15s); + break; + case EVENT_SHADOW_SHOCK: + DoCastVictim(SPELL_SHADOW_SHOCK); + events.ScheduleEvent(EVENT_SHADOW_SHOCK, 6s); + break; + default: + break; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetMoltenCoreAI<boss_lucifronAI>(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } + + DoMeleeAttackIfReady(); + } }; void AddSC_boss_lucifron() { - new boss_lucifron(); + RegisterMoltenCoreCreatureAI(boss_lucifron); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp index 9ed03658119..9d6a0bab5be 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp @@ -46,78 +46,67 @@ enum Events EVENT_LAVA_BOMB = 3, }; -class boss_magmadar : public CreatureScript +struct boss_magmadar : public BossAI { - public: - boss_magmadar() : CreatureScript("boss_magmadar") { } - - struct boss_magmadarAI : public BossAI + boss_magmadar(Creature* creature) : BossAI(creature, BOSS_MAGMADAR) + { + } + + void Reset() override + { + BossAI::Reset(); + DoCast(me, SPELL_MAGMA_SPIT, true); + } + + void JustEngagedWith(Unit* victim) override + { + BossAI::JustEngagedWith(victim); + events.ScheduleEvent(EVENT_FRENZY, 30s); + events.ScheduleEvent(EVENT_PANIC, 20s); + events.ScheduleEvent(EVENT_LAVA_BOMB, 12s); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) { - boss_magmadarAI(Creature* creature) : BossAI(creature, BOSS_MAGMADAR) + switch (eventId) { + case EVENT_FRENZY: + Talk(EMOTE_FRENZY); + DoCast(me, SPELL_FRENZY); + events.ScheduleEvent(EVENT_FRENZY, 15s); + break; + case EVENT_PANIC: + DoCastVictim(SPELL_PANIC); + events.ScheduleEvent(EVENT_PANIC, 35s); + break; + case EVENT_LAVA_BOMB: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true, -SPELL_LAVA_BOMB)) + DoCast(target, SPELL_LAVA_BOMB); + events.ScheduleEvent(EVENT_LAVA_BOMB, 12s); + break; + default: + break; } - void Reset() override - { - BossAI::Reset(); - DoCast(me, SPELL_MAGMA_SPIT, true); - } - - void JustEngagedWith(Unit* victim) override - { - BossAI::JustEngagedWith(victim); - events.ScheduleEvent(EVENT_FRENZY, 30s); - events.ScheduleEvent(EVENT_PANIC, 20s); - events.ScheduleEvent(EVENT_LAVA_BOMB, 12s); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_FRENZY: - Talk(EMOTE_FRENZY); - DoCast(me, SPELL_FRENZY); - events.ScheduleEvent(EVENT_FRENZY, 15s); - break; - case EVENT_PANIC: - DoCastVictim(SPELL_PANIC); - events.ScheduleEvent(EVENT_PANIC, 35s); - break; - case EVENT_LAVA_BOMB: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true, true, -SPELL_LAVA_BOMB)) - DoCast(target, SPELL_LAVA_BOMB); - events.ScheduleEvent(EVENT_LAVA_BOMB, 12s); - break; - default: - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - - DoMeleeAttackIfReady(); - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetMoltenCoreAI<boss_magmadarAI>(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } + + DoMeleeAttackIfReady(); + } }; void AddSC_boss_magmadar() { - new boss_magmadar(); + RegisterMoltenCoreCreatureAI(boss_magmadar); } diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp index 2d43e9ddb3f..48932371a19 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_majordomo_executus.cpp @@ -70,149 +70,138 @@ enum Events EVENT_OUTRO_3 = 7 }; -class boss_majordomo : public CreatureScript +struct boss_majordomo : public BossAI { - public: - boss_majordomo() : CreatureScript("boss_majordomo") { } - - struct boss_majordomoAI : public BossAI + boss_majordomo(Creature* creature) : BossAI(creature, BOSS_MAJORDOMO_EXECUTUS) + { + } + + void KilledUnit(Unit* /*victim*/) override + { + if (urand(0, 99) < 25) + Talk(SAY_SLAY); + } + + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + Talk(SAY_AGGRO); + events.ScheduleEvent(EVENT_MAGIC_REFLECTION, 30s); + events.ScheduleEvent(EVENT_DAMAGE_REFLECTION, 15s); + events.ScheduleEvent(EVENT_BLAST_WAVE, 10s); + events.ScheduleEvent(EVENT_TELEPORT, 20s); + } + + void UpdateAI(uint32 diff) override + { + if (instance->GetBossState(BOSS_MAJORDOMO_EXECUTUS) != DONE) { - boss_majordomoAI(Creature* creature) : BossAI(creature, BOSS_MAJORDOMO_EXECUTUS) - { - } + if (!UpdateVictim()) + return; - void KilledUnit(Unit* /*victim*/) override - { - if (urand(0, 99) < 25) - Talk(SAY_SLAY); - } + events.Update(diff); - void JustEngagedWith(Unit* who) override + if (!me->FindNearestCreature(NPC_FLAMEWAKER_HEALER, 100.0f) && !me->FindNearestCreature(NPC_FLAMEWAKER_ELITE, 100.0f)) { - BossAI::JustEngagedWith(who); - Talk(SAY_AGGRO); - events.ScheduleEvent(EVENT_MAGIC_REFLECTION, 30s); - events.ScheduleEvent(EVENT_DAMAGE_REFLECTION, 15s); - events.ScheduleEvent(EVENT_BLAST_WAVE, 10s); - events.ScheduleEvent(EVENT_TELEPORT, 20s); + instance->UpdateEncounterStateForKilledCreature(me->GetEntry(), me); + me->SetFaction(FACTION_FRIENDLY); + EnterEvadeMode(); + Talk(SAY_DEFEAT); + _JustDied(); + events.ScheduleEvent(EVENT_OUTRO_1, 32s); + return; } - void UpdateAI(uint32 diff) override - { - if (instance->GetBossState(BOSS_MAJORDOMO_EXECUTUS) != DONE) - { - if (!UpdateVictim()) - return; - - events.Update(diff); - - if (!me->FindNearestCreature(NPC_FLAMEWAKER_HEALER, 100.0f) && !me->FindNearestCreature(NPC_FLAMEWAKER_ELITE, 100.0f)) - { - instance->UpdateEncounterStateForKilledCreature(me->GetEntry(), me); - me->SetFaction(FACTION_FRIENDLY); - EnterEvadeMode(); - Talk(SAY_DEFEAT); - _JustDied(); - events.ScheduleEvent(EVENT_OUTRO_1, 32s); - return; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - if (HealthBelowPct(50)) - DoCast(me, SPELL_AEGIS_OF_RAGNAROS, true); - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_MAGIC_REFLECTION: - DoCast(me, SPELL_MAGIC_REFLECTION); - events.ScheduleEvent(EVENT_MAGIC_REFLECTION, 30s); - break; - case EVENT_DAMAGE_REFLECTION: - DoCast(me, SPELL_DAMAGE_REFLECTION); - events.ScheduleEvent(EVENT_DAMAGE_REFLECTION, 30s); - break; - case EVENT_BLAST_WAVE: - DoCastVictim(SPELL_BLAST_WAVE); - events.ScheduleEvent(EVENT_BLAST_WAVE, 10s); - break; - case EVENT_TELEPORT: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) - DoCast(target, SPELL_TELEPORT); - events.ScheduleEvent(EVENT_TELEPORT, 20s); - break; - default: - break; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - - DoMeleeAttackIfReady(); - } - else - { - events.Update(diff); - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_OUTRO_1: - me->NearTeleportTo(RagnarosTelePos.GetPositionX(), RagnarosTelePos.GetPositionY(), RagnarosTelePos.GetPositionZ(), RagnarosTelePos.GetOrientation()); - me->AddNpcFlag(UNIT_NPC_FLAG_GOSSIP); - break; - case EVENT_OUTRO_2: - instance->instance->SummonCreature(NPC_RAGNAROS, RagnarosSummonPos); - break; - case EVENT_OUTRO_3: - Talk(SAY_ARRIVAL2_MAJ); - break; - default: - break; - } - } - } - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + if (HealthBelowPct(50)) + DoCast(me, SPELL_AEGIS_OF_RAGNAROS, true); - void DoAction(int32 action) override + while (uint32 eventId = events.ExecuteEvent()) { - if (action == ACTION_START_RAGNAROS) + switch (eventId) { - me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); - Talk(SAY_SUMMON_MAJ); - events.ScheduleEvent(EVENT_OUTRO_2, 8s); - events.ScheduleEvent(EVENT_OUTRO_3, 24s); - } - else if (action == ACTION_START_RAGNAROS_ALT) - { - me->SetFaction(FACTION_FRIENDLY); - me->AddNpcFlag(UNIT_NPC_FLAG_GOSSIP); + case EVENT_MAGIC_REFLECTION: + DoCast(me, SPELL_MAGIC_REFLECTION); + events.ScheduleEvent(EVENT_MAGIC_REFLECTION, 30s); + break; + case EVENT_DAMAGE_REFLECTION: + DoCast(me, SPELL_DAMAGE_REFLECTION); + events.ScheduleEvent(EVENT_DAMAGE_REFLECTION, 30s); + break; + case EVENT_BLAST_WAVE: + DoCastVictim(SPELL_BLAST_WAVE); + events.ScheduleEvent(EVENT_BLAST_WAVE, 10s); + break; + case EVENT_TELEPORT: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) + DoCast(target, SPELL_TELEPORT); + events.ScheduleEvent(EVENT_TELEPORT, 20s); + break; + default: + break; } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } - bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + DoMeleeAttackIfReady(); + } + else + { + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) { - if (menuId == MENU_OPTION_YOU_CHALLENGED_US && gossipListId == OPTION_ID_YOU_CHALLENGED_US) + switch (eventId) { - CloseGossipMenuFor(player); - DoAction(ACTION_START_RAGNAROS); + case EVENT_OUTRO_1: + me->NearTeleportTo(RagnarosTelePos.GetPositionX(), RagnarosTelePos.GetPositionY(), RagnarosTelePos.GetPositionZ(), RagnarosTelePos.GetOrientation()); + me->AddNpcFlag(UNIT_NPC_FLAG_GOSSIP); + break; + case EVENT_OUTRO_2: + instance->instance->SummonCreature(NPC_RAGNAROS, RagnarosSummonPos); + break; + case EVENT_OUTRO_3: + Talk(SAY_ARRIVAL2_MAJ); + break; + default: + break; } - return false; } - }; + } + } + + void DoAction(int32 action) override + { + if (action == ACTION_START_RAGNAROS) + { + me->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP); + Talk(SAY_SUMMON_MAJ); + events.ScheduleEvent(EVENT_OUTRO_2, 8s); + events.ScheduleEvent(EVENT_OUTRO_3, 24s); + } + else if (action == ACTION_START_RAGNAROS_ALT) + { + me->SetFaction(FACTION_FRIENDLY); + me->AddNpcFlag(UNIT_NPC_FLAG_GOSSIP); + } + } - CreatureAI* GetAI(Creature* creature) const override + bool OnGossipSelect(Player* player, uint32 menuId, uint32 gossipListId) override + { + if (menuId == MENU_OPTION_YOU_CHALLENGED_US && gossipListId == OPTION_ID_YOU_CHALLENGED_US) { - return GetMoltenCoreAI<boss_majordomoAI>(creature); + CloseGossipMenuFor(player); + DoAction(ACTION_START_RAGNAROS); } + return false; + } }; void AddSC_boss_majordomo() { - new boss_majordomo(); + RegisterMoltenCoreCreatureAI(boss_majordomo); } |