refactor(Scripts/Mechanar): Modernize Pathaleon's script (#15494)
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user