diff options
| author | MitchesD <majklprofik@seznam.cz> | 2014-12-28 22:02:05 +0100 | 
|---|---|---|
| committer | MitchesD <majklprofik@seznam.cz> | 2014-12-28 22:02:05 +0100 | 
| commit | d3e2918c57786800b8cbc63287f43f37111a6317 (patch) | |
| tree | 95fce3e6a63d41ce87b3899c107279a4dde07ddd /src/server/scripts | |
| parent | cd0ad4739c28c926e548b9b8d73d7319a7bbf3fb (diff) | |
Scripts/Nexus: Keristrasza converted to BossAI and EventMap
Diffstat (limited to 'src/server/scripts')
| -rw-r--r-- | src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp | 272 | 
1 files changed, 140 insertions, 132 deletions
| diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp index a8ffb1d542e..a5feb4fac16 100644 --- a/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp +++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_keristrasza.cpp @@ -1,6 +1,5 @@  /*   * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>   *   * This program is free software; you can redistribute it and/or modify it   * under the terms of the GNU General Public License as published by the @@ -20,8 +19,8 @@  #include "ScriptedCreature.h"  #include "SpellScript.h"  #include "SpellAuraEffects.h" -#include "nexus.h"  #include "Player.h" +#include "nexus.h"  enum Spells  { @@ -31,15 +30,21 @@ enum Spells      SPELL_CRYSTAL_CHAINS                          = 50997,      SPELL_ENRAGE                                  = 8599,      SPELL_CRYSTALFIRE_BREATH                      = 48096, -    H_SPELL_CRYSTALFIRE_BREATH                    = 57091,      SPELL_CRYSTALIZE                              = 48179,      SPELL_INTENSE_COLD                            = 48094,      SPELL_INTENSE_COLD_TRIGGERED                  = 48095  }; +enum Events +{ +    EVENT_CRYSTAL_FIRE_BREATH                     = 1, +    EVENT_CRYSTAL_CHAINS_CRYSTALIZE, +    EVENT_TAIL_SWEEP +}; +  enum Yells  { -    //Yell +    // Yell      SAY_AGGRO                                     = 0,      SAY_SLAY                                      = 1,      SAY_ENRAGE                                    = 2, @@ -51,163 +56,166 @@ enum Yells  enum Misc  {      DATA_INTENSE_COLD                             = 1, -    DATA_CONTAINMENT_SPHERES                      = 3, +    DATA_CONTAINMENT_SPHERES                      = 3  };  class boss_keristrasza : public CreatureScript  { -public: -    boss_keristrasza() : CreatureScript("boss_keristrasza") { } - -    CreatureAI* GetAI(Creature* creature) const override -    { -        return GetInstanceAI<boss_keristraszaAI>(creature); -    } - -    struct boss_keristraszaAI : public ScriptedAI -    { -        boss_keristraszaAI(Creature* creature) : ScriptedAI(creature) -        { -            Initialize(); -            instance = creature->GetInstanceScript(); -        } +    public: +        boss_keristrasza() : CreatureScript("boss_keristrasza") { } -        void Initialize() +        struct boss_keristraszaAI : public BossAI          { -            uiCrystalfireBreathTimer = 14 * IN_MILLISECONDS; -            uiCrystalChainsCrystalizeTimer = DUNGEON_MODE(30 * IN_MILLISECONDS, 11 * IN_MILLISECONDS); -            uiTailSweepTimer = 5 * IN_MILLISECONDS; -            bEnrage = false; - -            intenseCold = true; -        } - -        InstanceScript* instance; - -        GuidList intenseColdList; -        ObjectGuid auiContainmentSphereGUIDs[DATA_CONTAINMENT_SPHERES]; -        uint32 uiCrystalfireBreathTimer; -        uint32 uiCrystalChainsCrystalizeTimer; -        uint32 uiTailSweepTimer; -        bool intenseCold; -        bool bEnrage; +            boss_keristraszaAI(Creature* creature) : BossAI(creature, DATA_KERISTRASZA) +            { +                Initialize(); +            } -        void Reset() override -        { -            Initialize(); -            intenseColdList.clear(); +            void Initialize() +            { +                _enrage = false; +                _intenseCold = true; +            } -            me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); +            void Reset() override +            { +                Initialize(); +                _intenseColdList.clear(); -            RemovePrison(CheckContainmentSpheres()); +                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); -            instance->SetBossState(DATA_KERISTRASZA, NOT_STARTED); -        } +                RemovePrison(CheckContainmentSpheres()); +                _Reset(); +            } -        void EnterCombat(Unit* /*who*/) override -        { -            Talk(SAY_AGGRO); -            DoCastAOE(SPELL_INTENSE_COLD); +            void EnterCombat(Unit* /*who*/) override +            { +                Talk(SAY_AGGRO); +                DoCastAOE(SPELL_INTENSE_COLD); +                _EnterCombat(); -            instance->SetBossState(DATA_KERISTRASZA, IN_PROGRESS); -        } +                events.ScheduleEvent(EVENT_CRYSTAL_FIRE_BREATH, 14000); +                events.ScheduleEvent(EVENT_CRYSTAL_CHAINS_CRYSTALIZE, DUNGEON_MODE(30000, 11000)); +                events.ScheduleEvent(EVENT_TAIL_SWEEP, 5000); +            } -        void JustDied(Unit* /*killer*/) override -        { -            Talk(SAY_DEATH); +            void JustDied(Unit* /*killer*/) override +            { +                Talk(SAY_DEATH); +                _JustDied(); +            } -            instance->SetBossState(DATA_KERISTRASZA, DONE); -        } +            void KilledUnit(Unit* who) override +            { +                if (who->GetTypeId() == TYPEID_PLAYER) +                    Talk(SAY_SLAY); +            } -        void KilledUnit(Unit* who) override -        { -            if (who->GetTypeId() == TYPEID_PLAYER) -                Talk(SAY_SLAY); -        } +            bool CheckContainmentSpheres(bool remove_prison = false) +            { +                ContainmentSphereGUIDs[0] = instance->GetGuidData(ANOMALUS_CONTAINMET_SPHERE); +                ContainmentSphereGUIDs[1] = instance->GetGuidData(ORMOROKS_CONTAINMET_SPHERE); +                ContainmentSphereGUIDs[2] = instance->GetGuidData(TELESTRAS_CONTAINMET_SPHERE); -        bool CheckContainmentSpheres(bool remove_prison = false) -        { -            auiContainmentSphereGUIDs[0] = instance->GetGuidData(ANOMALUS_CONTAINMET_SPHERE); -            auiContainmentSphereGUIDs[1] = instance->GetGuidData(ORMOROKS_CONTAINMET_SPHERE); -            auiContainmentSphereGUIDs[2] = instance->GetGuidData(TELESTRAS_CONTAINMET_SPHERE); +                GameObject* ContainmentSpheres[DATA_CONTAINMENT_SPHERES]; -            GameObject* ContainmentSpheres[DATA_CONTAINMENT_SPHERES]; +                for (uint8 i = 0; i < DATA_CONTAINMENT_SPHERES; ++i) +                { +                    ContainmentSpheres[i] = ObjectAccessor::GetGameObject(*me, ContainmentSphereGUIDs[i]); +                    if (!ContainmentSpheres[i]) +                        return false; +                    if (ContainmentSpheres[i]->GetGoState() != GO_STATE_ACTIVE) +                        return false; +                } +                if (remove_prison) +                    RemovePrison(true); +                return true; +            } -            for (uint8 i = 0; i < DATA_CONTAINMENT_SPHERES; ++i) +            void RemovePrison(bool remove)              { -                ContainmentSpheres[i] = instance->instance->GetGameObject(auiContainmentSphereGUIDs[i]); -                if (!ContainmentSpheres[i]) -                    return false; -                if (ContainmentSpheres[i]->GetGoState() != GO_STATE_ACTIVE) -                    return false; +                if (remove) +                { +                    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); +                    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); +                    if (me->HasAura(SPELL_FROZEN_PRISON)) +                        me->RemoveAurasDueToSpell(SPELL_FROZEN_PRISON); +                } +                else +                { +                    me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); +                    me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); +                    DoCast(me, SPELL_FROZEN_PRISON, false); +                }              } -            if (remove_prison) -                RemovePrison(true); -            return true; -        } -        void RemovePrison(bool remove) -        { -            if (remove) +            void SetGUID(ObjectGuid guid, int32 id/* = 0 */) override              { -                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); -                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); -                if (me->HasAura(SPELL_FROZEN_PRISON)) -                    me->RemoveAurasDueToSpell(SPELL_FROZEN_PRISON); +                if (id == DATA_INTENSE_COLD) +                    _intenseColdList.push_back(guid);              } -            else + +            void DamageTaken(Unit* /*attacker*/, uint32& damage) override              { -                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); -                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); -                DoCast(me, SPELL_FROZEN_PRISON, false); +                if (!_enrage && me->HealthBelowPctDamaged(25, damage)) +                { +                    Talk(SAY_ENRAGE); +                    Talk(SAY_FRENZY); +                    DoCast(me, SPELL_ENRAGE); +                    _enrage = true; +                }              } -        } -        void SetGUID(ObjectGuid guid, int32 id/* = 0 */) override -        { -            if (id == DATA_INTENSE_COLD) -                intenseColdList.push_back(guid); -        } +            void UpdateAI(uint32 diff) override +            { +                if (!UpdateVictim()) +                    return; -        void UpdateAI(uint32 diff) override -        { -            if (!UpdateVictim()) -                return; +                events.Update(diff); -            if (!bEnrage && HealthBelowPct(25)) -            { -                Talk(SAY_ENRAGE); -                Talk(SAY_FRENZY); -                DoCast(me, SPELL_ENRAGE); -                bEnrage = true; -            } +                if (me->HasUnitState(UNIT_STATE_CASTING)) +                    return; -            if (uiCrystalfireBreathTimer <= diff) -            { -                DoCastVictim(SPELL_CRYSTALFIRE_BREATH); -                uiCrystalfireBreathTimer = 14*IN_MILLISECONDS; -            } else uiCrystalfireBreathTimer -= diff; +                while (uint32 eventId = events.ExecuteEvent()) +                { +                    switch (eventId) +                    { +                        case EVENT_CRYSTAL_FIRE_BREATH: +                            DoCastVictim(SPELL_CRYSTALFIRE_BREATH); +                            events.ScheduleEvent(EVENT_CRYSTAL_FIRE_BREATH, 14000); +                            break; +                        case EVENT_CRYSTAL_CHAINS_CRYSTALIZE: +                            DoCast(me, SPELL_TAIL_SWEEP); +                            events.ScheduleEvent(EVENT_CRYSTAL_CHAINS_CRYSTALIZE, 5000); +                            break; +                        case EVENT_TAIL_SWEEP: +                            Talk(SAY_CRYSTAL_NOVA); +                            if (IsHeroic()) +                                DoCast(me, SPELL_CRYSTALIZE); +                            else if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true)) +                                DoCast(target, SPELL_CRYSTAL_CHAINS); +                            events.ScheduleEvent(EVENT_TAIL_SWEEP, DUNGEON_MODE(30000, 11000)); +                            break; +                        default: +                            break; +                    } +                } + +                DoMeleeAttackIfReady(); +            } -            if (uiTailSweepTimer <= diff) -            { -                DoCast(me, SPELL_TAIL_SWEEP); -                uiTailSweepTimer = 5*IN_MILLISECONDS; -            } else uiTailSweepTimer -= diff; +        private: +            bool _intenseCold; +            bool _enrage; +            ObjectGuid ContainmentSphereGUIDs[DATA_CONTAINMENT_SPHERES]; +        public: +            GuidList _intenseColdList; +        }; -            if (uiCrystalChainsCrystalizeTimer <= diff) -            { -                Talk(SAY_CRYSTAL_NOVA); -                if (IsHeroic()) -                    DoCast(me, SPELL_CRYSTALIZE); -                else if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) -                    DoCast(target, SPELL_CRYSTAL_CHAINS); -                uiCrystalChainsCrystalizeTimer = DUNGEON_MODE(30*IN_MILLISECONDS, 11*IN_MILLISECONDS); -            } else uiCrystalChainsCrystalizeTimer -= diff; - -            DoMeleeAttackIfReady(); +        CreatureAI* GetAI(Creature* creature) const override +        { +            return GetInstanceAI<boss_keristraszaAI>(creature);          } -    }; -  };  class containment_sphere : public GameObjectScript @@ -277,9 +285,9 @@ class achievement_intense_cold : public AchievementCriteriaScript              if (!target)                  return false; -            GuidList intenseColdList = ENSURE_AI(boss_keristrasza::boss_keristraszaAI, target->ToCreature()->AI())->intenseColdList; -            if (!intenseColdList.empty()) -                for (GuidList::iterator itr = intenseColdList.begin(); itr != intenseColdList.end(); ++itr) +            GuidList _intenseColdList = ENSURE_AI(boss_keristrasza::boss_keristraszaAI, target->ToCreature()->AI())->_intenseColdList; +            if (!_intenseColdList.empty()) +                for (GuidList::iterator itr = _intenseColdList.begin(); itr != _intenseColdList.end(); ++itr)                      if (player->GetGUID() == *itr)                          return false; | 
