refactor(Scripts/ShadowLabirynth): Update Blackheart the Inciter to t… (#16049)

refactor(Scripts/ShadowLabirynth): Update Blackheart the Inciter to the new script model
This commit is contained in:
Skjalf
2023-04-21 10:04:42 -03:00
committed by GitHub
parent 197b053eb4
commit 58d1419add

View File

@@ -25,6 +25,7 @@ enum BlackheartTheInciter
SPELL_INCITE_CHAOS_B = 33684, //debuff applied to each member of party
SPELL_CHARGE = 33709,
SPELL_WAR_STOMP = 33707,
SPELL_LAUGHTER = 33722,
SAY_INTRO = 0,
SAY_AGGRO = 1,
@@ -41,137 +42,112 @@ enum BlackheartTheInciter
NPC_INCITE_TRIGGER = 19300
};
class boss_blackheart_the_inciter : public CreatureScript
struct boss_blackheart_the_inciter : public BossAI
{
public:
boss_blackheart_the_inciter() : CreatureScript("boss_blackheart_the_inciter") { }
boss_blackheart_the_inciter(Creature* creature) : BossAI(creature, DATA_BLACKHEARTTHEINCITEREVENT) { }
CreatureAI* GetAI(Creature* creature) const override
bool InciteChaos;
void Reset() override
{
return GetShadowLabyrinthAI<boss_blackheart_the_inciterAI>(creature);
_Reset();
me->SetImmuneToPC(false);
InciteChaos = false;
}
struct boss_blackheart_the_inciterAI : public ScriptedAI
void KilledUnit(Unit* victim) override
{
boss_blackheart_the_inciterAI(Creature* creature) : ScriptedAI(creature)
if (victim->IsPlayer() && urand(0, 1))
{
instance = creature->GetInstanceScript();
Talk(SAY_SLAY);
}
}
void JustDied(Unit* /*killer*/) override
{
Talk(SAY_DEATH);
_JustDied();
}
void JustEngagedWith(Unit* /*who*/) override
{
Talk(SAY_AGGRO);
me->CallForHelp(100.0f);
events.ScheduleEvent(EVENT_SPELL_INCITE, 24000);
events.ScheduleEvent(EVENT_INCITE_WAIT, 15000);
events.ScheduleEvent(EVENT_SPELL_CHARGE, urand(30000, 50000));
events.ScheduleEvent(EVENT_SPELL_WAR_STOMP, urand(16950, 26350));
_JustEngagedWith();
}
void EnterEvadeMode(EvadeReason why) override
{
if (InciteChaos && SelectTargetFromPlayerList(100.0f))
return;
CreatureAI::EnterEvadeMode(why);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim() && !InciteChaos)
{
return;
}
InstanceScript* instance;
EventMap events;
bool InciteChaos;
void Reset() override
events.Update(diff);
switch (events.ExecuteEvent())
{
case EVENT_INCITE_WAIT:
me->SetImmuneToPC(false);
InciteChaos = false;
events.Reset();
if (instance)
{
instance->SetData(DATA_BLACKHEARTTHEINCITEREVENT, NOT_STARTED);
}
}
void KilledUnit(Unit* victim) override
break;
case EVENT_SPELL_INCITE:
{
if (victim->GetTypeId() == TYPEID_PLAYER && urand(0, 1))
DoCastAOE(SPELL_INCITE_CHAOS);
DoCastSelf(SPELL_LAUGHTER, true);
uint32 inciteTriggerID = NPC_INCITE_TRIGGER;
std::list<HostileReference*> t_list = me->GetThreatMgr().GetThreatList();
for (std::list<HostileReference*>::const_iterator itr = t_list.begin(); itr != t_list.end(); ++itr)
{
Talk(SAY_SLAY);
}
}
Unit* target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid());
void JustDied(Unit* /*killer*/) override
{
Talk(SAY_DEATH);
if (instance)
{
instance->SetData(DATA_BLACKHEARTTHEINCITEREVENT, DONE);
}
}
void JustEngagedWith(Unit* /*who*/) override
{
Talk(SAY_AGGRO);
me->CallForHelp(100.0f);
events.ScheduleEvent(EVENT_SPELL_INCITE, 24000);
events.ScheduleEvent(EVENT_INCITE_WAIT, 15000);
events.ScheduleEvent(EVENT_SPELL_CHARGE, urand(30000, 50000));
events.ScheduleEvent(EVENT_SPELL_WAR_STOMP, urand(16950, 26350));
if (instance)
{
instance->SetData(DATA_BLACKHEARTTHEINCITEREVENT, IN_PROGRESS);
}
}
void EnterEvadeMode(EvadeReason why) override
{
if (InciteChaos && SelectTargetFromPlayerList(100.0f))
return;
CreatureAI::EnterEvadeMode(why);
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim() && !InciteChaos)
{
return;
}
events.Update(diff);
switch (events.ExecuteEvent())
{
case EVENT_INCITE_WAIT:
me->SetImmuneToPC(false);
InciteChaos = false;
break;
case EVENT_SPELL_INCITE:
if (target && target->IsPlayer())
{
if (Creature* inciteTrigger = me->SummonCreature(inciteTriggerID++, *target, TEMPSUMMON_TIMED_DESPAWN, 15 * IN_MILLISECONDS))
{
DoCastAOE(SPELL_INCITE_CHAOS);
uint32 inciteTriggerID = NPC_INCITE_TRIGGER;
std::list<HostileReference*> t_list = me->GetThreatMgr().GetThreatList();
for (std::list<HostileReference*>::const_iterator itr = t_list.begin(); itr != t_list.end(); ++itr)
{
Unit* target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid());
if (target && target->IsPlayer())
{
if (Creature* inciteTrigger = me->SummonCreature(inciteTriggerID++, *target, TEMPSUMMON_TIMED_DESPAWN, 15 * IN_MILLISECONDS))
{
inciteTrigger->CastSpell(target, SPELL_INCITE_CHAOS_B, true);
}
}
}
DoResetThreatList();
me->SetImmuneToPC(true);
InciteChaos = true;
events.DelayEvents(15000);
events.RepeatEvent(urand(50000, 70000));
events.ScheduleEvent(EVENT_INCITE_WAIT, 15000);
break;
inciteTrigger->CastSpell(target, SPELL_INCITE_CHAOS_B, true);
}
case EVENT_SPELL_CHARGE:
DoCastRandomTarget(SPELL_CHARGE);
events.RepeatEvent(urand(30000, 50000));
break;
case EVENT_SPELL_WAR_STOMP:
DoCastAOE(SPELL_WAR_STOMP);
events.RepeatEvent(urand(16950, 26350));
break;
}
}
if (InciteChaos)
return;
DoMeleeAttackIfReady();
DoResetThreatList();
me->SetImmuneToPC(true);
InciteChaos = true;
events.DelayEvents(15000);
events.RepeatEvent(urand(50000, 70000));
events.ScheduleEvent(EVENT_INCITE_WAIT, 15000);
break;
}
};
case EVENT_SPELL_CHARGE:
DoCastRandomTarget(SPELL_CHARGE);
events.RepeatEvent(urand(30000, 50000));
break;
case EVENT_SPELL_WAR_STOMP:
DoCastAOE(SPELL_WAR_STOMP);
events.RepeatEvent(urand(16950, 26350));
break;
}
if (InciteChaos)
return;
DoMeleeAttackIfReady();
}
};
void AddSC_boss_blackheart_the_inciter()
{
new boss_blackheart_the_inciter();
RegisterShadowLabyrinthCreatureAI(boss_blackheart_the_inciter);
}