mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-18 19:35:42 +00:00
refactor(Scripts/SunwellPlateau): Update Kalecgos script (#20588)
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user