diff options
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_ |