refactor(Scripts/Mechanar): Modernize Pathaleon's script (#15494)

This commit is contained in:
Skjalf
2023-03-19 21:00:11 -03:00
committed by GitHub
parent 2da616cb8b
commit 29fba5fe38
@@ -43,116 +43,77 @@ enum Spells
SPELL_SUMMON_NETHER_WRAITH_4 = 35288, SPELL_SUMMON_NETHER_WRAITH_4 = 35288,
}; };
enum Events struct boss_pathaleon_the_calculator : public BossAI
{ {
EVENT_SUMMON = 1, boss_pathaleon_the_calculator(Creature* creature) : BossAI(creature, DATA_PATHALEON_THE_CALCULATOR)
EVENT_MANA_TAP = 2,
EVENT_ARCANE_TORRENT = 3,
EVENT_DOMINATION = 4,
EVENT_ARCANE_EXPLOSION = 5,
EVENT_FRENZY = 6,
};
class boss_pathaleon_the_calculator : public CreatureScript
{
public:
boss_pathaleon_the_calculator(): CreatureScript("boss_pathaleon_the_calculator") { }
struct boss_pathaleon_the_calculatorAI : public BossAI
{ {
boss_pathaleon_the_calculatorAI(Creature* creature) : BossAI(creature, DATA_PATHALEON_THE_CALCULATOR) { } scheduler.SetValidator([this]
void InitializeAI() override
{ {
BossAI::InitializeAI(); return !me->HasUnitState(UNIT_STATE_CASTING);
} });
}
void JustEngagedWith(Unit* /*who*/) override void JustEngagedWith(Unit* /*who*/) override
{
_JustEngagedWith();
ScheduleHealthCheckEvent(20, [&]()
{ {
_JustEngagedWith(); summons.DespawnAll();
events.ScheduleEvent(EVENT_SUMMON, 30000); DoCastSelf(SPELL_DISGRUNTLED_ANGER, true);
events.ScheduleEvent(EVENT_MANA_TAP, 12000); Talk(SAY_ENRAGE);
events.ScheduleEvent(EVENT_ARCANE_TORRENT, 16000); });
events.ScheduleEvent(EVENT_DOMINATION, 25000);
events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 8000);
events.ScheduleEvent(EVENT_FRENZY, 1000);
Talk(SAY_AGGRO);
}
void KilledUnit(Unit* victim) override scheduler.Schedule(30s, [this](TaskContext context)
{ {
if (victim->GetTypeId() == TYPEID_PLAYER) for (uint8 i = 0; i < DUNGEON_MODE(3, 4); ++i)
Talk(SAY_SLAY); me->CastSpell(me, SPELL_SUMMON_NETHER_WRAITH_1 + i, true);
}
void JustDied(Unit* /*killer*/) override Talk(SAY_SUMMON);
context.Repeat(30s, 40s);
}).Schedule(12s, [this](TaskContext context)
{ {
_JustDied(); if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, PowerUsersSelector(me, POWER_MANA, 40.0f, false)))
Talk(SAY_DEATH);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
switch (events.ExecuteEvent())
{ {
case EVENT_ARCANE_EXPLOSION: DoCast(target, SPELL_MANA_TAP);
me->CastSpell(me, SPELL_ARCANE_EXPLOSION, false);
events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 12000);
break;
case EVENT_ARCANE_TORRENT:
me->RemoveAurasDueToSpell(SPELL_MANA_TAP);
me->ModifyPower(POWER_MANA, 5000);
me->CastSpell(me, SPELL_ARCANE_TORRENT, false);
events.ScheduleEvent(EVENT_ARCANE_TORRENT, 15000);
break;
case EVENT_MANA_TAP:
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, PowerUsersSelector(me, POWER_MANA, 40.0f, false)))
me->CastSpell(target, SPELL_MANA_TAP, false);
events.ScheduleEvent(EVENT_MANA_TAP, 18000);
break;
case EVENT_DOMINATION:
Talk(SAY_DOMINATION);
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 50.0f))
me->CastSpell(target, SPELL_DOMINATION, false);
events.ScheduleEvent(EVENT_DOMINATION, 30000);
break;
case EVENT_FRENZY:
if (me->HealthBelowPct(20))
{
summons.DespawnAll();
me->CastSpell(me, SPELL_DISGRUNTLED_ANGER, true);
Talk(SAY_ENRAGE);
break;
}
events.ScheduleEvent(EVENT_FRENZY, 1000);
break;
case EVENT_SUMMON:
for (uint8 i = 0; i < DUNGEON_MODE(3, 4); ++i)
me->CastSpell(me, SPELL_SUMMON_NETHER_WRAITH_1 + i, true);
Talk(SAY_SUMMON);
events.ScheduleEvent(EVENT_SUMMON, urand(30000, 45000));
break;
} }
context.Repeat(18s);
}).Schedule(16s, [this](TaskContext context)
{
me->RemoveAurasDueToSpell(SPELL_MANA_TAP);
me->ModifyPower(POWER_MANA, 5000);
DoCastSelf(SPELL_ARCANE_TORRENT);
context.Repeat(15s);
}).Schedule(25s, [this](TaskContext context)
{
Talk(SAY_DOMINATION);
DoCastRandomTarget(SPELL_DOMINATION, 1, 50.0f);
context.Repeat(30s);
}).Schedule(8s, [this](TaskContext context)
{
DoCastAOE(SPELL_ARCANE_EXPLOSION);
context.Repeat(12s);
});
DoMeleeAttackIfReady(); Talk(SAY_AGGRO);
} }
};
CreatureAI* GetAI(Creature* creature) const override void KilledUnit(Unit* victim) override
{ {
return GetMechanarAI<boss_pathaleon_the_calculatorAI>(creature); if (victim->IsPlayer())
{
Talk(SAY_SLAY);
}
}
void JustDied(Unit* /*killer*/) override
{
_JustDied();
Talk(SAY_DEATH);
} }
}; };
void AddSC_boss_pathaleon_the_calculator() void AddSC_boss_pathaleon_the_calculator()
{ {
new boss_pathaleon_the_calculator(); RegisterMechanarCreatureAI(boss_pathaleon_the_calculator);
} }