From 8fbed6c30e5862cf2ee475238531d2fe17abdeda Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Wed, 15 Nov 2023 21:04:14 -0300 Subject: [PATCH] refactor(Scripts/MagistersTerrace): Update scripts to new register model (#17725) --- .../boss_felblood_kaelthas.cpp | 420 +++-- .../boss_priestess_delrissa.cpp | 1423 ++++++++--------- .../MagistersTerrace/boss_selin_fireheart.cpp | 313 ++-- .../MagistersTerrace/boss_vexallus.cpp | 209 ++- 4 files changed, 1111 insertions(+), 1254 deletions(-) diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp index 182b4588b..8a5b4404e 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_felblood_kaelthas.cpp @@ -76,259 +76,237 @@ enum Misc CREATURE_ARCANE_SPHERE = 24708 }; -class boss_felblood_kaelthas : public CreatureScript +struct boss_felblood_kaelthas : public ScriptedAI { -public: - boss_felblood_kaelthas() : CreatureScript("boss_felblood_kaelthas") { } - - CreatureAI* GetAI(Creature* creature) const override + boss_felblood_kaelthas(Creature* creature) : ScriptedAI(creature), summons(me) { - return GetMagistersTerraceAI(creature); + instance = creature->GetInstanceScript(); + introSpeak = false; } - struct boss_felblood_kaelthasAI : public ScriptedAI + InstanceScript* instance; + EventMap events; + EventMap events2; + SummonList summons; + bool introSpeak; + + void Reset() override { - boss_felblood_kaelthasAI(Creature* creature) : ScriptedAI(creature), summons(me) + events.Reset(); + summons.DespawnAll(); + me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, false); + instance->SetBossState(DATA_KAELTHAS, NOT_STARTED); + me->SetImmuneToAll(false); + } + + void JustSummoned(Creature* summon) override + { + for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) + if (*itr == summon->GetGUID()) + return; + summons.Summon(summon); + } + + void InitializeAI() override + { + ScriptedAI::InitializeAI(); + me->SetImmuneToAll(true); + } + + void JustDied(Unit*) override + { + instance->SetBossState(DATA_KAELTHAS, DONE); + + if (GameObject* orb = instance->GetGameObject(DATA_ESCAPE_ORB)) { - instance = creature->GetInstanceScript(); - introSpeak = false; + orb->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE); + } + } + + void JustEngagedWith(Unit* /*who*/) override + { + instance->SetBossState(DATA_KAELTHAS, IN_PROGRESS); + me->SetInCombatWithZone(); + + events.ScheduleEvent(EVENT_SPELL_FIREBALL, 0); + events.ScheduleEvent(EVENT_SPELL_PHOENIX, 15000); + events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 22000); + events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); + + if (IsHeroic()) + events.ScheduleEvent(EVENT_SPELL_SHOCK_BARRIER, 50000); + } + + void MoveInLineOfSight(Unit* who) override + { + if (!introSpeak && me->IsWithinDistInMap(who, 40.0f) && who->GetTypeId() == TYPEID_PLAYER) + { + Talk(SAY_AGGRO); + introSpeak = true; + events2.ScheduleEvent(EVENT_INIT_COMBAT, 35000); } - InstanceScript* instance; - EventMap events; - EventMap events2; - SummonList summons; - bool introSpeak; + ScriptedAI::MoveInLineOfSight(who); + } - void Reset() override + void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override + { + if (damage >= me->GetHealth()) { - events.Reset(); - summons.DespawnAll(); - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, false); - instance->SetBossState(DATA_KAELTHAS, NOT_STARTED); + damage = me->GetHealth() - 1; + if (me->isRegeneratingHealth()) + { + me->SetRegeneratingHealth(false); + me->SetUnitFlag(UNIT_FLAG_DISABLE_MOVE); + me->SetImmuneToAll(true); + me->CombatStop(); + me->SetReactState(REACT_PASSIVE); + LapseAction(ACTION_REMOVE_FLY); + events.Reset(); + events2.ScheduleEvent(EVENT_FINISH_TALK, 6000); + Talk(SAY_DEATH); + } + } + } + + void LapseAction(uint8 action) + { + uint8 counter = 0; + Map::PlayerList const& playerList = me->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr, ++counter) + if (Player* player = itr->GetSource()) + { + if (action == ACTION_TELEPORT_PLAYERS) + me->CastSpell(player, SPELL_GRAVITY_LAPSE_PLAYER + counter, true); + else if (action == ACTION_KNOCKUP) + player->CastSpell(player, SPELL_GRAVITY_LAPSE_DOT, true, nullptr, nullptr, me->GetGUID()); + else if (action == ACTION_ALLOW_FLY) + player->CastSpell(player, SPELL_GRAVITY_LAPSE_FLY, true, nullptr, nullptr, me->GetGUID()); + else if (action == ACTION_REMOVE_FLY) + { + player->RemoveAurasDueToSpell(SPELL_GRAVITY_LAPSE_FLY); + player->RemoveAurasDueToSpell(SPELL_GRAVITY_LAPSE_DOT); + } + } + } + + void UpdateAI(uint32 diff) override + { + events2.Update(diff); + switch (events2.ExecuteEvent()) + { + case EVENT_INIT_COMBAT: me->SetImmuneToAll(false); + if (Unit* target = SelectTargetFromPlayerList(50.0f)) + AttackStart(target); + return; + case EVENT_FINISH_TALK: + me->KillSelf(); + return; } - void JustSummoned(Creature* summon) override - { - for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) - if (*itr == summon->GetGUID()) - return; - summons.Summon(summon); - } + if (!UpdateVictim()) + return; - void InitializeAI() override - { - ScriptedAI::InitializeAI(); - me->SetImmuneToAll(true); - } + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - void JustDied(Unit*) override + switch (uint32 eventId = events.ExecuteEvent()) { - instance->SetBossState(DATA_KAELTHAS, DONE); - - if (GameObject* orb = instance->GetGameObject(DATA_ESCAPE_ORB)) + case EVENT_SPELL_FIREBALL: + me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_FIREBALL_N, SPELL_FIREBALL_H), false); + events.ScheduleEvent(EVENT_SPELL_FIREBALL, urand(3000, 4500)); + break; + case EVENT_SPELL_FLAMESTRIKE: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true)) { - orb->RemoveGameObjectFlag(GO_FLAG_NOT_SELECTABLE); + me->CastSpell(target, SPELL_FLAMESTRIKE_SUMMON, true); + Talk(SAY_FLAMESTRIKE); } - } - - void JustEngagedWith(Unit* /*who*/) override - { - instance->SetBossState(DATA_KAELTHAS, IN_PROGRESS); - me->SetInCombatWithZone(); - - events.ScheduleEvent(EVENT_SPELL_FIREBALL, 0); - events.ScheduleEvent(EVENT_SPELL_PHOENIX, 15000); - events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 22000); - events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000); - - if (IsHeroic()) - events.ScheduleEvent(EVENT_SPELL_SHOCK_BARRIER, 50000); - } - - void MoveInLineOfSight(Unit* who) override - { - if (!introSpeak && me->IsWithinDistInMap(who, 40.0f) && who->GetTypeId() == TYPEID_PLAYER) + events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 25000); + break; + case EVENT_SPELL_SHOCK_BARRIER: + me->CastSpell(me, SPELL_SHOCK_BARRIER, true); + me->CastCustomSpell(SPELL_PYROBLAST, SPELLVALUE_MAX_TARGETS, 1, (Unit*)nullptr, false); + events.ScheduleEvent(EVENT_SPELL_SHOCK_BARRIER, 50000); + break; + case EVENT_SPELL_PHOENIX: + Talk(SAY_PHOENIX); + me->CastSpell(me, SPELL_PHOENIX, false); + events.ScheduleEvent(EVENT_SPELL_PHOENIX, 60000); + break; + case EVENT_CHECK_HEALTH: + if (HealthBelowPct(50)) { - Talk(SAY_AGGRO); - introSpeak = true; - events2.ScheduleEvent(EVENT_INIT_COMBAT, 35000); - } + me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, true); + me->CastSpell(me, SPELL_TELEPORT_CENTER, true); + events.Reset(); - ScriptedAI::MoveInLineOfSight(who); + me->StopMoving(); + me->GetMotionMaster()->Clear(); + me->GetMotionMaster()->MoveIdle(); + + events.SetPhase(1); + events.ScheduleEvent(EVENT_GRAVITY_LAPSE_1_1, 0); + break; + } + events.ScheduleEvent(EVENT_CHECK_HEALTH, 500); + break; + case EVENT_GRAVITY_LAPSE_1_1: + case EVENT_GRAVITY_LAPSE_1_2: + Talk(eventId == EVENT_GRAVITY_LAPSE_1_1 ? SAY_GRAVITY_LAPSE : SAY_RECAST_GRAVITY); + me->CastSpell(me, SPELL_GRAVITY_LAPSE_INITIAL, false); + events.ScheduleEvent(EVENT_GRAVITY_LAPSE_2, 2000); + break; + case EVENT_GRAVITY_LAPSE_2: + LapseAction(ACTION_TELEPORT_PLAYERS); + events.ScheduleEvent(EVENT_GRAVITY_LAPSE_3, 1000); + break; + case EVENT_GRAVITY_LAPSE_3: + LapseAction(ACTION_KNOCKUP); + events.ScheduleEvent(EVENT_GRAVITY_LAPSE_4, 1000); + break; + case EVENT_GRAVITY_LAPSE_4: + LapseAction(ACTION_ALLOW_FLY); + for (uint8 i = 0; i < 3; ++i) + me->CastSpell(me, SPELL_SUMMON_ARCANE_SPHERE, true); + + me->CastSpell(me, SPELL_GRAVITY_LAPSE_CHANNEL, false); + events.ScheduleEvent(EVENT_GRAVITY_LAPSE_5, 30000); + break; + case EVENT_GRAVITY_LAPSE_5: + LapseAction(ACTION_REMOVE_FLY); + me->InterruptNonMeleeSpells(false); + Talk(SAY_TIRED); + me->CastSpell(me, SPELL_POWER_FEEDBACK, false); + events.ScheduleEvent(EVENT_GRAVITY_LAPSE_1_2, 10000); + break; } - void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override - { - if (damage >= me->GetHealth()) - { - damage = me->GetHealth() - 1; - if (me->isRegeneratingHealth()) - { - me->SetRegeneratingHealth(false); - me->SetUnitFlag(UNIT_FLAG_DISABLE_MOVE); - me->SetImmuneToAll(true); - me->CombatStop(); - me->SetReactState(REACT_PASSIVE); - LapseAction(ACTION_REMOVE_FLY); - events.Reset(); - events2.ScheduleEvent(EVENT_FINISH_TALK, 6000); - Talk(SAY_DEATH); - } - } - } - - void LapseAction(uint8 action) - { - uint8 counter = 0; - Map::PlayerList const& playerList = me->GetMap()->GetPlayers(); - for (Map::PlayerList::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr, ++counter) - if (Player* player = itr->GetSource()) - { - if (action == ACTION_TELEPORT_PLAYERS) - me->CastSpell(player, SPELL_GRAVITY_LAPSE_PLAYER + counter, true); - else if (action == ACTION_KNOCKUP) - player->CastSpell(player, SPELL_GRAVITY_LAPSE_DOT, true, nullptr, nullptr, me->GetGUID()); - else if (action == ACTION_ALLOW_FLY) - player->CastSpell(player, SPELL_GRAVITY_LAPSE_FLY, true, nullptr, nullptr, me->GetGUID()); - else if (action == ACTION_REMOVE_FLY) - { - player->RemoveAurasDueToSpell(SPELL_GRAVITY_LAPSE_FLY); - player->RemoveAurasDueToSpell(SPELL_GRAVITY_LAPSE_DOT); - } - } - } - - void UpdateAI(uint32 diff) override - { - events2.Update(diff); - switch (events2.ExecuteEvent()) - { - case EVENT_INIT_COMBAT: - me->SetImmuneToAll(false); - if (Unit* target = SelectTargetFromPlayerList(50.0f)) - AttackStart(target); - return; - case EVENT_FINISH_TALK: - me->KillSelf(); - return; - } - - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (uint32 eventId = events.ExecuteEvent()) - { - case EVENT_SPELL_FIREBALL: - me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_FIREBALL_N, SPELL_FIREBALL_H), false); - events.ScheduleEvent(EVENT_SPELL_FIREBALL, urand(3000, 4500)); - break; - case EVENT_SPELL_FLAMESTRIKE: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true)) - { - me->CastSpell(target, SPELL_FLAMESTRIKE_SUMMON, true); - Talk(SAY_FLAMESTRIKE); - } - events.ScheduleEvent(EVENT_SPELL_FLAMESTRIKE, 25000); - break; - case EVENT_SPELL_SHOCK_BARRIER: - me->CastSpell(me, SPELL_SHOCK_BARRIER, true); - me->CastCustomSpell(SPELL_PYROBLAST, SPELLVALUE_MAX_TARGETS, 1, (Unit*)nullptr, false); - events.ScheduleEvent(EVENT_SPELL_SHOCK_BARRIER, 50000); - break; - case EVENT_SPELL_PHOENIX: - Talk(SAY_PHOENIX); - me->CastSpell(me, SPELL_PHOENIX, false); - events.ScheduleEvent(EVENT_SPELL_PHOENIX, 60000); - break; - case EVENT_CHECK_HEALTH: - if (HealthBelowPct(50)) - { - me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_INTERRUPT_CAST, true); - me->CastSpell(me, SPELL_TELEPORT_CENTER, true); - events.Reset(); - - me->StopMoving(); - me->GetMotionMaster()->Clear(); - me->GetMotionMaster()->MoveIdle(); - - events.SetPhase(1); - events.ScheduleEvent(EVENT_GRAVITY_LAPSE_1_1, 0); - break; - } - events.ScheduleEvent(EVENT_CHECK_HEALTH, 500); - break; - case EVENT_GRAVITY_LAPSE_1_1: - case EVENT_GRAVITY_LAPSE_1_2: - Talk(eventId == EVENT_GRAVITY_LAPSE_1_1 ? SAY_GRAVITY_LAPSE : SAY_RECAST_GRAVITY); - me->CastSpell(me, SPELL_GRAVITY_LAPSE_INITIAL, false); - events.ScheduleEvent(EVENT_GRAVITY_LAPSE_2, 2000); - break; - case EVENT_GRAVITY_LAPSE_2: - LapseAction(ACTION_TELEPORT_PLAYERS); - events.ScheduleEvent(EVENT_GRAVITY_LAPSE_3, 1000); - break; - case EVENT_GRAVITY_LAPSE_3: - LapseAction(ACTION_KNOCKUP); - events.ScheduleEvent(EVENT_GRAVITY_LAPSE_4, 1000); - break; - case EVENT_GRAVITY_LAPSE_4: - LapseAction(ACTION_ALLOW_FLY); - for (uint8 i = 0; i < 3; ++i) - me->CastSpell(me, SPELL_SUMMON_ARCANE_SPHERE, true); - - me->CastSpell(me, SPELL_GRAVITY_LAPSE_CHANNEL, false); - events.ScheduleEvent(EVENT_GRAVITY_LAPSE_5, 30000); - break; - case EVENT_GRAVITY_LAPSE_5: - LapseAction(ACTION_REMOVE_FLY); - me->InterruptNonMeleeSpells(false); - Talk(SAY_TIRED); - me->CastSpell(me, SPELL_POWER_FEEDBACK, false); - events.ScheduleEvent(EVENT_GRAVITY_LAPSE_1_2, 10000); - break; - } - - if (events.GetPhaseMask() == 0) - DoMeleeAttackIfReady(); - } - }; + if (events.GetPhaseMask() == 0) + DoMeleeAttackIfReady(); + } }; -class spell_mt_phoenix_burn : public SpellScriptLoader +class spell_mt_phoenix_burn : public SpellScript { -public: - spell_mt_phoenix_burn() : SpellScriptLoader("spell_mt_phoenix_burn") { } + PrepareSpellScript(spell_mt_phoenix_burn); - class spell_mt_phoenix_burn_SpellScript : public SpellScript + void HandleAfterCast() { - PrepareSpellScript(spell_mt_phoenix_burn_SpellScript); + uint32 damage = CalculatePct(GetCaster()->GetMaxHealth(), 5); + Unit::DealDamage(GetCaster(), GetCaster(), damage); + } - void HandleAfterCast() - { - uint32 damage = CalculatePct(GetCaster()->GetMaxHealth(), 5); - Unit::DealDamage(GetCaster(), GetCaster(), damage); - } - - void Register() override - { - AfterCast += SpellCastFn(spell_mt_phoenix_burn_SpellScript::HandleAfterCast); - } - }; - - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_mt_phoenix_burn_SpellScript(); + AfterCast += SpellCastFn(spell_mt_phoenix_burn::HandleAfterCast); } }; void AddSC_boss_felblood_kaelthas() { - new boss_felblood_kaelthas(); - new spell_mt_phoenix_burn(); + RegisterMagistersTerraceCreatureAI(boss_felblood_kaelthas); + RegisterSpellScript(spell_mt_phoenix_burn); } diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp index f47af976e..9aafcaa42 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp @@ -21,29 +21,29 @@ enum Yells { - SAY_AGGRO = 0, - SAY_HELPER_DIED = 1, - SAY_PLAYER_KILLED = 5, - SAY_DEATH = 10, + SAY_AGGRO = 0, + SAY_HELPER_DIED = 1, + SAY_PLAYER_KILLED = 5, + SAY_DEATH = 10, }; enum Spells { - SPELL_MEDALION_OF_IMMUNITY = 46227, - SPELL_DISPEL_MAGIC = 27609, - SPELL_FLASH_HEAL = 17843, - SPELL_SHADOW_WORD_PAIN_N = 14032, - SPELL_SHADOW_WORD_PAIN_H = 15654, - SPELL_POWER_WORD_SHIELD_N = 44291, - SPELL_POWER_WORD_SHIELD_H = 46193, - SPELL_RENEW_N = 44174, - SPELL_RENEW_H = 46192, + SPELL_MEDALION_OF_IMMUNITY = 46227, + SPELL_DISPEL_MAGIC = 27609, + SPELL_FLASH_HEAL = 17843, + SPELL_SHADOW_WORD_PAIN_N = 14032, + SPELL_SHADOW_WORD_PAIN_H = 15654, + SPELL_POWER_WORD_SHIELD_N = 44291, + SPELL_POWER_WORD_SHIELD_H = 46193, + SPELL_RENEW_N = 44174, + SPELL_RENEW_H = 46192, }; enum Misc { - MAX_ACTIVE_HELPERS = 4, - MAX_HELPERS_COUNT = 8 + MAX_ACTIVE_HELPERS = 4, + MAX_HELPERS_COUNT = 8 }; const Position helpersLocations[MAX_ACTIVE_HELPERS] = @@ -68,207 +68,196 @@ const uint32 helpersEntries[MAX_HELPERS_COUNT] = enum Events { - EVENT_SPELL_FLASH_HEAL = 1, - EVENT_SPELL_RENEW = 2, - EVENT_SPELL_PW_SHIELD = 3, - EVENT_SPELL_SW_PAIN = 4, - EVENT_SPELL_DISPEL = 5, - EVENT_CHECK_DIST = 6, - EVENT_SPELL_IMMUNITY = 7, + EVENT_SPELL_FLASH_HEAL = 1, + EVENT_SPELL_RENEW = 2, + EVENT_SPELL_PW_SHIELD = 3, + EVENT_SPELL_SW_PAIN = 4, + EVENT_SPELL_DISPEL = 5, + EVENT_CHECK_DIST = 6, + EVENT_SPELL_IMMUNITY = 7, }; -class boss_priestess_delrissa : public CreatureScript +struct boss_priestess_delrissa : public ScriptedAI { -public: - boss_priestess_delrissa() : CreatureScript("boss_priestess_delrissa") { } - - CreatureAI* GetAI(Creature* creature) const override + boss_priestess_delrissa(Creature* creature) : ScriptedAI(creature), summons(me) { - return GetMagistersTerraceAI(creature); + instance = creature->GetInstanceScript(); } - struct boss_priestess_delrissaAI : public ScriptedAI + InstanceScript* instance; + EventMap events; + SummonList summons; + + uint8 PlayersKilled; + uint8 HelpersKilled; + + void Reset() override { - boss_priestess_delrissaAI(Creature* creature) : ScriptedAI(creature), summons(me) + PlayersKilled = SAY_PLAYER_KILLED; + HelpersKilled = SAY_HELPER_DIED; + instance->SetBossState(DATA_DELRISSA, NOT_STARTED); + summons.Respawn(); + + me->SetLootMode(0); + } + + void InitializeAI() override + { + ScriptedAI::InitializeAI(); + std::list helpersList; + for (uint8 i = 0; i < MAX_HELPERS_COUNT; ++i) + helpersList.push_back(helpersEntries[i]); + Acore::Containers::RandomResize(helpersList, MAX_ACTIVE_HELPERS); + + uint8 j = 0; + for (std::list::const_iterator itr = helpersList.begin(); itr != helpersList.end(); ++itr, ++j) + me->SummonCreature(*itr, helpersLocations[j], TEMPSUMMON_MANUAL_DESPAWN, 0); + } + + void JustSummoned(Creature* summon) override + { + summons.Summon(summon); + } + + void SummonedCreatureDies(Creature* /*summon*/, Unit*) override + { + if (me->IsAlive() && HelpersKilled < SAY_PLAYER_KILLED) { - instance = creature->GetInstanceScript(); + if (HelpersKilled == MAX_ACTIVE_HELPERS) + me->SetLootMode(1); + Talk(HelpersKilled); } - - InstanceScript* instance; - EventMap events; - SummonList summons; - - uint8 PlayersKilled; - uint8 HelpersKilled; - - void Reset() override + else if (HelpersKilled == MAX_ACTIVE_HELPERS) { - PlayersKilled = SAY_PLAYER_KILLED; - HelpersKilled = SAY_HELPER_DIED; - instance->SetBossState(DATA_DELRISSA, NOT_STARTED); - summons.Respawn(); - - me->SetLootMode(0); + me->loot.clear(); + me->loot.FillLoot(me->GetCreatureTemplate()->lootid, LootTemplates_Creature, me->GetLootRecipient(), false, false, 1, me); + instance->SetBossState(DATA_DELRISSA, DONE); + me->SetDynamicFlag(UNIT_DYNFLAG_LOOTABLE); } + ++HelpersKilled; + } - void InitializeAI() override + void JustEngagedWith(Unit* /*who*/) override + { + Talk(SAY_AGGRO); + summons.DoZoneInCombat(); + instance->SetBossState(DATA_DELRISSA, IN_PROGRESS); + + events.ScheduleEvent(EVENT_SPELL_FLASH_HEAL, 15000); + events.ScheduleEvent(EVENT_SPELL_RENEW, 10000); + events.ScheduleEvent(EVENT_SPELL_PW_SHIELD, 2000); + events.ScheduleEvent(EVENT_SPELL_SW_PAIN, 5000); + events.ScheduleEvent(EVENT_SPELL_DISPEL, 7500); + events.ScheduleEvent(EVENT_CHECK_DIST, 5000); + if (IsHeroic()) + events.ScheduleEvent(EVENT_SPELL_IMMUNITY, 4000); + } + + void KilledUnit(Unit* victim) override + { + if (victim->GetTypeId() != TYPEID_PLAYER) + return; + + if (PlayersKilled < SAY_DEATH) + Talk(PlayersKilled++); + } + + void JustDied(Unit* /*killer*/) override + { + Talk(SAY_DEATH); + + if (HelpersKilled == MAX_ACTIVE_HELPERS + 1) + instance->SetBossState(DATA_DELRISSA, DONE); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - ScriptedAI::InitializeAI(); - std::list helpersList; - for (uint8 i = 0; i < MAX_HELPERS_COUNT; ++i) - helpersList.push_back(helpersEntries[i]); - Acore::Containers::RandomResize(helpersList, MAX_ACTIVE_HELPERS); - - uint8 j = 0; - for (std::list::const_iterator itr = helpersList.begin(); itr != helpersList.end(); ++itr, ++j) - me->SummonCreature(*itr, helpersLocations[j], TEMPSUMMON_MANUAL_DESPAWN, 0); - } - - void JustSummoned(Creature* summon) override - { - summons.Summon(summon); - } - - void SummonedCreatureDies(Creature* /*summon*/, Unit*) override - { - if (me->IsAlive() && HelpersKilled < SAY_PLAYER_KILLED) + case EVENT_CHECK_DIST: + if (me->GetDistance(me->GetHomePosition()) > 75.0f) { - if (HelpersKilled == MAX_ACTIVE_HELPERS) - me->SetLootMode(1); - Talk(HelpersKilled); + EnterEvadeMode(EVADE_REASON_OTHER); + return; } - else if (HelpersKilled == MAX_ACTIVE_HELPERS) - { - me->loot.clear(); - me->loot.FillLoot(me->GetCreatureTemplate()->lootid, LootTemplates_Creature, me->GetLootRecipient(), false, false, 1, me); - instance->SetBossState(DATA_DELRISSA, DONE); - me->SetDynamicFlag(UNIT_DYNFLAG_LOOTABLE); - } - ++HelpersKilled; - } - - void JustEngagedWith(Unit* /*who*/) override - { - Talk(SAY_AGGRO); - summons.DoZoneInCombat(); - instance->SetBossState(DATA_DELRISSA, IN_PROGRESS); - - events.ScheduleEvent(EVENT_SPELL_FLASH_HEAL, 15000); - events.ScheduleEvent(EVENT_SPELL_RENEW, 10000); - events.ScheduleEvent(EVENT_SPELL_PW_SHIELD, 2000); - events.ScheduleEvent(EVENT_SPELL_SW_PAIN, 5000); - events.ScheduleEvent(EVENT_SPELL_DISPEL, 7500); events.ScheduleEvent(EVENT_CHECK_DIST, 5000); - if (IsHeroic()) - events.ScheduleEvent(EVENT_SPELL_IMMUNITY, 4000); - } - - void KilledUnit(Unit* victim) override + break; + case EVENT_SPELL_FLASH_HEAL: + if (Unit* target = DoSelectLowestHpFriendly(40.0f, 1000)) + me->CastSpell(target, SPELL_FLASH_HEAL, false); + events.ScheduleEvent(EVENT_SPELL_FLASH_HEAL, 15000); + break; + case EVENT_SPELL_RENEW: + if (Unit* target = DoSelectLowestHpFriendly(40.0f, 1000)) + me->CastSpell(target, DUNGEON_MODE(SPELL_RENEW_N, SPELL_RENEW_H), false); + events.ScheduleEvent(EVENT_SPELL_RENEW, 7000); + break; + case EVENT_SPELL_PW_SHIELD: { - if (victim->GetTypeId() != TYPEID_PLAYER) - return; - - if (PlayersKilled < SAY_DEATH) - Talk(PlayersKilled++); + std::list cList = DoFindFriendlyMissingBuff(40.0f, DUNGEON_MODE(SPELL_POWER_WORD_SHIELD_N, SPELL_POWER_WORD_SHIELD_H)); + if (Unit* target = Acore::Containers::SelectRandomContainerElement(cList)) + me->CastSpell(target, DUNGEON_MODE(SPELL_POWER_WORD_SHIELD_N, SPELL_POWER_WORD_SHIELD_H), false); + events.ScheduleEvent(EVENT_SPELL_PW_SHIELD, 10000); + break; } - - void JustDied(Unit* /*killer*/) override + case EVENT_SPELL_DISPEL: { - Talk(SAY_DEATH); - - if (HelpersKilled == MAX_ACTIVE_HELPERS + 1) - instance->SetBossState(DATA_DELRISSA, DONE); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) + Unit* target = nullptr; + switch (urand(0, 2)) { - case EVENT_CHECK_DIST: - if (me->GetDistance(me->GetHomePosition()) > 75.0f) - { - EnterEvadeMode(EVADE_REASON_OTHER); - return; - } - events.ScheduleEvent(EVENT_CHECK_DIST, 5000); - break; - case EVENT_SPELL_FLASH_HEAL: - if (Unit* target = DoSelectLowestHpFriendly(40.0f, 1000)) - me->CastSpell(target, SPELL_FLASH_HEAL, false); - events.ScheduleEvent(EVENT_SPELL_FLASH_HEAL, 15000); - break; - case EVENT_SPELL_RENEW: - if (Unit* target = DoSelectLowestHpFriendly(40.0f, 1000)) - me->CastSpell(target, DUNGEON_MODE(SPELL_RENEW_N, SPELL_RENEW_H), false); - events.ScheduleEvent(EVENT_SPELL_RENEW, 7000); - break; - case EVENT_SPELL_PW_SHIELD: - { - std::list cList = DoFindFriendlyMissingBuff(40.0f, DUNGEON_MODE(SPELL_POWER_WORD_SHIELD_N, SPELL_POWER_WORD_SHIELD_H)); - if (Unit* target = Acore::Containers::SelectRandomContainerElement(cList)) - me->CastSpell(target, DUNGEON_MODE(SPELL_POWER_WORD_SHIELD_N, SPELL_POWER_WORD_SHIELD_H), false); - events.ScheduleEvent(EVENT_SPELL_PW_SHIELD, 10000); - break; - } - case EVENT_SPELL_DISPEL: - { - Unit* target = nullptr; - switch (urand(0, 2)) - { - case 0: - target = SelectTarget(SelectTargetMethod::Random, 0, 30, true); - break; - case 1: - target = me; - break; - case 2: - target = ObjectAccessor::GetCreature(*me, Acore::Containers::SelectRandomContainerElement(summons)); - break; - } - - if (target) - me->CastSpell(target, SPELL_DISPEL_MAGIC, false); - events.ScheduleEvent(EVENT_SPELL_DISPEL, 12000); - break; - } - case EVENT_SPELL_IMMUNITY: - if (me->HasUnitState(UNIT_STATE_LOST_CONTROL)) - { - me->CastSpell(me, SPELL_MEDALION_OF_IMMUNITY, false); - events.ScheduleEvent(EVENT_SPELL_IMMUNITY, 60000); - } - else - events.ScheduleEvent(EVENT_SPELL_IMMUNITY, 1000); - break; - case EVENT_SPELL_SW_PAIN: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f)) - me->CastSpell(target, DUNGEON_MODE(SPELL_SHADOW_WORD_PAIN_N, SPELL_SHADOW_WORD_PAIN_H), false); - events.ScheduleEvent(EVENT_SPELL_SW_PAIN, 10000); - break; + case 0: + target = SelectTarget(SelectTargetMethod::Random, 0, 30, true); + break; + case 1: + target = me; + break; + case 2: + target = ObjectAccessor::GetCreature(*me, Acore::Containers::SelectRandomContainerElement(summons)); + break; } - DoMeleeAttackIfReady(); + if (target) + me->CastSpell(target, SPELL_DISPEL_MAGIC, false); + events.ScheduleEvent(EVENT_SPELL_DISPEL, 12000); + break; } - }; + case EVENT_SPELL_IMMUNITY: + if (me->HasUnitState(UNIT_STATE_LOST_CONTROL)) + { + me->CastSpell(me, SPELL_MEDALION_OF_IMMUNITY, false); + events.ScheduleEvent(EVENT_SPELL_IMMUNITY, 60000); + } + else + events.ScheduleEvent(EVENT_SPELL_IMMUNITY, 1000); + break; + case EVENT_SPELL_SW_PAIN: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f)) + me->CastSpell(target, DUNGEON_MODE(SPELL_SHADOW_WORD_PAIN_N, SPELL_SHADOW_WORD_PAIN_H), false); + events.ScheduleEvent(EVENT_SPELL_SW_PAIN, 10000); + break; + } + + DoMeleeAttackIfReady(); + } }; enum helpersShared { - SPELL_HEALING_POTION = 15503, + SPELL_HEALING_POTION = 15503, - EVENT_SPELL_HELPER_HEALING_POTION = 20, - EVENT_SPELL_HELPER_IMMUNITY = 21, - EVENT_HELPER_RESET_THREAT = 22, + EVENT_SPELL_HELPER_HEALING_POTION = 20, + EVENT_SPELL_HELPER_IMMUNITY = 21, + EVENT_HELPER_RESET_THREAT = 22, - AI_TYPE_MELEE = 1, - AI_TYPE_RANGED = 2 + AI_TYPE_MELEE = 1, + AI_TYPE_RANGED = 2 }; struct boss_priestess_lackey_commonAI : public ScriptedAI @@ -300,10 +289,10 @@ struct boss_priestess_lackey_commonAI : public ScriptedAI void RecalculateThreat() { ThreatContainer::StorageType const& tList = me->GetThreatMgr().GetThreatList(); - for( ThreatContainer::StorageType::const_iterator itr = tList.begin(); itr != tList.end(); ++itr ) + for (ThreatContainer::StorageType::const_iterator itr = tList.begin(); itr != tList.end(); ++itr) { Unit* pUnit = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); - if( pUnit && pUnit->GetTypeId() == TYPEID_PLAYER && me->GetThreatMgr().GetThreat(pUnit) ) + if (pUnit && pUnit->GetTypeId() == TYPEID_PLAYER && me->GetThreatMgr().GetThreat(pUnit)) { float threatMod = GetThreatMod(me->GetDistance2d(pUnit), (float)pUnit->GetArmor(), pUnit->GetHealth(), pUnit->GetMaxHealth(), pUnit); me->GetThreatMgr().ModifyThreatByPercent(pUnit, -100); @@ -377,474 +366,419 @@ struct boss_priestess_lackey_commonAI : public ScriptedAI actualEventId = events.ExecuteEvent(); switch (actualEventId) { - case EVENT_SPELL_HELPER_IMMUNITY: - if (me->HasUnitState(UNIT_STATE_LOST_CONTROL)) - { - me->CastSpell(me, SPELL_MEDALION_OF_IMMUNITY, false); - events.ScheduleEvent(EVENT_SPELL_HELPER_IMMUNITY, 60000); - } - else - events.ScheduleEvent(EVENT_SPELL_HELPER_IMMUNITY, 1000); - break; - case EVENT_SPELL_HELPER_HEALING_POTION: - if (me->HealthBelowPct(25)) - { - me->CastSpell(me, SPELL_HEALING_POTION, false); - break; - } - events.ScheduleEvent(EVENT_SPELL_HELPER_HEALING_POTION, 1000); - break; - case EVENT_HELPER_RESET_THREAT: - RecalculateThreat(); - events.ScheduleEvent(EVENT_HELPER_RESET_THREAT, urand(8000, 10000)); + case EVENT_SPELL_HELPER_IMMUNITY: + if (me->HasUnitState(UNIT_STATE_LOST_CONTROL)) + { + me->CastSpell(me, SPELL_MEDALION_OF_IMMUNITY, false); + events.ScheduleEvent(EVENT_SPELL_HELPER_IMMUNITY, 60000); + } + else + events.ScheduleEvent(EVENT_SPELL_HELPER_IMMUNITY, 1000); + break; + case EVENT_SPELL_HELPER_HEALING_POTION: + if (me->HealthBelowPct(25)) + { + me->CastSpell(me, SPELL_HEALING_POTION, false); break; + } + events.ScheduleEvent(EVENT_SPELL_HELPER_HEALING_POTION, 1000); + break; + case EVENT_HELPER_RESET_THREAT: + RecalculateThreat(); + events.ScheduleEvent(EVENT_HELPER_RESET_THREAT, urand(8000, 10000)); + break; } } }; enum RogueEnum { - SPELL_KIDNEY_SHOT = 27615, - SPELL_VANISH = 44290, - SPELL_GOUGE = 12540, - SPELL_KICK = 27613, - SPELL_BACKSTAB_N = 15657, - SPELL_BACKSTAB_H = 15582, - SPELL_EVISCERATE_N = 27611, - SPELL_EVISCERATE_H = 46189, + SPELL_KIDNEY_SHOT = 27615, + SPELL_VANISH = 44290, + SPELL_GOUGE = 12540, + SPELL_KICK = 27613, + SPELL_BACKSTAB_N = 15657, + SPELL_BACKSTAB_H = 15582, + SPELL_EVISCERATE_N = 27611, + SPELL_EVISCERATE_H = 46189, - EVENT_SPELL_GOUGE = 1, - EVENT_SPELL_KICK = 2, - EVENT_SPELL_VANISH = 3, - EVENT_SPELL_EVISCERATE = 4, - EVENT_SPELL_BACKSTAB = 5, + EVENT_SPELL_GOUGE = 1, + EVENT_SPELL_KICK = 2, + EVENT_SPELL_VANISH = 3, + EVENT_SPELL_EVISCERATE = 4, + EVENT_SPELL_BACKSTAB = 5, }; -class boss_kagani_nightstrike : public CreatureScript +struct boss_kagani_nightstrike : public boss_priestess_lackey_commonAI { -public: - boss_kagani_nightstrike() : CreatureScript("boss_kagani_nightstrike") { } + boss_kagani_nightstrike(Creature* creature) : boss_priestess_lackey_commonAI(creature, AI_TYPE_MELEE) { } - CreatureAI* GetAI(Creature* creature) const override + void JustEngagedWith(Unit* who) override { - return GetMagistersTerraceAI(creature); + boss_priestess_lackey_commonAI::JustEngagedWith(who); + + events.ScheduleEvent(EVENT_SPELL_GOUGE, 5500); + events.ScheduleEvent(EVENT_SPELL_KICK, 9000); + events.ScheduleEvent(EVENT_SPELL_VANISH, 200); + events.ScheduleEvent(EVENT_SPELL_EVISCERATE, 6000); + events.ScheduleEvent(EVENT_SPELL_BACKSTAB, 4000); } - struct boss_kagani_nightstrikeAI : public boss_priestess_lackey_commonAI + void MovementInform(uint32 type, uint32 /*point*/) override { - boss_kagani_nightstrikeAI(Creature* creature) : boss_priestess_lackey_commonAI(creature, AI_TYPE_MELEE) { } + if (type == CHASE_MOTION_TYPE && me->HasAura(SPELL_VANISH) && me->GetVictim()) + me->CastSpell(me->GetVictim(), SPELL_KIDNEY_SHOT, false); + } - void JustEngagedWith(Unit* who) override + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + boss_priestess_lackey_commonAI::UpdateAI(diff); + + switch (actualEventId) { - boss_priestess_lackey_commonAI::JustEngagedWith(who); + case EVENT_SPELL_VANISH: + me->CastSpell(me, SPELL_VANISH, false); + DoResetThreatList(); + if (Unit* unit = SelectTarget(SelectTargetMethod::Random, 0)) + me->AddThreat(unit, 1000.0f); - events.ScheduleEvent(EVENT_SPELL_GOUGE, 5500); - events.ScheduleEvent(EVENT_SPELL_KICK, 9000); - events.ScheduleEvent(EVENT_SPELL_VANISH, 200); - events.ScheduleEvent(EVENT_SPELL_EVISCERATE, 6000); - events.ScheduleEvent(EVENT_SPELL_BACKSTAB, 4000); - } - - void MovementInform(uint32 type, uint32 /*point*/) override - { - if (type == CHASE_MOTION_TYPE && me->HasAura(SPELL_VANISH) && me->GetVictim()) - me->CastSpell(me->GetVictim(), SPELL_KIDNEY_SHOT, false); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - boss_priestess_lackey_commonAI::UpdateAI(diff); - - switch (actualEventId) + events.ScheduleEvent(EVENT_SPELL_VANISH, 30000); + break; + case EVENT_SPELL_GOUGE: + me->CastSpell(me->GetVictim(), SPELL_GOUGE, false); + events.ScheduleEvent(EVENT_SPELL_GOUGE, 15000); + break; + case EVENT_SPELL_KICK: + if (me->GetVictim()->HasUnitState(UNIT_STATE_CASTING)) { - case EVENT_SPELL_VANISH: - me->CastSpell(me, SPELL_VANISH, false); - DoResetThreatList(); - if (Unit* unit = SelectTarget(SelectTargetMethod::Random, 0)) - me->AddThreat(unit, 1000.0f); - - events.ScheduleEvent(EVENT_SPELL_VANISH, 30000); - break; - case EVENT_SPELL_GOUGE: - me->CastSpell(me->GetVictim(), SPELL_GOUGE, false); - events.ScheduleEvent(EVENT_SPELL_GOUGE, 15000); - break; - case EVENT_SPELL_KICK: - if (me->GetVictim()->HasUnitState(UNIT_STATE_CASTING)) - { - me->CastSpell(me->GetVictim(), SPELL_KICK, false); - events.ScheduleEvent(EVENT_SPELL_KICK, 15000); - } - else - events.ScheduleEvent(EVENT_SPELL_KICK, 1000); - break; - case EVENT_SPELL_EVISCERATE: - me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_EVISCERATE_N, SPELL_EVISCERATE_H), false); - events.ScheduleEvent(EVENT_SPELL_EVISCERATE, 10000); - break; - case EVENT_SPELL_BACKSTAB: - if (!me->GetVictim()->HasInArc(static_cast(M_PI), me)) - { - me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_BACKSTAB_N, SPELL_BACKSTAB_H), false); - events.ScheduleEvent(EVENT_SPELL_BACKSTAB, 5000); - } - else - events.ScheduleEvent(EVENT_SPELL_BACKSTAB, 1000); - break; + me->CastSpell(me->GetVictim(), SPELL_KICK, false); + events.ScheduleEvent(EVENT_SPELL_KICK, 15000); } - - DoMeleeAttackIfReady(); + else + events.ScheduleEvent(EVENT_SPELL_KICK, 1000); + break; + case EVENT_SPELL_EVISCERATE: + me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_EVISCERATE_N, SPELL_EVISCERATE_H), false); + events.ScheduleEvent(EVENT_SPELL_EVISCERATE, 10000); + break; + case EVENT_SPELL_BACKSTAB: + if (!me->GetVictim()->HasInArc(static_cast(M_PI), me)) + { + me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_BACKSTAB_N, SPELL_BACKSTAB_H), false); + events.ScheduleEvent(EVENT_SPELL_BACKSTAB, 5000); + } + else + events.ScheduleEvent(EVENT_SPELL_BACKSTAB, 1000); + break; } - }; + + DoMeleeAttackIfReady(); + } }; enum WarlockEnum { - SPELL_IMMOLATE_N = 44267, - SPELL_IMMOLATE_H = 46191, - SPELL_SHADOW_BOLT_N = 12471, - SPELL_SHADOW_BOLT_H = 15232, - SPELL_CURSE_OF_AGONY_N = 14875, - SPELL_CURSE_OF_AGONY_H = 46190, - SPELL_SEED_OF_CORRUPTION = 44141, - SPELL_FEAR = 38595, - SPELL_SUMMON_IMP = 44163, + SPELL_IMMOLATE_N = 44267, + SPELL_IMMOLATE_H = 46191, + SPELL_SHADOW_BOLT_N = 12471, + SPELL_SHADOW_BOLT_H = 15232, + SPELL_CURSE_OF_AGONY_N = 14875, + SPELL_CURSE_OF_AGONY_H = 46190, + SPELL_SEED_OF_CORRUPTION = 44141, + SPELL_FEAR = 38595, + SPELL_SUMMON_IMP = 44163, - EVENT_SPELL_IMMOLATE = 1, - EVENT_SPELL_SHADOW_BOLT = 2, + EVENT_SPELL_IMMOLATE = 1, + EVENT_SPELL_SHADOW_BOLT = 2, EVENT_SPELL_SEED_OF_CORRUPTION = 3, - EVENT_SPELL_CURSE_OF_AGONY = 4, - EVENT_SPELL_FEAR = 5, + EVENT_SPELL_CURSE_OF_AGONY = 4, + EVENT_SPELL_FEAR = 5, }; -class boss_ellris_duskhallow : public CreatureScript +struct boss_ellris_duskhallow : public boss_priestess_lackey_commonAI { -public: - boss_ellris_duskhallow() : CreatureScript("boss_ellris_duskhallow") { } + boss_ellris_duskhallow(Creature* creature) : boss_priestess_lackey_commonAI(creature, AI_TYPE_RANGED) { } - CreatureAI* GetAI(Creature* creature) const override + void JustEngagedWith(Unit* who) override { - return GetMagistersTerraceAI(creature); + me->CastSpell(me, SPELL_SUMMON_IMP, false); + boss_priestess_lackey_commonAI::JustEngagedWith(who); + + events.ScheduleEvent(EVENT_SPELL_IMMOLATE, 3000); + events.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT, 1000); + events.ScheduleEvent(EVENT_SPELL_SEED_OF_CORRUPTION, 10000); + events.ScheduleEvent(EVENT_SPELL_CURSE_OF_AGONY, 6000); + events.ScheduleEvent(EVENT_SPELL_FEAR, 15000); } - struct boss_ellris_duskhallowAI : public boss_priestess_lackey_commonAI + void UpdateAI(uint32 diff) override { - boss_ellris_duskhallowAI(Creature* creature) : boss_priestess_lackey_commonAI(creature, AI_TYPE_RANGED) { } + if (!UpdateVictim()) + return; - void JustEngagedWith(Unit* who) override + boss_priestess_lackey_commonAI::UpdateAI(diff); + + switch (actualEventId) { - me->CastSpell(me, SPELL_SUMMON_IMP, false); - boss_priestess_lackey_commonAI::JustEngagedWith(who); - - events.ScheduleEvent(EVENT_SPELL_IMMOLATE, 3000); - events.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT, 1000); - events.ScheduleEvent(EVENT_SPELL_SEED_OF_CORRUPTION, 10000); - events.ScheduleEvent(EVENT_SPELL_CURSE_OF_AGONY, 6000); + case EVENT_SPELL_IMMOLATE: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f)) + me->CastSpell(target, DUNGEON_MODE(SPELL_IMMOLATE_N, SPELL_IMMOLATE_H), false); + events.ScheduleEvent(EVENT_SPELL_IMMOLATE, 12000); + break; + case EVENT_SPELL_SHADOW_BOLT: + me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_SHADOW_BOLT_N, SPELL_SHADOW_BOLT_H), false); + events.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT, 5000); + break; + case EVENT_SPELL_SEED_OF_CORRUPTION: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f)) + me->CastSpell(target, SPELL_SEED_OF_CORRUPTION, false); + events.ScheduleEvent(EVENT_SPELL_SEED_OF_CORRUPTION, 18000); + break; + case EVENT_SPELL_CURSE_OF_AGONY: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f)) + me->CastSpell(target, DUNGEON_MODE(SPELL_CURSE_OF_AGONY_N, SPELL_CURSE_OF_AGONY_H), false); + events.ScheduleEvent(EVENT_SPELL_CURSE_OF_AGONY, 13000); + break; + case EVENT_SPELL_FEAR: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 20.0f)) + me->CastSpell(target, SPELL_FEAR, false); events.ScheduleEvent(EVENT_SPELL_FEAR, 15000); + break; } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - boss_priestess_lackey_commonAI::UpdateAI(diff); - - switch (actualEventId) - { - case EVENT_SPELL_IMMOLATE: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f)) - me->CastSpell(target, DUNGEON_MODE(SPELL_IMMOLATE_N, SPELL_IMMOLATE_H), false); - events.ScheduleEvent(EVENT_SPELL_IMMOLATE, 12000); - break; - case EVENT_SPELL_SHADOW_BOLT: - me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_SHADOW_BOLT_N, SPELL_SHADOW_BOLT_H), false); - events.ScheduleEvent(EVENT_SPELL_SHADOW_BOLT, 5000); - break; - case EVENT_SPELL_SEED_OF_CORRUPTION: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f)) - me->CastSpell(target, SPELL_SEED_OF_CORRUPTION, false); - events.ScheduleEvent(EVENT_SPELL_SEED_OF_CORRUPTION, 18000); - break; - case EVENT_SPELL_CURSE_OF_AGONY: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f)) - me->CastSpell(target, DUNGEON_MODE(SPELL_CURSE_OF_AGONY_N, SPELL_CURSE_OF_AGONY_H), false); - events.ScheduleEvent(EVENT_SPELL_CURSE_OF_AGONY, 13000); - break; - case EVENT_SPELL_FEAR: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 20.0f)) - me->CastSpell(target, SPELL_FEAR, false); - events.ScheduleEvent(EVENT_SPELL_FEAR, 15000); - break; - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } }; enum MonkEnum { - SPELL_KNOCKDOWN_N = 11428, - SPELL_KNOCKDOWN_H = 46183, - SPELL_SNAP_KICK = 46182, - SPELL_FISTS_OF_ARCANE = 44120, + SPELL_KNOCKDOWN_N = 11428, + SPELL_KNOCKDOWN_H = 46183, + SPELL_SNAP_KICK = 46182, + SPELL_FISTS_OF_ARCANE = 44120, - EVENT_SPELL_KNOCKDOWN = 1, - EVENT_SPELL_SNAP_KICK = 2, - EVENT_SPELL_FISTS = 3, + EVENT_SPELL_KNOCKDOWN = 1, + EVENT_SPELL_SNAP_KICK = 2, + EVENT_SPELL_FISTS = 3, }; -class boss_eramas_brightblaze : public CreatureScript +struct boss_eramas_brightblaze : public boss_priestess_lackey_commonAI { -public: - boss_eramas_brightblaze() : CreatureScript("boss_eramas_brightblaze") { } + boss_eramas_brightblaze(Creature* creature) : boss_priestess_lackey_commonAI(creature, AI_TYPE_MELEE) { } - CreatureAI* GetAI(Creature* creature) const override + void JustEngagedWith(Unit* who) override { - return GetMagistersTerraceAI(creature); + boss_priestess_lackey_commonAI::JustEngagedWith(who); + + events.ScheduleEvent(EVENT_SPELL_KNOCKDOWN, 6000); + events.ScheduleEvent(EVENT_SPELL_SNAP_KICK, 3000); + events.ScheduleEvent(EVENT_SPELL_FISTS, 0); } - struct boss_eramas_brightblazeAI : public boss_priestess_lackey_commonAI + void UpdateAI(uint32 diff) override { - boss_eramas_brightblazeAI(Creature* creature) : boss_priestess_lackey_commonAI(creature, AI_TYPE_MELEE) { } + if (!UpdateVictim()) + return; - void JustEngagedWith(Unit* who) override + boss_priestess_lackey_commonAI::UpdateAI(diff); + + switch (actualEventId) { - boss_priestess_lackey_commonAI::JustEngagedWith(who); - - events.ScheduleEvent(EVENT_SPELL_KNOCKDOWN, 6000); - events.ScheduleEvent(EVENT_SPELL_SNAP_KICK, 3000); - events.ScheduleEvent(EVENT_SPELL_FISTS, 0); + case EVENT_SPELL_KNOCKDOWN: + me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_KNOCKDOWN_N, SPELL_KNOCKDOWN_H), false); + events.ScheduleEvent(EVENT_SPELL_KNOCKDOWN, 10000); + break; + case EVENT_SPELL_SNAP_KICK: + me->CastSpell(me->GetVictim(), SPELL_SNAP_KICK, false); + events.ScheduleEvent(EVENT_SPELL_SNAP_KICK, 10000); + break; + case EVENT_SPELL_FISTS: + me->CastSpell(me->GetVictim(), SPELL_FISTS_OF_ARCANE, false); + events.ScheduleEvent(EVENT_SPELL_FISTS, 10000); + break; } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - boss_priestess_lackey_commonAI::UpdateAI(diff); - - switch (actualEventId) - { - case EVENT_SPELL_KNOCKDOWN: - me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_KNOCKDOWN_N, SPELL_KNOCKDOWN_H), false); - events.ScheduleEvent(EVENT_SPELL_KNOCKDOWN, 10000); - break; - case EVENT_SPELL_SNAP_KICK: - me->CastSpell(me->GetVictim(), SPELL_SNAP_KICK, false); - events.ScheduleEvent(EVENT_SPELL_SNAP_KICK, 10000); - break; - case EVENT_SPELL_FISTS: - me->CastSpell(me->GetVictim(), SPELL_FISTS_OF_ARCANE, false); - events.ScheduleEvent(EVENT_SPELL_FISTS, 10000); - break; - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } }; enum MageEnum { - SPELL_POLYMORPH = 13323, - SPELL_ICE_BLOCK = 27619, - SPELL_BLIZZARD_N = 44178, - SPELL_BLIZZARD_H = 46195, - SPELL_ICE_LANCE_N = 44176, - SPELL_ICE_LANCE_H = 46194, - SPELL_CONE_OF_COLD_N = 38384, - SPELL_CONE_OF_COLD_H = 12611, - SPELL_FROSTBOLT_N = 15043, - SPELL_FROSTBOLT_H = 15530, - SPELL_BLINK = 14514, + SPELL_POLYMORPH = 13323, + SPELL_ICE_BLOCK = 27619, + SPELL_BLIZZARD_N = 44178, + SPELL_BLIZZARD_H = 46195, + SPELL_ICE_LANCE_N = 44176, + SPELL_ICE_LANCE_H = 46194, + SPELL_CONE_OF_COLD_N = 38384, + SPELL_CONE_OF_COLD_H = 12611, + SPELL_FROSTBOLT_N = 15043, + SPELL_FROSTBOLT_H = 15530, + SPELL_BLINK = 14514, - EVENT_SPELL_POLYMORPH = 1, - EVENT_SPELL_ICE_BLOCK = 2, - EVENT_SPELL_BLIZZARD = 3, - EVENT_SPELL_ICE_LANCE = 4, - EVENT_SPELL_COC = 5, - EVENT_SPELL_FROSTBOLT = 6, - EVENT_SPELL_BLINK = 7 + EVENT_SPELL_POLYMORPH = 1, + EVENT_SPELL_ICE_BLOCK = 2, + EVENT_SPELL_BLIZZARD = 3, + EVENT_SPELL_ICE_LANCE = 4, + EVENT_SPELL_COC = 5, + EVENT_SPELL_FROSTBOLT = 6, + EVENT_SPELL_BLINK = 7 }; -class boss_yazzai : public CreatureScript +struct boss_yazzai : public boss_priestess_lackey_commonAI { -public: - boss_yazzai() : CreatureScript("boss_yazzai") { } + boss_yazzai(Creature* creature) : boss_priestess_lackey_commonAI(creature, AI_TYPE_RANGED) { } - CreatureAI* GetAI(Creature* creature) const override + void JustEngagedWith(Unit* who) override { - return GetMagistersTerraceAI(creature); + boss_priestess_lackey_commonAI::JustEngagedWith(who); + + events.ScheduleEvent(EVENT_SPELL_POLYMORPH, 1000); + events.ScheduleEvent(EVENT_SPELL_ICE_BLOCK, 1000); + events.ScheduleEvent(EVENT_SPELL_BLIZZARD, 8000); + events.ScheduleEvent(EVENT_SPELL_ICE_LANCE, 12000); + events.ScheduleEvent(EVENT_SPELL_COC, 10000); + events.ScheduleEvent(EVENT_SPELL_FROSTBOLT, 3000); + events.ScheduleEvent(EVENT_SPELL_BLINK, 5000); } - struct boss_yazzaiAI : public boss_priestess_lackey_commonAI + void UpdateAI(uint32 diff) override { - boss_yazzaiAI(Creature* creature) : boss_priestess_lackey_commonAI(creature, AI_TYPE_RANGED) { } + if (!UpdateVictim()) + return; - void JustEngagedWith(Unit* who) override + boss_priestess_lackey_commonAI::UpdateAI(diff); + + switch (actualEventId) { - boss_priestess_lackey_commonAI::JustEngagedWith(who); - - events.ScheduleEvent(EVENT_SPELL_POLYMORPH, 1000); - events.ScheduleEvent(EVENT_SPELL_ICE_BLOCK, 1000); - events.ScheduleEvent(EVENT_SPELL_BLIZZARD, 8000); - events.ScheduleEvent(EVENT_SPELL_ICE_LANCE, 12000); - events.ScheduleEvent(EVENT_SPELL_COC, 10000); - events.ScheduleEvent(EVENT_SPELL_FROSTBOLT, 3000); - events.ScheduleEvent(EVENT_SPELL_BLINK, 5000); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - boss_priestess_lackey_commonAI::UpdateAI(diff); - - switch (actualEventId) + case EVENT_SPELL_POLYMORPH: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + me->CastSpell(target, SPELL_POLYMORPH, false); + events.ScheduleEvent(EVENT_SPELL_POLYMORPH, 20000); + break; + case EVENT_SPELL_ICE_BLOCK: + if (HealthBelowPct(35)) { - case EVENT_SPELL_POLYMORPH: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - me->CastSpell(target, SPELL_POLYMORPH, false); - events.ScheduleEvent(EVENT_SPELL_POLYMORPH, 20000); - break; - case EVENT_SPELL_ICE_BLOCK: - if (HealthBelowPct(35)) + me->CastSpell(me, SPELL_ICE_BLOCK, false); + return; + } + events.ScheduleEvent(EVENT_SPELL_ICE_BLOCK, 1000); + break; + case EVENT_SPELL_BLIZZARD: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + me->CastSpell(target, DUNGEON_MODE(SPELL_BLIZZARD_N, SPELL_BLIZZARD_H), false); + events.ScheduleEvent(EVENT_SPELL_BLIZZARD, 20000); + break; + case EVENT_SPELL_ICE_LANCE: + me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_ICE_LANCE_N, SPELL_ICE_LANCE_H), false); + events.ScheduleEvent(EVENT_SPELL_ICE_LANCE, 12000); + break; + case EVENT_SPELL_COC: + me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_CONE_OF_COLD_N, SPELL_CONE_OF_COLD_H), false); + events.ScheduleEvent(EVENT_SPELL_COC, 10000); + break; + case EVENT_SPELL_FROSTBOLT: + me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_FROSTBOLT_N, SPELL_FROSTBOLT_H), false); + events.ScheduleEvent(EVENT_SPELL_FROSTBOLT, 8000); + break; + case EVENT_SPELL_BLINK: + { + bool InMeleeRange = false; + ThreatContainer::StorageType const& t_list = me->GetThreatMgr().GetThreatList(); + for (ThreatContainer::StorageType::const_iterator itr = t_list.begin(); itr != t_list.end(); ++itr) + if (Unit* target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid())) + if (target->IsWithinMeleeRange(me)) { - me->CastSpell(me, SPELL_ICE_BLOCK, false); - return; - } - events.ScheduleEvent(EVENT_SPELL_ICE_BLOCK, 1000); - break; - case EVENT_SPELL_BLIZZARD: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - me->CastSpell(target, DUNGEON_MODE(SPELL_BLIZZARD_N, SPELL_BLIZZARD_H), false); - events.ScheduleEvent(EVENT_SPELL_BLIZZARD, 20000); - break; - case EVENT_SPELL_ICE_LANCE: - me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_ICE_LANCE_N, SPELL_ICE_LANCE_H), false); - events.ScheduleEvent(EVENT_SPELL_ICE_LANCE, 12000); - break; - case EVENT_SPELL_COC: - me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_CONE_OF_COLD_N, SPELL_CONE_OF_COLD_H), false); - events.ScheduleEvent(EVENT_SPELL_COC, 10000); - break; - case EVENT_SPELL_FROSTBOLT: - me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_FROSTBOLT_N, SPELL_FROSTBOLT_H), false); - events.ScheduleEvent(EVENT_SPELL_FROSTBOLT, 8000); - break; - case EVENT_SPELL_BLINK: - { - bool InMeleeRange = false; - ThreatContainer::StorageType const& t_list = me->GetThreatMgr().GetThreatList(); - for (ThreatContainer::StorageType::const_iterator itr = t_list.begin(); itr != t_list.end(); ++itr) - if (Unit* target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid())) - if (target->IsWithinMeleeRange(me)) - { - InMeleeRange = true; - break; - } - - if (InMeleeRange) - me->CastSpell(me, SPELL_BLINK, false); - events.ScheduleEvent(EVENT_SPELL_BLINK, 15000); + InMeleeRange = true; break; } - } - DoMeleeAttackIfReady(); + if (InMeleeRange) + me->CastSpell(me, SPELL_BLINK, false); + events.ScheduleEvent(EVENT_SPELL_BLINK, 15000); + break; } - }; + } + + DoMeleeAttackIfReady(); + } }; enum WarriorEnum { - SPELL_INTERCEPT = 27577, - SPELL_DISARM = 27581, - SPELL_PIERCING_HOWL = 23600, - SPELL_FRIGHTENING_SHOUT = 19134, - SPELL_HAMSTRING = 27584, - SPELL_BATTLE_SHOUT = 27578, - SPELL_MORTAL_STRIKE = 44268, + SPELL_INTERCEPT = 27577, + SPELL_DISARM = 27581, + SPELL_PIERCING_HOWL = 23600, + SPELL_FRIGHTENING_SHOUT = 19134, + SPELL_HAMSTRING = 27584, + SPELL_BATTLE_SHOUT = 27578, + SPELL_MORTAL_STRIKE = 44268, - EVENT_SPELL_DISARM = 1, - EVENT_SPELL_PIERCING_HOWL = 2, - EVENT_SPELL_SHOUT = 3, - EVENT_SPELL_HAMSTRING = 4, - EVENT_SPELL_MORTAL_STRIKE = 5, - EVENT_SPELL_INTERCEPT = 6, + EVENT_SPELL_DISARM = 1, + EVENT_SPELL_PIERCING_HOWL = 2, + EVENT_SPELL_SHOUT = 3, + EVENT_SPELL_HAMSTRING = 4, + EVENT_SPELL_MORTAL_STRIKE = 5, + EVENT_SPELL_INTERCEPT = 6, }; -class boss_warlord_salaris : public CreatureScript +struct boss_warlord_salaris : public boss_priestess_lackey_commonAI { -public: - boss_warlord_salaris() : CreatureScript("boss_warlord_salaris") { } + boss_warlord_salaris(Creature* creature) : boss_priestess_lackey_commonAI(creature, AI_TYPE_MELEE) { } - CreatureAI* GetAI(Creature* creature) const override + void JustEngagedWith(Unit* who) override { - return GetMagistersTerraceAI(creature); + boss_priestess_lackey_commonAI::JustEngagedWith(who); + me->CastSpell(me, SPELL_BATTLE_SHOUT, false); + + events.ScheduleEvent(EVENT_SPELL_DISARM, 6000); + events.ScheduleEvent(EVENT_SPELL_PIERCING_HOWL, 10000); + events.ScheduleEvent(EVENT_SPELL_SHOUT, 18000); + events.ScheduleEvent(EVENT_SPELL_HAMSTRING, 4000); + events.ScheduleEvent(EVENT_SPELL_MORTAL_STRIKE, 8000); + events.ScheduleEvent(EVENT_SPELL_INTERCEPT, 1000); } - struct boss_warlord_salarisAI : public boss_priestess_lackey_commonAI + void UpdateAI(uint32 diff) override { - boss_warlord_salarisAI(Creature* creature) : boss_priestess_lackey_commonAI(creature, AI_TYPE_MELEE) { } + if (!UpdateVictim()) + return; - void JustEngagedWith(Unit* who) override + boss_priestess_lackey_commonAI::UpdateAI(diff); + + switch (actualEventId) { - boss_priestess_lackey_commonAI::JustEngagedWith(who); - me->CastSpell(me, SPELL_BATTLE_SHOUT, false); - - events.ScheduleEvent(EVENT_SPELL_DISARM, 6000); - events.ScheduleEvent(EVENT_SPELL_PIERCING_HOWL, 10000); + case EVENT_SPELL_INTERCEPT: + me->CastSpell(me->GetVictim(), SPELL_INTERCEPT, false); + events.ScheduleEvent(EVENT_SPELL_INTERCEPT, 10000); + break; + case EVENT_SPELL_DISARM: + me->CastSpell(me->GetVictim(), SPELL_DISARM, false); + events.ScheduleEvent(EVENT_SPELL_DISARM, 16000); + break; + case EVENT_SPELL_HAMSTRING: + me->CastSpell(me->GetVictim(), SPELL_HAMSTRING, false); + events.ScheduleEvent(EVENT_SPELL_HAMSTRING, 15000); + break; + case EVENT_SPELL_MORTAL_STRIKE: + me->CastSpell(me->GetVictim(), SPELL_MORTAL_STRIKE, false); + events.ScheduleEvent(EVENT_SPELL_MORTAL_STRIKE, 10000); + break; + case EVENT_SPELL_PIERCING_HOWL: + me->CastSpell(me, SPELL_PIERCING_HOWL, false); + events.ScheduleEvent(EVENT_SPELL_PIERCING_HOWL, 15000); + break; + case EVENT_SPELL_SHOUT: + me->CastSpell(me, SPELL_FRIGHTENING_SHOUT, false); events.ScheduleEvent(EVENT_SPELL_SHOUT, 18000); - events.ScheduleEvent(EVENT_SPELL_HAMSTRING, 4000); - events.ScheduleEvent(EVENT_SPELL_MORTAL_STRIKE, 8000); - events.ScheduleEvent(EVENT_SPELL_INTERCEPT, 1000); + break; } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - boss_priestess_lackey_commonAI::UpdateAI(diff); - - switch (actualEventId) - { - case EVENT_SPELL_INTERCEPT: - me->CastSpell(me->GetVictim(), SPELL_INTERCEPT, false); - events.ScheduleEvent(EVENT_SPELL_INTERCEPT, 10000); - break; - case EVENT_SPELL_DISARM: - me->CastSpell(me->GetVictim(), SPELL_DISARM, false); - events.ScheduleEvent(EVENT_SPELL_DISARM, 16000); - break; - case EVENT_SPELL_HAMSTRING: - me->CastSpell(me->GetVictim(), SPELL_HAMSTRING, false); - events.ScheduleEvent(EVENT_SPELL_HAMSTRING, 15000); - break; - case EVENT_SPELL_MORTAL_STRIKE: - me->CastSpell(me->GetVictim(), SPELL_MORTAL_STRIKE, false); - events.ScheduleEvent(EVENT_SPELL_MORTAL_STRIKE, 10000); - break; - case EVENT_SPELL_PIERCING_HOWL: - me->CastSpell(me, SPELL_PIERCING_HOWL, false); - events.ScheduleEvent(EVENT_SPELL_PIERCING_HOWL, 15000); - break; - case EVENT_SPELL_SHOUT: - me->CastSpell(me, SPELL_FRIGHTENING_SHOUT, false); - events.ScheduleEvent(EVENT_SPELL_SHOUT, 18000); - break; - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } }; enum HunterEnum @@ -866,72 +800,61 @@ enum HunterEnum EVENT_SPELL_WING_CLIP = 5 }; -class boss_garaxxas : public CreatureScript +struct boss_garaxxas : public boss_priestess_lackey_commonAI { -public: - boss_garaxxas() : CreatureScript("boss_garaxxas") { } + boss_garaxxas(Creature* creature) : boss_priestess_lackey_commonAI(creature, AI_TYPE_RANGED) {} - CreatureAI* GetAI(Creature* creature) const override + void Reset() override { - return GetMagistersTerraceAI(creature); + boss_priestess_lackey_commonAI::Reset(); + me->SummonCreature(NPC_SLIVER, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 0); } - struct boss_garaxxasAI : public boss_priestess_lackey_commonAI + void JustEngagedWith(Unit* who) override { - boss_garaxxasAI(Creature* creature) : boss_priestess_lackey_commonAI(creature, AI_TYPE_RANGED) {} + boss_priestess_lackey_commonAI::JustEngagedWith(who); + me->CastSpell(me, SPELL_FREEZING_TRAP, true); - void Reset() override + events.ScheduleEvent(EVENT_SPELL_AIMED_SHOT, 8000); + events.ScheduleEvent(EVENT_SPELL_SHOOT, 0); + events.ScheduleEvent(EVENT_SPELL_CONCUSSIVE_SHOT, 6000); + events.ScheduleEvent(EVENT_SPELL_MULTI_SHOT, 10000); + events.ScheduleEvent(EVENT_SPELL_WING_CLIP, 4000); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + boss_priestess_lackey_commonAI::UpdateAI(diff); + + switch (actualEventId) { - boss_priestess_lackey_commonAI::Reset(); - me->SummonCreature(NPC_SLIVER, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 0); - } - - void JustEngagedWith(Unit* who) override - { - boss_priestess_lackey_commonAI::JustEngagedWith(who); - me->CastSpell(me, SPELL_FREEZING_TRAP, true); - - events.ScheduleEvent(EVENT_SPELL_AIMED_SHOT, 8000); - events.ScheduleEvent(EVENT_SPELL_SHOOT, 0); - events.ScheduleEvent(EVENT_SPELL_CONCUSSIVE_SHOT, 6000); - events.ScheduleEvent(EVENT_SPELL_MULTI_SHOT, 10000); + case EVENT_SPELL_WING_CLIP: + me->CastSpell(me->GetVictim(), SPELL_WING_CLIP, false); events.ScheduleEvent(EVENT_SPELL_WING_CLIP, 4000); + break; + case EVENT_SPELL_AIMED_SHOT: + me->CastSpell(me->GetVictim(), SPELL_AIMED_SHOT, false); + events.ScheduleEvent(EVENT_SPELL_AIMED_SHOT, 15000); + break; + case EVENT_SPELL_CONCUSSIVE_SHOT: + me->CastSpell(me->GetVictim(), SPELL_CONCUSSIVE_SHOT, false); + events.ScheduleEvent(EVENT_SPELL_CONCUSSIVE_SHOT, 15000); + break; + case EVENT_SPELL_MULTI_SHOT: + me->CastSpell(me->GetVictim(), SPELL_MULTI_SHOT, false); + events.ScheduleEvent(EVENT_SPELL_MULTI_SHOT, 10000); + break; + case EVENT_SPELL_SHOOT: + me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_SHOOT_N, SPELL_SHOOT_H), false); + events.ScheduleEvent(EVENT_SPELL_SHOOT, 2500); + break; } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - boss_priestess_lackey_commonAI::UpdateAI(diff); - - switch (actualEventId) - { - case EVENT_SPELL_WING_CLIP: - me->CastSpell(me->GetVictim(), SPELL_WING_CLIP, false); - events.ScheduleEvent(EVENT_SPELL_WING_CLIP, 4000); - break; - case EVENT_SPELL_AIMED_SHOT: - me->CastSpell(me->GetVictim(), SPELL_AIMED_SHOT, false); - events.ScheduleEvent(EVENT_SPELL_AIMED_SHOT, 15000); - break; - case EVENT_SPELL_CONCUSSIVE_SHOT: - me->CastSpell(me->GetVictim(), SPELL_CONCUSSIVE_SHOT, false); - events.ScheduleEvent(EVENT_SPELL_CONCUSSIVE_SHOT, 15000); - break; - case EVENT_SPELL_MULTI_SHOT: - me->CastSpell(me->GetVictim(), SPELL_MULTI_SHOT, false); - events.ScheduleEvent(EVENT_SPELL_MULTI_SHOT, 10000); - break; - case EVENT_SPELL_SHOOT: - me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_SHOOT_N, SPELL_SHOOT_H), false); - events.ScheduleEvent(EVENT_SPELL_SHOOT, 2500); - break; - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } }; enum ShamanEnum @@ -946,105 +869,94 @@ enum ShamanEnum SPELL_FROST_SHOCK_N = 21401, SPELL_FROST_SHOCK_H = 46180, - EVENT_SPELL_TOTEM1 = 1, - EVENT_SPELL_TOTEM2 = 2, - EVENT_SPELL_TOTEM3 = 3, - EVENT_SPELL_WAR_STOMP = 4, - EVENT_SPELL_PURGE = 5, - EVENT_SPELL_HEALING_WAVE = 6, - EVENT_SPELL_FROST_SHOCK = 7 + EVENT_SPELL_TOTEM1 = 1, + EVENT_SPELL_TOTEM2 = 2, + EVENT_SPELL_TOTEM3 = 3, + EVENT_SPELL_WAR_STOMP = 4, + EVENT_SPELL_PURGE = 5, + EVENT_SPELL_HEALING_WAVE = 6, + EVENT_SPELL_FROST_SHOCK = 7 }; -class boss_apoko : public CreatureScript +struct boss_apoko : public boss_priestess_lackey_commonAI { -public: - boss_apoko() : CreatureScript("boss_apoko") { } + boss_apoko(Creature* creature) : boss_priestess_lackey_commonAI(creature, AI_TYPE_MELEE) { } - CreatureAI* GetAI(Creature* creature) const override + // uint32 Totem_Timer; + uint8 Totem_Amount; + uint32 War_Stomp_Timer; + // uint32 Purge_Timer; + uint32 Healing_Wave_Timer; + // uint32 Frost_Shock_Timer; + + void JustEngagedWith(Unit* who) override { - return GetMagistersTerraceAI(creature); + boss_priestess_lackey_commonAI::JustEngagedWith(who); + + events.ScheduleEvent(EVENT_SPELL_TOTEM1, 2000); + events.ScheduleEvent(EVENT_SPELL_TOTEM2, 4000); + events.ScheduleEvent(EVENT_SPELL_TOTEM3, 6000); + events.ScheduleEvent(EVENT_SPELL_WAR_STOMP, 10000); + events.ScheduleEvent(EVENT_SPELL_PURGE, 14000); + events.ScheduleEvent(EVENT_SPELL_HEALING_WAVE, 12000); + events.ScheduleEvent(EVENT_SPELL_FROST_SHOCK, 8000); } - struct boss_apokoAI : public boss_priestess_lackey_commonAI + void UpdateAI(uint32 diff) override { - boss_apokoAI(Creature* creature) : boss_priestess_lackey_commonAI(creature, AI_TYPE_MELEE) { } + if (!UpdateVictim()) + return; -// uint32 Totem_Timer; - uint8 Totem_Amount; - uint32 War_Stomp_Timer; -// uint32 Purge_Timer; - uint32 Healing_Wave_Timer; -// uint32 Frost_Shock_Timer; + boss_priestess_lackey_commonAI::UpdateAI(diff); - void JustEngagedWith(Unit* who) override + switch (actualEventId) { - boss_priestess_lackey_commonAI::JustEngagedWith(who); - - events.ScheduleEvent(EVENT_SPELL_TOTEM1, 2000); - events.ScheduleEvent(EVENT_SPELL_TOTEM2, 4000); - events.ScheduleEvent(EVENT_SPELL_TOTEM3, 6000); - events.ScheduleEvent(EVENT_SPELL_WAR_STOMP, 10000); - events.ScheduleEvent(EVENT_SPELL_PURGE, 14000); + case EVENT_SPELL_TOTEM1: + me->CastSpell(me, SPELL_WINDFURY_TOTEM, false); + events.ScheduleEvent(EVENT_SPELL_TOTEM1, 20000); + break; + case EVENT_SPELL_TOTEM2: + me->CastSpell(me, SPELL_FIRE_NOVA_TOTEM, false); + events.ScheduleEvent(EVENT_SPELL_TOTEM2, 20000); + break; + case EVENT_SPELL_TOTEM3: + me->CastSpell(me, SPELL_EARTHBIND_TOTEM, false); + events.ScheduleEvent(EVENT_SPELL_TOTEM3, 20000); + break; + case EVENT_SPELL_WAR_STOMP: + me->CastSpell(me, SPELL_WAR_STOMP, false); + events.ScheduleEvent(EVENT_SPELL_WAR_STOMP, 120000); + break; + case EVENT_SPELL_PURGE: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f)) + me->CastSpell(target, SPELL_PURGE, false); + events.ScheduleEvent(EVENT_SPELL_PURGE, 15000); + break; + case EVENT_SPELL_FROST_SHOCK: + me->CastSpell(me, DUNGEON_MODE(SPELL_FROST_SHOCK_N, SPELL_FROST_SHOCK_H), false); + events.ScheduleEvent(EVENT_SPELL_FROST_SHOCK, 12000); + break; + case EVENT_SPELL_HEALING_WAVE: + if (Unit* target = DoSelectLowestHpFriendly(40.0f, 1000)) + me->CastSpell(target, DUNGEON_MODE(SPELL_LESSER_HEALING_WAVE_N, SPELL_LESSER_HEALING_WAVE_H), false); events.ScheduleEvent(EVENT_SPELL_HEALING_WAVE, 12000); - events.ScheduleEvent(EVENT_SPELL_FROST_SHOCK, 8000); + break; } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - boss_priestess_lackey_commonAI::UpdateAI(diff); - - switch (actualEventId) - { - case EVENT_SPELL_TOTEM1: - me->CastSpell(me, SPELL_WINDFURY_TOTEM, false); - events.ScheduleEvent(EVENT_SPELL_TOTEM1, 20000); - break; - case EVENT_SPELL_TOTEM2: - me->CastSpell(me, SPELL_FIRE_NOVA_TOTEM, false); - events.ScheduleEvent(EVENT_SPELL_TOTEM2, 20000); - break; - case EVENT_SPELL_TOTEM3: - me->CastSpell(me, SPELL_EARTHBIND_TOTEM, false); - events.ScheduleEvent(EVENT_SPELL_TOTEM3, 20000); - break; - case EVENT_SPELL_WAR_STOMP: - me->CastSpell(me, SPELL_WAR_STOMP, false); - events.ScheduleEvent(EVENT_SPELL_WAR_STOMP, 120000); - break; - case EVENT_SPELL_PURGE: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f)) - me->CastSpell(target, SPELL_PURGE, false); - events.ScheduleEvent(EVENT_SPELL_PURGE, 15000); - break; - case EVENT_SPELL_FROST_SHOCK: - me->CastSpell(me, DUNGEON_MODE(SPELL_FROST_SHOCK_N, SPELL_FROST_SHOCK_H), false); - events.ScheduleEvent(EVENT_SPELL_FROST_SHOCK, 12000); - break; - case EVENT_SPELL_HEALING_WAVE: - if (Unit* target = DoSelectLowestHpFriendly(40.0f, 1000)) - me->CastSpell(target, DUNGEON_MODE(SPELL_LESSER_HEALING_WAVE_N, SPELL_LESSER_HEALING_WAVE_H), false); - events.ScheduleEvent(EVENT_SPELL_HEALING_WAVE, 12000); - break; - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } }; enum EngineerEnum { - SPELL_GOBLIN_DRAGON_GUN_N = 44272, - SPELL_GOBLIN_DRAGON_GUN_H = 46186, - SPELL_ROCKET_LAUNCH_N = 44137, - SPELL_ROCKET_LAUNCH_H = 46187, - SPELL_FEL_IRON_BOMB_N = 46024, - SPELL_FEL_IRON_BOMB_H = 46184, - SPELL_RECOMBOBULATE = 44274, - SPELL_HIGH_EXPLOSIVE_SHEEP = 44276, + SPELL_GOBLIN_DRAGON_GUN_N = 44272, + SPELL_GOBLIN_DRAGON_GUN_H = 46186, + SPELL_ROCKET_LAUNCH_N = 44137, + SPELL_ROCKET_LAUNCH_H = 46187, + SPELL_FEL_IRON_BOMB_N = 46024, + SPELL_FEL_IRON_BOMB_H = 46184, + SPELL_RECOMBOBULATE = 44274, + SPELL_HIGH_EXPLOSIVE_SHEEP = 44276, EVENT_SPELL_DRAGON_GUN = 1, EVENT_SPELL_ROCKET_LAUNCH = 2, @@ -1053,85 +965,74 @@ enum EngineerEnum EVENT_SPELL_IRON_BOMB = 5 }; -class boss_zelfan : public CreatureScript +struct boss_zelfan : public boss_priestess_lackey_commonAI { -public: - boss_zelfan() : CreatureScript("boss_zelfan") { } + boss_zelfan(Creature* creature) : boss_priestess_lackey_commonAI(creature, AI_TYPE_RANGED) { } - CreatureAI* GetAI(Creature* creature) const override + void JustEngagedWith(Unit* who) override { - return GetMagistersTerraceAI(creature); + boss_priestess_lackey_commonAI::JustEngagedWith(who); + + events.ScheduleEvent(EVENT_SPELL_DRAGON_GUN, 20000); + events.ScheduleEvent(EVENT_SPELL_ROCKET_LAUNCH, 7000); + events.ScheduleEvent(EVENT_SPELL_RECOMBOBULATE, 14000); + events.ScheduleEvent(EVENT_SPELL_EXPLOSIVE_SHEEP, 10000); + events.ScheduleEvent(EVENT_SPELL_IRON_BOMB, 5000); } - struct boss_zelfanAI : public boss_priestess_lackey_commonAI + void UpdateAI(uint32 diff) override { - boss_zelfanAI(Creature* creature) : boss_priestess_lackey_commonAI(creature, AI_TYPE_RANGED) { } + if (!UpdateVictim()) + return; - void JustEngagedWith(Unit* who) override + boss_priestess_lackey_commonAI::UpdateAI(diff); + + switch (actualEventId) { - boss_priestess_lackey_commonAI::JustEngagedWith(who); - + case EVENT_SPELL_DRAGON_GUN: + me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_GOBLIN_DRAGON_GUN_N, SPELL_GOBLIN_DRAGON_GUN_H), false); events.ScheduleEvent(EVENT_SPELL_DRAGON_GUN, 20000); - events.ScheduleEvent(EVENT_SPELL_ROCKET_LAUNCH, 7000); - events.ScheduleEvent(EVENT_SPELL_RECOMBOBULATE, 14000); - events.ScheduleEvent(EVENT_SPELL_EXPLOSIVE_SHEEP, 10000); - events.ScheduleEvent(EVENT_SPELL_IRON_BOMB, 5000); - } - - void UpdateAI(uint32 diff) override + break; + case EVENT_SPELL_ROCKET_LAUNCH: + me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_ROCKET_LAUNCH_N, SPELL_ROCKET_LAUNCH_H), false); + events.ScheduleEvent(EVENT_SPELL_ROCKET_LAUNCH, 20000); + break; + case EVENT_SPELL_IRON_BOMB: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 15.0f)) + me->CastSpell(target, DUNGEON_MODE(SPELL_FEL_IRON_BOMB_N, SPELL_FEL_IRON_BOMB_H), false); + events.ScheduleEvent(EVENT_SPELL_IRON_BOMB, 20000); + break; + case EVENT_SPELL_RECOMBOBULATE: { - if (!UpdateVictim()) - return; - - boss_priestess_lackey_commonAI::UpdateAI(diff); - - switch (actualEventId) - { - case EVENT_SPELL_DRAGON_GUN: - me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_GOBLIN_DRAGON_GUN_N, SPELL_GOBLIN_DRAGON_GUN_H), false); - events.ScheduleEvent(EVENT_SPELL_DRAGON_GUN, 20000); + std::list cList = DoFindFriendlyMissingBuff(30.0f, SPELL_RECOMBOBULATE); + for (std::list::const_iterator itr = cList.begin(); itr != cList.end(); ++itr) + if ((*itr)->IsPolymorphed()) + { + me->CastSpell(*itr, SPELL_RECOMBOBULATE, false); break; - case EVENT_SPELL_ROCKET_LAUNCH: - me->CastSpell(me->GetVictim(), DUNGEON_MODE(SPELL_ROCKET_LAUNCH_N, SPELL_ROCKET_LAUNCH_H), false); - events.ScheduleEvent(EVENT_SPELL_ROCKET_LAUNCH, 20000); - break; - case EVENT_SPELL_IRON_BOMB: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 15.0f)) - me->CastSpell(target, DUNGEON_MODE(SPELL_FEL_IRON_BOMB_N, SPELL_FEL_IRON_BOMB_H), false); - events.ScheduleEvent(EVENT_SPELL_IRON_BOMB, 20000); - break; - case EVENT_SPELL_RECOMBOBULATE: - { - std::list cList = DoFindFriendlyMissingBuff(30.0f, SPELL_RECOMBOBULATE); - for (std::list::const_iterator itr = cList.begin(); itr != cList.end(); ++itr) - if ((*itr)->IsPolymorphed()) - { - me->CastSpell(*itr, SPELL_RECOMBOBULATE, false); - break; - } - events.ScheduleEvent(EVENT_SPELL_RECOMBOBULATE, 10000); - break; - } - case EVENT_SPELL_EXPLOSIVE_SHEEP: - me->CastSpell(me, SPELL_HIGH_EXPLOSIVE_SHEEP, false); - events.ScheduleEvent(EVENT_SPELL_EXPLOSIVE_SHEEP, 60000); - break; - } - - DoMeleeAttackIfReady(); + } + events.ScheduleEvent(EVENT_SPELL_RECOMBOBULATE, 10000); + break; } - }; + case EVENT_SPELL_EXPLOSIVE_SHEEP: + me->CastSpell(me, SPELL_HIGH_EXPLOSIVE_SHEEP, false); + events.ScheduleEvent(EVENT_SPELL_EXPLOSIVE_SHEEP, 60000); + break; + } + + DoMeleeAttackIfReady(); + } }; void AddSC_boss_priestess_delrissa() { - new boss_priestess_delrissa(); - new boss_kagani_nightstrike(); - new boss_ellris_duskhallow(); - new boss_eramas_brightblaze(); - new boss_yazzai(); - new boss_warlord_salaris(); - new boss_garaxxas(); - new boss_apoko(); - new boss_zelfan(); + RegisterMagistersTerraceCreatureAI(boss_priestess_delrissa); + RegisterMagistersTerraceCreatureAI(boss_kagani_nightstrike); + RegisterMagistersTerraceCreatureAI(boss_ellris_duskhallow); + RegisterMagistersTerraceCreatureAI(boss_eramas_brightblaze); + RegisterMagistersTerraceCreatureAI(boss_yazzai); + RegisterMagistersTerraceCreatureAI(boss_warlord_salaris); + RegisterMagistersTerraceCreatureAI(boss_garaxxas); + RegisterMagistersTerraceCreatureAI(boss_apoko); + RegisterMagistersTerraceCreatureAI(boss_zelfan); } diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp index 2c14c0fba..6abca3627 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_selin_fireheart.cpp @@ -52,188 +52,177 @@ enum Events EVENT_RESTORE_COMBAT = 6 }; -class boss_selin_fireheart : public CreatureScript +struct boss_selin_fireheart : public ScriptedAI { -public: - boss_selin_fireheart() : CreatureScript("boss_selin_fireheart") { } - - CreatureAI* GetAI(Creature* creature) const override + boss_selin_fireheart(Creature* creature) : ScriptedAI(creature), summons(me) { - return GetMagistersTerraceAI(creature); - }; + instance = creature->GetInstanceScript(); + } - struct boss_selin_fireheartAI : public ScriptedAI + InstanceScript* instance; + EventMap events; + SummonList summons; + ObjectGuid CrystalGUID; + + bool CanAIAttack(Unit const* who) const override { - boss_selin_fireheartAI(Creature* creature) : ScriptedAI(creature), summons(me) + return who->GetPositionX() > 216.0f; + } + + void SpawnCrystals() + { + me->SummonCreature(NPC_FEL_CRYSTAL, 248.053f, 14.592f, 3.74882f, 3.94444f, TEMPSUMMON_CORPSE_DESPAWN); + me->SummonCreature(NPC_FEL_CRYSTAL, 225.969f, -20.0775f, -2.9731f, 0.942478f, TEMPSUMMON_CORPSE_DESPAWN); + me->SummonCreature(NPC_FEL_CRYSTAL, 226.314f, 20.2183f, -2.98127f, 5.32325f, TEMPSUMMON_CORPSE_DESPAWN); + me->SummonCreature(NPC_FEL_CRYSTAL, 247.888f, -14.6252f, 3.80777f, 2.33874f, TEMPSUMMON_CORPSE_DESPAWN); + me->SummonCreature(NPC_FEL_CRYSTAL, 263.149f, 0.309245f, 1.32057f, 3.15905f, TEMPSUMMON_CORPSE_DESPAWN); + } + + void JustSummoned(Creature* summon) override + { + summon->SetReactState(REACT_PASSIVE); + summons.Summon(summon); + } + + void SummonedCreatureDies(Creature* summon, Unit*) override + { + summons.Despawn(summon); + if (events.GetPhaseMask() & 0x01) + events.ScheduleEvent(EVENT_RESTORE_COMBAT, 0); + } + + void Reset() override + { + events.Reset(); + summons.DespawnAll(); + SpawnCrystals(); + instance->SetBossState(DATA_SELIN_FIREHEART, NOT_STARTED); + CrystalGUID.Clear(); + me->SetPower(POWER_MANA, 0); + } + + void JustEngagedWith(Unit* /*who*/) override + { + Talk(SAY_AGGRO); + instance->SetBossState(DATA_SELIN_FIREHEART, IN_PROGRESS); + + events.ScheduleEvent(EVENT_SPELL_DRAIN_LIFE, 2500, 1); + events.ScheduleEvent(EVENT_SPELL_FEL_EXPLOSION, 2000); + events.ScheduleEvent(EVENT_DRAIN_CRYSTAL, 14000); + + if (IsHeroic()) + events.ScheduleEvent(EVENT_SPELL_DRAIN_MANA, 7500, 1); + } + + void KilledUnit(Unit* victim) override + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); + } + + void JustDied(Unit* /*killer*/) override + { + Talk(SAY_DEATH); + + instance->SetBossState(DATA_SELIN_FIREHEART, DONE); // Encounter complete! + summons.DespawnAll(); + } + + void SelectNearestCrystal() + { + if (summons.empty()) + return; + + CrystalGUID.Clear(); + Unit* crystal = nullptr; + for (SummonList::const_iterator i = summons.begin(); i != summons.end(); ) + if (Creature* summon = ObjectAccessor::GetCreature(*me, *i++)) + if (!crystal || me->GetDistanceOrder(summon, crystal, false)) + crystal = summon; + + if (crystal) { - instance = creature->GetInstanceScript(); + Talk(SAY_ENERGY); + float x, y, z; + crystal->GetClosePoint(x, y, z, me->GetObjectSize(), CONTACT_DISTANCE); + CrystalGUID = crystal->GetGUID(); + me->GetMotionMaster()->MovePoint(2, x, y, z); } + } - InstanceScript* instance; - EventMap events; - SummonList summons; - ObjectGuid CrystalGUID; - - bool CanAIAttack(Unit const* who) const override + void MovementInform(uint32 type, uint32 id) override + { + if (type == POINT_MOTION_TYPE && id == 2) { - return who->GetPositionX() > 216.0f; - } - - void SpawnCrystals() - { - me->SummonCreature(NPC_FEL_CRYSTAL, 248.053f, 14.592f, 3.74882f, 3.94444f, TEMPSUMMON_CORPSE_DESPAWN); - me->SummonCreature(NPC_FEL_CRYSTAL, 225.969f, -20.0775f, -2.9731f, 0.942478f, TEMPSUMMON_CORPSE_DESPAWN); - me->SummonCreature(NPC_FEL_CRYSTAL, 226.314f, 20.2183f, -2.98127f, 5.32325f, TEMPSUMMON_CORPSE_DESPAWN); - me->SummonCreature(NPC_FEL_CRYSTAL, 247.888f, -14.6252f, 3.80777f, 2.33874f, TEMPSUMMON_CORPSE_DESPAWN); - me->SummonCreature(NPC_FEL_CRYSTAL, 263.149f, 0.309245f, 1.32057f, 3.15905f, TEMPSUMMON_CORPSE_DESPAWN); - } - - void JustSummoned(Creature* summon) override - { - summon->SetReactState(REACT_PASSIVE); - summons.Summon(summon); - } - - void SummonedCreatureDies(Creature* summon, Unit*) override - { - summons.Despawn(summon); - if (events.GetPhaseMask() & 0x01) + if (Unit* crystal = ObjectAccessor::GetUnit(*me, CrystalGUID)) + { + Talk(EMOTE_CRYSTAL); + crystal->ReplaceAllUnitFlags(UNIT_FLAG_NONE); + crystal->CastSpell(me, SPELL_MANA_RAGE, true); + me->CastSpell(crystal, SPELL_FEL_CRYSTAL_COSMETIC, true); + events.SetPhase(1); + events.ScheduleEvent(EVENT_EMPOWER, 0, 0, 1); + } + else events.ScheduleEvent(EVENT_RESTORE_COMBAT, 0); } + } - void Reset() override + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - events.Reset(); - summons.DespawnAll(); - SpawnCrystals(); - instance->SetBossState(DATA_SELIN_FIREHEART, NOT_STARTED); - CrystalGUID.Clear(); - me->SetPower(POWER_MANA, 0); - } - - void JustEngagedWith(Unit* /*who*/) override - { - Talk(SAY_AGGRO); - instance->SetBossState(DATA_SELIN_FIREHEART, IN_PROGRESS); - - events.ScheduleEvent(EVENT_SPELL_DRAIN_LIFE, 2500, 1); + case EVENT_SPELL_DRAIN_LIFE: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) + me->CastSpell(target, DUNGEON_MODE(SPELL_DRAIN_LIFE_N, SPELL_DRAIN_LIFE_H), false); + events.ScheduleEvent(EVENT_SPELL_DRAIN_LIFE, 10000, 1); + return; + case EVENT_SPELL_DRAIN_MANA: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, PowerUsersSelector(me, POWER_MANA, 40.0f, false))) + me->CastSpell(target, SPELL_DRAIN_MANA, false); + events.ScheduleEvent(EVENT_SPELL_DRAIN_MANA, 10000, 1); + return; + case EVENT_SPELL_FEL_EXPLOSION: + me->RemoveAuraFromStack(SPELL_MANA_RAGE_TRIGGER); + me->CastSpell(me, SPELL_FEL_EXPLOSION, false); events.ScheduleEvent(EVENT_SPELL_FEL_EXPLOSION, 2000); - events.ScheduleEvent(EVENT_DRAIN_CRYSTAL, 14000); - - if (IsHeroic()) - events.ScheduleEvent(EVENT_SPELL_DRAIN_MANA, 7500, 1); - } - - void KilledUnit(Unit* victim) override - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_KILL); - } - - void JustDied(Unit* /*killer*/) override - { - Talk(SAY_DEATH); - - instance->SetBossState(DATA_SELIN_FIREHEART, DONE); // Encounter complete! - summons.DespawnAll(); - } - - void SelectNearestCrystal() - { - if (summons.empty()) - return; - - CrystalGUID.Clear(); - Unit* crystal = nullptr; - for (SummonList::const_iterator i = summons.begin(); i != summons.end(); ) - if (Creature* summon = ObjectAccessor::GetCreature(*me, *i++)) - if (!crystal || me->GetDistanceOrder(summon, crystal, false)) - crystal = summon; - - if (crystal) - { - Talk(SAY_ENERGY); - float x, y, z; - crystal->GetClosePoint(x, y, z, me->GetObjectSize(), CONTACT_DISTANCE); - CrystalGUID = crystal->GetGUID(); - me->GetMotionMaster()->MovePoint(2, x, y, z); - } - } - - void MovementInform(uint32 type, uint32 id) override - { - if (type == POINT_MOTION_TYPE && id == 2) + break; + case EVENT_DRAIN_CRYSTAL: + events.DelayEvents(10001); + events.ScheduleEvent(EVENT_EMPOWER, 10000); + events.ScheduleEvent(EVENT_DRAIN_CRYSTAL, 30000); + SelectNearestCrystal(); + break; + case EVENT_EMPOWER: + if (me->GetPower(POWER_MANA) == me->GetMaxPower(POWER_MANA)) { + Talk(SAY_EMPOWERED); if (Unit* crystal = ObjectAccessor::GetUnit(*me, CrystalGUID)) - { - Talk(EMOTE_CRYSTAL); - crystal->ReplaceAllUnitFlags(UNIT_FLAG_NONE); - crystal->CastSpell(me, SPELL_MANA_RAGE, true); - me->CastSpell(crystal, SPELL_FEL_CRYSTAL_COSMETIC, true); - events.SetPhase(1); - events.ScheduleEvent(EVENT_EMPOWER, 0, 0, 1); - } - else - events.ScheduleEvent(EVENT_RESTORE_COMBAT, 0); + Unit::Kill(crystal, crystal); + events.DelayEvents(10000, 1); + events.ScheduleEvent(EVENT_RESTORE_COMBAT, 0); } + else + events.ScheduleEvent(EVENT_EMPOWER, 0, 0, 1); + break; + case EVENT_RESTORE_COMBAT: + events.SetPhase(0); + me->GetMotionMaster()->MoveChase(me->GetVictim()); + break; } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - switch (events.ExecuteEvent()) - { - case EVENT_SPELL_DRAIN_LIFE: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - me->CastSpell(target, DUNGEON_MODE(SPELL_DRAIN_LIFE_N, SPELL_DRAIN_LIFE_H), false); - events.ScheduleEvent(EVENT_SPELL_DRAIN_LIFE, 10000, 1); - return; - case EVENT_SPELL_DRAIN_MANA: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, PowerUsersSelector(me, POWER_MANA, 40.0f, false))) - me->CastSpell(target, SPELL_DRAIN_MANA, false); - events.ScheduleEvent(EVENT_SPELL_DRAIN_MANA, 10000, 1); - return; - case EVENT_SPELL_FEL_EXPLOSION: - me->RemoveAuraFromStack(SPELL_MANA_RAGE_TRIGGER); - me->CastSpell(me, SPELL_FEL_EXPLOSION, false); - events.ScheduleEvent(EVENT_SPELL_FEL_EXPLOSION, 2000); - break; - case EVENT_DRAIN_CRYSTAL: - events.DelayEvents(10001); - events.ScheduleEvent(EVENT_EMPOWER, 10000); - events.ScheduleEvent(EVENT_DRAIN_CRYSTAL, 30000); - SelectNearestCrystal(); - break; - case EVENT_EMPOWER: - if (me->GetPower(POWER_MANA) == me->GetMaxPower(POWER_MANA)) - { - Talk(SAY_EMPOWERED); - if (Unit* crystal = ObjectAccessor::GetUnit(*me, CrystalGUID)) - Unit::Kill(crystal, crystal); - events.DelayEvents(10000, 1); - events.ScheduleEvent(EVENT_RESTORE_COMBAT, 0); - } - else - events.ScheduleEvent(EVENT_EMPOWER, 0, 0, 1); - break; - case EVENT_RESTORE_COMBAT: - events.SetPhase(0); - me->GetMotionMaster()->MoveChase(me->GetVictim()); - break; - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } }; void AddSC_boss_selin_fireheart() { - new boss_selin_fireheart(); + RegisterMagistersTerraceCreatureAI(boss_selin_fireheart); } diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp index f550b9554..9855abce9 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_vexallus.cpp @@ -58,133 +58,122 @@ enum Misc EVENT_HEALTH_CHECK = 3, }; -class boss_vexallus : public CreatureScript +struct boss_vexallus : public ScriptedAI { -public: - boss_vexallus() : CreatureScript("boss_vexallus") { } - - CreatureAI* GetAI(Creature* creature) const override + boss_vexallus(Creature* creature) : ScriptedAI(creature), summons(me) { - return GetMagistersTerraceAI(creature); - }; + instance = creature->GetInstanceScript(); + } - struct boss_vexallusAI : public ScriptedAI + InstanceScript* instance; + EventMap events; + SummonList summons; + + uint8 IntervalHealthAmount; + bool Enraged; + + void Reset() override { - boss_vexallusAI(Creature* creature) : ScriptedAI(creature), summons(me) + summons.DespawnAll(); + IntervalHealthAmount = 1; + + instance->SetBossState(DATA_VEXALLUS, NOT_STARTED); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ENERGY_FEEDBACK); + } + + void KilledUnit(Unit* victim) override + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_KILL); + } + + void JustDied(Unit* /*killer*/) override + { + summons.DespawnAll(); + instance->SetBossState(DATA_VEXALLUS, DONE); + instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ENERGY_FEEDBACK); + } + + void JustEngagedWith(Unit* /*who*/) override + { + Talk(SAY_AGGRO); + instance->SetBossState(DATA_VEXALLUS, IN_PROGRESS); + + events.ScheduleEvent(EVENT_SPELL_CHAIN_LIGHTNING, 8000); + events.ScheduleEvent(EVENT_SPELL_ARCANE_SHOCK, 5000); + events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000); + } + + void JustSummoned(Creature* summon) override + { + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) { - instance = creature->GetInstanceScript(); + summon->GetMotionMaster()->MoveFollow(target, 0.0f, 0.0f); + summon->CastSpell(target, SPELL_ENERGY_FEEDBACK_CHANNEL, false); } + summons.Summon(summon); + } - InstanceScript* instance; - EventMap events; - SummonList summons; + void SummonedCreatureDies(Creature* summon, Unit* killer) override + { + summons.Despawn(summon); + summon->DespawnOrUnsummon(1); + if (killer) + killer->CastSpell(killer, SPELL_ENERGY_FEEDBACK, true, 0, 0, summon->GetGUID()); + } - uint8 IntervalHealthAmount; - bool Enraged; + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - void Reset() override + events.Update(diff); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) { - summons.DespawnAll(); - IntervalHealthAmount = 1; + case EVENT_HEALTH_CHECK: + //used for check, when Vexallus cast adds 85%, 70%, 55%, 40% + if (!HealthAbovePct(100 - INTERVAL_MODIFIER * IntervalHealthAmount)) + { + if (IntervalHealthAmount++ == INTERVAL_SWITCH) + { + events.Reset(); + me->CastSpell(me, SPELL_OVERLOAD, true); + return; + } - instance->SetBossState(DATA_VEXALLUS, NOT_STARTED); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ENERGY_FEEDBACK); - } + Talk(SAY_ENERGY); + Talk(EMOTE_DISCHARGE_ENERGY); - void KilledUnit(Unit* victim) override - { - if (victim->GetTypeId() == TYPEID_PLAYER) - Talk(SAY_KILL); - } - - void JustDied(Unit* /*killer*/) override - { - summons.DespawnAll(); - instance->SetBossState(DATA_VEXALLUS, DONE); - instance->DoRemoveAurasDueToSpellOnPlayers(SPELL_ENERGY_FEEDBACK); - } - - void JustEngagedWith(Unit* /*who*/) override - { - Talk(SAY_AGGRO); - instance->SetBossState(DATA_VEXALLUS, IN_PROGRESS); - - events.ScheduleEvent(EVENT_SPELL_CHAIN_LIGHTNING, 8000); - events.ScheduleEvent(EVENT_SPELL_ARCANE_SHOCK, 5000); - events.ScheduleEvent(EVENT_HEALTH_CHECK, 1000); - } - - void JustSummoned(Creature* summon) override - { + if (IsHeroic()) + { + me->CastSpell(me, SPELL_SUMMON_PURE_ENERGY_H1, false); + me->CastSpell(me, SPELL_SUMMON_PURE_ENERGY_H2, false); + } + else + me->CastSpell(me, SPELL_SUMMON_PURE_ENERGY_N, false); + } + events.ScheduleEvent(EVENT_HEALTH_CHECK, 0); + break; + case EVENT_SPELL_CHAIN_LIGHTNING: if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - { - summon->GetMotionMaster()->MoveFollow(target, 0.0f, 0.0f); - summon->CastSpell(target, SPELL_ENERGY_FEEDBACK_CHANNEL, false); - } - summons.Summon(summon); + me->CastSpell(target, DUNGEON_MODE(SPELL_CHAIN_LIGHTNING_N, SPELL_CHAIN_LIGHTNING_H), false); + events.ScheduleEvent(EVENT_SPELL_CHAIN_LIGHTNING, 8000); + break; + case EVENT_SPELL_ARCANE_SHOCK: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 20.0f)) + me->CastSpell(target, DUNGEON_MODE(SPELL_ARCANE_SHOCK_N, SPELL_ARCANE_SHOCK_H), false); + events.ScheduleEvent(EVENT_SPELL_ARCANE_SHOCK, 8000); + break; } - void SummonedCreatureDies(Creature* summon, Unit* killer) override - { - summons.Despawn(summon); - summon->DespawnOrUnsummon(1); - if (killer) - killer->CastSpell(killer, SPELL_ENERGY_FEEDBACK, true, 0, 0, summon->GetGUID()); - } - - 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: - //used for check, when Vexallus cast adds 85%, 70%, 55%, 40% - if (!HealthAbovePct(100 - INTERVAL_MODIFIER * IntervalHealthAmount)) - { - if (IntervalHealthAmount++ == INTERVAL_SWITCH) - { - events.Reset(); - me->CastSpell(me, SPELL_OVERLOAD, true); - return; - } - - Talk(SAY_ENERGY); - Talk(EMOTE_DISCHARGE_ENERGY); - - if (IsHeroic()) - { - me->CastSpell(me, SPELL_SUMMON_PURE_ENERGY_H1, false); - me->CastSpell(me, SPELL_SUMMON_PURE_ENERGY_H2, false); - } - else - me->CastSpell(me, SPELL_SUMMON_PURE_ENERGY_N, false); - } - events.ScheduleEvent(EVENT_HEALTH_CHECK, 0); - break; - case EVENT_SPELL_CHAIN_LIGHTNING: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) - me->CastSpell(target, DUNGEON_MODE(SPELL_CHAIN_LIGHTNING_N, SPELL_CHAIN_LIGHTNING_H), false); - events.ScheduleEvent(EVENT_SPELL_CHAIN_LIGHTNING, 8000); - break; - case EVENT_SPELL_ARCANE_SHOCK: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 20.0f)) - me->CastSpell(target, DUNGEON_MODE(SPELL_ARCANE_SHOCK_N, SPELL_ARCANE_SHOCK_H), false); - events.ScheduleEvent(EVENT_SPELL_ARCANE_SHOCK, 8000); - break; - } - - DoMeleeAttackIfReady(); - } - }; + DoMeleeAttackIfReady(); + } }; void AddSC_boss_vexallus() { - new boss_vexallus(); + RegisterMagistersTerraceCreatureAI(boss_vexallus); }