From 65ec5bbceb5e7352195472c16677cc02d90dbe91 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Mon, 25 Nov 2024 03:15:49 -0300 Subject: [PATCH] refactor(Scripts/Nexus): Update creature scripts to new register method (#20728) --- .../Northrend/Nexus/Nexus/boss_anomalus.cpp | 219 +++++++-------- .../boss_commander_stoutbeard_kolurg.cpp | 133 +++++---- .../Nexus/Nexus/boss_keristrasza.cpp | 233 ++++++++-------- .../Nexus/Nexus/boss_magus_telestra.cpp | 255 +++++++++--------- .../Northrend/Nexus/Nexus/boss_ormorok.cpp | 246 ++++++++--------- .../Northrend/Nexus/Nexus/instance_nexus.cpp | 157 +++++------ .../scripts/Northrend/Nexus/Nexus/nexus.h | 2 + 7 files changed, 576 insertions(+), 669 deletions(-) diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp index 1f34b91ec..397f9ec8b 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_anomalus.cpp @@ -67,146 +67,131 @@ private: Creature* _caster; }; -class boss_anomalus : public CreatureScript +struct boss_anomalus : public BossAI { -public: - boss_anomalus() : CreatureScript("boss_anomalus") { } + boss_anomalus(Creature* creature) : BossAI(creature, DATA_ANOMALUS_EVENT) { } - CreatureAI* GetAI(Creature* creature) const override + bool achievement; + uint16 activeRifts; + + void Reset() override { - return GetNexusAI(creature); + BossAI::Reset(); + achievement = true; + me->CastSpell(me, SPELL_CLOSE_RIFTS, true); } - struct boss_anomalusAI : public BossAI + uint32 GetData(uint32 data) const override { - boss_anomalusAI(Creature* creature) : BossAI(creature, DATA_ANOMALUS_EVENT) - { - } + if (data == me->GetEntry()) + return achievement; + return 0; + } - bool achievement; - uint16 activeRifts; - - void Reset() override + void SetData(uint32 type, uint32) override + { + if (type == me->GetEntry()) { - BossAI::Reset(); - achievement = true; - me->CastSpell(me, SPELL_CLOSE_RIFTS, true); - } - - uint32 GetData(uint32 data) const override - { - if (data == me->GetEntry()) - return achievement; - return 0; - } - - void SetData(uint32 type, uint32) override - { - if (type == me->GetEntry()) + if (activeRifts > 0 && --activeRifts == 0 && me->HasAura(SPELL_RIFT_SHIELD)) { - if (activeRifts > 0 && --activeRifts == 0 && me->HasAura(SPELL_RIFT_SHIELD)) - { - events.DelayEvents(me->GetAura(SPELL_RIFT_SHIELD)->GetDuration() - 46000); - me->RemoveAura(SPELL_RIFT_SHIELD); - me->InterruptNonMeleeSpells(false); - } - achievement = false; + events.DelayEvents(me->GetAura(SPELL_RIFT_SHIELD)->GetDuration() - 46000); + me->RemoveAura(SPELL_RIFT_SHIELD); + me->InterruptNonMeleeSpells(false); } + achievement = false; } + } - void JustSummoned(Creature* summon) override + void JustSummoned(Creature* summon) override + { + summons.Summon(summon); + activeRifts++; + } + + void JustEngagedWith(Unit* who) override + { + Talk(SAY_AGGRO); + BossAI::JustEngagedWith(who); + + activeRifts = 0; + events.SetTimer(45000); + events.ScheduleEvent(EVENT_ANOMALUS_SPARK, 5s); + events.ScheduleEvent(EVENT_ANOMALUS_HEALTH, 1s); + events.ScheduleEvent(EVENT_ANOMALUS_SPAWN_RIFT, IsHeroic() ? 15s : 25s); + if (IsHeroic()) + events.ScheduleEvent(EVENT_ANOMALUS_ARCANE_ATTRACTION, 8s); + } + + void JustDied(Unit* killer) override + { + Talk(SAY_DEATH); + BossAI::JustDied(killer); + me->CastSpell(me, SPELL_CLOSE_RIFTS, true); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - summons.Summon(summon); - activeRifts++; - } - - void JustEngagedWith(Unit* who) override - { - Talk(SAY_AGGRO); - BossAI::JustEngagedWith(who); - - activeRifts = 0; - events.SetTimer(45000); + case EVENT_ANOMALUS_SPARK: + me->CastSpell(me->GetVictim(), SPELL_SPARK, false); events.ScheduleEvent(EVENT_ANOMALUS_SPARK, 5s); - events.ScheduleEvent(EVENT_ANOMALUS_HEALTH, 1s); - events.ScheduleEvent(EVENT_ANOMALUS_SPAWN_RIFT, IsHeroic() ? 15s : 25s); - if (IsHeroic()) - events.ScheduleEvent(EVENT_ANOMALUS_ARCANE_ATTRACTION, 8s); - } - - void JustDied(Unit* killer) override - { - Talk(SAY_DEATH); - BossAI::JustDied(killer); - me->CastSpell(me, SPELL_CLOSE_RIFTS, true); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) + break; + case EVENT_ANOMALUS_HEALTH: + if (me->HealthBelowPct(51)) { - case EVENT_ANOMALUS_SPARK: - me->CastSpell(me->GetVictim(), SPELL_SPARK, false); - events.ScheduleEvent(EVENT_ANOMALUS_SPARK, 5s); - break; - case EVENT_ANOMALUS_HEALTH: - if (me->HealthBelowPct(51)) - { - //First time we reach 51%, the next rift going to be empowered following timings. - events.CancelEvent(EVENT_ANOMALUS_SPAWN_RIFT); - events.ScheduleEvent(EVENT_ANOMALUS_SPAWN_RIFT_EMPOWERED, 1s); - break; - } - events.ScheduleEvent(EVENT_ANOMALUS_HEALTH, 1s); - break; - case EVENT_ANOMALUS_ARCANE_ATTRACTION: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true)) - me->CastSpell(target, SPELL_ARCANE_ATTRACTION, false); - events.ScheduleEvent(EVENT_ANOMALUS_ARCANE_ATTRACTION, 15s); - break; - case EVENT_ANOMALUS_SPAWN_RIFT: - Talk(SAY_RIFT); - Talk(EMOTE_RIFT); - me->CastSpell(me, SPELL_CREATE_RIFT, false); - //Once we hit 51% hp mark, after each rift we spawn an empowered - events.ScheduleEvent(me->HealthBelowPct(51) ? EVENT_ANOMALUS_SPAWN_RIFT_EMPOWERED : EVENT_ANOMALUS_SPAWN_RIFT, IsHeroic() ? 15000 : 25000); - break; - case EVENT_ANOMALUS_SPAWN_RIFT_EMPOWERED: - Talk(SAY_RIFT); - Talk(EMOTE_RIFT); - - me->CastSpell(me, SPELL_CREATE_RIFT, false); - me->CastSpell(me, SPELL_RIFT_SHIELD, true); - me->m_Events.AddEvent(new ChargeRifts(me), me->m_Events.CalculateTime(1000)); - events.DelayEvents(46s); - //As we just spawned an empowered spawn a normal one - events.ScheduleEvent(EVENT_ANOMALUS_SPAWN_RIFT, IsHeroic() ? 15s : 25s); - break; + //First time we reach 51%, the next rift going to be empowered following timings. + events.CancelEvent(EVENT_ANOMALUS_SPAWN_RIFT); + events.ScheduleEvent(EVENT_ANOMALUS_SPAWN_RIFT_EMPOWERED, 1s); + break; } + events.ScheduleEvent(EVENT_ANOMALUS_HEALTH, 1s); + break; + case EVENT_ANOMALUS_ARCANE_ATTRACTION: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50.0f, true)) + me->CastSpell(target, SPELL_ARCANE_ATTRACTION, false); + events.ScheduleEvent(EVENT_ANOMALUS_ARCANE_ATTRACTION, 15s); + break; + case EVENT_ANOMALUS_SPAWN_RIFT: + Talk(SAY_RIFT); + Talk(EMOTE_RIFT); + me->CastSpell(me, SPELL_CREATE_RIFT, false); + //Once we hit 51% hp mark, after each rift we spawn an empowered + events.ScheduleEvent(me->HealthBelowPct(51) ? EVENT_ANOMALUS_SPAWN_RIFT_EMPOWERED : EVENT_ANOMALUS_SPAWN_RIFT, IsHeroic() ? 15000 : 25000); + break; + case EVENT_ANOMALUS_SPAWN_RIFT_EMPOWERED: + Talk(SAY_RIFT); + Talk(EMOTE_RIFT); - DoMeleeAttackIfReady(); + me->CastSpell(me, SPELL_CREATE_RIFT, false); + me->CastSpell(me, SPELL_RIFT_SHIELD, true); + me->m_Events.AddEvent(new ChargeRifts(me), me->m_Events.CalculateTime(1000)); + events.DelayEvents(46s); + //As we just spawned an empowered spawn a normal one + events.ScheduleEvent(EVENT_ANOMALUS_SPAWN_RIFT, IsHeroic() ? 15s : 25s); + break; } - bool CheckEvadeIfOutOfCombatArea() const override - { - return me->GetHomePosition().GetExactDist2d(me) > 60.0f; - } - }; + DoMeleeAttackIfReady(); + } + + bool CheckEvadeIfOutOfCombatArea() const override + { + return me->GetHomePosition().GetExactDist2d(me) > 60.0f; + } }; class achievement_chaos_theory : public AchievementCriteriaScript { public: - achievement_chaos_theory() : AchievementCriteriaScript("achievement_chaos_theory") - { - } + achievement_chaos_theory() : AchievementCriteriaScript("achievement_chaos_theory") { } bool OnCheck(Player* /*player*/, Unit* target, uint32 /*criteria_id*/) override { @@ -219,6 +204,6 @@ public: void AddSC_boss_anomalus() { - new boss_anomalus(); + RegisterNexusCreatureAI(boss_anomalus); new achievement_chaos_theory(); } diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard_kolurg.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard_kolurg.cpp index 3f6f1a5b2..3e73dda8e 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard_kolurg.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_commander_stoutbeard_kolurg.cpp @@ -43,90 +43,77 @@ enum Says SAY_KILL = 2 }; -class boss_commander_stoutbeard : public CreatureScript +struct boss_commander_stoutbeard : public BossAI { -public: - boss_commander_stoutbeard() : CreatureScript("boss_commander_stoutbeard") { } + boss_commander_stoutbeard(Creature* creature) : BossAI(creature, DATA_COMMANDER_EVENT) {} - CreatureAI* GetAI(Creature* creature) const override + void Reset() override { - return GetNexusAI(creature); + BossAI::Reset(); } - struct boss_commander_stoutbeardAI : public BossAI + void JustEngagedWith(Unit* who) override { - boss_commander_stoutbeardAI(Creature* creature) : BossAI(creature, DATA_COMMANDER_EVENT) + BossAI::JustEngagedWith(who); + Talk(SAY_AGGRO); + + events.ScheduleEvent(EVENT_BATTLE_SHOUT, 0ms); + events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 10s); + events.ScheduleEvent(EVENT_WHIRLWIND, 15s); + events.ScheduleEvent(EVENT_COMMANDER_CHARGE, 1s); + me->RemoveAllAuras(); + } + + void KilledUnit(Unit*) override + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) { + Talk(SAY_KILL); + events.ScheduleEvent(EVENT_KILL_TALK, 6s); + } + } + + void JustDied(Unit* killer) override + { + BossAI::JustDied(killer); + Talk(SAY_DEATH); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_BATTLE_SHOUT: + me->CastSpell(me, SPELL_BATTLE_SHOUT, true); + events.ScheduleEvent(EVENT_BATTLE_SHOUT, 2min); + break; + case EVENT_FRIGHTENING_SHOUT: + me->CastSpell(me->GetVictim(), SPELL_FRIGHTENING_SHOUT, false); + events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 15s, 20s); + break; + case EVENT_WHIRLWIND: + me->CastSpell(me, SPELL_WHIRLWIND, false); + events.ScheduleEvent(EVENT_WHIRLWIND, 16s); + break; + case EVENT_COMMANDER_CHARGE: + if (Unit* target = SelectTarget(SelectTargetMethod::MinDistance, 0, 25.0f)) + me->CastSpell(target, SPELL_CHARGE, false); + events.ScheduleEvent(EVENT_COMMANDER_CHARGE, 20s); + break; } - void Reset() override - { - BossAI::Reset(); - } - - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - Talk(SAY_AGGRO); - - events.ScheduleEvent(EVENT_BATTLE_SHOUT, 0ms); - events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 10s); - events.ScheduleEvent(EVENT_WHIRLWIND, 15s); - events.ScheduleEvent(EVENT_COMMANDER_CHARGE, 1s); - me->RemoveAllAuras(); - } - - void KilledUnit(Unit*) override - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_KILL); - events.ScheduleEvent(EVENT_KILL_TALK, 6s); - } - } - - void JustDied(Unit* killer) override - { - BossAI::JustDied(killer); - Talk(SAY_DEATH); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_BATTLE_SHOUT: - me->CastSpell(me, SPELL_BATTLE_SHOUT, true); - events.ScheduleEvent(EVENT_BATTLE_SHOUT, 2min); - break; - case EVENT_FRIGHTENING_SHOUT: - me->CastSpell(me->GetVictim(), SPELL_FRIGHTENING_SHOUT, false); - events.ScheduleEvent(EVENT_FRIGHTENING_SHOUT, 15s, 20s); - break; - case EVENT_WHIRLWIND: - me->CastSpell(me, SPELL_WHIRLWIND, false); - events.ScheduleEvent(EVENT_WHIRLWIND, 16s); - break; - case EVENT_COMMANDER_CHARGE: - if (Unit* target = SelectTarget(SelectTargetMethod::MinDistance, 0, 25.0f)) - me->CastSpell(target, SPELL_CHARGE, false); - events.ScheduleEvent(EVENT_COMMANDER_CHARGE, 20s); - break; - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } }; void AddSC_boss_commander_stoutbeard() { - new boss_commander_stoutbeard(); + RegisterNexusCreatureAI(boss_commander_stoutbeard); } diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp index 5cdc46622..a367d6059 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp @@ -55,152 +55,137 @@ enum Events EVENT_KILL_TALK = 6 }; -class boss_keristrasza : public CreatureScript +struct boss_keristrasza : public BossAI { -public: - boss_keristrasza() : CreatureScript("boss_keristrasza") { } + boss_keristrasza(Creature* creature) : BossAI(creature, DATA_KERISTRASZA_EVENT) {} - CreatureAI* GetAI(Creature* creature) const override + std::set aGuids; + + void Reset() override { - return GetNexusAI(creature); + BossAI::Reset(); + RemovePrison(CanRemovePrison()); + aGuids.clear(); } - struct boss_keristraszaAI : public BossAI + void JustEngagedWith(Unit* who) override { - boss_keristraszaAI(Creature* creature) : BossAI(creature, DATA_KERISTRASZA_EVENT) + Talk(SAY_AGGRO); + BossAI::JustEngagedWith(who); + + me->CastSpell(me, SPELL_INTENSE_COLD, true); + events.ScheduleEvent(EVENT_CRYSTALFIRE_BREATH, 14s); + events.ScheduleEvent(EVENT_CRYSTAL_CHAINS, DUNGEON_MODE(20000, 11000)); + events.ScheduleEvent(EVENT_TAIL_SWEEP, 5s); + events.ScheduleEvent(EVENT_HEALTH_CHECK, 1s); + events.ScheduleEvent(EVENT_ACHIEVEMENT_CHECK, 1s); + } + + void JustDied(Unit* killer) override + { + Talk(SAY_DEATH); + BossAI::JustDied(killer); + } + + void KilledUnit(Unit*) override + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) { + Talk(SAY_SLAY); + events.ScheduleEvent(EVENT_KILL_TALK, 6s); } + } - std::set aGuids; + void SetData(uint32 type, uint32) override + { + if (type == me->GetEntry() && CanRemovePrison()) + RemovePrison(true); + } - void Reset() override + bool CanRemovePrison() + { + for (uint8 i = DATA_TELESTRA_ORB; i <= DATA_ORMOROK_ORB; ++i) + if (instance->GetBossState(i) != DONE) + return false; + return true; + } + + void RemovePrison(bool remove) + { + if (remove) { - BossAI::Reset(); - RemovePrison(CanRemovePrison()); - aGuids.clear(); + me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); + me->RemoveAurasDueToSpell(SPELL_FROZEN_PRISON); } - - void JustEngagedWith(Unit* who) override + else { - Talk(SAY_AGGRO); - BossAI::JustEngagedWith(who); + me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); + me->CastSpell(me, SPELL_FROZEN_PRISON, true); + } + } - me->CastSpell(me, SPELL_INTENSE_COLD, true); - events.ScheduleEvent(EVENT_CRYSTALFIRE_BREATH, 14s); - events.ScheduleEvent(EVENT_CRYSTAL_CHAINS, DUNGEON_MODE(20000, 11000)); - events.ScheduleEvent(EVENT_TAIL_SWEEP, 5s); + uint32 GetData(uint32 guid) const override + { + return aGuids.find(guid) == aGuids.end(); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_HEALTH_CHECK: + if (me->HealthBelowPct(26)) + { + Talk(SAY_ENRAGE); + Talk(EMOTE_FRENZY); + me->CastSpell(me, SPELL_ENRAGE, true); + break; + } events.ScheduleEvent(EVENT_HEALTH_CHECK, 1s); - events.ScheduleEvent(EVENT_ACHIEVEMENT_CHECK, 1s); - } - - void JustDied(Unit* killer) override + break; + case EVENT_ACHIEVEMENT_CHECK: { - Talk(SAY_DEATH); - BossAI::JustDied(killer); + Map::PlayerList const& pList = me->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) + if (Aura* aur = itr->GetSource()->GetAura(SPELL_INTENSE_COLD_TRIGGER)) + if (aur->GetStackAmount() > 2) + aGuids.insert(itr->GetSource()->GetGUID().GetCounter()); + events.ScheduleEvent(EVENT_ACHIEVEMENT_CHECK, 500ms); + break; + } + case EVENT_CRYSTALFIRE_BREATH: + me->CastSpell(me->GetVictim(), SPELL_CRYSTALFIRE_BREATH, false); + events.ScheduleEvent(EVENT_CRYSTALFIRE_BREATH, 14s); + break; + case EVENT_TAIL_SWEEP: + me->CastSpell(me, SPELL_TAIL_SWEEP, false); + events.ScheduleEvent(EVENT_TAIL_SWEEP, 5s); + break; + case EVENT_CRYSTAL_CHAINS: + Talk(SAY_CRYSTAL_NOVA); + if (IsHeroic()) + me->CastSpell(me, SPELL_CRYSTALIZE, false); + else if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true)) + me->CastSpell(target, SPELL_CRYSTAL_CHAINS, false); + events.ScheduleEvent(EVENT_CRYSTAL_CHAINS, DUNGEON_MODE(20000, 11000)); + break; } - void KilledUnit(Unit*) override - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) - { - Talk(SAY_SLAY); - events.ScheduleEvent(EVENT_KILL_TALK, 6s); - } - } - - void SetData(uint32 type, uint32) override - { - if (type == me->GetEntry() && CanRemovePrison()) - RemovePrison(true); - } - - bool CanRemovePrison() - { - for (uint8 i = DATA_TELESTRA_ORB; i <= DATA_ORMOROK_ORB; ++i) - if (instance->GetBossState(i) != DONE) - return false; - return true; - } - - void RemovePrison(bool remove) - { - if (remove) - { - me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - me->RemoveAurasDueToSpell(SPELL_FROZEN_PRISON); - } - else - { - me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - me->CastSpell(me, SPELL_FROZEN_PRISON, true); - } - } - - uint32 GetData(uint32 guid) const override - { - return aGuids.find(guid) == aGuids.end(); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_HEALTH_CHECK: - if (me->HealthBelowPct(26)) - { - Talk(SAY_ENRAGE); - Talk(EMOTE_FRENZY); - me->CastSpell(me, SPELL_ENRAGE, true); - break; - } - events.ScheduleEvent(EVENT_HEALTH_CHECK, 1s); - break; - case EVENT_ACHIEVEMENT_CHECK: - { - Map::PlayerList const& pList = me->GetMap()->GetPlayers(); - for(Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) - if (Aura* aur = itr->GetSource()->GetAura(SPELL_INTENSE_COLD_TRIGGER)) - if (aur->GetStackAmount() > 2) - aGuids.insert(itr->GetSource()->GetGUID().GetCounter()); - events.ScheduleEvent(EVENT_ACHIEVEMENT_CHECK, 500ms); - break; - } - case EVENT_CRYSTALFIRE_BREATH: - me->CastSpell(me->GetVictim(), SPELL_CRYSTALFIRE_BREATH, false); - events.ScheduleEvent(EVENT_CRYSTALFIRE_BREATH, 14s); - break; - case EVENT_TAIL_SWEEP: - me->CastSpell(me, SPELL_TAIL_SWEEP, false); - events.ScheduleEvent(EVENT_TAIL_SWEEP, 5s); - break; - case EVENT_CRYSTAL_CHAINS: - Talk(SAY_CRYSTAL_NOVA); - if (IsHeroic()) - me->CastSpell(me, SPELL_CRYSTALIZE, false); - else if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true)) - me->CastSpell(target, SPELL_CRYSTAL_CHAINS, false); - events.ScheduleEvent(EVENT_CRYSTAL_CHAINS, DUNGEON_MODE(20000, 11000)); - break; - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } }; class achievement_intense_cold : public AchievementCriteriaScript { public: - achievement_intense_cold() : AchievementCriteriaScript("achievement_intense_cold") - { - } + achievement_intense_cold() : AchievementCriteriaScript("achievement_intense_cold") { } bool OnCheck(Player* player, Unit* target, uint32 /*criteria_id*/) override { @@ -213,6 +198,6 @@ public: void AddSC_boss_keristrasza() { - new boss_keristrasza(); + RegisterNexusCreatureAI(boss_keristrasza); new achievement_intense_cold(); } 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 162579292..e0c82fd6e 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp @@ -79,159 +79,146 @@ enum Events EVENT_KILL_TALK = 9 }; -class boss_magus_telestra : public CreatureScript +struct boss_magus_telestra : public BossAI { -public: - boss_magus_telestra() : CreatureScript("boss_magus_telestra") { } + boss_magus_telestra(Creature* creature) : BossAI(creature, DATA_MAGUS_TELESTRA_EVENT) { } - CreatureAI* GetAI(Creature* creature) const override + uint8 copiesDied; + bool achievement; + + void Reset() override { - return GetNexusAI(creature); + BossAI::Reset(); + copiesDied = 0; + achievement = true; + + if (IsHeroic() && sGameEventMgr->IsActiveEvent(GAME_EVENT_WINTER_VEIL) && !me->HasAura(SPELL_WEAR_CHRISTMAS_HAT)) + me->AddAura(SPELL_WEAR_CHRISTMAS_HAT, me); } - struct boss_magus_telestraAI : public BossAI + uint32 GetData(uint32 data) const override { - boss_magus_telestraAI(Creature* creature) : BossAI(creature, DATA_MAGUS_TELESTRA_EVENT) + if (data == me->GetEntry()) + return achievement; + return 0; + } + + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + Talk(SAY_AGGRO); + + events.ScheduleEvent(EVENT_MAGUS_ICE_NOVA, 10s); + events.ScheduleEvent(EVENT_MAGUS_FIREBOMB, 0ms); + events.ScheduleEvent(EVENT_MAGUS_GRAVITY_WELL, 20s); + events.ScheduleEvent(EVENT_MAGUS_HEALTH1, 1s); + if (IsHeroic()) + events.ScheduleEvent(EVENT_MAGUS_HEALTH2, 1s); + } + + void AttackStart(Unit* who) override + { + if (who && me->Attack(who, true)) + me->GetMotionMaster()->MoveChase(who, 20.0f); + } + + void JustDied(Unit* killer) override + { + BossAI::JustDied(killer); + Talk(SAY_DEATH); + } + + void KilledUnit(Unit*) override + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) { + Talk(SAY_KILL); + events.ScheduleEvent(EVENT_KILL_TALK, 6s); } + } - uint8 copiesDied; - bool achievement; + void JustSummoned(Creature* summon) override + { + summons.Summon(summon); + summon->SetInCombatWithZone(); + } - void Reset() override + void SpellHit(Unit* caster, SpellInfo const* spellInfo) override + { + if (spellInfo->Id >= SPELL_FIRE_MAGUS_DEATH && spellInfo->Id <= SPELL_ARCANE_MAGUS_DEATH && caster->ToCreature()) { - BossAI::Reset(); - copiesDied = 0; - achievement = true; + events.ScheduleEvent(EVENT_MAGUS_FAIL_ACHIEVEMENT, 5s); + caster->ToCreature()->DespawnOrUnsummon(1000); - if (IsHeroic() && sGameEventMgr->IsActiveEvent(GAME_EVENT_WINTER_VEIL) && !me->HasAura(SPELL_WEAR_CHRISTMAS_HAT)) - me->AddAura(SPELL_WEAR_CHRISTMAS_HAT, me); + if (++copiesDied >= 3) + { + copiesDied = 0; + events.CancelEvent(EVENT_MAGUS_FAIL_ACHIEVEMENT); + events.ScheduleEvent(EVENT_MAGUS_MERGED, 5s); + me->CastSpell(me, SPELL_BURNING_WINDS, true); + } } + } - uint32 GetData(uint32 data) const override + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - if (data == me->GetEntry()) - return achievement; - return 0; - } - - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - Talk(SAY_AGGRO); - - events.ScheduleEvent(EVENT_MAGUS_ICE_NOVA, 10s); - events.ScheduleEvent(EVENT_MAGUS_FIREBOMB, 0ms); - events.ScheduleEvent(EVENT_MAGUS_GRAVITY_WELL, 20s); + case EVENT_MAGUS_HEALTH1: + if (me->HealthBelowPct(51)) + { + me->CastSpell(me, SPELL_START_SUMMON_CLONES, false); + events.ScheduleEvent(EVENT_MAGUS_RELOCATE, 3500ms); + Talk(SAY_SPLIT); + break; + } events.ScheduleEvent(EVENT_MAGUS_HEALTH1, 1s); - if (IsHeroic()) - events.ScheduleEvent(EVENT_MAGUS_HEALTH2, 1s); - } - - void AttackStart(Unit* who) override - { - if (who && me->Attack(who, true)) - me->GetMotionMaster()->MoveChase(who, 20.0f); - } - - void JustDied(Unit* killer) override - { - BossAI::JustDied(killer); - Talk(SAY_DEATH); - } - - void KilledUnit(Unit*) override - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + break; + case EVENT_MAGUS_HEALTH2: + if (me->HealthBelowPct(11)) { - Talk(SAY_KILL); - events.ScheduleEvent(EVENT_KILL_TALK, 6s); + me->CastSpell(me, SPELL_START_SUMMON_CLONES, false); + events.ScheduleEvent(EVENT_MAGUS_RELOCATE, 3500ms); + Talk(SAY_SPLIT); + break; } + events.ScheduleEvent(EVENT_MAGUS_HEALTH2, 1s); + break; + case EVENT_MAGUS_FIREBOMB: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + me->CastSpell(target, SPELL_FIREBOMB, false); + events.ScheduleEvent(EVENT_MAGUS_FIREBOMB, 3s); + break; + case EVENT_MAGUS_ICE_NOVA: + me->CastSpell(me, SPELL_ICE_NOVA, false); + events.ScheduleEvent(EVENT_MAGUS_ICE_NOVA, 15s); + break; + case EVENT_MAGUS_GRAVITY_WELL: + me->CastSpell(me, SPELL_GRAVITY_WELL, false); + events.ScheduleEvent(EVENT_MAGUS_GRAVITY_WELL, 15s); + break; + case EVENT_MAGUS_FAIL_ACHIEVEMENT: + achievement = false; + break; + case EVENT_MAGUS_RELOCATE: + me->NearTeleportTo(505.04f, 88.915f, -16.13f, 2.98f); + break; + case EVENT_MAGUS_MERGED: + me->CastSpell(me, SPELL_TELESTRA_BACK, true); + me->RemoveAllAuras(); + Talk(SAY_MERGE); + break; } - void JustSummoned(Creature* summon) override - { - summons.Summon(summon); - summon->SetInCombatWithZone(); - } - - void SpellHit(Unit* caster, SpellInfo const* spellInfo) override - { - if (spellInfo->Id >= SPELL_FIRE_MAGUS_DEATH && spellInfo->Id <= SPELL_ARCANE_MAGUS_DEATH && caster->ToCreature()) - { - events.ScheduleEvent(EVENT_MAGUS_FAIL_ACHIEVEMENT, 5s); - caster->ToCreature()->DespawnOrUnsummon(1000); - - if (++copiesDied >= 3) - { - copiesDied = 0; - events.CancelEvent(EVENT_MAGUS_FAIL_ACHIEVEMENT); - events.ScheduleEvent(EVENT_MAGUS_MERGED, 5s); - me->CastSpell(me, SPELL_BURNING_WINDS, true); - } - } - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_MAGUS_HEALTH1: - if (me->HealthBelowPct(51)) - { - me->CastSpell(me, SPELL_START_SUMMON_CLONES, false); - events.ScheduleEvent(EVENT_MAGUS_RELOCATE, 3500ms); - Talk(SAY_SPLIT); - break; - } - events.ScheduleEvent(EVENT_MAGUS_HEALTH1, 1s); - break; - case EVENT_MAGUS_HEALTH2: - if (me->HealthBelowPct(11)) - { - me->CastSpell(me, SPELL_START_SUMMON_CLONES, false); - events.ScheduleEvent(EVENT_MAGUS_RELOCATE, 3500ms); - Talk(SAY_SPLIT); - break; - } - events.ScheduleEvent(EVENT_MAGUS_HEALTH2, 1s); - break; - case EVENT_MAGUS_FIREBOMB: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - me->CastSpell(target, SPELL_FIREBOMB, false); - events.ScheduleEvent(EVENT_MAGUS_FIREBOMB, 3s); - break; - case EVENT_MAGUS_ICE_NOVA: - me->CastSpell(me, SPELL_ICE_NOVA, false); - events.ScheduleEvent(EVENT_MAGUS_ICE_NOVA, 15s); - break; - case EVENT_MAGUS_GRAVITY_WELL: - me->CastSpell(me, SPELL_GRAVITY_WELL, false); - events.ScheduleEvent(EVENT_MAGUS_GRAVITY_WELL, 15s); - break; - case EVENT_MAGUS_FAIL_ACHIEVEMENT: - achievement = false; - break; - case EVENT_MAGUS_RELOCATE: - me->NearTeleportTo(505.04f, 88.915f, -16.13f, 2.98f); - break; - case EVENT_MAGUS_MERGED: - me->CastSpell(me, SPELL_TELESTRA_BACK, true); - me->RemoveAllAuras(); - Talk(SAY_MERGE); - break; - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } }; class spell_boss_magus_telestra_summon_telestra_clones_aura : public AuraScript @@ -331,7 +318,7 @@ public: void AddSC_boss_magus_telestra() { - new boss_magus_telestra(); + RegisterNexusCreatureAI(boss_magus_telestra); 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/Nexus/boss_ormorok.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp index 66dd21655..82b36095d 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_ormorok.cpp @@ -60,173 +60,147 @@ enum Misc GO_CRYSTAL_SPIKE = 188537 }; -class boss_ormorok : public CreatureScript +struct boss_ormorok : public BossAI { -public: - boss_ormorok() : CreatureScript("boss_ormorok") { } + boss_ormorok(Creature* creature) : BossAI(creature, DATA_ORMOROK_EVENT) {} - CreatureAI* GetAI(Creature* creature) const override + uint8 _spikesCount; + + void Reset() override { - return GetNexusAI(creature); + _spikesCount = 0; + BossAI::Reset(); } - struct boss_ormorokAI : public BossAI + void JustEngagedWith(Unit* who) override { - boss_ormorokAI(Creature* creature) : BossAI(creature, DATA_ORMOROK_EVENT) + Talk(SAY_AGGRO); + BossAI::JustEngagedWith(who); + + events.ScheduleEvent(EVENT_ORMOROK_CRYSTAL_SPIKES, 12s); + events.ScheduleEvent(EVENT_ORMOROK_TRAMPLE, 10s); + events.ScheduleEvent(EVENT_ORMOROK_SPELL_REFLECTION, 30s); + events.ScheduleEvent(EVENT_ORMOROK_HEALTH, 1s); + if (IsHeroic()) + events.ScheduleEvent(EVENT_ORMOROK_SUMMON, 17s); + } + + void JustDied(Unit* killer) override + { + Talk(SAY_DEATH); + BossAI::JustDied(killer); + } + + void KilledUnit(Unit* /*victim*/) override + { + if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) { + Talk(SAY_KILL); + events.ScheduleEvent(EVENT_KILL_TALK, 6s); } + } - uint8 _spikesCount; + void JustSummoned(Creature* summon) override + { + summons.Summon(summon); + } - void Reset() override + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - _spikesCount = 0; - BossAI::Reset(); - } - - void JustEngagedWith(Unit* who) override - { - Talk(SAY_AGGRO); - BossAI::JustEngagedWith(who); - - events.ScheduleEvent(EVENT_ORMOROK_CRYSTAL_SPIKES, 12s); - events.ScheduleEvent(EVENT_ORMOROK_TRAMPLE, 10s); - events.ScheduleEvent(EVENT_ORMOROK_SPELL_REFLECTION, 30s); + case EVENT_ORMOROK_HEALTH: + if (me->HealthBelowPct(26)) + { + me->CastSpell(me, SPELL_FRENZY, true); + Talk(EMOTE_FRENZY); + break; + } events.ScheduleEvent(EVENT_ORMOROK_HEALTH, 1s); - if (IsHeroic()) - events.ScheduleEvent(EVENT_ORMOROK_SUMMON, 17s); - } - - void JustDied(Unit* killer) override - { - Talk(SAY_DEATH); - BossAI::JustDied(killer); - } - - void KilledUnit(Unit* /*victim*/) override - { - if (events.GetNextEventTime(EVENT_KILL_TALK) == 0) + break; + case EVENT_ORMOROK_TRAMPLE: + me->CastSpell(me, SPELL_TRAMPLE, false); + events.ScheduleEvent(EVENT_ORMOROK_TRAMPLE, 10s); + break; + case EVENT_ORMOROK_SPELL_REFLECTION: + Talk(SAY_REFLECT); + me->CastSpell(me, SPELL_SPELL_REFLECTION, false); + events.ScheduleEvent(EVENT_ORMOROK_SPELL_REFLECTION, 30s); + break; + case EVENT_ORMOROK_SUMMON: + if (Unit* target = SelectTarget(SelectTargetMethod::MinDistance, 0, 50.0f, true)) + me->CastSpell(target, SPELL_SUMMON_CRYSTALLINE_TANGLER, true); + events.ScheduleEvent(EVENT_ORMOROK_SUMMON, 17s); + break; + case EVENT_ORMOROK_CRYSTAL_SPIKES: + Talk(SAY_CRYSTAL_SPIKES); + me->CastSpell(me, SPELL_CRYSTAL_SPIKES, false); + _spikesCount = 0; + events.ScheduleEvent(EVENT_ORMOROK_SUMMON_SPIKES, 300ms); + events.ScheduleEvent(EVENT_ORMOROK_CRYSTAL_SPIKES, 20s); + break; + case EVENT_ORMOROK_SUMMON_SPIKES: + if (++_spikesCount > 9) + break; + for (uint8 i = 0; i < 4; ++i) { - Talk(SAY_KILL); - events.ScheduleEvent(EVENT_KILL_TALK, 6s); + float o = rand_norm() * 2.0f * M_PI; + float x = me->GetPositionX() + 5.0f * _spikesCount * cos(o); + float y = me->GetPositionY() + 5.0f * _spikesCount * std::sin(o); + float h = me->GetMapHeight(x, y, me->GetPositionZ()); + + if (h != INVALID_HEIGHT) + me->SummonCreature(NPC_CRYSTAL_SPIKE, x, y, h, 0, TEMPSUMMON_TIMED_DESPAWN, 7000); } + events.ScheduleEvent(EVENT_ORMOROK_SUMMON_SPIKES, 200ms); + break; } - void JustSummoned(Creature* summon) override - { - summons.Summon(summon); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_ORMOROK_HEALTH: - if (me->HealthBelowPct(26)) - { - me->CastSpell(me, SPELL_FRENZY, true); - Talk(EMOTE_FRENZY); - break; - } - events.ScheduleEvent(EVENT_ORMOROK_HEALTH, 1s); - break; - case EVENT_ORMOROK_TRAMPLE: - me->CastSpell(me, SPELL_TRAMPLE, false); - events.ScheduleEvent(EVENT_ORMOROK_TRAMPLE, 10s); - break; - case EVENT_ORMOROK_SPELL_REFLECTION: - Talk(SAY_REFLECT); - me->CastSpell(me, SPELL_SPELL_REFLECTION, false); - events.ScheduleEvent(EVENT_ORMOROK_SPELL_REFLECTION, 30s); - break; - case EVENT_ORMOROK_SUMMON: - if (Unit* target = SelectTarget(SelectTargetMethod::MinDistance, 0, 50.0f, true)) - me->CastSpell(target, SPELL_SUMMON_CRYSTALLINE_TANGLER, true); - events.ScheduleEvent(EVENT_ORMOROK_SUMMON, 17s); - break; - case EVENT_ORMOROK_CRYSTAL_SPIKES: - Talk(SAY_CRYSTAL_SPIKES); - me->CastSpell(me, SPELL_CRYSTAL_SPIKES, false); - _spikesCount = 0; - events.ScheduleEvent(EVENT_ORMOROK_SUMMON_SPIKES, 300ms); - events.ScheduleEvent(EVENT_ORMOROK_CRYSTAL_SPIKES, 20s); - break; - case EVENT_ORMOROK_SUMMON_SPIKES: - if (++_spikesCount > 9) - break; - for (uint8 i = 0; i < 4; ++i) - { - float o = rand_norm() * 2.0f * M_PI; - float x = me->GetPositionX() + 5.0f * _spikesCount * cos(o); - float y = me->GetPositionY() + 5.0f * _spikesCount * std::sin(o); - float h = me->GetMapHeight(x, y, me->GetPositionZ()); - - if (h != INVALID_HEIGHT) - me->SummonCreature(NPC_CRYSTAL_SPIKE, x, y, h, 0, TEMPSUMMON_TIMED_DESPAWN, 7000); - } - events.ScheduleEvent(EVENT_ORMOROK_SUMMON_SPIKES, 200ms); - break; - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } }; -class npc_crystal_spike : public CreatureScript +struct npc_crystal_spike : public NullCreatureAI { -public: - npc_crystal_spike() : CreatureScript("npc_crystal_spike") { } + npc_crystal_spike(Creature* c) : NullCreatureAI(c) { } - CreatureAI* GetAI(Creature* pCreature) const override + int32 _damageTimer; + ObjectGuid _gameObjectGUID; + + void Reset() override { - return GetNexusAI(pCreature); + if (GameObject* gameobject = me->SummonGameObject(GO_CRYSTAL_SPIKE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 3500)) + _gameObjectGUID = gameobject->GetGUID(); + + _damageTimer = 1; } - struct npc_crystal_spikeAI : public NullCreatureAI + void UpdateAI(uint32 diff) override { - npc_crystal_spikeAI(Creature* c) : NullCreatureAI(c) + if (_damageTimer) { - } - - int32 _damageTimer; - ObjectGuid _gameObjectGUID; - - void Reset() override - { - if (GameObject* gameobject = me->SummonGameObject(GO_CRYSTAL_SPIKE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 3500)) - _gameObjectGUID = gameobject->GetGUID(); - - _damageTimer = 1; - } - - void UpdateAI(uint32 diff) override - { - if (_damageTimer) + _damageTimer += diff; + if (_damageTimer >= 2000) { - _damageTimer += diff; - if (_damageTimer >= 2000) - { - if (GameObject* gameobject = ObjectAccessor::GetGameObject(*me, _gameObjectGUID)) - gameobject->SetGoState(GO_STATE_ACTIVE); + if (GameObject* gameobject = ObjectAccessor::GetGameObject(*me, _gameObjectGUID)) + gameobject->SetGoState(GO_STATE_ACTIVE); - me->CastSpell(me, SPELL_CRYSTAL_SPIKE_DAMAGE, false); - _damageTimer = 0; - } + me->CastSpell(me, SPELL_CRYSTAL_SPIKE_DAMAGE, false); + _damageTimer = 0; } } - }; + } }; void AddSC_boss_ormorok() { - new boss_ormorok(); - new npc_crystal_spike(); + RegisterNexusCreatureAI(boss_ormorok); + RegisterNexusCreatureAI(npc_crystal_spike); } diff --git a/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp b/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp index aa22aede4..658e903f9 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/instance_nexus.cpp @@ -166,110 +166,97 @@ enum eFrayer SPELL_ENSNARE = 48053 }; -class npc_crystalline_frayer : public CreatureScript +struct npc_crystalline_frayer : public ScriptedAI { -public: - npc_crystalline_frayer() : CreatureScript("npc_crystalline_frayer") { } + npc_crystalline_frayer(Creature* creature) : ScriptedAI(creature) { } - CreatureAI* GetAI(Creature* creature) const override + bool _allowDeath; + uint32 restoreTimer; + uint32 abilityTimer1; + uint32 abilityTimer2; + + void Reset() override { - return GetNexusAI(creature); + restoreTimer = 0; + abilityTimer1 = 0; + abilityTimer2 = 30000; + me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); + me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); } - struct npc_crystalline_frayerAI : public ScriptedAI + void JustEngagedWith(Unit*) override { - npc_crystalline_frayerAI(Creature* creature) : ScriptedAI(creature) + _allowDeath = me->GetInstanceScript()->GetBossState(DATA_ORMOROK_EVENT) == DONE; + } + + void EnterEvadeMode(EvadeReason why) override + { + if (me->isRegeneratingHealth()) + ScriptedAI::EnterEvadeMode(why); + } + + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override + { + if (damage >= me->GetHealth()) { + if (!_allowDeath) + { + me->RemoveAllAuras(); + me->GetThreatMgr().ClearAllThreat(); + me->CombatStop(true); + damage = 0; + + me->SetReactState(REACT_PASSIVE); + me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); + me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); + me->SetRegeneratingHealth(false); + me->CastSpell(me, SPELL_SUMMON_SEED_POD, true); + me->CastSpell(me, SPELL_SEED_POD, true); + me->CastSpell(me, SPELL_AURA_OF_REGENERATION, false); + restoreTimer = 1; + } + } + } + + void UpdateAI(uint32 diff) override + { + if (restoreTimer) + { + restoreTimer += diff; + if (restoreTimer >= 90 * IN_MILLISECONDS) + { + Talk(0); + me->SetRegeneratingHealth(true); + restoreTimer = 0; + me->SetReactState(REACT_AGGRESSIVE); + me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); + me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); + } + return; } - bool _allowDeath; - uint32 restoreTimer; - uint32 abilityTimer1; - uint32 abilityTimer2; + if (!UpdateVictim()) + return; - void Reset() override + abilityTimer1 += diff; + abilityTimer2 += diff; + + if (abilityTimer1 >= 5000) { - restoreTimer = 0; + me->CastSpell(me->GetVictim(), SPELL_ENSNARE, false); abilityTimer1 = 0; - abilityTimer2 = 30000; - me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); } - void JustEngagedWith(Unit*) override + if (abilityTimer2 >= 30000) { - _allowDeath = me->GetInstanceScript()->GetBossState(DATA_ORMOROK_EVENT) == DONE; + me->CastSpell(me->GetVictim(), SPELL_CRYSTAL_BLOOM, false); + abilityTimer2 = 0; } - - void EnterEvadeMode(EvadeReason why) override - { - if (me->isRegeneratingHealth()) - ScriptedAI::EnterEvadeMode(why); - } - - void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override - { - if (damage >= me->GetHealth()) - { - if (!_allowDeath) - { - me->RemoveAllAuras(); - me->GetThreatMgr().ClearAllThreat(); - me->CombatStop(true); - damage = 0; - - me->SetReactState(REACT_PASSIVE); - me->SetUnitFlag(UNIT_FLAG_NOT_SELECTABLE); - me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - me->SetRegeneratingHealth(false); - me->CastSpell(me, SPELL_SUMMON_SEED_POD, true); - me->CastSpell(me, SPELL_SEED_POD, true); - me->CastSpell(me, SPELL_AURA_OF_REGENERATION, false); - restoreTimer = 1; - } - } - } - - void UpdateAI(uint32 diff) override - { - if (restoreTimer) - { - restoreTimer += diff; - if (restoreTimer >= 90 * IN_MILLISECONDS) - { - Talk(0); - me->SetRegeneratingHealth(true); - restoreTimer = 0; - me->SetReactState(REACT_AGGRESSIVE); - me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE); - me->RemoveUnitFlag(UNIT_FLAG_NOT_SELECTABLE); - } - return; - } - - if (!UpdateVictim()) - return; - - abilityTimer1 += diff; - abilityTimer2 += diff; - - if (abilityTimer1 >= 5000) - { - me->CastSpell(me->GetVictim(), SPELL_ENSNARE, false); - abilityTimer1 = 0; - } - - if (abilityTimer2 >= 30000) - { - me->CastSpell(me->GetVictim(), SPELL_CRYSTAL_BLOOM, false); - abilityTimer2 = 0; - } - } - }; + } }; void AddSC_instance_nexus() { new instance_nexus(); - new npc_crystalline_frayer(); + RegisterNexusCreatureAI(npc_crystalline_frayer); } diff --git a/src/server/scripts/Northrend/Nexus/Nexus/nexus.h b/src/server/scripts/Northrend/Nexus/Nexus/nexus.h index dbc87982a..43099ce51 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/nexus.h +++ b/src/server/scripts/Northrend/Nexus/Nexus/nexus.h @@ -62,4 +62,6 @@ inline AI* GetNexusAI(T* obj) return GetInstanceAI(obj, NexusScriptName); } +#define RegisterNexusCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetNexusAI) + #endif