diff options
author | offl <11556157+offl@users.noreply.github.com> | 2021-07-13 05:16:45 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-13 05:16:45 +0300 |
commit | 8e0429d6abcdd2a1dc73b0e1d720afa393dfdd80 (patch) | |
tree | 113a2bf908c3b0fee1520f5fd3e738df00450fc5 | |
parent | 661e7cca00ac863849ee05677e5d001c90bed0cc (diff) |
Scripts/Obsidian Sanctum: Update instance scripts to new register model (#26680)
-rw-r--r-- | src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp | 759 | ||||
-rw-r--r-- | src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.h | 2 |
2 files changed, 332 insertions, 429 deletions
diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp index f7465f832a8..6639a3129c8 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.cpp @@ -412,59 +412,48 @@ struct dummy_dragonAI : public ScriptedAI ## Tenebron ######*/ -class npc_tenebron : public CreatureScript +struct npc_tenebron : public dummy_dragonAI { -public: - npc_tenebron() : CreatureScript("npc_tenebron") { } + npc_tenebron(Creature* creature) : dummy_dragonAI(creature) { } - struct npc_tenebronAI : public dummy_dragonAI + void Reset() override { - npc_tenebronAI(Creature* creature) : dummy_dragonAI(creature) { } - - void Reset() override - { - dummy_dragonAI::Reset(); - } + dummy_dragonAI::Reset(); + } - void JustEngagedWith(Unit* who) override - { - dummy_dragonAI::JustEngagedWith(who); + void JustEngagedWith(Unit* who) override + { + dummy_dragonAI::JustEngagedWith(who); - events.ScheduleEvent(EVENT_HATCH_EGGS, 30s); - } + events.ScheduleEvent(EVENT_HATCH_EGGS, 30s); + } - void UpdateAI(uint32 diff) override + void UpdateAI(uint32 diff) override + { + // if no target, update dummy and return + if (!UpdateVictim()) { - // if no target, update dummy and return - if (!UpdateVictim()) - { - dummy_dragonAI::UpdateAI(diff); - return; - } + dummy_dragonAI::UpdateAI(diff); + return; + } - events.Update(diff); + events.Update(diff); - while (uint32 eventId = events.ExecuteEvent()) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - switch (eventId) - { - case EVENT_HATCH_EGGS: - OpenPortal(); - events.ScheduleEvent(EVENT_HATCH_EGGS, 30s); - break; - default: - dummy_dragonAI::ExecuteEvent(eventId); - break; - } + case EVENT_HATCH_EGGS: + OpenPortal(); + events.ScheduleEvent(EVENT_HATCH_EGGS, 30s); + break; + default: + dummy_dragonAI::ExecuteEvent(eventId); + break; } - - DoMeleeAttackIfReady(); } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetObsidianSanctumAI<npc_tenebronAI>(creature); + DoMeleeAttackIfReady(); } }; @@ -472,78 +461,67 @@ public: ## Shadron ######*/ -class npc_shadron : public CreatureScript +struct npc_shadron : public dummy_dragonAI { -public: - npc_shadron() : CreatureScript("npc_shadron") { } + npc_shadron(Creature* creature) : dummy_dragonAI(creature) { } - struct npc_shadronAI : public dummy_dragonAI + void Reset() override { - npc_shadronAI(Creature* creature) : dummy_dragonAI(creature) { } + dummy_dragonAI::Reset(); - void Reset() override - { - dummy_dragonAI::Reset(); + if (me->HasAura(SPELL_TWILIGHT_TORMENT_VESP)) + me->RemoveAurasDueToSpell(SPELL_TWILIGHT_TORMENT_VESP); - if (me->HasAura(SPELL_TWILIGHT_TORMENT_VESP)) - me->RemoveAurasDueToSpell(SPELL_TWILIGHT_TORMENT_VESP); + if (me->HasAura(SPELL_GIFT_OF_TWILIGTH_SHA)) + me->RemoveAurasDueToSpell(SPELL_GIFT_OF_TWILIGTH_SHA); - if (me->HasAura(SPELL_GIFT_OF_TWILIGTH_SHA)) - me->RemoveAurasDueToSpell(SPELL_GIFT_OF_TWILIGTH_SHA); + instance->SetBossState(DATA_PORTAL_OPEN, NOT_STARTED); + } - instance->SetBossState(DATA_PORTAL_OPEN, NOT_STARTED); - } + void JustEngagedWith(Unit* who) override + { + dummy_dragonAI::JustEngagedWith(who); - void JustEngagedWith(Unit* who) override - { - dummy_dragonAI::JustEngagedWith(who); + events.ScheduleEvent(EVENT_ACOLYTE_SHADRON, 1min); + } - events.ScheduleEvent(EVENT_ACOLYTE_SHADRON, 1min); + void UpdateAI(uint32 diff) override + { + // if no target, update dummy and return + if (!UpdateVictim()) + { + dummy_dragonAI::UpdateAI(diff); + return; } - void UpdateAI(uint32 diff) override + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) { - // if no target, update dummy and return - if (!UpdateVictim()) + switch (eventId) { - dummy_dragonAI::UpdateAI(diff); - return; - } + case EVENT_ACOLYTE_SHADRON: + if (instance->GetBossState(DATA_PORTAL_OPEN) == NOT_STARTED) + events.ScheduleEvent(EVENT_ACOLYTE_SHADRON, 10s); + else + { + if (me->HasAura(SPELL_GIFT_OF_TWILIGTH_SHA)) + return; - events.Update(diff); + OpenPortal(); - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_ACOLYTE_SHADRON: - if (instance->GetBossState(DATA_PORTAL_OPEN) == NOT_STARTED) - events.ScheduleEvent(EVENT_ACOLYTE_SHADRON, 10s); - else - { - if (me->HasAura(SPELL_GIFT_OF_TWILIGTH_SHA)) - return; - - OpenPortal(); - - instance->SetBossState(DATA_PORTAL_OPEN, IN_PROGRESS); - - events.ScheduleEvent(EVENT_ACOLYTE_SHADRON, 60s, 65s); - } - break; - default: - dummy_dragonAI::ExecuteEvent(eventId); - break; - } - } + instance->SetBossState(DATA_PORTAL_OPEN, IN_PROGRESS); - DoMeleeAttackIfReady(); + events.ScheduleEvent(EVENT_ACOLYTE_SHADRON, 60s, 65s); + } + break; + default: + dummy_dragonAI::ExecuteEvent(eventId); + break; + } } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetObsidianSanctumAI<npc_shadronAI>(creature); + DoMeleeAttackIfReady(); } }; @@ -551,65 +529,54 @@ public: ## Vesperon ######*/ -class npc_vesperon : public CreatureScript +struct npc_vesperon : public dummy_dragonAI { -public: - npc_vesperon() : CreatureScript("npc_vesperon") { } + npc_vesperon(Creature* creature) : dummy_dragonAI(creature) { } - struct npc_vesperonAI : public dummy_dragonAI + void Reset() override { - npc_vesperonAI(Creature* creature) : dummy_dragonAI(creature) { } - - void Reset() override - { - dummy_dragonAI::Reset(); - } + dummy_dragonAI::Reset(); + } - void JustEngagedWith(Unit* who) override - { - dummy_dragonAI::JustEngagedWith(who); + void JustEngagedWith(Unit* who) override + { + dummy_dragonAI::JustEngagedWith(who); - events.ScheduleEvent(EVENT_ACOLYTE_VESPERON, 1min); - } + events.ScheduleEvent(EVENT_ACOLYTE_VESPERON, 1min); + } - void UpdateAI(uint32 diff) override + void UpdateAI(uint32 diff) override + { + // if no target, update dummy and return + if (!UpdateVictim()) { - // if no target, update dummy and return - if (!UpdateVictim()) - { - dummy_dragonAI::UpdateAI(diff); - return; - } + dummy_dragonAI::UpdateAI(diff); + return; + } - events.Update(diff); + events.Update(diff); - while (uint32 eventId = events.ExecuteEvent()) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - switch (eventId) - { - case EVENT_ACOLYTE_VESPERON: - if (instance->GetBossState(DATA_PORTAL_OPEN) == IN_PROGRESS) - events.ScheduleEvent(EVENT_ACOLYTE_VESPERON, 10s); - else - { - OpenPortal(); - DoCastVictim(SPELL_TWILIGHT_TORMENT_VESP); - events.ScheduleEvent(EVENT_ACOLYTE_VESPERON, 60s, 70s); - } - break; - default: - dummy_dragonAI::ExecuteEvent(eventId); - break; - } + case EVENT_ACOLYTE_VESPERON: + if (instance->GetBossState(DATA_PORTAL_OPEN) == IN_PROGRESS) + events.ScheduleEvent(EVENT_ACOLYTE_VESPERON, 10s); + else + { + OpenPortal(); + DoCastVictim(SPELL_TWILIGHT_TORMENT_VESP); + events.ScheduleEvent(EVENT_ACOLYTE_VESPERON, 60s, 70s); + } + break; + default: + dummy_dragonAI::ExecuteEvent(eventId); + break; } - - DoMeleeAttackIfReady(); } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetObsidianSanctumAI<npc_vesperonAI>(creature); + DoMeleeAttackIfReady(); } }; @@ -617,166 +584,144 @@ public: ## Acolyte of Shadron ######*/ -class npc_acolyte_of_shadron : public CreatureScript +struct npc_acolyte_of_shadron : public ScriptedAI { - public: - npc_acolyte_of_shadron() : CreatureScript("npc_acolyte_of_shadron") { } - - struct npc_acolyte_of_shadronAI : public ScriptedAI - { - npc_acolyte_of_shadronAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - void Reset() override - { - // Despawn the NPC automatically after 28 seconds - me->DespawnOrUnsummon(28s); - - //if not solo fight, buff main boss, else place debuff on mini-boss. both spells TARGET_SCRIPT - if (instance->GetBossState(DATA_SARTHARION) == IN_PROGRESS) - { - if (Creature* sartharion = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SARTHARION))) - sartharion->AddAura(SPELL_GIFT_OF_TWILIGTH_SAR, sartharion); - } - else - { - if (Creature* shadron = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SHADRON))) - shadron->AddAura(SPELL_GIFT_OF_TWILIGTH_SHA, shadron); - } + npc_acolyte_of_shadron(Creature* creature) : ScriptedAI(creature) + { + instance = creature->GetInstanceScript(); + } - me->AddAura(SPELL_TWILIGHT_SHIFT_ENTER, me); - } + void Reset() override + { + // Despawn the NPC automatically after 28 seconds + me->DespawnOrUnsummon(28s); - void JustDied(Unit* /*killer*/) override - { - if (ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SHADRON))) - instance->SetBossState(DATA_PORTAL_OPEN, NOT_STARTED); + //if not solo fight, buff main boss, else place debuff on mini-boss. both spells TARGET_SCRIPT + if (instance->GetBossState(DATA_SARTHARION) == IN_PROGRESS) + { + if (Creature* sartharion = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SARTHARION))) + sartharion->AddAura(SPELL_GIFT_OF_TWILIGTH_SAR, sartharion); + } + else + { + if (Creature* shadron = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SHADRON))) + shadron->AddAura(SPELL_GIFT_OF_TWILIGTH_SHA, shadron); + } - Map::PlayerList const& PlayerList = me->GetMap()->GetPlayers(); + me->AddAura(SPELL_TWILIGHT_SHIFT_ENTER, me); + } - if (PlayerList.isEmpty()) - return; + void JustDied(Unit* /*killer*/) override + { + if (ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SHADRON))) + instance->SetBossState(DATA_PORTAL_OPEN, NOT_STARTED); - for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) - { - if (i->GetSource()->IsAlive() && i->GetSource()->HasAura(SPELL_TWILIGHT_SHIFT) && !i->GetSource()->GetVictim()) - { - i->GetSource()->CastSpell(i->GetSource(), SPELL_TWILIGHT_SHIFT_REMOVAL_ALL, true); - i->GetSource()->CastSpell(i->GetSource(), SPELL_TWILIGHT_RESIDUE, true); - i->GetSource()->RemoveAurasDueToSpell(SPELL_TWILIGHT_SHIFT); - i->GetSource()->RemoveAurasDueToSpell(SPELL_TWILIGHT_SHIFT_ENTER); - } - } + Map::PlayerList const& PlayerList = me->GetMap()->GetPlayers(); - // not solo fight, so main boss has debuff - if (Creature* debuffTarget = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SARTHARION))) - if (debuffTarget->IsAlive() && debuffTarget->HasAura(SPELL_GIFT_OF_TWILIGTH_SAR)) - debuffTarget->RemoveAurasDueToSpell(SPELL_GIFT_OF_TWILIGTH_SAR); + if (PlayerList.isEmpty()) + return; - // event not in progress, then solo fight and must remove debuff mini-boss - if (Creature* debuffTarget = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SHADRON))) - if (debuffTarget->IsAlive() && debuffTarget->HasAura(SPELL_GIFT_OF_TWILIGTH_SHA)) - debuffTarget->RemoveAurasDueToSpell(SPELL_GIFT_OF_TWILIGTH_SHA); + for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + { + if (i->GetSource()->IsAlive() && i->GetSource()->HasAura(SPELL_TWILIGHT_SHIFT) && !i->GetSource()->GetVictim()) + { + i->GetSource()->CastSpell(i->GetSource(), SPELL_TWILIGHT_SHIFT_REMOVAL_ALL, true); + i->GetSource()->CastSpell(i->GetSource(), SPELL_TWILIGHT_RESIDUE, true); + i->GetSource()->RemoveAurasDueToSpell(SPELL_TWILIGHT_SHIFT); + i->GetSource()->RemoveAurasDueToSpell(SPELL_TWILIGHT_SHIFT_ENTER); } + } - void UpdateAI(uint32 /*diff*/) override - { - if (!UpdateVictim()) - return; + // not solo fight, so main boss has debuff + if (Creature* debuffTarget = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SARTHARION))) + if (debuffTarget->IsAlive() && debuffTarget->HasAura(SPELL_GIFT_OF_TWILIGTH_SAR)) + debuffTarget->RemoveAurasDueToSpell(SPELL_GIFT_OF_TWILIGTH_SAR); - DoMeleeAttackIfReady(); - } + // event not in progress, then solo fight and must remove debuff mini-boss + if (Creature* debuffTarget = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_SHADRON))) + if (debuffTarget->IsAlive() && debuffTarget->HasAura(SPELL_GIFT_OF_TWILIGTH_SHA)) + debuffTarget->RemoveAurasDueToSpell(SPELL_GIFT_OF_TWILIGTH_SHA); + } - private: - InstanceScript* instance; - }; + void UpdateAI(uint32 /*diff*/) override + { + if (!UpdateVictim()) + return; - CreatureAI* GetAI(Creature* creature) const override - { - return GetObsidianSanctumAI<npc_acolyte_of_shadronAI>(creature); - } + DoMeleeAttackIfReady(); + } + +private: + InstanceScript* instance; }; /*###### ## Acolyte of Vesperon ######*/ -class npc_acolyte_of_vesperon : public CreatureScript +struct npc_acolyte_of_vesperon : public ScriptedAI { - public: - npc_acolyte_of_vesperon() : CreatureScript("npc_acolyte_of_vesperon") { } - - struct npc_acolyte_of_vesperonAI : public ScriptedAI - { - npc_acolyte_of_vesperonAI(Creature* creature) : ScriptedAI(creature) - { - instance = creature->GetInstanceScript(); - } - - void Reset() override - { - // Despawn the NPC automatically after 28 seconds - me->DespawnOrUnsummon(28s); + npc_acolyte_of_vesperon(Creature* creature) : ScriptedAI(creature) + { + instance = creature->GetInstanceScript(); + } - me->AddAura(SPELL_TWILIGHT_SHIFT_ENTER, me); + void Reset() override + { + // Despawn the NPC automatically after 28 seconds + me->DespawnOrUnsummon(28s); - DoCast(me, SPELL_TWILIGHT_TORMENT_VESP_ACO); - } + me->AddAura(SPELL_TWILIGHT_SHIFT_ENTER, me); - void JustDied(Unit* /*killer*/) override - { - me->RemoveAurasDueToSpell(SPELL_TWILIGHT_TORMENT_VESP_ACO); + DoCast(me, SPELL_TWILIGHT_TORMENT_VESP_ACO); + } - // remove twilight torment on Vesperon - if (Creature* vesperon = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_VESPERON))) - { - instance->SetBossState(DATA_PORTAL_OPEN, NOT_STARTED); + void JustDied(Unit* /*killer*/) override + { + me->RemoveAurasDueToSpell(SPELL_TWILIGHT_TORMENT_VESP_ACO); - if (vesperon->IsAlive() && vesperon->HasAura(SPELL_TWILIGHT_TORMENT_VESP)) - vesperon->RemoveAurasDueToSpell(SPELL_TWILIGHT_TORMENT_VESP); - } + // remove twilight torment on Vesperon + if (Creature* vesperon = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_VESPERON))) + { + instance->SetBossState(DATA_PORTAL_OPEN, NOT_STARTED); - Map::PlayerList const& PlayerList = me->GetMap()->GetPlayers(); + if (vesperon->IsAlive() && vesperon->HasAura(SPELL_TWILIGHT_TORMENT_VESP)) + vesperon->RemoveAurasDueToSpell(SPELL_TWILIGHT_TORMENT_VESP); + } - if (PlayerList.isEmpty()) - return; + Map::PlayerList const& PlayerList = me->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) - { - if (i->GetSource()->IsAlive() && i->GetSource()->HasAura(SPELL_TWILIGHT_SHIFT) && !i->GetSource()->GetVictim()) - { - i->GetSource()->CastSpell(i->GetSource(), SPELL_TWILIGHT_SHIFT_REMOVAL_ALL, true); - i->GetSource()->CastSpell(i->GetSource(), SPELL_TWILIGHT_RESIDUE, true); - i->GetSource()->RemoveAurasDueToSpell(SPELL_TWILIGHT_SHIFT); - i->GetSource()->RemoveAurasDueToSpell(SPELL_TWILIGHT_SHIFT_ENTER); - } - if (i->GetSource()->IsAlive() && i->GetSource()->HasAura(SPELL_TWILIGHT_TORMENT_VESP) && !i->GetSource()->GetVictim()) - i->GetSource()->RemoveAurasDueToSpell(SPELL_TWILIGHT_TORMENT_VESP); - } + if (PlayerList.isEmpty()) + return; - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_TWILIGHT_TORMENT_VESP_ACO, true, true); - instance->DoRemoveAurasDueToSpellOnPlayers(57935, true, true); - instance->DoRemoveAurasDueToSpellOnPlayers(58835, true, true); // Components of spell Twilight Torment + for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) + { + if (i->GetSource()->IsAlive() && i->GetSource()->HasAura(SPELL_TWILIGHT_SHIFT) && !i->GetSource()->GetVictim()) + { + i->GetSource()->CastSpell(i->GetSource(), SPELL_TWILIGHT_SHIFT_REMOVAL_ALL, true); + i->GetSource()->CastSpell(i->GetSource(), SPELL_TWILIGHT_RESIDUE, true); + i->GetSource()->RemoveAurasDueToSpell(SPELL_TWILIGHT_SHIFT); + i->GetSource()->RemoveAurasDueToSpell(SPELL_TWILIGHT_SHIFT_ENTER); } + if (i->GetSource()->IsAlive() && i->GetSource()->HasAura(SPELL_TWILIGHT_TORMENT_VESP) && !i->GetSource()->GetVictim()) + i->GetSource()->RemoveAurasDueToSpell(SPELL_TWILIGHT_TORMENT_VESP); + } - void UpdateAI(uint32 /*diff*/) override - { - if (!UpdateVictim()) - return; + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_TWILIGHT_TORMENT_VESP_ACO, true, true); + instance->DoRemoveAurasDueToSpellOnPlayers(57935, true, true); + instance->DoRemoveAurasDueToSpellOnPlayers(58835, true, true); // Components of spell Twilight Torment + } - DoMeleeAttackIfReady(); - } + void UpdateAI(uint32 /*diff*/) override + { + if (!UpdateVictim()) + return; - private: - InstanceScript* instance; - }; + DoMeleeAttackIfReady(); + } - CreatureAI* GetAI(Creature* creature) const override - { - return GetObsidianSanctumAI<npc_acolyte_of_vesperonAI>(creature); - } +private: + InstanceScript* instance; }; /*###### @@ -788,64 +733,53 @@ enum TwilightEggs EVENT_TWILIGHT_EGGS = 11 }; -class npc_twilight_eggs : public CreatureScript +struct npc_twilight_eggs : public ScriptedAI { -public: - npc_twilight_eggs() : CreatureScript("npc_twilight_eggs") { } + npc_twilight_eggs(Creature* creature) : ScriptedAI(creature) + { + SetCombatMovement(false); + instance = creature->GetInstanceScript(); + } - struct npc_twilight_eggsAI : public ScriptedAI + void Reset() override { - npc_twilight_eggsAI(Creature* creature) : ScriptedAI(creature) - { - SetCombatMovement(false); - instance = creature->GetInstanceScript(); - } + me->AddAura(SPELL_TWILIGHT_SHIFT_ENTER, me); - void Reset() override - { - me->AddAura(SPELL_TWILIGHT_SHIFT_ENTER, me); + events.ScheduleEvent(EVENT_TWILIGHT_EGGS, 20s); + } - events.ScheduleEvent(EVENT_TWILIGHT_EGGS, 20s); - } + void SpawnWhelps() + { + me->RemoveAllAuras(); - void SpawnWhelps() - { - me->RemoveAllAuras(); + if (instance->GetBossState(DATA_SARTHARION) != IN_PROGRESS) + me->SummonCreature(NPC_TWILIGHT_WHELP, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 1min); + else + me->SummonCreature(NPC_SARTHARION_TWILIGHT_WHELP, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 1min); + me->KillSelf(); + } - if (instance->GetBossState(DATA_SARTHARION) != IN_PROGRESS) - me->SummonCreature(NPC_TWILIGHT_WHELP, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 1min); - else - me->SummonCreature(NPC_SARTHARION_TWILIGHT_WHELP, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 1min); - me->KillSelf(); - } + void JustSummoned(Creature* who) override + { + DoZoneInCombat(who); + } - void JustSummoned(Creature* who) override - { - DoZoneInCombat(who); - } + void UpdateAI(uint32 diff) override + { + events.Update(diff); - void UpdateAI(uint32 diff) override + if (events.ExecuteEvent() == EVENT_TWILIGHT_EGGS) { - events.Update(diff); - - if (events.ExecuteEvent() == EVENT_TWILIGHT_EGGS) - { - if (ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_TENEBRON))) - instance->SetBossState(DATA_PORTAL_OPEN, NOT_STARTED); + if (ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_TENEBRON))) + instance->SetBossState(DATA_PORTAL_OPEN, NOT_STARTED); - SpawnWhelps(); - } + SpawnWhelps(); } - - private: - InstanceScript* instance; - EventMap events; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetObsidianSanctumAI<npc_twilight_eggsAI>(creature); } + +private: + InstanceScript* instance; + EventMap events; }; /*###### @@ -858,56 +792,45 @@ enum FlameTsunami EVENT_TSUNAMI_BUFF = 13 }; -class npc_flame_tsunami : public CreatureScript +struct npc_flame_tsunami : public ScriptedAI { -public: - npc_flame_tsunami() : CreatureScript("npc_flame_tsunami") { } + npc_flame_tsunami(Creature* creature) : ScriptedAI(creature) + { + me->SetDisplayId(11686); + me->AddAura(SPELL_FLAME_TSUNAMI, me); + } - struct npc_flame_tsunamiAI : public ScriptedAI + void Reset() override { - npc_flame_tsunamiAI(Creature* creature) : ScriptedAI(creature) - { - me->SetDisplayId(11686); - me->AddAura(SPELL_FLAME_TSUNAMI, me); - } + me->SetReactState(REACT_PASSIVE); + events.ScheduleEvent(EVENT_TSUNAMI_TIMER, 100ms); + events.ScheduleEvent(EVENT_TSUNAMI_BUFF, 1s); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + } - void Reset() override - { - me->SetReactState(REACT_PASSIVE); - events.ScheduleEvent(EVENT_TSUNAMI_TIMER, 100ms); - events.ScheduleEvent(EVENT_TSUNAMI_BUFF, 1s); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); - } + void UpdateAI(uint32 diff) override + { + events.Update(diff); - void UpdateAI(uint32 diff) override + while (uint32 eventId = events.ExecuteEvent()) { - events.Update(diff); - - while (uint32 eventId = events.ExecuteEvent()) + switch (eventId) { - switch (eventId) - { - case EVENT_TSUNAMI_TIMER: - DoCast(me, SPELL_FLAME_TSUNAMI_DMG_AURA); - events.ScheduleEvent(EVENT_TSUNAMI_TIMER, 500ms); - break; - case EVENT_TSUNAMI_BUFF: - if (Unit* lavaBlaze = GetClosestCreatureWithEntry(me, NPC_LAVA_BLAZE, 10.0f, true)) - lavaBlaze->CastSpell(lavaBlaze, SPELL_FLAME_TSUNAMI_BUFF, true); - events.ScheduleEvent(EVENT_TSUNAMI_BUFF, 1s); - break; - } + case EVENT_TSUNAMI_TIMER: + DoCast(me, SPELL_FLAME_TSUNAMI_DMG_AURA); + events.ScheduleEvent(EVENT_TSUNAMI_TIMER, 500ms); + break; + case EVENT_TSUNAMI_BUFF: + if (Unit* lavaBlaze = GetClosestCreatureWithEntry(me, NPC_LAVA_BLAZE, 10.0f, true)) + lavaBlaze->CastSpell(lavaBlaze, SPELL_FLAME_TSUNAMI_BUFF, true); + events.ScheduleEvent(EVENT_TSUNAMI_BUFF, 1s); + break; } } - - private: - EventMap events; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetObsidianSanctumAI<npc_flame_tsunamiAI>(creature); } + +private: + EventMap events; }; /*###### @@ -919,49 +842,38 @@ enum TwilightFissure EVENT_VOID_BLAST = 14 }; -class npc_twilight_fissure : public CreatureScript +struct npc_twilight_fissure : public ScriptedAI { -public: - npc_twilight_fissure() : CreatureScript("npc_twilight_fissure") { } + npc_twilight_fissure(Creature* creature) : ScriptedAI(creature) + { + SetCombatMovement(false); + } - struct npc_twilight_fissureAI : public ScriptedAI + void Reset() override { - npc_twilight_fissureAI(Creature* creature) : ScriptedAI(creature) - { - SetCombatMovement(false); - } + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + me->AddAura(46265, me); // Wrong, can't find proper visual + me->AddAura(69422, me); + events.ScheduleEvent(EVENT_VOID_BLAST, 5s); + } - void Reset() override - { - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); - me->AddAura(46265, me); // Wrong, can't find proper visual - me->AddAura(69422, me); - events.ScheduleEvent(EVENT_VOID_BLAST, 5s); - } + void UpdateAI(uint32 diff) override + { + events.Update(diff); - void UpdateAI(uint32 diff) override + if (events.ExecuteEvent() == EVENT_VOID_BLAST) { - events.Update(diff); - - if (events.ExecuteEvent() == EVENT_VOID_BLAST) - { - DoCastAOE(SPELL_VOID_BLAST); - ////twilight realm - //DoCastVictim(57620, true); - //DoCastVictim(57874, true); - me->RemoveAllAuras(); - me->KillSelf(); - } + DoCastAOE(SPELL_VOID_BLAST); + ////twilight realm + //DoCastVictim(57620, true); + //DoCastVictim(57874, true); + me->RemoveAllAuras(); + me->KillSelf(); } - - private: - EventMap events; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetObsidianSanctumAI<npc_twilight_fissureAI>(creature); } + +private: + EventMap events; }; /*###### @@ -973,49 +885,38 @@ enum TwilightWhelps EVENT_FADE_ARMOR = 15 }; -class npc_twilight_whelp : public CreatureScript +struct npc_twilight_whelp : public ScriptedAI { -public: - npc_twilight_whelp() : CreatureScript("npc_twilight_whelp") { } - - struct npc_twilight_whelpAI : public ScriptedAI + npc_twilight_whelp(Creature* creature) : ScriptedAI(creature) { - npc_twilight_whelpAI(Creature* creature) : ScriptedAI(creature) - { - } - - void Reset() override - { - me->RemoveAllAuras(); - DoZoneInCombat(); - events.ScheduleEvent(EVENT_FADE_ARMOR, 1s); - } + } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + void Reset() override + { + me->RemoveAllAuras(); + DoZoneInCombat(); + events.ScheduleEvent(EVENT_FADE_ARMOR, 1s); + } - // twilight torment - events.Update(diff); + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - if (events.ExecuteEvent() == EVENT_FADE_ARMOR) - { - DoCastVictim(SPELL_FADE_ARMOR); - events.ScheduleEvent(EVENT_FADE_ARMOR, 5s, 10s); - } + // twilight torment + events.Update(diff); - DoMeleeAttackIfReady(); + if (events.ExecuteEvent() == EVENT_FADE_ARMOR) + { + DoCastVictim(SPELL_FADE_ARMOR); + events.ScheduleEvent(EVENT_FADE_ARMOR, 5s, 10s); } - private: - EventMap events; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetObsidianSanctumAI<npc_twilight_whelpAI>(creature); + DoMeleeAttackIfReady(); } + +private: + EventMap events; }; class achievement_twilight_assist : public AchievementCriteriaScript @@ -1053,15 +954,15 @@ class achievement_twilight_zone : public AchievementCriteriaScript void AddSC_obsidian_sanctum() { - new npc_vesperon(); - new npc_shadron(); - new npc_tenebron(); - new npc_acolyte_of_shadron(); - new npc_acolyte_of_vesperon(); - new npc_twilight_eggs(); - new npc_flame_tsunami(); - new npc_twilight_fissure(); - new npc_twilight_whelp(); + RegisterObsidianSanctumCreatureAI(npc_vesperon); + RegisterObsidianSanctumCreatureAI(npc_shadron); + RegisterObsidianSanctumCreatureAI(npc_tenebron); + RegisterObsidianSanctumCreatureAI(npc_acolyte_of_shadron); + RegisterObsidianSanctumCreatureAI(npc_acolyte_of_vesperon); + RegisterObsidianSanctumCreatureAI(npc_twilight_eggs); + RegisterObsidianSanctumCreatureAI(npc_flame_tsunami); + RegisterObsidianSanctumCreatureAI(npc_twilight_fissure); + RegisterObsidianSanctumCreatureAI(npc_twilight_whelp); new achievement_twilight_assist(); new achievement_twilight_duo(); new achievement_twilight_zone(); diff --git a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.h b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.h index 64365ca50b3..cd7e78603a6 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.h +++ b/src/server/scripts/Northrend/ChamberOfAspects/ObsidianSanctum/obsidian_sanctum.h @@ -54,4 +54,6 @@ inline AI* GetObsidianSanctumAI(T* obj) return GetInstanceAI<AI>(obj, OSScriptName); } +#define RegisterObsidianSanctumCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetObsidianSanctumAI) + #endif // OBSIDIAN_SANCTUM_H_ |