fix(Scripts/Arcatraz): Fix Soccothrates fel flame charge (#15600)

This commit is contained in:
Skjalf
2023-03-27 03:48:15 -03:00
committed by GitHub
parent a959942d82
commit 5ea6e250a6
@@ -51,9 +51,6 @@ enum Spells
enum Events enum Events
{ {
EVENT_FELFIRE_SHOCK = 1,
EVENT_KNOCK_AWAY = 2,
EVENT_PREFIGHT_1 = 3, EVENT_PREFIGHT_1 = 3,
EVENT_PREFIGHT_2 = 4, EVENT_PREFIGHT_2 = 4,
EVENT_PREFIGHT_3 = 5, EVENT_PREFIGHT_3 = 5,
@@ -62,23 +59,19 @@ enum Events
EVENT_PREFIGHT_6 = 8, EVENT_PREFIGHT_6 = 8,
EVENT_PREFIGHT_7 = 9, EVENT_PREFIGHT_7 = 9,
EVENT_PREFIGHT_8 = 10, EVENT_PREFIGHT_8 = 10,
EVENT_PREFIGHT_9 = 11, EVENT_PREFIGHT_9 = 11
EVENT_ME_FIRST = 12,
EVENT_CHECK_HEALTH = 13,
EVENT_SPELL_CHARGE = 14,
EVENT_FELFIRE = 15,
}; };
class boss_wrath_scryer_soccothrates : public CreatureScript struct boss_wrath_scryer_soccothrates : public BossAI
{ {
public: boss_wrath_scryer_soccothrates(Creature* creature) : BossAI(creature, DATA_SOCCOTHRATES)
boss_wrath_scryer_soccothrates() : CreatureScript("boss_wrath_scryer_soccothrates") { }
struct boss_wrath_scryer_soccothratesAI : public BossAI
{
boss_wrath_scryer_soccothratesAI(Creature* creature) : BossAI(creature, DATA_SOCCOTHRATES)
{ {
preFight = instance->GetBossState(DATA_DALLIAH) == DONE; preFight = instance->GetBossState(DATA_DALLIAH) == DONE;
scheduler.SetValidator([this]
{
return !me->HasUnitState(UNIT_STATE_CASTING);
});
} }
void Reset() override void Reset() override
@@ -87,6 +80,17 @@ public:
events2.Reset(); events2.Reset();
me->CastSpell(me, SPELL_FEL_IMMOLATION, true); me->CastSpell(me, SPELL_FEL_IMMOLATION, true);
me->SetImmuneToAll(false); me->SetImmuneToAll(false);
ScheduleHealthCheckEvent(25, [&]
{
if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH))
{
if (dalliah->IsAlive())
{
dalliah->AI()->Talk(SAY_SOCCOTHRATES_25_PERCENT);
}
}
});
} }
void InitializeAI() override void InitializeAI() override
@@ -114,22 +118,60 @@ public:
{ {
_JustEngagedWith(); _JustEngagedWith();
events2.Reset(); events2.Reset();
events.ScheduleEvent(EVENT_FELFIRE_SHOCK, urand(12000, 14000));
events.ScheduleEvent(EVENT_KNOCK_AWAY, urand(11000, 12000));
events.ScheduleEvent(EVENT_ME_FIRST, 6000);
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
Talk(SAY_AGGRO); Talk(SAY_AGGRO);
if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH))
{
if (dalliah->IsAlive() && !dalliah->IsInCombat())
{
dalliah->AI()->Talk(SAY_AGGRO_SOCCOTHRATES_FIRST, 6s);
}
}
scheduler.Schedule(11s, 12s, [this](TaskContext context)
{
me->CastSpell(me, SPELL_KNOCK_AWAY, false);
Talk(SAY_KNOCK_AWAY);
scheduler.Schedule(4600ms, [this](TaskContext)
{
DoCastAOE(SPELL_CHARGE);
DoCastSelf(SPELL_FELFIRE, true);
scheduler.Schedule(300ms, [this](TaskContext context2)
{
if (me->GetVictim() && !me->IsWithinMeleeRange(me->GetVictim()))
{
DoCastAOE(SPELL_FELFIRE, true);
}
if (context2.GetRepeatCounter() <= 6)
{
context2.Repeat();
}
});
});
context.Repeat();
}).Schedule(12s, 14s, [this](TaskContext context)
{
DoCastVictim(SPELL_FELFIRE_SHOCK);
context.Repeat();
});
} }
void KilledUnit(Unit* victim) override void KilledUnit(Unit* victim) override
{ {
if (victim->GetTypeId() == TYPEID_PLAYER) if (victim->IsPlayer())
{
Talk(SAY_SLAY); Talk(SAY_SLAY);
} }
}
void MoveInLineOfSight(Unit* who) override void MoveInLineOfSight(Unit* who) override
{ {
if (!preFight && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 70.0f)) if (!preFight && who->IsPlayer() && me->IsWithinDistInMap(who, 70.0f))
{ {
Talk(SAY_SOCCOTHRATES_CONVO_1); Talk(SAY_SOCCOTHRATES_CONVO_1);
events2.ScheduleEvent(EVENT_PREFIGHT_1, 2000); events2.ScheduleEvent(EVENT_PREFIGHT_1, 2000);
@@ -194,50 +236,7 @@ public:
if (!UpdateVictim()) if (!UpdateVictim())
return; return;
events.Update(diff); scheduler.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{
case EVENT_FELFIRE_SHOCK:
me->CastSpell(me->GetVictim(), SPELL_FELFIRE_SHOCK, false);
events.ScheduleEvent(EVENT_FELFIRE_SHOCK, urand(12000, 14000));
break;
case EVENT_KNOCK_AWAY:
me->CastSpell(me, SPELL_KNOCK_AWAY, false);
Talk(SAY_KNOCK_AWAY);
events.ScheduleEvent(EVENT_KNOCK_AWAY, urand(11000, 12000));
events.ScheduleEvent(EVENT_SPELL_CHARGE, 4600);
break;
case EVENT_SPELL_CHARGE:
me->CastSpell(me, SPELL_CHARGE, true);
me->CastSpell(me, SPELL_FELFIRE, true);
events.ScheduleEvent(EVENT_FELFIRE, 300);
events.ScheduleEvent(EVENT_FELFIRE, 600);
events.ScheduleEvent(EVENT_FELFIRE, 900);
events.ScheduleEvent(EVENT_FELFIRE, 1200);
events.ScheduleEvent(EVENT_FELFIRE, 1500);
events.ScheduleEvent(EVENT_FELFIRE, 1800);
break;
case EVENT_FELFIRE:
me->CastSpell(me, SPELL_FELFIRE, true);
break;
case EVENT_ME_FIRST:
if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH))
if (dalliah->IsAlive() && !dalliah->IsInCombat())
dalliah->AI()->Talk(SAY_AGGRO_SOCCOTHRATES_FIRST);
break;
case EVENT_CHECK_HEALTH:
if (HealthBelowPct(25))
{
if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH))
dalliah->AI()->Talk(SAY_SOCCOTHRATES_25_PERCENT);
break;
}
events.ScheduleEvent(EVENT_CHECK_HEALTH, 1000);
break;
}
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
@@ -247,13 +246,7 @@ public:
EventMap events2; EventMap events2;
}; };
CreatureAI* GetAI(Creature* creature) const override
{
return GetArcatrazAI<boss_wrath_scryer_soccothratesAI>(creature);
}
};
void AddSC_boss_wrath_scryer_soccothrates() void AddSC_boss_wrath_scryer_soccothrates()
{ {
new boss_wrath_scryer_soccothrates(); RegisterArcatrazCreatureAI(boss_wrath_scryer_soccothrates);
} }