diff options
Diffstat (limited to 'src/server/scripts/Outland/TempestKeep')
6 files changed, 142 insertions, 90 deletions
diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp index 00cce1ecebc..22aff78f441 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp @@ -52,7 +52,7 @@ enum Events  class boss_gatewatcher_gyrokill : public CreatureScript  { -    public: boss_gatewatcher_gyrokill() : CreatureScript("boss_gatewatcher_gyrokill") { } +    public: boss_gatewatcher_gyrokill() : CreatureScript("boss_gatewatcher_gyrokill") {}          struct boss_gatewatcher_gyrokillAI : public BossAI          { @@ -62,6 +62,8 @@ class boss_gatewatcher_gyrokill : public CreatureScript              {                  _JustDied();                  Talk(SAY_DEATH); +                if (GameObject* door = me->GetMap()->GetGameObject(instance->GetData64(GO_DOOR_MOARG_2))) +                    door->SetGoState(GO_STATE_ACTIVE);              }              void EnterCombat(Unit* /*who*/) diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp index 09ff6cf8e49..c613b3a67bb 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp @@ -25,8 +25,9 @@ EndScriptData */  #include "ScriptMgr.h"  #include "ScriptedCreature.h" +#include "mechanar.h" -enum eSays +enum Says  {      SAY_AGGRO                      = 0,      SAY_HAMMER                     = 1, @@ -35,106 +36,91 @@ enum eSays      EMOTE_HAMMER                   = 4  }; -enum eSpells +enum Spells  { -    // Spells to be casted      SPELL_SHADOW_POWER             = 35322,      H_SPELL_SHADOW_POWER           = 39193,      SPELL_HAMMER_PUNCH             = 35326,      SPELL_JACKHAMMER               = 35327,      H_SPELL_JACKHAMMER             = 39194, -    SPELL_STREAM_OF_MACHINE_FLUID  = 35311, +    SPELL_STREAM_OF_MACHINE_FLUID  = 35311 +}; + +enum Events +{ +    EVENT_STREAM_OF_MACHINE_FLUID   = 0, +    EVENT_JACKHAMMER                = 1, +    EVENT_SHADOW_POWER              = 2  };  class boss_gatewatcher_iron_hand : public CreatureScript  { -    public: +    public: boss_gatewatcher_iron_hand(): CreatureScript("boss_gatewatcher_iron_hand") {} -        boss_gatewatcher_iron_hand() -            : CreatureScript("boss_gatewatcher_iron_hand") +        struct boss_gatewatcher_iron_handAI : public BossAI          { -        } -            // Gatewatcher Iron-Hand AI -            struct boss_gatewatcher_iron_handAI : public ScriptedAI -            { -                boss_gatewatcher_iron_handAI(Creature* creature) : ScriptedAI(creature) -                { -                } - -                uint32 Shadow_Power_Timer; -                uint32 Jackhammer_Timer; -                uint32 Stream_of_Machine_Fluid_Timer; - -                void Reset() -                { -                    Shadow_Power_Timer = 25000; -                    Jackhammer_Timer = 45000; -                    Stream_of_Machine_Fluid_Timer = 55000; +            boss_gatewatcher_iron_handAI(Creature* creature) : BossAI(creature, DATA_GATEWATCHER_IRON_HAND) {} -                } -                void EnterCombat(Unit* /*who*/) -                { -                    Talk(SAY_AGGRO); -                } - -                void KilledUnit(Unit* /*victim*/) -                { -                    if (rand()%2) -                        return; +            void EnterCombat(Unit* /*who*/) +            { +                _EnterCombat(); +                events.ScheduleEvent(EVENT_STREAM_OF_MACHINE_FLUID, 55000); +                events.ScheduleEvent(EVENT_JACKHAMMER, 45000); +                events.ScheduleEvent(EVENT_SHADOW_POWER, 25000); +                Talk(SAY_AGGRO); +            } +            void KilledUnit(Unit* /*victim*/) +            { +                if (roll_chance_i(50))                      Talk(SAY_SLAY); -                } - -                void JustDied(Unit* /*killer*/) -                { -                    Talk(SAY_DEATH); -                    //TODO: Add door check/open code -                } - -                void UpdateAI(const uint32 diff) -                { -                    //Return since we have no target -                    if (!UpdateVictim()) -                        return; - -                    //Shadow Power -                    if (Shadow_Power_Timer <= diff) -                    { -                        DoCast(me, SPELL_SHADOW_POWER); -                        Shadow_Power_Timer = urand(20000, 28000); -                    } -                    else -                        Shadow_Power_Timer -= diff; +            } -                    //Jack Hammer -                    if (Jackhammer_Timer <= diff) -                    { -                        //TODO: expect cast this about 5 times in a row (?), announce it by emote only once -                        Talk(EMOTE_HAMMER); -                        DoCast(me->getVictim(), SPELL_JACKHAMMER); +            void JustDied(Unit* /*killer*/) +            { +                _JustDied(); +                Talk(SAY_DEATH); +                if (GameObject* door = me->GetMap()->GetGameObject(instance->GetData64(GO_DOOR_MOARG_1))) +                    door->SetGoState(GO_STATE_ACTIVE); +            } -                        //chance to yell, but not same time as emote (after spell in fact casted) -                        if (rand()%2) -                            return; +            void UpdateAI(uint32 const diff) +            { +                if (!UpdateVictim()) +                    return; -                        Talk(SAY_HAMMER); -                        Jackhammer_Timer = 30000; -                    } -                    else -                        Jackhammer_Timer -= diff; +                events.Update(diff); -                    //Stream of Machine Fluid -                    if (Stream_of_Machine_Fluid_Timer <= diff) +                if (me->HasUnitState(UNIT_STATE_CASTING)) +                    return; +                 while (uint32 eventId = events.ExecuteEvent()) +                { +                    switch (eventId)                      { -                        DoCast(me->getVictim(), SPELL_STREAM_OF_MACHINE_FLUID); -                        Stream_of_Machine_Fluid_Timer = urand(35000, 50000); +                        case EVENT_STREAM_OF_MACHINE_FLUID: +                            DoCastVictim(SPELL_STREAM_OF_MACHINE_FLUID, true); +                            events.ScheduleEvent(EVENT_STREAM_OF_MACHINE_FLUID, urand(35000, 50000)); +                            break; +                        case EVENT_JACKHAMMER: +                            Talk(EMOTE_HAMMER); +                            //TODO: expect cast this about 5 times in a row (?), announce it by emote only once +                            DoCastVictim(SPELL_JACKHAMMER, true); +                            if (roll_chance_i(50)) +                                Talk(SAY_HAMMER); +                            events.ScheduleEvent(EVENT_JACKHAMMER, 30000); +                            break; +                        case EVENT_SHADOW_POWER: +                            DoCast(me, SPELL_SHADOW_POWER); +                            events.ScheduleEvent(EVENT_SHADOW_POWER, urand(20000, 28000)); +                            break; +                        default: +                            break;                      } -                    else -                        Stream_of_Machine_Fluid_Timer -= diff; - -                    DoMeleeAttackIfReady();                  } -            }; + +                DoMeleeAttackIfReady(); +            } +        };              CreatureAI* GetAI(Creature* creature) const              { diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp index f8c44471b30..e71be639999 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp @@ -29,13 +29,12 @@ enum Spells      SPELL_POSITIVE_CHARGE           = 39090,      SPELL_NEGATIVE_POLARITY         = 39091,      SPELL_NEGATIVE_CHARGE_STACK     = 39092, -    SPELL_NEGATIVE_CHARGE           = 39093, +    SPELL_NEGATIVE_CHARGE           = 39093  };  class spell_capacitus_polarity_charge : public SpellScriptLoader  { -    public: -        spell_capacitus_polarity_charge() : SpellScriptLoader("spell_capacitus_polarity_charge") { } +    public: spell_capacitus_polarity_charge() : SpellScriptLoader("spell_capacitus_polarity_charge") { }          class spell_capacitus_polarity_charge_SpellScript : public SpellScript          { diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp index 0b2370e1b17..fcf32e5c341 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp @@ -89,6 +89,8 @@ class boss_nethermancer_sepethrea : public CreatureScript              {                  _JustDied();                  Talk(SAY_DEATH); +                if (GameObject* door = me->GetMap()->GetGameObject(instance->GetData64(GO_DOOR_NETHERMANCER))) +                    door->SetGoState(GO_STATE_ACTIVE);              }              void UpdateAI(uint32 const diff) diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp index 250959a1468..66424fb9e10 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp @@ -31,11 +31,67 @@ class instance_mechanar : public InstanceMapScript  {      public: instance_mechanar(): InstanceMapScript("instance_mechanar", 554) { } +        InstanceScript* GetInstanceScript(InstanceMap* map) const +        { +            return new instance_mechanar_InstanceMapScript(map); +        } +          struct instance_mechanar_InstanceMapScript : public InstanceScript          {              instance_mechanar_InstanceMapScript(Map* map) : InstanceScript(map)              {                  SetBossNumber(EncounterCount); +                DoorMoArg1GUID          = 0; +                DoorMoArg2GUID          = 0; +                DoorNethermancerGUID    = 0; +            } + +            void OnGameObjectCreate(GameObject* go) +            { +                switch (go->GetEntry()) +                { +                    case GO_DOOR_MOARG_1: +                        DoorMoArg1GUID = go->GetGUID(); +                        break; +                    case GO_DOOR_MOARG_2: +                        DoorMoArg2GUID = go->GetGUID(); +                        break; +                    case GO_DOOR_NETHERMANCER: +                        DoorNethermancerGUID = go->GetGUID(); +                        break; +                    default: +                        break; +                } +                CheckInstanceStatus(); +            } + +            void CheckInstanceStatus() +            { +                if (GetBossState(DATA_GATEWATCHER_IRON_HAND) == DONE) +                    HandleGameObject(DoorMoArg1GUID, true); + +                if (GetBossState(DATA_GATEWATCHER_GYROKILL) == DONE) +                    HandleGameObject(DoorMoArg2GUID, true); + +                if (GetBossState(DATA_NETHERMANCER_SEPRETHREA) == DONE) +                    HandleGameObject(DoorNethermancerGUID, true); +            } + +            uint64 GetData64(uint32 type) const +            { +                switch (type) +                { +                    case GO_DOOR_MOARG_1: +                        return DoorMoArg1GUID; +                    case GO_DOOR_MOARG_2: +                        return DoorMoArg2GUID; +                    case GO_DOOR_NETHERMANCER: +                        return DoorNethermancerGUID; +                    default: +                        break; +                } + +                return 0;              }              bool SetBossState(uint32 type, EncounterState state) @@ -46,7 +102,7 @@ class instance_mechanar : public InstanceMapScript                  switch (type)                  {                      case DATA_GATEWATCHER_GYROKILL: -                    case DATA_IRON_HAND: +                    case DATA_GATEWATCHER_IRON_HAND:                      case DATA_MECHANOLORD_CAPACITUS:                      case DATA_NETHERMANCER_SEPRETHREA:                      case DATA_PATHALEON_THE_CALCULATOR: @@ -100,12 +156,12 @@ class instance_mechanar : public InstanceMapScript                  OUT_LOAD_INST_DATA_COMPLETE;              } -        }; -        InstanceScript* GetInstanceScript(InstanceMap* map) const -        { -            return new instance_mechanar_InstanceMapScript(map); -        } +        protected: +            uint64 DoorMoArg1GUID; +            uint64 DoorMoArg2GUID; +            uint64 DoorNethermancerGUID; +        };  };  void AddSC_instance_mechanar() diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/mechanar.h b/src/server/scripts/Outland/TempestKeep/Mechanar/mechanar.h index b1c7cf8e25c..0d3a4ea241d 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/mechanar.h +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/mechanar.h @@ -23,10 +23,17 @@ uint32 const EncounterCount             = 5;  enum DataTypes  {      DATA_GATEWATCHER_GYROKILL           = 0, -    DATA_IRON_HAND                      = 1, +    DATA_GATEWATCHER_IRON_HAND          = 1,      DATA_MECHANOLORD_CAPACITUS          = 2,      DATA_NETHERMANCER_SEPRETHREA        = 3,      DATA_PATHALEON_THE_CALCULATOR       = 4  }; +enum GameobjectIds +{ +    GO_DOOR_MOARG_1                     = 184632, +    GO_DOOR_MOARG_2                     = 184322, +    GO_DOOR_NETHERMANCER                = 184449 +}; +  #endif  | 
