fix(Script/HoL) Ionar timers and spark now follows seperate players (#23481)

This commit is contained in:
blinkysc 2025-11-01 13:16:33 -05:00 committed by GitHub
parent 675135e19b
commit e6984c0672
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -63,6 +63,7 @@ enum IonarEvents
EVENT_CHECK_HEALTH = 3, EVENT_CHECK_HEALTH = 3,
EVENT_CALL_SPARKS = 4, EVENT_CALL_SPARKS = 4,
EVENT_RESTORE = 5, EVENT_RESTORE = 5,
EVENT_CHANGE_TARGET = 6,
}; };
struct boss_ionar : public BossAI struct boss_ionar : public BossAI
@ -85,8 +86,8 @@ struct boss_ionar : public BossAI
if (!spark) if (!spark)
events.RescheduleEvent(EVENT_CHECK_HEALTH, 1s, 0, 1); events.RescheduleEvent(EVENT_CHECK_HEALTH, 1s, 0, 1);
events.RescheduleEvent(EVENT_BALL_LIGHTNING, 10s, 0, 1); events.RescheduleEvent(EVENT_BALL_LIGHTNING, 7s, 11s, 0, 1);
events.RescheduleEvent(EVENT_STATIC_OVERLOAD, 5s, 0, 1); events.RescheduleEvent(EVENT_STATIC_OVERLOAD, 6s, 12s, 0, 1);
} }
void JustEngagedWith(Unit*) override void JustEngagedWith(Unit*) override
@ -138,7 +139,7 @@ struct boss_ionar : public BossAI
me->SetControlled(true, UNIT_STATE_STUNNED); me->SetControlled(true, UNIT_STATE_STUNNED);
events.SetPhase(2); events.SetPhase(2);
events.ScheduleEvent(EVENT_CALL_SPARKS, 15s, 0, 2); events.ScheduleEvent(EVENT_CALL_SPARKS, 20s, 0, 2);
} }
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override
@ -155,17 +156,17 @@ struct boss_ionar : public BossAI
{ {
case EVENT_BALL_LIGHTNING: case EVENT_BALL_LIGHTNING:
DoCastRandomTarget(SPELL_BALL_LIGHTNING, 1, 0.0f, false); DoCastRandomTarget(SPELL_BALL_LIGHTNING, 1, 0.0f, false);
events.Repeat(10s, 11s); events.Repeat(8s, 18s);
break; break;
case EVENT_STATIC_OVERLOAD: case EVENT_STATIC_OVERLOAD:
DoCastRandomTarget(SPELL_STATIC_OVERLOAD); DoCastRandomTarget(SPELL_STATIC_OVERLOAD);
events.Repeat(5s, 6s); events.Repeat(9s, 14s);
break; break;
case EVENT_CALL_SPARKS: case EVENT_CALL_SPARKS:
{ {
EntryCheckPredicate pred(NPC_SPARK_OF_IONAR); EntryCheckPredicate pred(NPC_SPARK_OF_IONAR);
summons.DoAction(ACTION_CALLBACK, pred); summons.DoAction(ACTION_CALLBACK, pred);
events.ScheduleEvent(EVENT_RESTORE, 2s, 0, 2); events.ScheduleEvent(EVENT_RESTORE, 5s, 0, 2);
return; return;
} }
case EVENT_RESTORE: case EVENT_RESTORE:
@ -187,20 +188,47 @@ struct npc_spark_of_ionar : public ScriptedAI
npc_spark_of_ionar(Creature* creature) : ScriptedAI(creature) { } npc_spark_of_ionar(Creature* creature) : ScriptedAI(creature) { }
void MoveInLineOfSight(Unit*) override { } void MoveInLineOfSight(Unit*) override { }
void UpdateAI(uint32) override { }
void AttackStart(Unit* /*who*/) override { } void AttackStart(Unit* /*who*/) override { }
void Reset() override { returning = false; } void Reset() override
{
returning = false;
_events.ScheduleEvent(EVENT_CHANGE_TARGET, 3s);
}
void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override void DamageTaken(Unit*, uint32& damage, DamageEffectType, SpellSchoolMask) override
{ {
damage = 0; damage = 0;
} }
void UpdateAI(uint32 diff) override
{
if (returning)
return;
_events.Update(diff);
while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_CHANGE_TARGET:
if (Player* tgt = SelectTargetFromPlayerList(100))
{
me->GetMotionMaster()->Clear();
me->GetMotionMaster()->MoveFollow(tgt, 0.0f, 0.0f, MOTION_SLOT_CONTROLLED);
}
_events.Repeat(3s);
break;
}
}
}
void DoAction(int32 param) override void DoAction(int32 param) override
{ {
if (param == ACTION_CALLBACK) if (param == ACTION_CALLBACK)
{ {
_events.Reset();
me->SetSpeed(MOVE_RUN, 2.5f); me->SetSpeed(MOVE_RUN, 2.5f);
me->GetThreatMgr().ClearAllThreat(); me->GetThreatMgr().ClearAllThreat();
me->CombatStop(true); me->CombatStop(true);
@ -218,6 +246,7 @@ struct npc_spark_of_ionar : public ScriptedAI
} }
private: private:
EventMap _events;
bool returning; bool returning;
}; };