diff options
| author | offl <11556157+offl@users.noreply.github.com> | 2021-07-13 05:16:03 +0300 | 
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2022-03-11 15:47:43 +0100 | 
| commit | ea5823151a7019ee927505b8622767e8e62e3d5d (patch) | |
| tree | 4dae8d21ed6182748dac83c4110c3f0a9a9c3967 /src | |
| parent | f65dd33cfcda284d84d828b5ad6b83669bc5b3a5 (diff) | |
Scripts/SL: Update scripts to new register model (#26677)
(cherry picked from commit 4bca9c990d33b3222ef15390be68c644ccfe3395)
Diffstat (limited to 'src')
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_ | 
