diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp index ddf0fe2de..fb285f7d5 100644 --- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp +++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp @@ -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(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 t_list = me->GetThreatMgr().GetThreatList(); + for (std::list::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 t_list = me->GetThreatMgr().GetThreatList(); - for (std::list::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); }