diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp index 28be3faf6..d96bdc33b 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/boss_priestess_delrissa.cpp @@ -39,8 +39,8 @@ enum Spells enum Misc { - MAX_ACTIVE_HELPERS = 4, - MAX_HELPERS_COUNT = 8 + MAX_ACTIVE_HELPERS = 4, + MAX_HELPERS_COUNT = 8 }; const Position helpersLocations[MAX_ACTIVE_HELPERS] = @@ -63,41 +63,29 @@ const uint32 helpersEntries[MAX_HELPERS_COUNT] = 24556, //Zelfan }; -enum Events +struct boss_priestess_delrissa : public BossAI { - 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, -}; - -struct boss_priestess_delrissa : public ScriptedAI -{ - boss_priestess_delrissa(Creature* creature) : ScriptedAI(creature), summons(me) - { - instance = creature->GetInstanceScript(); - } - - InstanceScript* instance; - EventMap events; - SummonList summons; + boss_priestess_delrissa(Creature* creature) : BossAI(creature, DATA_DELRISSA) { } uint8 PlayersKilled; uint8 HelpersKilled; void Reset() override { + instance->SetBossState(DATA_DELRISSA, NOT_STARTED); + scheduler.CancelAll(); PlayersKilled = SAY_PLAYER_KILLED; HelpersKilled = SAY_HELPER_DIED; - instance->SetBossState(DATA_DELRISSA, NOT_STARTED); summons.Respawn(); me->SetLootMode(0); } + bool CheckInRoom() override + { + return me->GetDistance(me->GetHomePosition()) < 75.0f; + } + void InitializeAI() override { ScriptedAI::InitializeAI(); @@ -137,17 +125,60 @@ struct boss_priestess_delrissa : public ScriptedAI void JustEngagedWith(Unit* /*who*/) override { Talk(SAY_AGGRO); - summons.DoZoneInCombat(); - instance->SetBossState(DATA_DELRISSA, IN_PROGRESS); + _JustEngagedWith(); + + ScheduleTimedEvent(15s, [&] { + if (Unit* target = DoSelectLowestHpFriendly(40.0f, 1000)) + DoCast(target, SPELL_FLASH_HEAL); + }, 15s); + + ScheduleTimedEvent(10s, [&] { + if (Unit* target = DoSelectLowestHpFriendly(40.0f, 1000)) + DoCast(target, SPELL_RENEW); + }, 7s); + + ScheduleTimedEvent(2s, [&] { + std::list cList = DoFindFriendlyMissingBuff(40.0f, SPELL_POWER_WORD_SHIELD); + if (Unit* target = Acore::Containers::SelectRandomContainerElement(cList)) + DoCast(target, SPELL_POWER_WORD_SHIELD); + }, 10s); + + ScheduleTimedEvent(5s, [&] { + DoCastRandomTarget(SPELL_SHADOW_WORD_PAIN, 0, 30.0f); + }, 10s); + + ScheduleTimedEvent(7500ms, [&] { + 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) + DoCast(target, SPELL_DISPEL_MAGIC); + }, 12s); - 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); + { + scheduler.Schedule(4s, [this](TaskContext context) + { + if (me->HasUnitState(UNIT_STATE_LOST_CONTROL)) + { + DoCastSelf(SPELL_MEDALION_OF_IMMUNITY, false); + context.Repeat(1min); + } + else + context.Repeat(1s); + }); + } } void KilledUnit(Unit* victim) override @@ -166,93 +197,12 @@ struct boss_priestess_delrissa : public ScriptedAI 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()) - { - 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, SPELL_RENEW, false); - events.ScheduleEvent(EVENT_SPELL_RENEW, 7000); - break; - case EVENT_SPELL_PW_SHIELD: - { - std::list cList = DoFindFriendlyMissingBuff(40.0f, SPELL_POWER_WORD_SHIELD); - if (Unit* target = Acore::Containers::SelectRandomContainerElement(cList)) - me->CastSpell(target, SPELL_POWER_WORD_SHIELD, 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, SPELL_SHADOW_WORD_PAIN, false); - events.ScheduleEvent(EVENT_SPELL_SW_PAIN, 10000); - break; - } - - DoMeleeAttackIfReady(); - } }; enum helpersShared { SPELL_HEALING_POTION = 15503, - EVENT_SPELL_HELPER_HEALING_POTION = 20, - EVENT_SPELL_HELPER_IMMUNITY = 21, - EVENT_HELPER_RESET_THREAT = 22, - AI_TYPE_MELEE = 1, AI_TYPE_RANGED = 2 }; @@ -266,9 +216,7 @@ struct boss_priestess_lackey_commonAI : public ScriptedAI } InstanceScript* instance; - EventMap events; SummonList summons; - uint32 actualEventId; uint8 aiType; float GetThreatMod(float dist, float /*armor*/, uint32 health, uint32 /*maxhealth*/, Unit* target) @@ -286,9 +234,9 @@ 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 (auto const& ref : tList) { - Unit* pUnit = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); + Unit* pUnit = ObjectAccessor::GetUnit(*me, ref->getUnitGuid()); if (pUnit && pUnit->IsPlayer() && me->GetThreatMgr().GetThreat(pUnit)) { float threatMod = GetThreatMod(me->GetDistance2d(pUnit), (float)pUnit->GetArmor(), pUnit->GetHealth(), pUnit->GetMaxHealth(), pUnit); @@ -302,8 +250,8 @@ struct boss_priestess_lackey_commonAI : public ScriptedAI void Reset() override { events.Reset(); + scheduler.CancelAll(); summons.DespawnAll(); - actualEventId = 0; } void JustSummoned(Creature* summon) override @@ -313,7 +261,7 @@ struct boss_priestess_lackey_commonAI : public ScriptedAI void EnterEvadeMode(EvadeReason why) override { - if (Creature* delrissa = ObjectAccessor::GetCreature(*me, instance->GetGuidData(NPC_DELRISSA))) + if (Creature* delrissa = instance->GetCreature(DATA_DELRISSA)) if (!delrissa->IsAlive()) { delrissa->Respawn(); @@ -324,14 +272,35 @@ struct boss_priestess_lackey_commonAI : public ScriptedAI void JustEngagedWith(Unit* who) override { - if (Creature* delrissa = ObjectAccessor::GetCreature(*me, instance->GetGuidData(NPC_DELRISSA))) + if (Creature* delrissa = instance->GetCreature(DATA_DELRISSA)) if (delrissa->IsAlive() && !delrissa->IsEngaged()) delrissa->AI()->AttackStart(who); - events.ScheduleEvent(EVENT_SPELL_HELPER_HEALING_POTION, 1000); - events.ScheduleEvent(EVENT_HELPER_RESET_THREAT, urand(8000, 10000)); + scheduler.Schedule(5s, [this](TaskContext context) + { + if (me->HealthBelowPct(25)) + DoCastSelf(SPELL_HEALING_POTION, true); + else + context.Repeat(1s); + }); + + ScheduleTimedEvent(8s, 10s, [&] { + RecalculateThreat(); + }, 8s, 10s); + if (IsHeroic()) - events.ScheduleEvent(EVENT_SPELL_HELPER_IMMUNITY, 2000, 1); + { + scheduler.Schedule(2s, [this](TaskContext context) + { + if (me->HasUnitState(UNIT_STATE_LOST_CONTROL)) + { + DoCastSelf(SPELL_MEDALION_OF_IMMUNITY); + context.Repeat(1min); + } + else + context.Repeat(1s); + }); + } RecalculateThreat(); } @@ -343,7 +312,7 @@ struct boss_priestess_lackey_commonAI : public ScriptedAI void KilledUnit(Unit* victim) override { - if (Creature* delrissa = ObjectAccessor::GetCreature(*me, instance->GetGuidData(NPC_DELRISSA))) + if (Creature* delrissa = instance->GetCreature(DATA_DELRISSA)) delrissa->AI()->KilledUnit(victim); } @@ -355,36 +324,14 @@ struct boss_priestess_lackey_commonAI : public ScriptedAI void UpdateAI(uint32 diff) override { - actualEventId = 0; - events.Update(diff); + if (!UpdateVictim()) + return; + if (me->HasUnitState(UNIT_STATE_CASTING)) return; - 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)); - break; - } + scheduler.Update(diff, + std::bind(&BossAI::DoMeleeAttackIfReady, this)); } }; @@ -395,13 +342,7 @@ enum RogueEnum SPELL_GOUGE = 12540, SPELL_KICK = 27613, SPELL_BACKSTAB = 15657, - SPELL_EVISCERATE = 27611, - - EVENT_SPELL_GOUGE = 1, - EVENT_SPELL_KICK = 2, - EVENT_SPELL_VANISH = 3, - EVENT_SPELL_EVISCERATE = 4, - EVENT_SPELL_BACKSTAB = 5, + SPELL_EVISCERATE = 27611 }; struct boss_kagani_nightstrike : public boss_priestess_lackey_commonAI @@ -412,11 +353,42 @@ struct boss_kagani_nightstrike : public boss_priestess_lackey_commonAI { 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); + ScheduleTimedEvent(5500ms, [&] { + DoCastVictim(SPELL_GOUGE); + }, 15s); + + ScheduleTimedEvent(6s, [&] { + DoCastVictim(SPELL_EVISCERATE); + }, 10s); + + ScheduleTimedEvent(1s, [&] { + DoCastSelf(SPELL_VANISH); + DoResetThreatList(); + if (Unit* unit = SelectTarget(SelectTargetMethod::Random, 0)) + me->AddThreat(unit, 1000.0f); + }, 30s); + + scheduler.Schedule(9s, [this](TaskContext context) + { + if (me->GetVictim() && me->GetVictim()->HasUnitState(UNIT_STATE_CASTING)) + { + DoCastVictim(SPELL_KICK); + context.Repeat(15s); + } + else + context.Repeat(1s); + }); + + scheduler.Schedule(9s, [this](TaskContext context) + { + if (me->GetVictim() && !me->GetVictim()->HasInArc(static_cast(M_PI), me)) + { + DoCastVictim(SPELL_BACKSTAB); + context.Repeat(5s); + } + else + context.Repeat(1s); + }); } void MovementInform(uint32 type, uint32 /*point*/) override @@ -424,54 +396,6 @@ struct boss_kagani_nightstrike : public boss_priestess_lackey_commonAI 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) - { - 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(), SPELL_EVISCERATE, 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(), SPELL_BACKSTAB, false); - events.ScheduleEvent(EVENT_SPELL_BACKSTAB, 5000); - } - else - events.ScheduleEvent(EVENT_SPELL_BACKSTAB, 1000); - break; - } - - DoMeleeAttackIfReady(); - } }; enum WarlockEnum @@ -481,13 +405,7 @@ enum WarlockEnum SPELL_CURSE_OF_AGONY = 14875, SPELL_SEED_OF_CORRUPTION = 44141, SPELL_FEAR = 38595, - SPELL_SUMMON_IMP = 44163, - - 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, + SPELL_SUMMON_IMP = 44163 }; struct boss_ellris_duskhallow : public boss_priestess_lackey_commonAI @@ -496,52 +414,28 @@ struct boss_ellris_duskhallow : public boss_priestess_lackey_commonAI void JustEngagedWith(Unit* who) override { - me->CastSpell(me, SPELL_SUMMON_IMP, false); + DoCastAOE(SPELL_SUMMON_IMP); 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); - } + ScheduleTimedEvent(3s, [&] { + DoCastRandomTarget(SPELL_IMMOLATE, 0, 20.0f); + }, 12s); - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + ScheduleTimedEvent(1s, [&] { + DoCastVictim(SPELL_SHADOW_BOLT); + }, 5s); - boss_priestess_lackey_commonAI::UpdateAI(diff); + ScheduleTimedEvent(10s, [&] { + DoCastRandomTarget(SPELL_SEED_OF_CORRUPTION, 0, 30.0f); + }, 18s); - switch (actualEventId) - { - case EVENT_SPELL_IMMOLATE: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f)) - me->CastSpell(target, SPELL_IMMOLATE, false); - events.ScheduleEvent(EVENT_SPELL_IMMOLATE, 12000); - break; - case EVENT_SPELL_SHADOW_BOLT: - me->CastSpell(me->GetVictim(), SPELL_SHADOW_BOLT, 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, SPELL_CURSE_OF_AGONY, 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; - } + ScheduleTimedEvent(6s, [&] { + DoCastRandomTarget(SPELL_CURSE_OF_AGONY, 0, 30.0f); + }, 13s); - DoMeleeAttackIfReady(); + ScheduleTimedEvent(15s, [&] { + DoCastRandomTarget(SPELL_FEAR, 0, 20.0f); + }, 15s); } }; @@ -549,11 +443,7 @@ enum MonkEnum { SPELL_KNOCKDOWN = 11428, SPELL_SNAP_KICK = 46182, - SPELL_FISTS_OF_ARCANE = 44120, - - EVENT_SPELL_KNOCKDOWN = 1, - EVENT_SPELL_SNAP_KICK = 2, - EVENT_SPELL_FISTS = 3, + SPELL_FISTS_OF_ARCANE = 44120 }; struct boss_eramas_brightblaze : public boss_priestess_lackey_commonAI @@ -564,35 +454,17 @@ struct boss_eramas_brightblaze : public boss_priestess_lackey_commonAI { 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); - } + ScheduleTimedEvent(6s, [&] { + DoCastVictim(SPELL_KNOCKDOWN); + }, 10s); - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + ScheduleTimedEvent(3s, [&] { + DoCastVictim(SPELL_SNAP_KICK); + }, 10s); - boss_priestess_lackey_commonAI::UpdateAI(diff); - - switch (actualEventId) - { - case EVENT_SPELL_KNOCKDOWN: - me->CastSpell(me->GetVictim(), SPELL_KNOCKDOWN, 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(); + ScheduleTimedEvent(3s, [&] { + DoCastVictim(SPELL_FISTS_OF_ARCANE); + }, 10s); } }; @@ -604,15 +476,7 @@ enum MageEnum SPELL_ICE_LANCE = 44176, SPELL_CONE_OF_COLD = 12611, SPELL_FROSTBOLT = 15043, - 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 + SPELL_BLINK = 14514 }; struct boss_yazzai : public boss_priestess_lackey_commonAI @@ -623,74 +487,38 @@ struct boss_yazzai : public boss_priestess_lackey_commonAI { 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); - } + ScheduleTimedEvent(1s, [&] { + DoCastRandomTarget(SPELL_POLYMORPH); + }, 20s); - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + ScheduleTimedEvent(8s, [&] { + DoCastRandomTarget(SPELL_BLIZZARD); + }, 20s); - boss_priestess_lackey_commonAI::UpdateAI(diff); + ScheduleTimedEvent(12s, [&] { + DoCastVictim(SPELL_ICE_LANCE); + }, 12s); - switch (actualEventId) + ScheduleTimedEvent(10s, [&] { + DoCastVictim(SPELL_CONE_OF_COLD); + }, 10s); + + ScheduleTimedEvent(3s, [&] { + DoCastVictim(SPELL_FROSTBOLT); + }, 8s); + + ScheduleTimedEvent(5s, [&] { + if (me->SelectNearbyTarget()) + DoCastAOE(SPELL_BLINK); + }, 15s); + + scheduler.Schedule(1s, [this](TaskContext context) { - 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, SPELL_BLIZZARD, false); - events.ScheduleEvent(EVENT_SPELL_BLIZZARD, 20000); - break; - case EVENT_SPELL_ICE_LANCE: - me->CastSpell(me->GetVictim(), SPELL_ICE_LANCE, false); - events.ScheduleEvent(EVENT_SPELL_ICE_LANCE, 12000); - break; - case EVENT_SPELL_COC: - me->CastSpell(me->GetVictim(), SPELL_CONE_OF_COLD, false); - events.ScheduleEvent(EVENT_SPELL_COC, 10000); - break; - case EVENT_SPELL_FROSTBOLT: - me->CastSpell(me->GetVictim(), SPELL_FROSTBOLT, 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); - break; - } - } - - DoMeleeAttackIfReady(); + if (me->HealthBelowPct(35)) + DoCastSelf(SPELL_ICE_BLOCK, true); + else + context.Repeat(); + }); } }; @@ -702,14 +530,7 @@ enum WarriorEnum 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, + SPELL_MORTAL_STRIKE = 44268 }; struct boss_warlord_salaris : public boss_priestess_lackey_commonAI @@ -719,52 +540,31 @@ struct boss_warlord_salaris : public boss_priestess_lackey_commonAI void JustEngagedWith(Unit* who) override { boss_priestess_lackey_commonAI::JustEngagedWith(who); - me->CastSpell(me, SPELL_BATTLE_SHOUT, false); + DoCastAOE(SPELL_BATTLE_SHOUT); - 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); - } + ScheduleTimedEvent(6s, [&] { + DoCastVictim(SPELL_INTERCEPT); + }, 10s); - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + ScheduleTimedEvent(10s, [&] { + DoCastVictim(SPELL_DISARM); + }, 16s); - boss_priestess_lackey_commonAI::UpdateAI(diff); + ScheduleTimedEvent(18s, [&] { + DoCastVictim(SPELL_HAMSTRING); + }, 15s); - 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; - } + ScheduleTimedEvent(4s, [&] { + DoCastVictim(SPELL_MORTAL_STRIKE); + }, 10s); - DoMeleeAttackIfReady(); + ScheduleTimedEvent(8s, [&] { + DoCastAOE(SPELL_PIERCING_HOWL); + }, 15s); + + ScheduleTimedEvent(1s, [&] { + DoCastAOE(SPELL_FRIGHTENING_SHOUT); + }, 18s); } }; @@ -777,18 +577,12 @@ enum HunterEnum SPELL_WING_CLIP = 44286, SPELL_FREEZING_TRAP = 44136, - NPC_SLIVER = 24552, - - EVENT_SPELL_AIMED_SHOT = 1, - EVENT_SPELL_SHOOT = 2, - EVENT_SPELL_CONCUSSIVE_SHOT = 3, - EVENT_SPELL_MULTI_SHOT = 4, - EVENT_SPELL_WING_CLIP = 5 + NPC_SLIVER = 24552 }; struct boss_garaxxas : public boss_priestess_lackey_commonAI { - boss_garaxxas(Creature* creature) : boss_priestess_lackey_commonAI(creature, AI_TYPE_RANGED) {} + boss_garaxxas(Creature* creature) : boss_priestess_lackey_commonAI(creature, AI_TYPE_RANGED) { } void Reset() override { @@ -799,47 +593,27 @@ struct boss_garaxxas : public boss_priestess_lackey_commonAI void JustEngagedWith(Unit* who) override { boss_priestess_lackey_commonAI::JustEngagedWith(who); - me->CastSpell(me, SPELL_FREEZING_TRAP, true); + DoCastAOE(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); - events.ScheduleEvent(EVENT_SPELL_WING_CLIP, 4000); - } + ScheduleTimedEvent(8s, [&] { + DoCastVictim(SPELL_AIMED_SHOT); + }, 15s); - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + ScheduleTimedEvent(6s, [&] { + DoCastVictim(SPELL_CONCUSSIVE_SHOT); + }, 15s); - boss_priestess_lackey_commonAI::UpdateAI(diff); + ScheduleTimedEvent(10s, [&] { + DoCastVictim(SPELL_MULTI_SHOT); + }, 10s); - 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(), SPELL_SHOOT, false); - events.ScheduleEvent(EVENT_SPELL_SHOOT, 2500); - break; - } + ScheduleTimedEvent(1s, [&] { + DoCastVictim(SPELL_SHOOT); + }, 2500ms); - DoMeleeAttackIfReady(); + ScheduleTimedEvent(4s, [&] { + DoCastVictim(SPELL_WING_CLIP); + }, 4s); } }; @@ -851,83 +625,45 @@ enum ShamanEnum SPELL_WAR_STOMP = 46026, SPELL_PURGE = 27626, SPELL_LESSER_HEALING_WAVE = 44256, - SPELL_FROST_SHOCK = 21401, - - 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 + SPELL_FROST_SHOCK = 21401 }; struct boss_apoko : public boss_priestess_lackey_commonAI { boss_apoko(Creature* creature) : boss_priestess_lackey_commonAI(creature, AI_TYPE_MELEE) { } - // 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 { 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); - } + ScheduleTimedEvent(2s, [&] { + DoCastAOE(SPELL_WINDFURY_TOTEM); + }, 20s); - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + ScheduleTimedEvent(4s, [&] { + DoCastAOE(SPELL_FIRE_NOVA_TOTEM); + }, 20s); - boss_priestess_lackey_commonAI::UpdateAI(diff); + ScheduleTimedEvent(6s, [&] { + DoCastAOE(SPELL_EARTHBIND_TOTEM); + }, 20s); - 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, SPELL_FROST_SHOCK, false); - events.ScheduleEvent(EVENT_SPELL_FROST_SHOCK, 12000); - break; - case EVENT_SPELL_HEALING_WAVE: + ScheduleTimedEvent(10s, [&] { + DoCastAOE(SPELL_WAR_STOMP); + }, 2min); + + ScheduleTimedEvent(14s, [&] { + DoCastRandomTarget(SPELL_PURGE, 0, 30.0f); + }, 15s); + + ScheduleTimedEvent(12s, [&] { if (Unit* target = DoSelectLowestHpFriendly(40.0f, 1000)) - me->CastSpell(target, SPELL_LESSER_HEALING_WAVE, false); - events.ScheduleEvent(EVENT_SPELL_HEALING_WAVE, 12000); - break; - } + DoCast(target, SPELL_LESSER_HEALING_WAVE); + }, 15s); - DoMeleeAttackIfReady(); + ScheduleTimedEvent(8s, [&] { + DoCastVictim(SPELL_FROST_SHOCK); + }, 12s); } }; @@ -937,13 +673,7 @@ enum EngineerEnum SPELL_ROCKET_LAUNCH = 44137, SPELL_FEL_IRON_BOMB = 46024, SPELL_RECOMBOBULATE = 44274, - SPELL_HIGH_EXPLOSIVE_SHEEP = 44276, - - EVENT_SPELL_DRAGON_GUN = 1, - EVENT_SPELL_ROCKET_LAUNCH = 2, - EVENT_SPELL_RECOMBOBULATE = 3, - EVENT_SPELL_EXPLOSIVE_SHEEP = 4, - EVENT_SPELL_IRON_BOMB = 5 + SPELL_HIGH_EXPLOSIVE_SHEEP = 44276 }; struct boss_zelfan : public boss_priestess_lackey_commonAI @@ -954,54 +684,31 @@ struct boss_zelfan : public boss_priestess_lackey_commonAI { 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); - } + ScheduleTimedEvent(20s, [&] { + DoCastVictim(SPELL_GOBLIN_DRAGON_GUN); + }, 20s); - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + ScheduleTimedEvent(7s, [&] { + DoCastVictim(SPELL_ROCKET_LAUNCH); + }, 20s); - boss_priestess_lackey_commonAI::UpdateAI(diff); - - switch (actualEventId) - { - case EVENT_SPELL_DRAGON_GUN: - me->CastSpell(me->GetVictim(), SPELL_GOBLIN_DRAGON_GUN, false); - events.ScheduleEvent(EVENT_SPELL_DRAGON_GUN, 20000); - break; - case EVENT_SPELL_ROCKET_LAUNCH: - me->CastSpell(me->GetVictim(), SPELL_ROCKET_LAUNCH, 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, SPELL_FEL_IRON_BOMB, false); - events.ScheduleEvent(EVENT_SPELL_IRON_BOMB, 20000); - break; - case EVENT_SPELL_RECOMBOBULATE: - { + ScheduleTimedEvent(14s, [&] { std::list cList = DoFindFriendlyMissingBuff(30.0f, SPELL_RECOMBOBULATE); - for (std::list::const_iterator itr = cList.begin(); itr != cList.end(); ++itr) - if ((*itr)->IsPolymorphed()) + for (auto const& creature : cList) + if (creature->IsPolymorphed()) { - me->CastSpell(*itr, SPELL_RECOMBOBULATE, false); + DoCast(creature, SPELL_RECOMBOBULATE); 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; - } + }, 10s); - DoMeleeAttackIfReady(); + ScheduleTimedEvent(10s, [&] { + DoCastAOE(SPELL_HIGH_EXPLOSIVE_SHEEP); + }, 1min); + + ScheduleTimedEvent(5s, [&] { + DoCastRandomTarget(SPELL_FEL_IRON_BOMB, 0, 15.0f); + }, 20s); } }; diff --git a/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp b/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp index 8b91165d0..ac265bcec 100644 --- a/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp +++ b/src/server/scripts/EasternKingdoms/MagistersTerrace/instance_magisters_terrace.cpp @@ -23,6 +23,7 @@ ObjectData const creatureData[] = { + { NPC_DELRISSA, DATA_DELRISSA }, { NPC_KAEL_THAS, DATA_KAELTHAS }, { NPC_KALECGOS, DATA_KALECGOS }, { 0, 0 } @@ -34,6 +35,13 @@ ObjectData const gameobjectData[] = { 0, 0, } }; +ObjectData const summonerData[] = +{ + { NPC_PHOENIX, DATA_KAELTHAS }, + { NPC_PHOENIX_EGG, DATA_KAELTHAS }, + { 0, 0 } +}; + DoorData const doorData[] = { { GO_SELIN_DOOR, DATA_SELIN_FIREHEART, DOOR_TYPE_PASSAGE }, @@ -58,10 +66,9 @@ public: SetBossNumber(MAX_ENCOUNTER); LoadObjectData(creatureData, gameobjectData); LoadDoorData(doorData); + LoadSummonData(summonerData); } - ObjectGuid DelrissaGUID; - void ProcessEvent(WorldObject* /*obj*/, uint32 eventId) override { if (eventId == EVENT_SPAWN_KALECGOS) @@ -74,31 +81,6 @@ public: }); } } - - void OnCreatureCreate(Creature* creature) override - { - switch (creature->GetEntry()) - { - case NPC_DELRISSA: - DelrissaGUID = creature->GetGUID(); - break; - case NPC_PHOENIX: - case NPC_PHOENIX_EGG: - if (Creature* kael = GetCreature(DATA_KAELTHAS)) - kael->AI()->JustSummoned(creature); - break; - } - - InstanceScript::OnCreatureCreate(creature); - } - - ObjectGuid GetGuidData(uint32 identifier) const override - { - if (identifier == NPC_DELRISSA) - return DelrissaGUID; - - return ObjectGuid::Empty; - } }; InstanceScript* GetInstanceScript(InstanceMap* map) const override