aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp231
-rw-r--r--src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_blackheart_the_inciter.cpp30
-rw-r--r--src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp356
-rw-r--r--src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp290
-rw-r--r--src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.cpp57
-rw-r--r--src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h2
6 files changed, 443 insertions, 523 deletions
diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp
index ef748775215..252e1ac88f4 100644
--- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_ambassador_hellmaw.cpp
@@ -51,138 +51,127 @@ enum Events
EVENT_BERSERK
};
-class boss_ambassador_hellmaw : public CreatureScript
+struct boss_ambassador_hellmaw : public EscortAI
{
- public:
- boss_ambassador_hellmaw() : CreatureScript("boss_ambassador_hellmaw") { }
-
- struct boss_ambassador_hellmawAI : public EscortAI
+ boss_ambassador_hellmaw(Creature* creature) : EscortAI(creature)
+ {
+ _instance = creature->GetInstanceScript();
+ _intro = false;
+ }
+
+ void Reset() override
+ {
+ if (!me->IsAlive())
+ return;
+
+ _events.Reset();
+ _instance->SetBossState(DATA_AMBASSADOR_HELLMAW, NOT_STARTED);
+
+ _events.ScheduleEvent(EVENT_CORROSIVE_ACID, 5s, 10s);
+ _events.ScheduleEvent(EVENT_FEAR, 25s, 30s);
+ if (IsHeroic())
+ _events.ScheduleEvent(EVENT_BERSERK, 3min);
+
+ DoAction(ACTION_AMBASSADOR_HELLMAW_BANISH);
+ }
+
+ void MoveInLineOfSight(Unit* who) override
+ {
+ if (me->HasAura(SPELL_BANISH))
+ return;
+
+ EscortAI::MoveInLineOfSight(who);
+ }
+
+ void DoAction(int32 actionId) override
+ {
+ if (actionId == ACTION_AMBASSADOR_HELLMAW_INTRO)
+ DoIntro();
+ else if (actionId == ACTION_AMBASSADOR_HELLMAW_BANISH)
{
- boss_ambassador_hellmawAI(Creature* creature) : EscortAI(creature)
- {
- _instance = creature->GetInstanceScript();
- _intro = false;
- }
-
- void Reset() override
- {
- if (!me->IsAlive())
- return;
-
- _events.Reset();
- _instance->SetBossState(DATA_AMBASSADOR_HELLMAW, NOT_STARTED);
-
- _events.ScheduleEvent(EVENT_CORROSIVE_ACID, 5s, 10s);
- _events.ScheduleEvent(EVENT_FEAR, 25s, 30s);
- if (IsHeroic())
- _events.ScheduleEvent(EVENT_BERSERK, 3min);
-
- DoAction(ACTION_AMBASSADOR_HELLMAW_BANISH);
- }
-
- void MoveInLineOfSight(Unit* who) override
- {
- if (me->HasAura(SPELL_BANISH))
- return;
-
- EscortAI::MoveInLineOfSight(who);
- }
-
- void DoAction(int32 actionId) override
- {
- if (actionId == ACTION_AMBASSADOR_HELLMAW_INTRO)
- DoIntro();
- else if (actionId == ACTION_AMBASSADOR_HELLMAW_BANISH)
- {
- if (_instance->GetData(DATA_FEL_OVERSEER) && me->HasAura(SPELL_BANISH))
- DoCast(me, SPELL_BANISH, true); // this will not work, because he is immune to banish
- }
- }
-
- void DoIntro()
- {
- if (_intro)
- return;
-
- _intro = true;
-
- if (me->HasAura(SPELL_BANISH))
- me->RemoveAurasDueToSpell(SPELL_BANISH);
-
- Talk(SAY_INTRO);
- Start(true, false, ObjectGuid::Empty, nullptr, false, true);
- }
-
- void JustEngagedWith(Unit* /*who*/) override
- {
- _instance->SetBossState(DATA_AMBASSADOR_HELLMAW, IN_PROGRESS);
- Talk(SAY_AGGRO);
- }
+ if (_instance->GetData(DATA_FEL_OVERSEER) && me->HasAura(SPELL_BANISH))
+ DoCast(me, SPELL_BANISH, true); // this will not work, because he is immune to banish
+ }
+ }
+
+ void DoIntro()
+ {
+ if (_intro)
+ return;
+
+ _intro = true;
+
+ if (me->HasAura(SPELL_BANISH))
+ me->RemoveAurasDueToSpell(SPELL_BANISH);
+
+ Talk(SAY_INTRO);
+ Start(true, false, ObjectGuid::Empty, nullptr, false, true);
+ }
+
+ void JustEngagedWith(Unit* /*who*/) override
+ {
+ _instance->SetBossState(DATA_AMBASSADOR_HELLMAW, IN_PROGRESS);
+ Talk(SAY_AGGRO);
+ }
+
+ void KilledUnit(Unit* who) override
+ {
+ if (who->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_SLAY);
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ _instance->SetBossState(DATA_AMBASSADOR_HELLMAW, DONE);
+ Talk(SAY_DEATH);
+ }
+
+ void UpdateEscortAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
+
+ if (me->HasAura(SPELL_BANISH))
+ {
+ EnterEvadeMode(EVADE_REASON_OTHER);
+ return;
+ }
- void KilledUnit(Unit* who) override
- {
- if (who->GetTypeId() == TYPEID_PLAYER)
- Talk(SAY_SLAY);
- }
+ _events.Update(diff);
- void JustDied(Unit* /*killer*/) override
- {
- _instance->SetBossState(DATA_AMBASSADOR_HELLMAW, DONE);
- Talk(SAY_DEATH);
- }
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- void UpdateEscortAI(uint32 diff) override
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
{
- if (!UpdateVictim())
- return;
-
- if (me->HasAura(SPELL_BANISH))
- {
- EnterEvadeMode(EVADE_REASON_OTHER);
- return;
- }
-
- _events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = _events.ExecuteEvent())
- {
- switch (eventId)
- {
- case EVENT_CORROSIVE_ACID:
- DoCastVictim(SPELL_CORROSIVE_ACID);
- _events.ScheduleEvent(EVENT_CORROSIVE_ACID, 15s, 25s);
- break;
- case EVENT_FEAR:
- DoCastAOE(SPELL_FEAR);
- _events.ScheduleEvent(EVENT_FEAR, 20s, 35s);
- break;
- case EVENT_BERSERK:
- DoCast(me, SPELL_ENRAGE, true);
- break;
- default:
- break;
- }
- }
-
- DoMeleeAttackIfReady();
+ case EVENT_CORROSIVE_ACID:
+ DoCastVictim(SPELL_CORROSIVE_ACID);
+ _events.ScheduleEvent(EVENT_CORROSIVE_ACID, 15s, 25s);
+ break;
+ case EVENT_FEAR:
+ DoCastAOE(SPELL_FEAR);
+ _events.ScheduleEvent(EVENT_FEAR, 20s, 35s);
+ break;
+ case EVENT_BERSERK:
+ DoCast(me, SPELL_ENRAGE, true);
+ break;
+ default:
+ break;
}
+ }
- private:
- InstanceScript* _instance;
- EventMap _events;
- bool _intro;
- };
+ DoMeleeAttackIfReady();
+ }
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetShadowLabyrinthAI<boss_ambassador_hellmawAI>(creature);
- }
+private:
+ InstanceScript* _instance;
+ EventMap _events;
+ bool _intro;
};
void AddSC_boss_ambassador_hellmaw()
{
- new boss_ambassador_hellmaw();
+ RegisterShadowLabyrinthCreatureAI(boss_ambassador_hellmaw);
}
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 a3629f1348a..39488ff7709 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
@@ -26,13 +26,8 @@
#include "SpellScript.h"
#include "shadow_labyrinth.h"
-enum BlackheartTheInciter
+enum BlackheartTexts
{
- SPELL_INCITE_CHAOS = 33676,
- SPELL_INCITE_CHAOS_B = 33684, //debuff applied to each member of party
- SPELL_CHARGE = 33709,
- SPELL_WAR_STOMP = 33707,
-
SAY_INTRO = 0,
SAY_AGGRO = 1,
SAY_SLAY = 2,
@@ -47,11 +42,19 @@ enum BlackheartTheInciter
SAY2_DEATH = 9
};
-enum Events
+enum BlackheartSpells
{
- EVENT_INCITE_CHAOS = 1,
- EVENT_CHARGE_ATTACK = 2,
- EVENT_WAR_STOMP = 3
+ SPELL_INCITE_CHAOS = 33676,
+ SPELL_INCITE_CHAOS_B = 33684, //debuff applied to each member of party
+ SPELL_CHARGE = 33709,
+ SPELL_WAR_STOMP = 33707
+};
+
+enum BlackheartEvents
+{
+ EVENT_INCITE_CHAOS = 1,
+ EVENT_CHARGE_ATTACK,
+ EVENT_WAR_STOMP
};
class BlackheartCharmedPlayerAI : public SimpleCharmedPlayerAI
@@ -187,11 +190,13 @@ struct boss_blackheart_the_inciter_mc_dummy : public NullCreatureAI
}
}
}
+
void UpdateAI(uint32 /*diff*/) override
{
if (me->m_Controlled.empty())
me->DespawnOrUnsummon();
}
+
PlayerAI* GetAIForCharmedPlayer(Player* player) override
{
return new BlackheartCharmedPlayerAI(player);
@@ -202,6 +207,7 @@ struct boss_blackheart_the_inciter_mc_dummy : public NullCreatureAI
class spell_blackheart_incite_chaos : public SpellScript
{
PrepareSpellScript(spell_blackheart_incite_chaos);
+
bool Validate(SpellInfo const* /*spell*/) override
{
return ValidateSpellInfo({ SPELL_INCITE_CHAOS_B });
@@ -228,7 +234,7 @@ const uint32 spell_blackheart_incite_chaos::INCITE_SPELLS[spell_blackheart_incit
void AddSC_boss_blackheart_the_inciter()
{
- RegisterCreatureAIWithFactory(boss_blackheart_the_inciter, GetShadowLabyrinthAI);
- RegisterCreatureAIWithFactory(boss_blackheart_the_inciter_mc_dummy, GetShadowLabyrinthAI);
+ RegisterShadowLabyrinthCreatureAI(boss_blackheart_the_inciter);
+ RegisterShadowLabyrinthCreatureAI(boss_blackheart_the_inciter_mc_dummy);
RegisterSpellScript(spell_blackheart_incite_chaos);
}
diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp
index 37ec05b8028..1c209c21aec 100644
--- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_grandmaster_vorpil.cpp
@@ -81,220 +81,198 @@ enum Events
EVENT_SUMMON_TRAVELER = 4
};
-class boss_grandmaster_vorpil : public CreatureScript
+struct boss_grandmaster_vorpil : public BossAI
{
- public:
- boss_grandmaster_vorpil() : CreatureScript("boss_grandmaster_vorpil") { }
-
- struct boss_grandmaster_vorpilAI : public BossAI
+ boss_grandmaster_vorpil(Creature* creature) : BossAI(creature, DATA_GRANDMASTER_VORPIL)
+ {
+ Initialize();
+ _intro = false;
+ }
+
+ void Initialize()
+ {
+ _helpYell = false;
+ }
+
+ void Reset() override
+ {
+ _Reset();
+ Initialize();
+ }
+
+ void SummonPortals()
+ {
+ for (uint8 i = 0; i < 5; ++i)
+ if (Creature* portal = me->SummonCreature(NPC_VOID_PORTAL, VoidPortalCoords[i][0], VoidPortalCoords[i][1], VoidPortalCoords[i][2], 0, TEMPSUMMON_CORPSE_DESPAWN, 50min))
+ portal->CastSpell(portal, SPELL_VOID_PORTAL_VISUAL, true);
+
+ events.ScheduleEvent(EVENT_SUMMON_TRAVELER, 5s);
+ }
+
+ void spawnVoidTraveler()
+ {
+ uint8 pos = urand(0, 4);
+ me->SummonCreature(NPC_VOID_TRAVELER, VoidPortalCoords[pos][0], VoidPortalCoords[pos][1], VoidPortalCoords[pos][2], 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5s);
+ if (!_helpYell)
{
- boss_grandmaster_vorpilAI(Creature* creature) : BossAI(creature, DATA_GRANDMASTER_VORPIL)
- {
- Initialize();
- _intro = false;
- }
-
- void Initialize()
- {
- _helpYell = false;
- }
-
- void Reset() override
- {
- _Reset();
- Initialize();
- }
-
- void SummonPortals()
- {
- for (uint8 i = 0; i < 5; ++i)
- if (Creature* portal = me->SummonCreature(NPC_VOID_PORTAL, VoidPortalCoords[i][0], VoidPortalCoords[i][1], VoidPortalCoords[i][2], 0, TEMPSUMMON_CORPSE_DESPAWN, 50min))
- portal->CastSpell(portal, SPELL_VOID_PORTAL_VISUAL, true);
-
- events.ScheduleEvent(EVENT_SUMMON_TRAVELER, 5s);
- }
+ Talk(SAY_HELP);
+ _helpYell = true;
+ }
+ }
+
+ void KilledUnit(Unit* who) override
+ {
+ if (who->GetTypeId() == TYPEID_PLAYER)
+ Talk(SAY_SLAY);
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ }
+
+ void JustEngagedWith(Unit* who) override
+ {
+ BossAI::JustEngagedWith(who);
+ events.ScheduleEvent(EVENT_SHADOWBOLT_VOLLEY, 7s, 14s);
+ if (IsHeroic())
+ events.ScheduleEvent(EVENT_BANISH, 15s);
+ events.ScheduleEvent(EVENT_DRAW_SHADOWS, 45s);
+ events.ScheduleEvent(EVENT_SUMMON_TRAVELER, 90s);
+
+ Talk(SAY_AGGRO);
+ SummonPortals();
+ }
+
+ void MoveInLineOfSight(Unit* who) override
+ {
+ BossAI::MoveInLineOfSight(who);
+
+ if (!_intro && me->IsWithinLOSInMap(who) && me->IsWithinDistInMap(who, 100) && me->IsValidAttackTarget(who))
+ {
+ Talk(SAY_INTRO);
+ _intro = true;
+ }
+ }
- void spawnVoidTraveler()
- {
- uint8 pos = urand(0, 4);
- me->SummonCreature(NPC_VOID_TRAVELER, VoidPortalCoords[pos][0], VoidPortalCoords[pos][1], VoidPortalCoords[pos][2], 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5s);
- if (!_helpYell)
- {
- Talk(SAY_HELP);
- _helpYell = true;
- }
- }
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
- void KilledUnit(Unit* who) override
- {
- if (who->GetTypeId() == TYPEID_PLAYER)
- Talk(SAY_SLAY);
- }
+ events.Update(diff);
- void JustDied(Unit* /*killer*/) override
- {
- _JustDied();
- Talk(SAY_DEATH);
- }
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- void JustEngagedWith(Unit* who) override
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
{
- BossAI::JustEngagedWith(who);
- events.ScheduleEvent(EVENT_SHADOWBOLT_VOLLEY, 7s, 14s);
- if (IsHeroic())
+ case EVENT_SHADOWBOLT_VOLLEY:
+ DoCast(me, SPELL_SHADOWBOLT_VOLLEY);
+ events.ScheduleEvent(EVENT_SHADOWBOLT_VOLLEY, 15s, 30s);
+ break;
+ case EVENT_BANISH:
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, false))
+ DoCast(target, SPELL_BANISH);
events.ScheduleEvent(EVENT_BANISH, 15s);
- events.ScheduleEvent(EVENT_DRAW_SHADOWS, 45s);
- events.ScheduleEvent(EVENT_SUMMON_TRAVELER, 90s);
-
- Talk(SAY_AGGRO);
- SummonPortals();
- }
-
- void MoveInLineOfSight(Unit* who) override
- {
- BossAI::MoveInLineOfSight(who);
-
- if (!_intro && me->IsWithinLOSInMap(who) && me->IsWithinDistInMap(who, 100) && me->IsValidAttackTarget(who))
- {
- Talk(SAY_INTRO);
- _intro = true;
- }
- }
-
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
-
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
+ break;
+ case EVENT_DRAW_SHADOWS:
{
- case EVENT_SHADOWBOLT_VOLLEY:
- DoCast(me, SPELL_SHADOWBOLT_VOLLEY);
- events.ScheduleEvent(EVENT_SHADOWBOLT_VOLLEY, 15s, 30s);
- break;
- case EVENT_BANISH:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, false))
- DoCast(target, SPELL_BANISH);
- events.ScheduleEvent(EVENT_BANISH, 15s);
- break;
- case EVENT_DRAW_SHADOWS:
- {
- instance->instance->DoOnPlayers([this](Player* player)
- {
- if (player->IsAlive() && !player->HasAura(SPELL_BANISH))
- player->TeleportTo(me->GetMapId(), VorpilPosition.GetPositionX(), VorpilPosition.GetPositionY(), VorpilPosition.GetPositionZ(), VorpilPosition.GetOrientation(), TELE_TO_NOT_LEAVE_COMBAT);
- });
-
- me->UpdatePosition(VorpilPosition);
- DoCast(me, SPELL_DRAW_SHADOWS, true);
- DoCast(me, SPELL_RAIN_OF_FIRE);
- events.ScheduleEvent(EVENT_SHADOWBOLT_VOLLEY, 6s);
- events.ScheduleEvent(EVENT_DRAW_SHADOWS, 30s);
- break;
- }
- case EVENT_SUMMON_TRAVELER:
- spawnVoidTraveler();
- events.ScheduleEvent(EVENT_SUMMON_TRAVELER, 10s);
- // enrage at 20%
- if (HealthBelowPct(20))
- events.ScheduleEvent(EVENT_SUMMON_TRAVELER, 5s);
- break;
+ instance->instance->DoOnPlayers([this](Player* player)
+ {
+ if (player->IsAlive() && !player->HasAura(SPELL_BANISH))
+ player->TeleportTo(me->GetMapId(), VorpilPosition.GetPositionX(), VorpilPosition.GetPositionY(), VorpilPosition.GetPositionZ(), VorpilPosition.GetOrientation(), TELE_TO_NOT_LEAVE_COMBAT);
+ });
+
+ me->UpdatePosition(VorpilPosition);
+ DoCast(me, SPELL_DRAW_SHADOWS, true);
+ DoCast(me, SPELL_RAIN_OF_FIRE);
+ events.ScheduleEvent(EVENT_SHADOWBOLT_VOLLEY, 6s);
+ events.ScheduleEvent(EVENT_DRAW_SHADOWS, 30s);
+ break;
}
-
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
- }
-
- DoMeleeAttackIfReady();
+ case EVENT_SUMMON_TRAVELER:
+ spawnVoidTraveler();
+ events.ScheduleEvent(EVENT_SUMMON_TRAVELER, 10s);
+ // enrage at 20%
+ if (HealthBelowPct(20))
+ events.ScheduleEvent(EVENT_SUMMON_TRAVELER, 5s);
+ break;
}
- private:
- bool _intro;
- bool _helpYell;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetShadowLabyrinthAI<boss_grandmaster_vorpilAI>(creature);
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
}
+
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ bool _intro;
+ bool _helpYell;
};
-class npc_voidtraveler : public CreatureScript
+struct npc_voidtraveler : public ScriptedAI
{
- public:
- npc_voidtraveler() : CreatureScript("npc_voidtraveler") { }
-
- struct npc_voidtravelerAI : public ScriptedAI
+ npc_voidtraveler(Creature* creature) : ScriptedAI(creature)
+ {
+ Initialize();
+ _instance = creature->GetInstanceScript();
+ }
+
+ void Initialize()
+ {
+ _moveTimer = 0;
+ _sacrificed = false;
+ }
+
+ void Reset() override
+ {
+ Initialize();
+ }
+
+ void JustEngagedWith(Unit* /*who*/) override { }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (_moveTimer <= diff)
{
- npc_voidtravelerAI(Creature* creature) : ScriptedAI(creature)
- {
- Initialize();
- _instance = creature->GetInstanceScript();
- }
+ Creature* Vorpil = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_GRANDMASTER_VORPIL));
+ if (!Vorpil)
+ return;
- void Initialize()
+ if (_sacrificed)
{
- _moveTimer = 0;
- _sacrificed = false;
+ DoCastAOE(SPELL_EMPOWERING_SHADOWS, true);
+ DoCast(me, SPELL_SHADOW_NOVA, true);
+ me->KillSelf();
+ return;
}
-
- void Reset() override
+ me->GetMotionMaster()->MoveFollow(Vorpil, 0, 0);
+ if (me->IsWithinDist(Vorpil, 3))
{
- Initialize();
- }
-
- void JustEngagedWith(Unit* /*who*/) override { }
-
- void UpdateAI(uint32 diff) override
- {
- if (_moveTimer <= diff)
- {
- Creature* Vorpil = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_GRANDMASTER_VORPIL));
- if (!Vorpil)
- return;
-
- if (_sacrificed)
- {
- DoCastAOE(SPELL_EMPOWERING_SHADOWS, true);
- DoCast(me, SPELL_SHADOW_NOVA, true);
- me->KillSelf();
- return;
- }
- me->GetMotionMaster()->MoveFollow(Vorpil, 0, 0);
- if (me->IsWithinDist(Vorpil, 3))
- {
- DoCast(me, SPELL_SACRIFICE, false);
- _sacrificed = true;
- _moveTimer = 500;
- return;
- }
- _moveTimer = 1000;
- }
- else
- _moveTimer -= diff;
+ DoCast(me, SPELL_SACRIFICE, false);
+ _sacrificed = true;
+ _moveTimer = 500;
+ return;
}
-
- private:
- InstanceScript* _instance;
- uint32 _moveTimer;
- bool _sacrificed;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetShadowLabyrinthAI<npc_voidtravelerAI>(creature);
+ _moveTimer = 1000;
}
+ else
+ _moveTimer -= diff;
+ }
+
+private:
+ InstanceScript* _instance;
+ uint32 _moveTimer;
+ bool _sacrificed;
};
void AddSC_boss_grandmaster_vorpil()
{
- new boss_grandmaster_vorpil();
- new npc_voidtraveler();
+ RegisterShadowLabyrinthCreatureAI(boss_grandmaster_vorpil);
+ RegisterShadowLabyrinthCreatureAI(npc_voidtraveler);
}
diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp
index 64f2b53ac71..f995ff53986 100644
--- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/boss_murmur.cpp
@@ -51,169 +51,136 @@ enum Events
EVENT_SONIC_SHOCK = 6
};
-class boss_murmur : public CreatureScript
+struct boss_murmur : public BossAI
{
- public:
- boss_murmur() : CreatureScript("boss_murmur") { }
-
- struct boss_murmurAI : public BossAI
+ boss_murmur(Creature* creature) : BossAI(creature, DATA_MURMUR)
+ {
+ SetCombatMovement(false);
+ }
+
+ void Reset() override
+ {
+ _Reset();
+ events.ScheduleEvent(EVENT_SONIC_BOOM, 30s);
+ events.ScheduleEvent(EVENT_MURMURS_TOUCH, 8s, 20s);
+ events.ScheduleEvent(EVENT_RESONANCE, 5s);
+ events.ScheduleEvent(EVENT_MAGNETIC_PULL, 15s, 30s);
+ if (IsHeroic())
{
- boss_murmurAI(Creature* creature) : BossAI(creature, DATA_MURMUR)
- {
- SetCombatMovement(false);
- }
+ events.ScheduleEvent(EVENT_THUNDERING_STORM, 15s);
+ events.ScheduleEvent(EVENT_SONIC_SHOCK, 10s);
+ }
- void Reset() override
- {
- _Reset();
- events.ScheduleEvent(EVENT_SONIC_BOOM, 30s);
- events.ScheduleEvent(EVENT_MURMURS_TOUCH, 8s, 20s);
- events.ScheduleEvent(EVENT_RESONANCE, 5s);
- events.ScheduleEvent(EVENT_MAGNETIC_PULL, 15s, 30s);
- if (IsHeroic())
- {
- events.ScheduleEvent(EVENT_THUNDERING_STORM, 15s);
- events.ScheduleEvent(EVENT_SONIC_SHOCK, 10s);
- }
+ // database should have `RegenHealth`=0 to prevent regen
+ uint32 hp = me->CountPctFromMaxHealth(40);
+ if (hp)
+ me->SetHealth(hp);
+ me->ResetPlayerDamageReq();
+ }
- // database should have `RegenHealth`=0 to prevent regen
- uint32 hp = me->CountPctFromMaxHealth(40);
- if (hp)
- me->SetHealth(hp);
- me->ResetPlayerDamageReq();
- }
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- events.Update(diff);
+ events.Update(diff);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- while (uint32 eventId = events.ExecuteEvent())
- {
- switch (eventId)
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_SONIC_BOOM:
+ Talk(EMOTE_SONIC_BOOM);
+ DoCast(me, SPELL_SONIC_BOOM_CAST);
+ events.ScheduleEvent(EVENT_SONIC_BOOM, 30s);
+ events.ScheduleEvent(EVENT_RESONANCE, 1500ms);
+ break;
+ case EVENT_MURMURS_TOUCH:
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 80.0f, true))
+ DoCast(target, SPELL_MURMURS_TOUCH);
+ events.ScheduleEvent(EVENT_MURMURS_TOUCH, 25s, 35s);
+ break;
+ case EVENT_RESONANCE:
+ if (!(me->IsWithinMeleeRange(me->GetVictim())))
{
- case EVENT_SONIC_BOOM:
- Talk(EMOTE_SONIC_BOOM);
- DoCast(me, SPELL_SONIC_BOOM_CAST);
- events.ScheduleEvent(EVENT_SONIC_BOOM, 30s);
- events.ScheduleEvent(EVENT_RESONANCE, 1500ms);
- break;
- case EVENT_MURMURS_TOUCH:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 80.0f, true))
- DoCast(target, SPELL_MURMURS_TOUCH);
- events.ScheduleEvent(EVENT_MURMURS_TOUCH, 25s, 35s);
- break;
- case EVENT_RESONANCE:
- if (!(me->IsWithinMeleeRange(me->GetVictim())))
- {
- DoCast(me, SPELL_RESONANCE);
- events.ScheduleEvent(EVENT_RESONANCE, 5s);
- }
- break;
- case EVENT_MAGNETIC_PULL:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true))
- {
- DoCast(target, SPELL_MAGNETIC_PULL);
- events.ScheduleEvent(EVENT_MAGNETIC_PULL, 15s, 30s);
- break;
- }
- events.ScheduleEvent(EVENT_MAGNETIC_PULL, 500ms);
- break;
- case EVENT_THUNDERING_STORM:
- DoCastAOE(SPELL_THUNDERING_STORM, true);
- events.ScheduleEvent(EVENT_THUNDERING_STORM, 15s);
- break;
- case EVENT_SONIC_SHOCK:
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 20.0f, false))
- DoCast(target, SPELL_SONIC_SHOCK);
- events.ScheduleEvent(EVENT_SONIC_SHOCK, 10s, 20s);
- break;
+ DoCast(me, SPELL_RESONANCE);
+ events.ScheduleEvent(EVENT_RESONANCE, 5s);
}
+ break;
+ case EVENT_MAGNETIC_PULL:
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true))
+ {
+ DoCast(target, SPELL_MAGNETIC_PULL);
+ events.ScheduleEvent(EVENT_MAGNETIC_PULL, 15s, 30s);
+ break;
+ }
+ events.ScheduleEvent(EVENT_MAGNETIC_PULL, 500ms);
+ break;
+ case EVENT_THUNDERING_STORM:
+ DoCastAOE(SPELL_THUNDERING_STORM, true);
+ events.ScheduleEvent(EVENT_THUNDERING_STORM, 15s);
+ break;
+ case EVENT_SONIC_SHOCK:
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 20.0f, false))
+ DoCast(target, SPELL_SONIC_SHOCK);
+ events.ScheduleEvent(EVENT_SONIC_SHOCK, 10s, 20s);
+ break;
+ }
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
- }
-
- // Select nearest most aggro target if top aggro too far
- if (!me->isAttackReady())
- return;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+ }
- if (!me->IsWithinMeleeRange(me->GetVictim()))
- me->GetThreatManager().ResetThreat(me->GetVictim());
+ // Select nearest most aggro target if top aggro too far
+ if (!me->isAttackReady())
+ return;
- DoMeleeAttackIfReady();
- }
- };
+ if (!me->IsWithinMeleeRange(me->GetVictim()))
+ me->GetThreatManager().ResetThreat(me->GetVictim());
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetShadowLabyrinthAI<boss_murmurAI>(creature);
- }
+ DoMeleeAttackIfReady();
+ }
};
// 33923, 38796 - Sonic Boom
-class spell_murmur_sonic_boom : public SpellScriptLoader
+class spell_murmur_sonic_boom : public SpellScript
{
- public:
- spell_murmur_sonic_boom() : SpellScriptLoader("spell_murmur_sonic_boom") { }
-
- class spell_murmur_sonic_boom_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_murmur_sonic_boom_SpellScript);
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_SONIC_BOOM_EFFECT });
- }
-
- void HandleEffect(SpellEffIndex /*effIndex*/)
- {
- GetCaster()->CastSpell(nullptr, SPELL_SONIC_BOOM_EFFECT, true);
- }
-
- void Register() override
- {
- OnEffectHit += SpellEffectFn(spell_murmur_sonic_boom_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_DUMMY);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_murmur_sonic_boom_SpellScript();
- }
+ PrepareSpellScript(spell_murmur_sonic_boom);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_SONIC_BOOM_EFFECT });
+ }
+
+ void HandleEffect(SpellEffIndex /*effIndex*/)
+ {
+ GetCaster()->CastSpell(nullptr, SPELL_SONIC_BOOM_EFFECT, true);
+ }
+
+ void Register() override
+ {
+ OnEffectHit += SpellEffectFn(spell_murmur_sonic_boom::HandleEffect, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
};
// 33666, 38795 - Sonic Boom Effect
-class spell_murmur_sonic_boom_effect : public SpellScriptLoader
+class spell_murmur_sonic_boom_effect : public SpellScript
{
- public:
- spell_murmur_sonic_boom_effect() : SpellScriptLoader("spell_murmur_sonic_boom_effect") { }
-
- class spell_murmur_sonic_boom_effect_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_murmur_sonic_boom_effect_SpellScript);
-
- void CalcDamage()
- {
- if (Unit* target = GetHitUnit())
- SetHitDamage(target->CountPctFromMaxHealth(80)); /// @todo: find correct value
- }
-
- void Register() override
- {
- OnHit += SpellHitFn(spell_murmur_sonic_boom_effect_SpellScript::CalcDamage);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_murmur_sonic_boom_effect_SpellScript();
- }
+ PrepareSpellScript(spell_murmur_sonic_boom_effect);
+
+ void CalcDamage()
+ {
+ if (Unit* target = GetHitUnit())
+ SetHitDamage(target->CountPctFromMaxHealth(80)); /// @todo: find correct value
+ }
+
+ void Register() override
+ {
+ OnHit += SpellHitFn(spell_murmur_sonic_boom_effect::CalcDamage);
+ }
};
class ThunderingStormCheck
@@ -232,36 +199,25 @@ class ThunderingStormCheck
};
// 39365 - Thundering Storm
-class spell_murmur_thundering_storm : public SpellScriptLoader
+class spell_murmur_thundering_storm : public SpellScript
{
- public:
- spell_murmur_thundering_storm() : SpellScriptLoader("spell_murmur_thundering_storm") { }
-
- class spell_murmur_thundering_storm_SpellScript : public SpellScript
- {
- PrepareSpellScript(spell_murmur_thundering_storm_SpellScript);
+ PrepareSpellScript(spell_murmur_thundering_storm);
- void FilterTarget(std::list<WorldObject*>& targets)
- {
- targets.remove_if(ThunderingStormCheck(GetCaster()));
- }
+ void FilterTarget(std::list<WorldObject*>& targets)
+ {
+ targets.remove_if(ThunderingStormCheck(GetCaster()));
+ }
- void Register() override
- {
- OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_murmur_thundering_storm_SpellScript::FilterTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
- }
- };
-
- SpellScript* GetSpellScript() const override
- {
- return new spell_murmur_thundering_storm_SpellScript();
- }
+ void Register() override
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_murmur_thundering_storm::FilterTarget, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
+ }
};
void AddSC_boss_murmur()
{
- new boss_murmur();
- new spell_murmur_sonic_boom();
- new spell_murmur_sonic_boom_effect();
- new spell_murmur_thundering_storm();
+ RegisterShadowLabyrinthCreatureAI(boss_murmur);
+ RegisterSpellScript(spell_murmur_sonic_boom);
+ RegisterSpellScript(spell_murmur_sonic_boom_effect);
+ RegisterSpellScript(spell_murmur_thundering_storm);
}
diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.cpp b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.cpp
index ed5da1af652..433c3ee1ba1 100644
--- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.cpp
+++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.cpp
@@ -25,43 +25,32 @@ enum Spells
};
// 33493 - Mark of Malice
-class spell_mark_of_malice : public SpellScriptLoader
+class spell_mark_of_malice : public AuraScript
{
- public:
- spell_mark_of_malice() : SpellScriptLoader("spell_mark_of_malice") { }
-
- class spell_mark_of_malice_AuraScript : public AuraScript
- {
- PrepareAuraScript(spell_mark_of_malice_AuraScript);
-
- bool Validate(SpellInfo const* /*spellInfo*/) override
- {
- return ValidateSpellInfo({ SPELL_MARK_OF_MALICE_TRIGGERED });
- }
-
- void HandleProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/)
- {
- PreventDefaultAction();
- // just drop charges
- if (GetCharges() > 1)
- return;
-
- GetTarget()->CastSpell(GetTarget(), SPELL_MARK_OF_MALICE_TRIGGERED, aurEff);
- }
-
- void Register() override
- {
- OnEffectProc += AuraEffectProcFn(spell_mark_of_malice_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
- }
- };
-
- AuraScript* GetAuraScript() const override
- {
- return new spell_mark_of_malice_AuraScript();
- }
+ PrepareAuraScript(spell_mark_of_malice);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_MARK_OF_MALICE_TRIGGERED });
+ }
+
+ void HandleProc(AuraEffect* aurEff, ProcEventInfo& /*eventInfo*/)
+ {
+ PreventDefaultAction();
+ // just drop charges
+ if (GetCharges() > 1)
+ return;
+
+ GetTarget()->CastSpell(GetTarget(), SPELL_MARK_OF_MALICE_TRIGGERED, aurEff);
+ }
+
+ void Register() override
+ {
+ OnEffectProc += AuraEffectProcFn(spell_mark_of_malice::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ }
};
void AddSC_shadow_labyrinth()
{
- new spell_mark_of_malice();
+ RegisterSpellScript(spell_mark_of_malice);
}
diff --git a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h
index 642ee116055..b1c10738295 100644
--- a/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h
+++ b/src/server/scripts/Outland/Auchindoun/ShadowLabyrinth/shadow_labyrinth.h
@@ -71,4 +71,6 @@ inline AI* GetShadowLabyrinthAI(T* obj)
return GetInstanceAI<AI>(obj, SLScriptName);
}
+#define RegisterShadowLabyrinthCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetShadowLabyrinthAI)
+
#endif // SHADOW_LABYRINTH_H_