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

View File

@@ -51,9 +51,6 @@ enum Spells
enum Events
{
EVENT_FELFIRE_SHOCK = 1,
EVENT_KNOCK_AWAY = 2,
EVENT_PREFIGHT_1 = 3,
EVENT_PREFIGHT_2 = 4,
EVENT_PREFIGHT_3 = 5,
@@ -62,198 +59,194 @@ enum Events
EVENT_PREFIGHT_6 = 8,
EVENT_PREFIGHT_7 = 9,
EVENT_PREFIGHT_8 = 10,
EVENT_PREFIGHT_9 = 11,
EVENT_ME_FIRST = 12,
EVENT_CHECK_HEALTH = 13,
EVENT_SPELL_CHARGE = 14,
EVENT_FELFIRE = 15,
EVENT_PREFIGHT_9 = 11
};
class boss_wrath_scryer_soccothrates : public CreatureScript
struct boss_wrath_scryer_soccothrates : public BossAI
{
public:
boss_wrath_scryer_soccothrates() : CreatureScript("boss_wrath_scryer_soccothrates") { }
struct boss_wrath_scryer_soccothratesAI : public BossAI
boss_wrath_scryer_soccothrates(Creature* creature) : BossAI(creature, DATA_SOCCOTHRATES)
{
boss_wrath_scryer_soccothratesAI(Creature* creature) : BossAI(creature, DATA_SOCCOTHRATES)
{
preFight = instance->GetBossState(DATA_DALLIAH) == DONE;
}
preFight = instance->GetBossState(DATA_DALLIAH) == DONE;
void Reset() override
scheduler.SetValidator([this]
{
_Reset();
events2.Reset();
me->CastSpell(me, SPELL_FEL_IMMOLATION, true);
me->SetImmuneToAll(false);
}
return !me->HasUnitState(UNIT_STATE_CASTING);
});
}
void InitializeAI() override
void Reset() override
{
_Reset();
events2.Reset();
me->CastSpell(me, SPELL_FEL_IMMOLATION, true);
me->SetImmuneToAll(false);
ScheduleHealthCheckEvent(25, [&]
{
BossAI::InitializeAI();
if (!preFight)
me->SetImmuneToAll(true);
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
Talk(SAY_DEATH);
if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH))
{
if (dalliah->IsAlive() && !dalliah->IsInCombat())
if (dalliah->IsAlive())
{
dalliah->AI()->Talk(SAY_RIVAL_DIED + 1, 6s);
dalliah->AI()->Talk(SAY_SOCCOTHRATES_25_PERCENT);
}
}
}
void JustEngagedWith(Unit* /*who*/) override
{
_JustEngagedWith();
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);
}
void KilledUnit(Unit* victim) override
{
if (victim->GetTypeId() == TYPEID_PLAYER)
Talk(SAY_SLAY);
}
void MoveInLineOfSight(Unit* who) override
{
if (!preFight && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 70.0f))
{
Talk(SAY_SOCCOTHRATES_CONVO_1);
events2.ScheduleEvent(EVENT_PREFIGHT_1, 2000);
preFight = true;
}
}
void UpdateAI(uint32 diff) override
{
events2.Update(diff);
switch (events2.ExecuteEvent())
{
case EVENT_PREFIGHT_1:
if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH))
dalliah->AI()->Talk(SAY_DALLIAH_CONVO_1);
events2.ScheduleEvent(EVENT_PREFIGHT_2, 3000);
break;
case EVENT_PREFIGHT_2:
Talk(SAY_SOCCOTHRATES_CONVO_2);
events2.ScheduleEvent(EVENT_PREFIGHT_3, 3000);
break;
case EVENT_PREFIGHT_3:
if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH))
dalliah->AI()->Talk(SAY_DALLIAH_CONVO_2);
events2.ScheduleEvent(EVENT_PREFIGHT_4, 6000);
break;
case EVENT_PREFIGHT_4:
Talk(SAY_SOCCOTHRATES_CONVO_3);
events2.ScheduleEvent(EVENT_PREFIGHT_5, 2000);
break;
case EVENT_PREFIGHT_5:
if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH))
dalliah->AI()->Talk(SAY_DALLIAH_CONVO_3);
events2.ScheduleEvent(EVENT_PREFIGHT_6, 3000);
break;
case EVENT_PREFIGHT_6:
Talk(SAY_SOCCOTHRATES_CONVO_4);
events2.ScheduleEvent(EVENT_PREFIGHT_7, 2000);
break;
case EVENT_PREFIGHT_7:
if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH))
dalliah->GetMotionMaster()->MovePoint(0, 118.6048f, 96.84852f, 22.44115f);
events2.ScheduleEvent(EVENT_PREFIGHT_8, 4000);
break;
case EVENT_PREFIGHT_8:
me->GetMotionMaster()->MovePoint(0, 122.1035f, 192.7203f, 22.44115f);
events2.ScheduleEvent(EVENT_PREFIGHT_9, 4000);
break;
case EVENT_PREFIGHT_9:
if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH))
{
dalliah->SetFacingToObject(me);
dalliah->SetImmuneToAll(false);
me->SetFacingToObject(dalliah);
me->SetImmuneToAll(false);
dalliah->SetHomePosition(dalliah->GetPositionX(), dalliah->GetPositionY(), dalliah->GetPositionZ(), 1.51737f);
me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 4.725722f);
}
break;
}
if (!UpdateVictim())
return;
events.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();
}
private:
bool preFight;
EventMap events2;
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetArcatrazAI<boss_wrath_scryer_soccothratesAI>(creature);
});
}
void InitializeAI() override
{
BossAI::InitializeAI();
if (!preFight)
me->SetImmuneToAll(true);
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
Talk(SAY_DEATH);
if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH))
{
if (dalliah->IsAlive() && !dalliah->IsInCombat())
{
dalliah->AI()->Talk(SAY_RIVAL_DIED + 1, 6s);
}
}
}
void JustEngagedWith(Unit* /*who*/) override
{
_JustEngagedWith();
events2.Reset();
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
{
if (victim->IsPlayer())
{
Talk(SAY_SLAY);
}
}
void MoveInLineOfSight(Unit* who) override
{
if (!preFight && who->IsPlayer() && me->IsWithinDistInMap(who, 70.0f))
{
Talk(SAY_SOCCOTHRATES_CONVO_1);
events2.ScheduleEvent(EVENT_PREFIGHT_1, 2000);
preFight = true;
}
}
void UpdateAI(uint32 diff) override
{
events2.Update(diff);
switch (events2.ExecuteEvent())
{
case EVENT_PREFIGHT_1:
if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH))
dalliah->AI()->Talk(SAY_DALLIAH_CONVO_1);
events2.ScheduleEvent(EVENT_PREFIGHT_2, 3000);
break;
case EVENT_PREFIGHT_2:
Talk(SAY_SOCCOTHRATES_CONVO_2);
events2.ScheduleEvent(EVENT_PREFIGHT_3, 3000);
break;
case EVENT_PREFIGHT_3:
if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH))
dalliah->AI()->Talk(SAY_DALLIAH_CONVO_2);
events2.ScheduleEvent(EVENT_PREFIGHT_4, 6000);
break;
case EVENT_PREFIGHT_4:
Talk(SAY_SOCCOTHRATES_CONVO_3);
events2.ScheduleEvent(EVENT_PREFIGHT_5, 2000);
break;
case EVENT_PREFIGHT_5:
if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH))
dalliah->AI()->Talk(SAY_DALLIAH_CONVO_3);
events2.ScheduleEvent(EVENT_PREFIGHT_6, 3000);
break;
case EVENT_PREFIGHT_6:
Talk(SAY_SOCCOTHRATES_CONVO_4);
events2.ScheduleEvent(EVENT_PREFIGHT_7, 2000);
break;
case EVENT_PREFIGHT_7:
if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH))
dalliah->GetMotionMaster()->MovePoint(0, 118.6048f, 96.84852f, 22.44115f);
events2.ScheduleEvent(EVENT_PREFIGHT_8, 4000);
break;
case EVENT_PREFIGHT_8:
me->GetMotionMaster()->MovePoint(0, 122.1035f, 192.7203f, 22.44115f);
events2.ScheduleEvent(EVENT_PREFIGHT_9, 4000);
break;
case EVENT_PREFIGHT_9:
if (Creature* dalliah = instance->GetCreature(DATA_DALLIAH))
{
dalliah->SetFacingToObject(me);
dalliah->SetImmuneToAll(false);
me->SetFacingToObject(dalliah);
me->SetImmuneToAll(false);
dalliah->SetHomePosition(dalliah->GetPositionX(), dalliah->GetPositionY(), dalliah->GetPositionZ(), 1.51737f);
me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 4.725722f);
}
break;
}
if (!UpdateVictim())
return;
scheduler.Update(diff);
DoMeleeAttackIfReady();
}
private:
bool preFight;
EventMap events2;
};
void AddSC_boss_wrath_scryer_soccothrates()
{
new boss_wrath_scryer_soccothrates();
RegisterArcatrazCreatureAI(boss_wrath_scryer_soccothrates);
}