fix(Scripts/Arcatraz): Fix Harbringer Skyriss not splitting if castin… (#15811)
* fix(Scripts/Arcatraz): Fix Harbringer Skyriss not splitting if casting abilities * Update boss_harbinger_skyriss.cpp * Update boss_harbinger_skyriss.cpp * scheduler update * Update boss_harbinger_skyriss.cpp
This commit is contained in:
@@ -45,142 +45,98 @@ enum Spells
|
|||||||
|
|
||||||
enum Misc
|
enum Misc
|
||||||
{
|
{
|
||||||
NPC_HARBINGER_SKYRISS_66 = 21466,
|
NPC_HARBINGER_SKYRISS_66 = 21466
|
||||||
|
|
||||||
EVENT_SUMMON_IMAGE1 = 1,
|
|
||||||
EVENT_SUMMON_IMAGE2 = 2,
|
|
||||||
EVENT_SPELL_MIND_REND = 3,
|
|
||||||
EVENT_SPELL_FEAR = 4,
|
|
||||||
EVENT_SPELL_DOMINATION = 5,
|
|
||||||
EVENT_SPELL_MANA_BURN = 6
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class boss_harbinger_skyriss : public CreatureScript
|
struct boss_harbinger_skyriss : public BossAI
|
||||||
{
|
{
|
||||||
public:
|
boss_harbinger_skyriss(Creature* creature) : BossAI(creature, DATA_WARDEN_MELLICHAR)
|
||||||
boss_harbinger_skyriss() : CreatureScript("boss_harbinger_skyriss") { }
|
|
||||||
|
|
||||||
struct boss_harbinger_skyrissAI : public ScriptedAI
|
|
||||||
{
|
{
|
||||||
boss_harbinger_skyrissAI(Creature* creature) : ScriptedAI(creature), summons(me)
|
scheduler.SetValidator([this]
|
||||||
{
|
{
|
||||||
instance = creature->GetInstanceScript();
|
return !me->HasUnitState(UNIT_STATE_CASTING);
|
||||||
}
|
});
|
||||||
|
}
|
||||||
|
|
||||||
InstanceScript* instance;
|
void Reset() override
|
||||||
SummonList summons;
|
{
|
||||||
EventMap events;
|
_Reset();
|
||||||
|
me->SetImmuneToAll(false);
|
||||||
|
|
||||||
void Reset() override
|
ScheduleHealthCheckEvent(66, [&] {
|
||||||
|
Talk(SAY_IMAGE);
|
||||||
|
DoCastSelf(SPELL_66_ILLUSION, true);
|
||||||
|
});
|
||||||
|
|
||||||
|
ScheduleHealthCheckEvent(33, [&] {
|
||||||
|
Talk(SAY_IMAGE);
|
||||||
|
DoCastSelf(SPELL_33_ILLUSION, true);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void JustEngagedWith(Unit* /*who*/) override
|
||||||
|
{
|
||||||
|
Talk(SAY_AGGRO);
|
||||||
|
me->SetInCombatWithZone();
|
||||||
|
|
||||||
|
scheduler.Schedule(10s, [this](TaskContext context)
|
||||||
{
|
{
|
||||||
events.Reset();
|
DoCastRandomTarget(SPELL_MIND_REND, 0, 50.0f);
|
||||||
summons.DespawnAll();
|
context.Repeat(10s);
|
||||||
me->SetImmuneToAll(false);
|
}).Schedule(15s, [this](TaskContext context)
|
||||||
}
|
|
||||||
|
|
||||||
void JustEngagedWith(Unit* /*who*/) override
|
|
||||||
{
|
{
|
||||||
Talk(SAY_AGGRO);
|
if (DoCastRandomTarget(SPELL_FEAR, 1, 20.0f) == SPELL_CAST_OK)
|
||||||
me->SetInCombatWithZone();
|
|
||||||
|
|
||||||
events.ScheduleEvent(EVENT_SUMMON_IMAGE1, 1000);
|
|
||||||
events.ScheduleEvent(EVENT_SUMMON_IMAGE2, 1000);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_MIND_REND, 10000);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_FEAR, 15000);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_DOMINATION, 30000);
|
|
||||||
if (IsHeroic())
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_MANA_BURN, 25000);
|
|
||||||
}
|
|
||||||
|
|
||||||
void JustDied(Unit* /*killer*/) override
|
|
||||||
{
|
|
||||||
Talk(SAY_DEATH);
|
|
||||||
summons.DespawnAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
void JustSummoned(Creature* summon) override
|
|
||||||
{
|
|
||||||
summon->SetHealth(summon->CountPctFromMaxHealth(summon->GetEntry() == NPC_HARBINGER_SKYRISS_66 ? 66 : 33));
|
|
||||||
summons.Summon(summon);
|
|
||||||
summon->SetInCombatWithZone();
|
|
||||||
me->UpdatePosition(*summon, true);
|
|
||||||
me->SendMovementFlagUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
void KilledUnit(Unit* victim) override
|
|
||||||
{
|
|
||||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
|
||||||
Talk(SAY_KILL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void UpdateAI(uint32 diff) override
|
|
||||||
{
|
|
||||||
if (!UpdateVictim())
|
|
||||||
return;
|
|
||||||
|
|
||||||
events.Update(diff);
|
|
||||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (events.ExecuteEvent())
|
|
||||||
{
|
{
|
||||||
case EVENT_SUMMON_IMAGE1:
|
Talk(SAY_FEAR);
|
||||||
if (HealthBelowPct(67))
|
|
||||||
{
|
|
||||||
Talk(SAY_IMAGE);
|
|
||||||
me->CastSpell(me, SPELL_66_ILLUSION, false);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
events.ScheduleEvent(EVENT_SUMMON_IMAGE1, 1000);
|
|
||||||
break;
|
|
||||||
case EVENT_SUMMON_IMAGE2:
|
|
||||||
if (HealthBelowPct(34))
|
|
||||||
{
|
|
||||||
Talk(SAY_IMAGE);
|
|
||||||
me->CastSpell(me, SPELL_33_ILLUSION, false);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
events.ScheduleEvent(EVENT_SUMMON_IMAGE2, 1000);
|
|
||||||
break;
|
|
||||||
case EVENT_SPELL_MIND_REND:
|
|
||||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 50.0f))
|
|
||||||
me->CastSpell(target, SPELL_MIND_REND, false);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_MIND_REND, 10000);
|
|
||||||
break;
|
|
||||||
case EVENT_SPELL_FEAR:
|
|
||||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 20.0f))
|
|
||||||
{
|
|
||||||
Talk(SAY_FEAR);
|
|
||||||
me->CastSpell(target, SPELL_FEAR, false);
|
|
||||||
}
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_FEAR, 25000);
|
|
||||||
break;
|
|
||||||
case EVENT_SPELL_DOMINATION:
|
|
||||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 30.0f))
|
|
||||||
{
|
|
||||||
Talk(SAY_MIND);
|
|
||||||
me->CastSpell(target, SPELL_DOMINATION, false);
|
|
||||||
}
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_DOMINATION, 30000);
|
|
||||||
break;
|
|
||||||
case EVENT_SPELL_MANA_BURN:
|
|
||||||
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, PowerUsersSelector(me, POWER_MANA, 40.0f, false)))
|
|
||||||
me->CastSpell(target, SPELL_MANA_BURN, false);
|
|
||||||
events.ScheduleEvent(EVENT_SPELL_MANA_BURN, 30000);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
context.Repeat(25s);
|
||||||
|
}).Schedule(30s, [this](TaskContext context)
|
||||||
|
{
|
||||||
|
if (DoCastRandomTarget(SPELL_DOMINATION, 1, 30.0f) == SPELL_CAST_OK)
|
||||||
|
{
|
||||||
|
Talk(SAY_MIND);
|
||||||
|
}
|
||||||
|
context.Repeat();
|
||||||
|
});
|
||||||
|
|
||||||
DoMeleeAttackIfReady();
|
if (IsHeroic())
|
||||||
|
{
|
||||||
|
scheduler.Schedule(25s, [this](TaskContext context)
|
||||||
|
{
|
||||||
|
if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, PowerUsersSelector(me, POWER_MANA, 40.0f, false)))
|
||||||
|
{
|
||||||
|
DoCast(target, SPELL_MANA_BURN);
|
||||||
|
}
|
||||||
|
|
||||||
|
context.Repeat(30s);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
CreatureAI* GetAI(Creature* creature) const override
|
void JustDied(Unit* /*killer*/) override
|
||||||
{
|
{
|
||||||
return GetArcatrazAI<boss_harbinger_skyrissAI>(creature);
|
_JustDied();
|
||||||
|
Talk(SAY_DEATH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JustSummoned(Creature* summon) override
|
||||||
|
{
|
||||||
|
summon->SetHealth(summon->CountPctFromMaxHealth(summon->GetEntry() == NPC_HARBINGER_SKYRISS_66 ? 66 : 33));
|
||||||
|
me->UpdatePosition(*summon, true);
|
||||||
|
me->SendMovementFlagUpdate();
|
||||||
|
BossAI::JustSummoned(summon);
|
||||||
|
}
|
||||||
|
|
||||||
|
void KilledUnit(Unit* victim) override
|
||||||
|
{
|
||||||
|
if (victim->IsPlayer())
|
||||||
|
{
|
||||||
|
Talk(SAY_KILL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void AddSC_boss_harbinger_skyriss()
|
void AddSC_boss_harbinger_skyriss()
|
||||||
{
|
{
|
||||||
new boss_harbinger_skyriss();
|
RegisterArcatrazCreatureAI(boss_harbinger_skyriss);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user