aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp5
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp16
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp131
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp2
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp3
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp71
6 files changed, 164 insertions, 64 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 22aff78f441..dc9940c87b8 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,8 @@ 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,8 +63,6 @@ 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 c613b3a67bb..440e17a29cf 100644
--- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp
@@ -55,7 +55,8 @@ enum Events
class boss_gatewatcher_iron_hand : public CreatureScript
{
- public: boss_gatewatcher_iron_hand(): CreatureScript("boss_gatewatcher_iron_hand") {}
+ public:
+ boss_gatewatcher_iron_hand(): CreatureScript("boss_gatewatcher_iron_hand") {}
struct boss_gatewatcher_iron_handAI : public BossAI
{
@@ -80,8 +81,6 @@ class boss_gatewatcher_iron_hand : public CreatureScript
{
_JustDied();
Talk(SAY_DEATH);
- if (GameObject* door = me->GetMap()->GetGameObject(instance->GetData64(GO_DOOR_MOARG_1)))
- door->SetGoState(GO_STATE_ACTIVE);
}
void UpdateAI(uint32 const diff)
@@ -93,7 +92,8 @@ class boss_gatewatcher_iron_hand : public CreatureScript
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
- while (uint32 eventId = events.ExecuteEvent())
+
+ while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
@@ -122,10 +122,10 @@ class boss_gatewatcher_iron_hand : public CreatureScript
}
};
- CreatureAI* GetAI(Creature* creature) const
- {
- return new boss_gatewatcher_iron_handAI(creature);
- }
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new boss_gatewatcher_iron_handAI(creature);
+ }
};
void AddSC_boss_gatewatcher_iron_hand()
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 e71be639999..1a43798ccef 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
@@ -15,26 +15,150 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-//! TODO - Boss not scripted, just ported required spellscript from core
-
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellScript.h"
+#include "mechanar.h"
#include "Player.h"
enum Spells
{
+ SPELL_HEADCRACK = 35161,
+ SPELL_REFLECTIVE_MAGIC_SHIELD = 35158,
+ SPELL_REFLECTIVE_DAMAGE_SHIELD = 35159,
+ SPELL_POLARITY_SHIFT = 39096,
+ SPELL_BERSERK = 26662,
+ SPELL_NETHER_CHARGE_TIMER = 37670,
+ SPELL_NETHER_CHARGE_PASSIVE = 37670,
+
SPELL_POSITIVE_POLARITY = 39088,
SPELL_POSITIVE_CHARGE_STACK = 39089,
SPELL_POSITIVE_CHARGE = 39090,
+
SPELL_NEGATIVE_POLARITY = 39091,
SPELL_NEGATIVE_CHARGE_STACK = 39092,
SPELL_NEGATIVE_CHARGE = 39093
};
+enum Yells
+{
+ YELL_AGGRO = 0,
+ YELL_REFLECTIVE_MAGIC_SHIELD = 1,
+ YELL_REFLECTIVE_DAMAGE_SHIELD = 2,
+ YELL_KILL = 3,
+ YELL_DEATH = 4
+};
+
+enum Creatures
+{
+ NPC_NETHER_CHARGE = 20405
+};
+
+enum Events
+{
+ EVENT_NONE = 0,
+
+ EVENT_HEADCRACK = 1,
+ EVENT_REFLECTIVE_DAMAGE_SHIELD = 2,
+ EVENT_REFLECTIVE_MAGIE_SHIELD = 3,
+ EVENT_POSITIVE_SHIFT = 4,
+ EVENT_SUMMON_NETHER_CHARGE = 5,
+ EVENT_BERSERK = 6
+};
+
+class boss_mechano_lord_capacitus : public CreatureScript
+{
+ public:
+ boss_mechano_lord_capacitus() : CreatureScript("boss_mechano_lord_capacitus") { }
+
+ struct boss_mechano_lord_capacitusAI : public BossAI
+ {
+ boss_mechano_lord_capacitusAI(Creature* creature) : BossAI(creature, DATA_MECHANOLORD_CAPACITUS) { }
+
+ void EnterCombat(Unit* /*who*/)
+ {
+ _EnterCombat();
+ Talk(YELL_AGGRO);
+ events.ScheduleEvent(EVENT_HEADCRACK, 10 * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_REFLECTIVE_DAMAGE_SHIELD, 15 * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_SUMMON_NETHER_CHARGE, 10 * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_BERSERK, 3 * MINUTE * IN_MILLISECONDS);
+
+ if (IsHeroic())
+ events.ScheduleEvent(EVENT_POSITIVE_SHIFT, 15 * IN_MILLISECONDS);
+ }
+
+ void KilledUnit(Unit* /*victim*/)
+ {
+ Talk(YELL_KILL);
+ }
+
+ void JustDied(Unit* /*victim*/)
+ {
+ _JustDied();
+ Talk(YELL_DEATH);
+ }
+
+ void UpdateAI(uint32 const diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_HEADCRACK:
+ DoCastVictim(SPELL_HEADCRACK);
+ events.ScheduleEvent(EVENT_HEADCRACK, 10 * IN_MILLISECONDS);
+ break;
+ case EVENT_REFLECTIVE_DAMAGE_SHIELD:
+ Talk(YELL_REFLECTIVE_DAMAGE_SHIELD);
+ DoCast(me, SPELL_REFLECTIVE_DAMAGE_SHIELD);
+ events.ScheduleEvent(EVENT_REFLECTIVE_MAGIE_SHIELD, 30 * IN_MILLISECONDS);
+ break;
+ case EVENT_REFLECTIVE_MAGIE_SHIELD:
+ Talk(YELL_REFLECTIVE_MAGIC_SHIELD);
+ DoCast(me, SPELL_REFLECTIVE_MAGIC_SHIELD);
+ events.ScheduleEvent(EVENT_REFLECTIVE_DAMAGE_SHIELD, 30 * IN_MILLISECONDS);
+ break;
+ case EVENT_POSITIVE_SHIFT:
+ DoCastAOE(SPELL_POLARITY_SHIFT);
+ events.ScheduleEvent(EVENT_POSITIVE_SHIFT, urand(45, 60) * IN_MILLISECONDS);
+ break;
+ case EVENT_SUMMON_NETHER_CHARGE:
+ Position pos;
+ me->GetRandomNearPosition(pos, 5.0f);
+ me->SummonCreature(NPC_NETHER_CHARGE, pos, TEMPSUMMON_TIMED_DESPAWN, 18000);
+ events.ScheduleEvent(EVENT_SUMMON_NETHER_CHARGE, 10 * IN_MILLISECONDS);
+ break;
+ case EVENT_BERSERK:
+ DoCast(me, SPELL_BERSERK);
+ break;
+ default:
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new boss_mechano_lord_capacitusAI(creature);
+ }
+};
+
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
{
@@ -137,6 +261,7 @@ class spell_capacitus_polarity_shift : public SpellScriptLoader
void AddSC_boss_mechano_lord_capacitus()
{
+ new boss_mechano_lord_capacitus();
new spell_capacitus_polarity_charge();
new spell_capacitus_polarity_shift();
}
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 fcf32e5c341..0b2370e1b17 100644
--- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp
@@ -89,8 +89,6 @@ 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/boss_pathaleon_the_calculator.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp
index 09b3403f5c2..9d894e41b60 100644
--- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp
@@ -68,7 +68,8 @@ enum Creatures
class boss_pathaleon_the_calculator : public CreatureScript
{
- public: boss_pathaleon_the_calculator(): CreatureScript("boss_pathaleon_the_calculator") {}
+ public:
+ boss_pathaleon_the_calculator(): CreatureScript("boss_pathaleon_the_calculator") {}
struct boss_pathaleon_the_calculatorAI : public BossAI
{
diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp
index 66424fb9e10..e6cb05084ad 100644
--- a/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp
@@ -16,82 +16,59 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Instance_Mechanar
-SD%Complete: 100
-SDComment:
-SDCategory: Mechanar
-EndScriptData */
#include "ScriptMgr.h"
#include "InstanceScript.h"
#include "mechanar.h"
-class instance_mechanar : public InstanceMapScript
+static DoorData const doorData[] =
{
- public: instance_mechanar(): InstanceMapScript("instance_mechanar", 554) { }
+ { GO_DOOR_MOARG_1, DATA_GATEWATCHER_IRON_HAND, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { GO_DOOR_MOARG_2, DATA_GATEWATCHER_GYROKILL, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { GO_DOOR_NETHERMANCER, DATA_NETHERMANCER_SEPRETHREA, DOOR_TYPE_ROOM, BOUNDARY_NONE },
+ {0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE }
+};
- InstanceScript* GetInstanceScript(InstanceMap* map) const
- {
- return new instance_mechanar_InstanceMapScript(map);
- }
+class instance_mechanar : public InstanceMapScript
+{
+ public:
+ instance_mechanar(): InstanceMapScript("instance_mechanar", 554) { }
struct instance_mechanar_InstanceMapScript : public InstanceScript
{
instance_mechanar_InstanceMapScript(Map* map) : InstanceScript(map)
{
SetBossNumber(EncounterCount);
- DoorMoArg1GUID = 0;
- DoorMoArg2GUID = 0;
- DoorNethermancerGUID = 0;
+ LoadDoorData(doorData);
}
+
- void OnGameObjectCreate(GameObject* go)
+ void OnGameObjectCreate(GameObject* gameObject)
{
- switch (go->GetEntry())
+ switch (gameObject->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();
+ AddDoor(gameObject, true);
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
+ void OnGameObjectRemove(GameObject* gameObject)
{
- switch (type)
+ switch (gameObject->GetEntry())
{
case GO_DOOR_MOARG_1:
- return DoorMoArg1GUID;
case GO_DOOR_MOARG_2:
- return DoorMoArg2GUID;
case GO_DOOR_NETHERMANCER:
- return DoorNethermancerGUID;
+ AddDoor(gameObject, false);
+ break;
default:
break;
}
-
- return 0;
}
bool SetBossState(uint32 type, EncounterState state)
@@ -156,12 +133,12 @@ class instance_mechanar : public InstanceMapScript
OUT_LOAD_INST_DATA_COMPLETE;
}
-
- protected:
- uint64 DoorMoArg1GUID;
- uint64 DoorMoArg2GUID;
- uint64 DoorNethermancerGUID;
};
+
+ InstanceScript* GetInstanceScript(InstanceMap* map) const
+ {
+ return new instance_mechanar_InstanceMapScript(map);
+ }
};
void AddSC_instance_mechanar()