diff options
Diffstat (limited to 'src')
3 files changed, 256 insertions, 309 deletions
| diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp index a27f04d4890..c42902b6085 100644 --- a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp +++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_nexusprince_shaffar.cpp @@ -71,123 +71,112 @@ enum Events      EVENT_FROST_NOVA  }; -class boss_nexusprince_shaffar : public CreatureScript +struct boss_nexusprince_shaffar : public BossAI  { -    public: -        boss_nexusprince_shaffar() : CreatureScript("boss_nexusprince_shaffar") { } +    boss_nexusprince_shaffar(Creature* creature) : BossAI(creature, DATA_NEXUSPRINCE_SHAFFAR) +    { +        _hasTaunted = false; +    } -        struct boss_nexusprince_shaffarAI : public BossAI -        { -            boss_nexusprince_shaffarAI(Creature* creature) : BossAI(creature, DATA_NEXUSPRINCE_SHAFFAR) -            { -                _hasTaunted = false; -            } +    void Reset() override +    { +        _Reset(); -            void Reset() override -            { -                _Reset(); +        float dist = 8.0f; +        float posX, posY, posZ, angle; +        me->GetHomePosition(posX, posY, posZ, angle); -                float dist = 8.0f; -                float posX, posY, posZ, angle; -                me->GetHomePosition(posX, posY, posZ, angle); +        me->SummonCreature(NPC_BEACON, posX - dist, posY - dist, posZ, angle, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2h); +        me->SummonCreature(NPC_BEACON, posX - dist, posY + dist, posZ, angle, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2h); +        me->SummonCreature(NPC_BEACON, posX + dist, posY, posZ, angle, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2h); +    } -                me->SummonCreature(NPC_BEACON, posX - dist, posY - dist, posZ, angle, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2h); -                me->SummonCreature(NPC_BEACON, posX - dist, posY + dist, posZ, angle, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2h); -                me->SummonCreature(NPC_BEACON, posX + dist, posY, posZ, angle, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2h); -            } +    void MoveInLineOfSight(Unit* who) override +    { +        if (!_hasTaunted && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 100.0f)) +        { +            Talk(SAY_INTRO); +            _hasTaunted = true; +        } +    } -            void MoveInLineOfSight(Unit* who) override -            { -                if (!_hasTaunted && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 100.0f)) -                { -                    Talk(SAY_INTRO); -                    _hasTaunted = true; -                } -            } +    void JustEngagedWith(Unit* who) override +    { +        Talk(SAY_AGGRO); +        BossAI::JustEngagedWith(who); -            void JustEngagedWith(Unit* who) override -            { -                Talk(SAY_AGGRO); -                BossAI::JustEngagedWith(who); +        events.ScheduleEvent(EVENT_BEACON, 10s); +        events.ScheduleEvent(EVENT_FIREBALL, 8s); +        events.ScheduleEvent(EVENT_FROSTBOLT, 4s); +        events.ScheduleEvent(EVENT_FROST_NOVA, 15s); +    } -                events.ScheduleEvent(EVENT_BEACON, 10s); -                events.ScheduleEvent(EVENT_FIREBALL, 8s); -                events.ScheduleEvent(EVENT_FROSTBOLT, 4s); -                events.ScheduleEvent(EVENT_FROST_NOVA, 15s); -            } +    void JustSummoned(Creature* summoned) override +    { +        if (summoned->GetEntry() == NPC_BEACON) +        { +            summoned->CastSpell(summoned, SPELL_ETHEREAL_BEACON_VISUAL, false); -            void JustSummoned(Creature* summoned) override -            { -                if (summoned->GetEntry() == NPC_BEACON) -                { -                    summoned->CastSpell(summoned, SPELL_ETHEREAL_BEACON_VISUAL, false); +            if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) +                summoned->AI()->AttackStart(target); +        } -                    if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0)) -                        summoned->AI()->AttackStart(target); -                } +        summons.Summon(summoned); +    } -                summons.Summon(summoned); -            } +    void KilledUnit(Unit* victim) override +    { +        if (victim->GetTypeId() == TYPEID_PLAYER) +            Talk(SAY_SLAY); +    } -            void KilledUnit(Unit* victim) override -            { -                if (victim->GetTypeId() == TYPEID_PLAYER) -                    Talk(SAY_SLAY); -            } +    void JustDied(Unit* /*killer*/) override +    { +        Talk(SAY_DEAD); +        _JustDied(); +    } -            void JustDied(Unit* /*killer*/) override -            { -                Talk(SAY_DEAD); -                _JustDied(); -            } +    void ExecuteEvent(uint32 eventId) override +    { +        switch (eventId) +        { +            case EVENT_BLINK: +                if (me->IsNonMeleeSpellCast(false)) +                    me->InterruptNonMeleeSpells(true); -            void ExecuteEvent(uint32 eventId) override -            { -                switch (eventId) -                { -                    case EVENT_BLINK: -                        if (me->IsNonMeleeSpellCast(false)) -                            me->InterruptNonMeleeSpells(true); - -                        // expire movement, will prevent from running right back to victim after cast -                        // (but should MoveChase be used again at a certain time or should he not move?) -                        me->GetMotionMaster()->Clear(MOTION_PRIORITY_NORMAL); - -                        DoCast(me, SPELL_BLINK); -                        break; -                    case EVENT_BEACON: -                        if (!urand(0, 3)) -                            Talk(SAY_SUMMON); - -                        DoCast(me, SPELL_ETHEREAL_BEACON, true); -                        events.ScheduleEvent(EVENT_BEACON, 10s); -                        break; -                    case EVENT_FIREBALL: -                        DoCastVictim(SPELL_FROSTBOLT); -                        events.ScheduleEvent(EVENT_FIREBALL, 4500ms, 6s); -                        break; -                    case EVENT_FROSTBOLT: -                        DoCastVictim(SPELL_FROSTBOLT); -                        events.ScheduleEvent(EVENT_FROSTBOLT, 4500ms, 6s); -                        break; -                    case EVENT_FROST_NOVA: -                        DoCast(me, SPELL_FROSTNOVA); -                        events.ScheduleEvent(EVENT_FROST_NOVA, 17500ms, 25s); -                        events.ScheduleEvent(EVENT_BLINK, 1500ms); -                        break; -                    default: -                        break; -                } -            } +                // expire movement, will prevent from running right back to victim after cast +                // (but should MoveChase be used again at a certain time or should he not move?) +                me->GetMotionMaster()->Clear(MOTION_PRIORITY_NORMAL); -        private: -            bool _hasTaunted; -        }; +                DoCast(me, SPELL_BLINK); +                break; +            case EVENT_BEACON: +                if (!urand(0, 3)) +                    Talk(SAY_SUMMON); -        CreatureAI* GetAI(Creature* creature) const override -        { -            return GetManaTombsAI<boss_nexusprince_shaffarAI>(creature); +                DoCast(me, SPELL_ETHEREAL_BEACON, true); +                events.ScheduleEvent(EVENT_BEACON, 10s); +                break; +            case EVENT_FIREBALL: +                DoCastVictim(SPELL_FROSTBOLT); +                events.ScheduleEvent(EVENT_FIREBALL, 4500ms, 6s); +                break; +            case EVENT_FROSTBOLT: +                DoCastVictim(SPELL_FROSTBOLT); +                events.ScheduleEvent(EVENT_FROSTBOLT, 4500ms, 6s); +                break; +            case EVENT_FROST_NOVA: +                DoCast(me, SPELL_FROSTNOVA); +                events.ScheduleEvent(EVENT_FROST_NOVA, 17500ms, 25s); +                events.ScheduleEvent(EVENT_BLINK, 1500ms); +                break; +            default: +                break;          } +    } + +private: +    bool _hasTaunted;  };  enum EtherealBeacon @@ -196,71 +185,60 @@ enum EtherealBeacon      EVENT_ARCANE_BOLT  }; -class npc_ethereal_beacon : public CreatureScript +struct npc_ethereal_beacon : public ScriptedAI  { -    public: -        npc_ethereal_beacon() : CreatureScript("npc_ethereal_beacon") { } +    npc_ethereal_beacon(Creature* creature) : ScriptedAI(creature) { } -        struct npc_ethereal_beaconAI : public ScriptedAI -        { -            npc_ethereal_beaconAI(Creature* creature) : ScriptedAI(creature) { } +    void Reset() override +    { +        _events.Reset(); +    } -            void Reset() override -            { -                _events.Reset(); -            } +    void JustEngagedWith(Unit* who) override +    { +        if (Creature* shaffar = me->FindNearestCreature(NPC_SHAFFAR, 100.0f)) +            if (!shaffar->IsInCombat()) +                shaffar->AI()->AttackStart(who); -            void JustEngagedWith(Unit* who) override -            { -                if (Creature* shaffar = me->FindNearestCreature(NPC_SHAFFAR, 100.0f)) -                    if (!shaffar->IsInCombat()) -                        shaffar->AI()->AttackStart(who); +        _events.ScheduleEvent(EVENT_APPRENTICE, DUNGEON_MODE(20s, 10s)); +        _events.ScheduleEvent(EVENT_ARCANE_BOLT, 1s); +    } -                _events.ScheduleEvent(EVENT_APPRENTICE, DUNGEON_MODE(20s, 10s)); -                _events.ScheduleEvent(EVENT_ARCANE_BOLT, 1s); -            } +    void JustSummoned(Creature* summoned) override +    { +        summoned->AI()->AttackStart(me->GetVictim()); +    } -            void JustSummoned(Creature* summoned) override -            { -                summoned->AI()->AttackStart(me->GetVictim()); -            } +    void UpdateAI(uint32 diff) override +    { +        if (!UpdateVictim()) +            return; -            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) -                    { -                        case EVENT_APPRENTICE: -                            DoCast(me, SPELL_ETHEREAL_APPRENTICE, true); -                            me->DespawnOrUnsummon(); -                            break; -                        case EVENT_ARCANE_BOLT: -                            DoCastVictim(SPELL_ARCANE_BOLT); -                            _events.ScheduleEvent(EVENT_ARCANE_BOLT, 2s, 4500ms); -                            break; -                        default: -                            break; -                    } -                } -            } +        _events.Update(diff); -        private: -            EventMap _events; -        }; +        if (me->HasUnitState(UNIT_STATE_CASTING)) +            return; -        CreatureAI* GetAI(Creature* creature) const override +        while (uint32 eventId = _events.ExecuteEvent())          { -            return GetManaTombsAI<npc_ethereal_beaconAI>(creature); +            switch (eventId) +            { +                case EVENT_APPRENTICE: +                    DoCast(me, SPELL_ETHEREAL_APPRENTICE, true); +                    me->DespawnOrUnsummon(); +                    break; +                case EVENT_ARCANE_BOLT: +                    DoCastVictim(SPELL_ARCANE_BOLT); +                    _events.ScheduleEvent(EVENT_ARCANE_BOLT, 2s, 4500ms); +                    break; +                default: +                    break; +            }          } +    } + +private: +    EventMap _events;  };  enum EtherealApprentice @@ -271,61 +249,50 @@ enum EtherealApprentice      EVENT_ETHEREAL_APPRENTICE_FROSTBOLT  }; -class npc_ethereal_apprentice : public CreatureScript +struct npc_ethereal_apprentice : public ScriptedAI  { -    public: -        npc_ethereal_apprentice() : CreatureScript("npc_ethereal_apprentice") { } +    npc_ethereal_apprentice(Creature* creature) : ScriptedAI(creature) { } -        struct npc_ethereal_apprenticeAI : public ScriptedAI -        { -            npc_ethereal_apprenticeAI(Creature* creature) : ScriptedAI(creature) { } +    void Reset() override +    { +        _events.Reset(); +    } -            void Reset() override -            { -                _events.Reset(); -            } +    void JustEngagedWith(Unit* /*who*/) override +    { +        _events.ScheduleEvent(EVENT_ETHEREAL_APPRENTICE_FIREBOLT, 3s); +    } -            void JustEngagedWith(Unit* /*who*/) override -            { -                _events.ScheduleEvent(EVENT_ETHEREAL_APPRENTICE_FIREBOLT, 3s); -            } +    void UpdateAI(uint32 diff) override +    { +        if (!UpdateVictim()) +            return; -            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) -                    { -                        case EVENT_ETHEREAL_APPRENTICE_FIREBOLT: -                            DoCastVictim(SPELL_ETHEREAL_APPRENTICE_FIREBOLT, true); -                            _events.ScheduleEvent(EVENT_ETHEREAL_APPRENTICE_FROSTBOLT, 3s); -                            break; -                        case EVENT_ETHEREAL_APPRENTICE_FROSTBOLT: -                            DoCastVictim(SPELL_ETHEREAL_APPRENTICE_FROSTBOLT, true); -                            _events.ScheduleEvent(EVENT_ETHEREAL_APPRENTICE_FIREBOLT, 3s); -                            break; -                        default: -                            break; -                    } -                } -            } +        _events.Update(diff); -        private: -            EventMap _events; -        }; +        if (me->HasUnitState(UNIT_STATE_CASTING)) +            return; -        CreatureAI* GetAI(Creature* creature) const override +        while (uint32 eventId = _events.ExecuteEvent())          { -            return GetManaTombsAI<npc_ethereal_apprenticeAI>(creature); +            switch (eventId) +            { +                case EVENT_ETHEREAL_APPRENTICE_FIREBOLT: +                    DoCastVictim(SPELL_ETHEREAL_APPRENTICE_FIREBOLT, true); +                    _events.ScheduleEvent(EVENT_ETHEREAL_APPRENTICE_FROSTBOLT, 3s); +                    break; +                case EVENT_ETHEREAL_APPRENTICE_FROSTBOLT: +                    DoCastVictim(SPELL_ETHEREAL_APPRENTICE_FROSTBOLT, true); +                    _events.ScheduleEvent(EVENT_ETHEREAL_APPRENTICE_FIREBOLT, 3s); +                    break; +                default: +                    break; +            }          } +    } + +private: +    EventMap _events;  };  enum Yor @@ -334,60 +301,49 @@ enum Yor      EVENT_DOUBLE_BREATH          = 1  }; -class npc_yor : public CreatureScript +struct npc_yor : public ScriptedAI  { -public: -    npc_yor() : CreatureScript("npc_yor") { } +    npc_yor(Creature* creature) : ScriptedAI(creature) { } -    struct npc_yorAI : public ScriptedAI +    void Reset() override { } + +    void JustEngagedWith(Unit* /*who*/) override      { -        npc_yorAI(Creature* creature) : ScriptedAI(creature) { } +        _events.ScheduleEvent(EVENT_DOUBLE_BREATH, 6s, 9s); +    } -        void Reset() override { } +    void UpdateAI(uint32 diff) override +    { +        if (!UpdateVictim()) +            return; -        void JustEngagedWith(Unit* /*who*/) override -        { -            _events.ScheduleEvent(EVENT_DOUBLE_BREATH, 6s, 9s); -        } +        _events.Update(diff); -        void UpdateAI(uint32 diff) override +        while (uint32 eventId = _events.ExecuteEvent())          { -            if (!UpdateVictim()) -                return; - -            _events.Update(diff); - -            while (uint32 eventId = _events.ExecuteEvent()) +            switch (eventId)              { -                switch (eventId) -                { -                    case EVENT_DOUBLE_BREATH: -                        if (me->IsWithinDist(me->GetVictim(), ATTACK_DISTANCE)) -                            DoCastVictim(SPELL_DOUBLE_BREATH); -                        _events.ScheduleEvent(EVENT_DOUBLE_BREATH, 6s, 9s); -                        break; -                    default: -                        break; -                } +                case EVENT_DOUBLE_BREATH: +                    if (me->IsWithinDist(me->GetVictim(), ATTACK_DISTANCE)) +                        DoCastVictim(SPELL_DOUBLE_BREATH); +                    _events.ScheduleEvent(EVENT_DOUBLE_BREATH, 6s, 9s); +                    break; +                default: +                    break;              } - -            DoMeleeAttackIfReady();          } -        private: -            EventMap _events; -    }; - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return GetManaTombsAI<npc_yorAI>(creature); +        DoMeleeAttackIfReady();      } + +    private: +        EventMap _events;  };  void AddSC_boss_nexusprince_shaffar()  { -    new boss_nexusprince_shaffar(); -    new npc_ethereal_beacon(); -    new npc_ethereal_apprentice(); -    new npc_yor(); +    RegisterManaTombsCreatureAI(boss_nexusprince_shaffar); +    RegisterManaTombsCreatureAI(npc_ethereal_beacon); +    RegisterManaTombsCreatureAI(npc_ethereal_apprentice); +    RegisterManaTombsCreatureAI(npc_yor);  } diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp index a6a3645ccc7..b6d9b3f8d8b 100644 --- a/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp +++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/boss_pandemonius.cpp @@ -41,87 +41,76 @@ enum Events  uint32 constexpr DARK_SHELL_EVENT_GROUP = 1; -class boss_pandemonius : public CreatureScript +struct boss_pandemonius : public BossAI  { -public: -    boss_pandemonius() : CreatureScript("boss_pandemonius") { } - -    struct boss_pandemoniusAI : public BossAI +    boss_pandemonius(Creature* creature) : BossAI(creature, DATA_PANDEMONIUS)      { -        boss_pandemoniusAI(Creature* creature) : BossAI(creature, DATA_PANDEMONIUS) -        { -            VoidBlastCounter = 0; -        } +        VoidBlastCounter = 0; +    } -        void Reset() override -        { -            _Reset(); -            VoidBlastCounter = 0; -        } +    void Reset() override +    { +        _Reset(); +        VoidBlastCounter = 0; +    } -        void JustDied(Unit* /*killer*/) override -        { -            Talk(SAY_DEATH); -        } +    void JustDied(Unit* /*killer*/) override +    { +        Talk(SAY_DEATH); +    } -        void KilledUnit(Unit* /*victim*/) override -        { -            Talk(SAY_KILL); -        } +    void KilledUnit(Unit* /*victim*/) override +    { +        Talk(SAY_KILL); +    } -        void JustEngagedWith(Unit* who) override -        { -            BossAI::JustEngagedWith(who); -            Talk(SAY_AGGRO); -            events.ScheduleEvent(EVENT_DARK_SHELL, 20s, DARK_SHELL_EVENT_GROUP); -            events.ScheduleEvent(EVENT_VOID_BLAST, 8s, 23s); -        } +    void JustEngagedWith(Unit* who) override +    { +        BossAI::JustEngagedWith(who); +        Talk(SAY_AGGRO); +        events.ScheduleEvent(EVENT_DARK_SHELL, 20s, DARK_SHELL_EVENT_GROUP); +        events.ScheduleEvent(EVENT_VOID_BLAST, 8s, 23s); +    } -        void ExecuteEvent(uint32 eventId) override +    void ExecuteEvent(uint32 eventId) override +    { +        switch (eventId)          { -            switch (eventId) -            { -                case EVENT_VOID_BLAST: -                    if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) -                    { -                        DoCast(target, SPELL_VOID_BLAST); -                        ++VoidBlastCounter; -                    } - -                    if (VoidBlastCounter == 5) -                    { -                        VoidBlastCounter = 0; -                        events.ScheduleEvent(EVENT_VOID_BLAST, 15s, 25s); -                    } -                    else -                    { -                        events.ScheduleEvent(EVENT_VOID_BLAST, 500ms); -                        events.DelayEvents(500ms, DARK_SHELL_EVENT_GROUP); -                    } -                    break; -                case EVENT_DARK_SHELL: -                    if (me->IsNonMeleeSpellCast(false)) -                        me->InterruptNonMeleeSpells(true); -                    Talk(EMOTE_DARK_SHELL); -                    DoCast(me, SPELL_DARK_SHELL); -                    events.ScheduleEvent(EVENT_DARK_SHELL, 20s, DARK_SHELL_EVENT_GROUP); -                    break; -                default: -                    break; -            } +            case EVENT_VOID_BLAST: +                if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) +                { +                    DoCast(target, SPELL_VOID_BLAST); +                    ++VoidBlastCounter; +                } + +                if (VoidBlastCounter == 5) +                { +                    VoidBlastCounter = 0; +                    events.ScheduleEvent(EVENT_VOID_BLAST, 15s, 25s); +                } +                else +                { +                    events.ScheduleEvent(EVENT_VOID_BLAST, 500ms); +                    events.DelayEvents(500ms, DARK_SHELL_EVENT_GROUP); +                } +                break; +            case EVENT_DARK_SHELL: +                if (me->IsNonMeleeSpellCast(false)) +                    me->InterruptNonMeleeSpells(true); +                Talk(EMOTE_DARK_SHELL); +                DoCast(me, SPELL_DARK_SHELL); +                events.ScheduleEvent(EVENT_DARK_SHELL, 20s, DARK_SHELL_EVENT_GROUP); +                break; +            default: +                break;          } - -        private: -            uint32 VoidBlastCounter; -    }; - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return GetManaTombsAI<boss_pandemoniusAI>(creature);      } + +    private: +        uint32 VoidBlastCounter;  };  void AddSC_boss_pandemonius()  { -    new boss_pandemonius(); +    RegisterManaTombsCreatureAI(boss_pandemonius);  } diff --git a/src/server/scripts/Outland/Auchindoun/ManaTombs/mana_tombs.h b/src/server/scripts/Outland/Auchindoun/ManaTombs/mana_tombs.h index 2b6844017f0..6c982df370b 100644 --- a/src/server/scripts/Outland/Auchindoun/ManaTombs/mana_tombs.h +++ b/src/server/scripts/Outland/Auchindoun/ManaTombs/mana_tombs.h @@ -40,4 +40,6 @@ inline AI* GetManaTombsAI(T* obj)      return GetInstanceAI<AI>(obj, MTScriptName);  } +#define RegisterManaTombsCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetManaTombsAI) +  #endif // MANA_TOMBS_H_ | 
