summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew <47818697+Nyeriah@users.noreply.github.com>2024-11-16 08:33:12 -0300
committerGitHub <noreply@github.com>2024-11-16 08:33:12 -0300
commit59db107ed38a1e50f6beccfc34a5baf55620fe92 (patch)
treed1e87edba22108c26d4cb19561051a70041500d6 /src
parent48a0b7a460b53b048d942a65f52c85a5c8a89153 (diff)
refactor(Scripts/SunwellPlateau): Update Kalecgos script (#20588)
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp533
1 files changed, 201 insertions, 332 deletions
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
index 2c41d4a805..abb1b321c1 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp
@@ -84,50 +84,28 @@ enum SWPActions
ACTION_ENRAGE_OTHER = 5,
};
-enum kalEvents
-{
- EVENT_ARCANE_BUFFET = 1,
- EVENT_FROST_BREATH = 2,
- EVENT_WILD_MAGIC = 3,
- EVENT_TAIL_LASH = 4,
- EVENT_SPECTRAL_BLAST = 5,
- EVENT_CHECK_HEALTH = 6,
- EVENT_CHECK_HEALTH2 = 7,
- EVENT_CHECK_POS = 8,
- EVENT_SPAWN_SPECTRALS = 9,
-
- EVENT_SPELL_REVITALIZE = 10,
- EVENT_SPELL_HEROIC_STRIKE = 11,
- EVENT_SHADOW_BOLT = 12,
- EVENT_AGONY_CURSE = 13,
- EVENT_CORRUPTION_STRIKE = 14,
-
- EVENT_TALK_GOOD_1 = 20,
- EVENT_TALK_GOOD_2 = 21,
- EVENT_TALK_GOOD_3 = 22,
- EVENT_TALK_GOOD_4 = 23,
- EVENT_TALK_GOOD_5 = 24,
- EVENT_TALK_BAD_1 = 25,
- EVENT_TALK_BAD_2 = 26,
- EVENT_TALK_BAD_3 = 27
-};
-
#define DRAGON_REALM_Z 53.079f
struct boss_kalecgos : public BossAI
{
boss_kalecgos(Creature* creature) : BossAI(creature, DATA_KALECGOS)
{
+ SetInvincibility(true);
}
- bool sathBanished;
- EventMap events2;
-
bool CanAIAttack(Unit const* target) const override
{
return target->GetPositionZ() > 50.0f;
}
+ bool CheckInRoom() override
+ {
+ if (me->GetDistance(me->GetHomePosition()) > 50.0f)
+ return false;
+
+ return true;
+ }
+
void JustReachedHome() override
{
BossAI::JustReachedHome();
@@ -137,15 +115,24 @@ struct boss_kalecgos : public BossAI
void Reset() override
{
BossAI::Reset();
- me->SetHealth(me->GetMaxHealth());
+ me->SetFullHealth();
me->SetStandState(UNIT_STAND_STATE_SLEEP);
me->SetDisableGravity(false);
me->SetReactState(REACT_AGGRESSIVE);
me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
- events2.Reset();
- sathBanished = false;
+ _sathBanished = false;
ClearPlayerAuras();
+
+ ScheduleHealthCheckEvent(10, [&] {
+ if (Creature* Sath = instance->GetCreature(DATA_SATHROVARR))
+ Sath->AI()->DoAction(ACTION_ENRAGE_OTHER);
+ DoAction(ACTION_ENRAGE);
+ });
+
+ ScheduleHealthCheckEvent(1, [&] {
+ DoAction(ACTION_BANISH);
+ });
}
void ClearPlayerAuras() const
@@ -160,29 +147,75 @@ struct boss_kalecgos : public BossAI
if (param == ACTION_ENRAGE || param == ACTION_ENRAGE_OTHER)
{
Talk(param == ACTION_ENRAGE ? SAY_KALEC_ENRAGE_SATH : SAY_SATH_ENRAGE_ME);
- me->CastSpell(me, SPELL_CRAZED_RAGE, true);
- events.CancelEvent(EVENT_CHECK_HEALTH);
+ DoCastSelf(SPELL_CRAZED_RAGE, true);
return;
}
else if (param == ACTION_BANISH)
{
- me->CastSpell(me, SPELL_BANISH, true);
- events.Reset();
+ DoCastSelf(SPELL_BANISH, true);
+ scheduler.CancelAll();
}
else if (param == ACTION_SATH_BANISH)
- sathBanished = true;
+ _sathBanished = true;
else if (param == ACTION_KALEC_DIED)
{
- events.Reset();
- events2.ScheduleEvent(EVENT_TALK_BAD_1, 0);
+ scheduler.CancelAll();
+
+ me->m_Events.AddEventAtOffset([&] {
+ me->SetReactState(REACT_PASSIVE);
+ me->CombatStop();
+ me->RemoveAllAuras();
+ me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
+ Talk(SAY_EVIL_ENRAGE);
+ }, 1s);
+
+ me->m_Events.AddEventAtOffset([&] {
+ me->SetDisableGravity(true);
+ me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
+ }, 4s);
+
+ me->m_Events.AddEventAtOffset([&] {
+ me->SetVisible(false);
+ EnterEvadeMode();
+ }, 9s);
+
ClearPlayerAuras();
return;
}
- if (me->HasAura(SPELL_BANISH) && sathBanished)
+ if (me->HasAura(SPELL_BANISH) && _sathBanished)
{
- events.Reset();
- events2.ScheduleEvent(EVENT_TALK_GOOD_1, 1000);
+ scheduler.CancelAll();
+
+ me->m_Events.AddEventAtOffset([&] {
+ me->SetRegeneratingHealth(false);
+ me->RemoveAllAuras();
+ me->SetReactState(REACT_PASSIVE);
+ me->CombatStop();
+ me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
+ me->SetFaction(FACTION_FRIENDLY);
+ }, 1s);
+
+ me->m_Events.AddEventAtOffset([&] {
+ if (Creature* Sath = instance->GetCreature(DATA_SATHROVARR))
+ {
+ summons.Despawn(Sath);
+ Unit::Kill(me, Sath);
+ }
+ }, 2s);
+
+ Talk(SAY_GOOD_PLRWIN, 10s);
+
+ me->m_Events.AddEventAtOffset([&] {
+ me->SetDisableGravity(true);
+ me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
+ }, 15s);
+
+ me->m_Events.AddEventAtOffset([&] {
+ me->SetVisible(false);
+ me->KillSelf();
+ }, 20s);
+
ClearPlayerAuras();
if (Creature* Sath = instance->GetCreature(DATA_SATHROVARR))
{
@@ -194,160 +227,47 @@ struct boss_kalecgos : public BossAI
}
}
- void JustDied(Unit* killer) override
- {
- BossAI::JustDied(killer);
- }
-
void JustEngagedWith(Unit* who) override
{
BossAI::JustEngagedWith(who);
- events.ScheduleEvent(EVENT_ARCANE_BUFFET, 6000);
- events.ScheduleEvent(EVENT_FROST_BREATH, 15000);
- events.ScheduleEvent(EVENT_WILD_MAGIC, 10000);
- events.ScheduleEvent(EVENT_TAIL_LASH, 25000);
- events.ScheduleEvent(EVENT_SPECTRAL_BLAST, 20000);
- events.ScheduleEvent(EVENT_CHECK_POS, 5000);
- events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
- events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000);
- events.ScheduleEvent(EVENT_SPAWN_SPECTRALS, 16000);
+
+ ScheduleTimedEvent(6s, [&] {
+ DoCastAOE(SPELL_ARCANE_BUFFET);
+ }, 8s);
+
+ ScheduleTimedEvent(15s, [&] {
+ DoCastVictim(SPELL_FROST_BREATH);
+ }, 15s);
+
+ ScheduleTimedEvent(10s, [&] {
+ me->CastCustomSpell(RAND(44978, 45001, 45002, 45004, 45006, 45010), SPELLVALUE_MAX_TARGETS, 1, me, false);
+ }, 20s);
+
+ ScheduleTimedEvent(25s, [&] {
+ DoCastVictim(SPELL_TAIL_LASH);
+ }, 15s);
+
+ ScheduleTimedEvent(20s, [&] {
+ DoCastAOE(SPELL_SPECTRAL_BLAST);
+ }, 15s, 25s);
+
+ me->m_Events.AddEventAtOffset([&] {
+ me->SummonCreature(NPC_KALEC, 1702.21f, 931.7f, -74.56f, 5.07f, TEMPSUMMON_MANUAL_DESPAWN);
+ me->SummonCreature(NPC_SATHROVARR, 1704.62f, 927.78f, -73.9f, 2.0f, TEMPSUMMON_MANUAL_DESPAWN);
+ }, 16s);
me->SetStandState(UNIT_STAND_STATE_STAND);
Talk(SAY_EVIL_AGGRO);
}
- void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType, SpellSchoolMask) override
- {
- if (damage >= me->GetHealth() && attacker != me)
- damage = 0;
- }
-
void KilledUnit(Unit* victim) override
{
if (victim->IsPlayer() && roll_chance_i(50))
Talk(SAY_EVIL_SLAY);
}
- void UpdateAI(uint32 diff) override
- {
- events2.Update(diff);
- switch (events2.ExecuteEvent())
- {
- case EVENT_TALK_GOOD_1:
- me->SetRegeneratingHealth(false);
- me->RemoveAllAuras();
- me->SetReactState(REACT_PASSIVE);
- me->CombatStop();
- me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
- me->SetFaction(FACTION_FRIENDLY);
- events2.ScheduleEvent(EVENT_TALK_GOOD_2, 1000);
- break;
- case EVENT_TALK_GOOD_2:
- if (Creature* Sath = instance->GetCreature(DATA_SATHROVARR))
- {
- summons.Despawn(Sath);
- Unit::Kill(me, Sath);
- }
- events2.ScheduleEvent(EVENT_TALK_GOOD_3, 8000);
- break;
- case EVENT_TALK_GOOD_3:
- Talk(SAY_GOOD_PLRWIN);
- events2.ScheduleEvent(EVENT_TALK_GOOD_4, 10000);
- break;
- case EVENT_TALK_GOOD_4:
- me->SetDisableGravity(true);
- me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
- events2.ScheduleEvent(EVENT_TALK_GOOD_5, 10000);
- break;
- case EVENT_TALK_GOOD_5:
- me->SetVisible(false);
- me->KillSelf();
- break;
- case EVENT_TALK_BAD_1:
- me->SetReactState(REACT_PASSIVE);
- me->CombatStop();
- me->RemoveAllAuras();
- me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
- Talk(SAY_EVIL_ENRAGE);
- events2.ScheduleEvent(EVENT_TALK_BAD_2, 3000);
- break;
- case EVENT_TALK_BAD_2:
- me->SetDisableGravity(true);
- me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
- events2.ScheduleEvent(EVENT_TALK_BAD_3, 15000);
- break;
- case EVENT_TALK_BAD_3:
- me->SetVisible(false);
- EnterEvadeMode();
- break;
- }
-
- if (!events2.Empty())
- return;
-
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- switch (events.ExecuteEvent())
- {
- case EVENT_SPAWN_SPECTRALS:
- me->SummonCreature(NPC_KALEC, 1702.21f, 931.7f, -74.56f, 5.07f, TEMPSUMMON_MANUAL_DESPAWN);
- me->SummonCreature(NPC_SATHROVARR, 1704.62f, 927.78f, -73.9f, 2.0f, TEMPSUMMON_MANUAL_DESPAWN);
- break;
- case EVENT_ARCANE_BUFFET:
- me->CastSpell(me, SPELL_ARCANE_BUFFET, false);
- events.ScheduleEvent(EVENT_ARCANE_BUFFET, 8000);
- break;
- case EVENT_FROST_BREATH:
- me->CastSpell(me->GetVictim(), SPELL_FROST_BREATH, false);
- events.ScheduleEvent(EVENT_FROST_BREATH, 15000);
- break;
- case EVENT_TAIL_LASH:
- me->CastSpell(me->GetVictim(), SPELL_TAIL_LASH, false);
- events.ScheduleEvent(EVENT_TAIL_LASH, 15000);
- break;
- case EVENT_WILD_MAGIC:
- me->CastCustomSpell(RAND(44978, 45001, 45002, 45004, 45006, 45010), SPELLVALUE_MAX_TARGETS, 1, me, false);
- events.ScheduleEvent(EVENT_WILD_MAGIC, 20000);
- break;
- case EVENT_SPECTRAL_BLAST:
- me->CastSpell(me, SPELL_SPECTRAL_BLAST, false);
- events.ScheduleEvent(EVENT_SPECTRAL_BLAST, urand(15000, 25000));
- break;
- case EVENT_CHECK_POS:
- if (me->GetDistance(me->GetHomePosition()) > 50.0f)
- {
- EnterEvadeMode();
- return;
- }
- events.ScheduleEvent(EVENT_CHECK_POS, 5000);
- break;
- case EVENT_CHECK_HEALTH:
- if (me->HealthBelowPct(10))
- {
- if (Creature* Sath = instance->GetCreature(DATA_SATHROVARR))
- Sath->AI()->DoAction(ACTION_ENRAGE_OTHER);
- DoAction(ACTION_ENRAGE);
- break;
- }
- events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
- break;
- case EVENT_CHECK_HEALTH2:
- if (me->HealthBelowPct(1))
- {
- DoAction(ACTION_BANISH);
- break;
- }
- events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000);
- break;
- }
-
- DoMeleeAttackIfReady();
- }
+ private:
+ bool _sathBanished;
};
enum Kalec
@@ -362,41 +282,66 @@ enum Kalec
struct boss_kalec : public ScriptedAI
{
- boss_kalec(Creature* creature) : ScriptedAI(creature) { }
-
- EventMap events;
- EventMap events2;
+ boss_kalec(Creature* creature) : ScriptedAI(creature)
+ {
+ SetInvincibility(true);
+ }
void Reset() override
{
- events.Reset();
- events2.Reset();
if (me->GetPositionY() < 750.0f)
{
me->SetSpeed(MOVE_RUN, 2.4f);
me->SetDisplayId(MODEL_KALECGOS_DRAGON);
me->SetDisableGravity(true);
me->GetMotionMaster()->MovePoint(0, 1483.30f, 657.99f, 28.0f, false, true);
- events2.ScheduleEvent(EVENT_KALEC_SCENE_1, 9000);
- events2.ScheduleEvent(EVENT_KALEC_SCENE_2, 16000);
- events2.ScheduleEvent(EVENT_KALEC_SCENE_3, 22000);
+
+ me->m_Events.AddEventAtOffset([&] {
+ Talk(SAY_GOOD_MADRIGOSA);
+ me->GetMotionMaster()->MovePoint(0, 1509.0f, 560.0f, 30.0f, false, true);
+ }, 9s);
+
+ me->m_Events.AddEventAtOffset([&] {
+ DoCastAOE(SPELL_OPEN_BRUTALLUS_BACK_DOOR, true);
+ me->GetInstanceScript()->SetBossState(DATA_FELMYST_DOORS, NOT_STARTED);
+ me->GetInstanceScript()->SetBossState(DATA_FELMYST_DOORS, DONE);
+ }, 16s);
+
+ me->m_Events.AddEventAtOffset([&] {
+ me->GetMotionMaster()->MovePoint(0, 1400.0f, 630.0f, 90.0f, false, true);
+ me->DespawnOrUnsummon(6000);
+ }, 22s);
}
else
- me->CastSpell(me, SPELL_SPECTRAL_INVISIBILITY, true);
- }
-
- void DamageTaken(Unit* who, uint32& damage, DamageEffectType, SpellSchoolMask) override
- {
- if (!who || who->GetEntry() != NPC_SATHROVARR)
- damage = 0;
+ DoCastSelf(SPELL_SPECTRAL_INVISIBILITY, true);
}
void JustEngagedWith(Unit*) override
{
- events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
- events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000);
- events.ScheduleEvent(EVENT_SPELL_REVITALIZE, 5000);
- events.ScheduleEvent(EVENT_SPELL_HEROIC_STRIKE, 3000);
+ ScheduleTimedEvent(5s, [&] {
+ DoCastSelf(SPELL_REVITALIZE);
+ }, 10s);
+
+ ScheduleTimedEvent(3s, [&] {
+ DoCastVictim(SPELL_HEROIC_STRIKE);
+ }, 5s);
+
+ scheduler.Schedule(1s, [this](TaskContext context)
+ {
+ if (me->HealthBelowPct(50))
+ Talk(SAY_GOOD_NEAR_DEATH);
+ else
+ context.Repeat();
+ });
+
+ scheduler.Schedule(1s, [this](TaskContext context)
+ {
+ if (me->HealthBelowPct(10))
+ Talk(SAY_GOOD_NEAR_DEATH2);
+ else
+ context.Repeat();
+ });
+
Talk(SAY_GOOD_AGGRO);
}
@@ -409,60 +354,11 @@ struct boss_kalec : public ScriptedAI
void UpdateAI(uint32 diff) override
{
- events2.Update(diff);
- switch (events2.ExecuteEvent())
- {
- case EVENT_KALEC_SCENE_1:
- Talk(SAY_GOOD_MADRIGOSA);
- me->GetMotionMaster()->MovePoint(0, 1509.0f, 560.0f, 30.0f, false, true);
- break;
- case EVENT_KALEC_SCENE_2:
- me->CastSpell(me, SPELL_OPEN_BRUTALLUS_BACK_DOOR, true);
- me->GetInstanceScript()->SetBossState(DATA_FELMYST_DOORS, NOT_STARTED);
- me->GetInstanceScript()->SetBossState(DATA_FELMYST_DOORS, DONE);
- break;
- case EVENT_KALEC_SCENE_3:
- me->GetMotionMaster()->MovePoint(0, 1400.0f, 630.0f, 90.0f, false, true);
- me->DespawnOrUnsummon(6000);
- break;
- }
-
if (!UpdateVictim())
return;
- events.Update(diff);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- switch (events.ExecuteEvent())
- {
- case EVENT_CHECK_HEALTH:
- if (me->HealthBelowPct(50))
- {
- Talk(SAY_GOOD_NEAR_DEATH);
- break;
- }
- events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
- break;
- case EVENT_CHECK_HEALTH2:
- if (me->HealthBelowPct(10))
- {
- Talk(SAY_GOOD_NEAR_DEATH2);
- break;
- }
- events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000);
- break;
- case EVENT_SPELL_REVITALIZE:
- me->CastSpell(me, SPELL_REVITALIZE, false);
- events.ScheduleEvent(EVENT_SPELL_REVITALIZE, 10000);
- break;
- case EVENT_SPELL_HEROIC_STRIKE:
- me->CastSpell(me->GetVictim(), SPELL_HEROIC_STRIKE, false);
- events.ScheduleEvent(EVENT_SPELL_HEROIC_STRIKE, 5000);
- break;
- }
-
- DoMeleeAttackIfReady();
+ scheduler.Update(diff,
+ std::bind(&BossAI::DoMeleeAttackIfReady, this));
}
};
@@ -470,12 +366,10 @@ struct boss_sathrovarr : public ScriptedAI
{
boss_sathrovarr(Creature* creature) : ScriptedAI(creature)
{
- instance = creature->GetInstanceScript();
+ _instance = creature->GetInstanceScript();
+ SetInvincibility(true);
}
- InstanceScript* instance;
- EventMap events;
-
bool CanAIAttack(Unit const* target) const override
{
return target->GetPositionZ() < 50.0f;
@@ -483,26 +377,53 @@ struct boss_sathrovarr : public ScriptedAI
void Reset() override
{
- events.Reset();
- me->CastSpell(me, SPELL_DEMONIC_VISUAL, true);
- me->CastSpell(me, SPELL_SPECTRAL_INVISIBILITY, true);
-
- events.ScheduleEvent(EVENT_SHADOW_BOLT, 7000);
- events.ScheduleEvent(EVENT_AGONY_CURSE, 20000);
- events.ScheduleEvent(EVENT_CORRUPTION_STRIKE, 13000);
- events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
- events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000);
+ DoCastSelf(SPELL_DEMONIC_VISUAL, true);
+ DoCastSelf(SPELL_SPECTRAL_INVISIBILITY, true);
}
void JustEngagedWith(Unit* /*who*/) override
{
Talk(SAY_SATH_AGGRO);
- }
- void DamageTaken(Unit* who, uint32& damage, DamageEffectType, SpellSchoolMask) override
- {
- if (damage >= me->GetHealth() && who != me)
- damage = 0;
+ ScheduleTimedEvent(7s, [&] {
+ if (roll_chance_i(20))
+ Talk(SAY_SATH_SPELL1);
+ DoCastVictim(SPELL_SHADOW_BOLT);
+ }, 9s);
+
+ ScheduleTimedEvent(20s, [&] {
+ me->CastCustomSpell(SPELL_CURSE_OF_BOUNDLESS_AGONY, SPELLVALUE_MAX_TARGETS, 1, me, false);
+ }, 30s);
+
+ ScheduleTimedEvent(20s, [&] {
+ if (roll_chance_i(20))
+ Talk(SAY_SATH_SPELL2);
+ DoCastVictim(SPELL_CORRUPTION_STRIKE);
+ }, 9s);
+
+ scheduler.Schedule(1s, [this](TaskContext context)
+ {
+ if (me->HealthBelowPct(10))
+ {
+ if (Creature* kalecgos = _instance->GetCreature(DATA_KALECGOS))
+ kalecgos->AI()->DoAction(ACTION_ENRAGE_OTHER);
+ DoAction(ACTION_ENRAGE);
+ }
+ else
+ context.Repeat();
+ });
+
+ scheduler.Schedule(1s, [this](TaskContext context)
+ {
+ if (me->HealthBelowPct(1))
+ {
+ if (Creature* kalecgos = _instance->GetCreature(DATA_KALECGOS))
+ kalecgos->AI()->DoAction(ACTION_SATH_BANISH);
+ DoAction(ACTION_BANISH);
+ }
+ else
+ context.Repeat();
+ });
}
void KilledUnit(Unit* target) override
@@ -519,15 +440,9 @@ struct boss_sathrovarr : public ScriptedAI
void DoAction(int32 param) override
{
if (param == ACTION_ENRAGE || param == ACTION_ENRAGE_OTHER)
- {
- me->CastSpell(me, SPELL_CRAZED_RAGE, true);
- events.CancelEvent(EVENT_CHECK_HEALTH);
- }
+ DoCastSelf(SPELL_CRAZED_RAGE, true);
else if (param == ACTION_BANISH)
- {
- me->CastSpell(me, SPELL_BANISH, true);
- events.Reset();
- }
+ DoCastSelf(SPELL_BANISH, true);
}
void UpdateAI(uint32 diff) override
@@ -535,58 +450,12 @@ struct boss_sathrovarr : public ScriptedAI
if (!UpdateVictim())
return;
- events.Update(diff);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- switch (events.ExecuteEvent())
- {
- case EVENT_SHADOW_BOLT:
- if (roll_chance_i(20))
- Talk(SAY_SATH_SPELL1);
- me->CastSpell(me->GetVictim(), SPELL_SHADOW_BOLT, false);
- events.ScheduleEvent(EVENT_SHADOW_BOLT, 9000);
- break;
- case EVENT_AGONY_CURSE:
- me->CastCustomSpell(SPELL_CURSE_OF_BOUNDLESS_AGONY, SPELLVALUE_MAX_TARGETS, 1, me, false);
- events.ScheduleEvent(EVENT_AGONY_CURSE, 30000);
- break;
- case EVENT_CORRUPTION_STRIKE:
- if (roll_chance_i(20))
- Talk(SAY_SATH_SPELL2);
- me->CastSpell(me->GetVictim(), SPELL_CORRUPTION_STRIKE, false);
- events.ScheduleEvent(EVENT_CORRUPTION_STRIKE, 9000);
- break;
- case EVENT_CHECK_HEALTH:
- if (me->HealthBelowPct(10))
- {
- if (InstanceScript* instanceScript = me->GetInstanceScript())
- {
- if (Creature* kalecgos = ObjectAccessor::GetCreature(*me, instanceScript->GetGuidData(
- NPC_KALECGOS)))
- {
- kalecgos->AI()->DoAction(ACTION_ENRAGE_OTHER);
- }
- }
- DoAction(ACTION_ENRAGE);
- break;
- }
- events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
- break;
- case EVENT_CHECK_HEALTH2:
- if (me->HealthBelowPct(1))
- {
- if (Creature* kalecgos = instance->GetCreature(DATA_KALECGOS))
- kalecgos->AI()->DoAction(ACTION_SATH_BANISH);
- DoAction(ACTION_BANISH);
- break;
- }
- events.ScheduleEvent(EVENT_CHECK_HEALTH2, 1000);
- break;
- }
-
- DoMeleeAttackIfReady();
+ scheduler.Update(diff,
+ std::bind(&BossAI::DoMeleeAttackIfReady, this));
}
+
+private:
+ InstanceScript* _instance;
};
class SpectralBlastCheck