aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts/Outland
diff options
context:
space:
mode:
authorVincent_Michael <Vincent_Michael@gmx.de>2013-12-08 20:27:46 +0100
committerVincent_Michael <Vincent_Michael@gmx.de>2013-12-08 20:27:46 +0100
commite8be55aa8b3facd776303a34acf6048f50dcfa51 (patch)
treedb95abc0bd54a7693025306c3b435d672da00800 /src/server/scripts/Outland
parent214d0822ce41fb326a9763ae7507923fdfa659f1 (diff)
parent5c15e88da9037af885c40a55aeea581c520148d7 (diff)
Merge branch 'master' of github.com:TrinityCore/TrinityCore into 4.3.4
Conflicts: src/server/game/AI/CoreAI/TotemAI.cpp src/server/game/Entities/Player/Player.cpp src/server/game/Entities/Unit/Unit.cpp src/server/game/Globals/ObjectMgr.cpp src/server/game/Guilds/Guild.cpp src/server/game/Guilds/Guild.h src/server/game/Movement/Spline/MoveSplineInit.cpp src/server/game/Movement/Spline/MovementPacketBuilder.cpp src/server/game/Movement/Spline/MovementPacketBuilder.h src/server/game/Spells/SpellMgr.cpp src/server/scripts/EasternKingdoms/BlackrockMountain/BlackwingLair/boss_nefarian.cpp src/server/scripts/EasternKingdoms/ZulAman/boss_akilzon.cpp src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp src/server/scripts/Kalimdor/zone_mulgore.cpp src/server/scripts/Kalimdor/zone_stonetalon_mountains.cpp src/server/shared/Database/Implementation/CharacterDatabase.cpp
Diffstat (limited to 'src/server/scripts/Outland')
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_illidan.cpp2
-rw-r--r--src/server/scripts/Outland/CMakeLists.txt9
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_mennu_the_betrayer.cpp141
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_quagmirran.cpp124
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_rokmar_the_crackler.cpp127
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/instance_the_slave_pens.cpp3
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h32
-rw-r--r--src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp4
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp112
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h64
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp194
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp34
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp283
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp125
-rw-r--r--src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp364
-rw-r--r--src/server/scripts/Outland/zone_blades_edge_mountains.cpp101
-rw-r--r--src/server/scripts/Outland/zone_shadowmoon_valley.cpp4
17 files changed, 1419 insertions, 304 deletions
diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
index 3a790ec683b..3f90118ec8b 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp
@@ -1990,7 +1990,7 @@ public:
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
}
- void EnterCombat(Unit* /*who*/)OVERRIDE { }
+ void EnterCombat(Unit* /*who*/) OVERRIDE { }
void MoveInLineOfSight(Unit* who) OVERRIDE
diff --git a/src/server/scripts/Outland/CMakeLists.txt b/src/server/scripts/Outland/CMakeLists.txt
index 84cbbc3c30c..ab10ee2dfe4 100644
--- a/src/server/scripts/Outland/CMakeLists.txt
+++ b/src/server/scripts/Outland/CMakeLists.txt
@@ -43,9 +43,13 @@ set(scripts_STAT_SRCS
Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
Outland/CoilfangReservoir/SerpentShrine/boss_morogrim_tidewalker.cpp
Outland/CoilfangReservoir/TheSlavePens/instance_the_slave_pens.cpp
+ Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h
+ Outland/CoilfangReservoir/TheSlavePens/boss_mennu_the_betrayer.cpp
+ Outland/CoilfangReservoir/TheSlavePens/boss_rokmar_the_crackler.cpp
+ Outland/CoilfangReservoir/TheSlavePens/boss_quagmirran.cpp
+ Outland/CoilfangReservoir/TheUnderbog/instance_the_underbog.cpp
Outland/CoilfangReservoir/TheUnderbog/boss_hungarfen.cpp
Outland/CoilfangReservoir/TheUnderbog/boss_the_black_stalker.cpp
- Outland/CoilfangReservoir/TheUnderbog/instance_the_underbog.cpp
Outland/zone_shattrath_city.cpp
Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp
Outland/TempestKeep/Mechanar/boss_pathaleon_the_calculator.cpp
@@ -68,6 +72,9 @@ set(scripts_STAT_SRCS
Outland/TempestKeep/botanica/boss_high_botanist_freywinn.cpp
Outland/TempestKeep/botanica/boss_warp_splinter.cpp
Outland/TempestKeep/botanica/boss_laj.cpp
+ Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp
+ Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp
+ Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp
Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp
Outland/TempestKeep/arcatraz/instance_arcatraz.cpp
Outland/TempestKeep/arcatraz/arcatraz.h
diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_mennu_the_betrayer.cpp b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_mennu_the_betrayer.cpp
new file mode 100644
index 00000000000..ba59aa3b463
--- /dev/null
+++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_mennu_the_betrayer.cpp
@@ -0,0 +1,141 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * 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
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* ScriptData
+SDName: boss_mennu_the_betrayer
+SD%Complete: 95%
+SDComment:
+SDCategory: Coilfang Reservoir, The Slave Pens
+EndScriptData */
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "the_slave_pens.h"
+
+enum Say
+{
+ SAY_AGGRO = 0,
+ SAY_SLAY = 1,
+ SAY_DEATH = 2
+};
+
+enum Spells
+{
+ SPELL_TAINTED_STONESKIN_TOTEM = 31985, // every 30 sec if health below 100%
+ SPELL_TAINTED_EARTHGRAB_TOTEM = 31981, // ?
+ SPELL_CORRUPTED_NOVA_TOTEM = 31991, // ?
+ SPELL_MENNUS_HEALING_WARD = 34980, // every 14 - 25 sec
+ SPELL_LIGHTNING_BOLT = 35010 // every 14 - 19 sec
+};
+
+enum Events
+{
+ EVENT_TAINTED_STONESKIN_TOTEM = 1,
+ EVENT_TAINTED_EARTHGRAB_TOTEM = 2,
+ EVENT_CORRUPTED_NOVA_TOTEM = 3,
+ EVENT_MENNUS_HEALING_WARD = 4,
+ EVENT_LIGHTNING_BOLT = 5
+};
+
+class boss_mennu_the_betrayer : public CreatureScript
+{
+ public:
+ boss_mennu_the_betrayer() : CreatureScript("boss_mennu_the_betrayer") { }
+
+ struct boss_mennu_the_betrayerAI : public BossAI
+ {
+ boss_mennu_the_betrayerAI(Creature* creature) : BossAI(creature, DATA_MENNU_THE_BETRAYER) { }
+
+ void Reset() OVERRIDE
+ {
+ _Reset();
+ }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ }
+
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_TAINTED_STONESKIN_TOTEM, 30000);
+ events.ScheduleEvent(EVENT_TAINTED_EARTHGRAB_TOTEM, 20000);
+ events.ScheduleEvent(EVENT_CORRUPTED_NOVA_TOTEM, 60000);
+ events.ScheduleEvent(EVENT_MENNUS_HEALING_WARD, urand(14000, 25000));
+ events.ScheduleEvent(EVENT_LIGHTNING_BOLT, urand(14000, 19000));
+ Talk(SAY_AGGRO);
+ }
+
+ void KilledUnit(Unit* /*victim*/) OVERRIDE
+ {
+ Talk(SAY_SLAY);
+ }
+
+ 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_TAINTED_STONESKIN_TOTEM:
+ if (HealthBelowPct(100))
+ DoCast(me, SPELL_TAINTED_STONESKIN_TOTEM);
+ events.ScheduleEvent(EVENT_TAINTED_STONESKIN_TOTEM, 30000);
+ break;
+ case EVENT_TAINTED_EARTHGRAB_TOTEM:
+ DoCast(me, SPELL_TAINTED_EARTHGRAB_TOTEM);
+ break;
+ case EVENT_CORRUPTED_NOVA_TOTEM:
+ DoCast(me, SPELL_CORRUPTED_NOVA_TOTEM);
+ break;
+ case EVENT_MENNUS_HEALING_WARD:
+ DoCast(me, SPELL_MENNUS_HEALING_WARD);
+ events.ScheduleEvent(EVENT_MENNUS_HEALING_WARD, urand(14000, 25000));
+ break;
+ case EVENT_LIGHTNING_BOLT:
+ DoCastVictim(SPELL_LIGHTNING_BOLT, true);
+ events.ScheduleEvent(EVENT_LIGHTNING_BOLT, urand(14000, 25000));
+ break;
+ default:
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new boss_mennu_the_betrayerAI(creature);
+ }
+};
+
+void AddSC_boss_mennu_the_betrayer()
+{
+ new boss_mennu_the_betrayer();
+}
diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_quagmirran.cpp b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_quagmirran.cpp
new file mode 100644
index 00000000000..6cef7291542
--- /dev/null
+++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_quagmirran.cpp
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * 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
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* ScriptData
+SDName: boss_quagmirran
+SD%Complete: 100%
+SDComment:
+SDCategory: Coilfang Reservoir, The Slave Pens
+EndScriptData */
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "the_slave_pens.h"
+
+enum Spells
+{
+ SPELL_ACID_SPRAY = 38153,
+ SPELL_CLEAVE = 40504,
+ SPELL_UPPERCUT = 32055,
+ SPELL_POISON_BOLT_VOLLEY = 34780 // 39340
+};
+
+enum Events
+{
+ EVENT_ACID_SPRAY = 1,
+ EVENT_CLEAVE = 2,
+ EVENT_UPPERCUT = 3,
+ EVENT_POISON_BOLT_VOLLEY = 4
+};
+
+class boss_quagmirran : public CreatureScript
+{
+ public:
+ boss_quagmirran() : CreatureScript("boss_quagmirran") { }
+
+ struct boss_quagmirranAI : public BossAI
+ {
+ boss_quagmirranAI(Creature* creature) : BossAI(creature, DATA_QUAGMIRRAN) { }
+
+ void Reset() OVERRIDE
+ {
+ _Reset();
+ }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ _JustDied();
+ }
+
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_ACID_SPRAY, 25000);
+ events.ScheduleEvent(EVENT_CLEAVE, 9000);
+ events.ScheduleEvent(EVENT_UPPERCUT, 20000);
+ events.ScheduleEvent(EVENT_POISON_BOLT_VOLLEY, 31000);
+ }
+
+ void KilledUnit(Unit* /*victim*/) OVERRIDE { }
+
+ 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_ACID_SPRAY:
+ DoCastAOE(SPELL_ACID_SPRAY);
+ events.ScheduleEvent(EVENT_ACID_SPRAY, urand(20000, 25000));
+ break;
+ case EVENT_CLEAVE:
+ DoCastVictim(SPELL_CLEAVE, true);
+ events.ScheduleEvent(EVENT_CLEAVE, urand(18000, 34000));
+ break;
+ case EVENT_UPPERCUT:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 10.0f, true))
+ DoCast(target, SPELL_UPPERCUT);
+ events.ScheduleEvent(EVENT_UPPERCUT, 22000);
+ break;
+ case EVENT_POISON_BOLT_VOLLEY:
+ DoCast(me, SPELL_POISON_BOLT_VOLLEY);
+ events.ScheduleEvent(EVENT_POISON_BOLT_VOLLEY, 24000);
+ break;
+ default:
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new boss_quagmirranAI(creature);
+ }
+};
+
+void AddSC_boss_quagmirran()
+{
+ new boss_quagmirran();
+}
diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_rokmar_the_crackler.cpp b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_rokmar_the_crackler.cpp
new file mode 100644
index 00000000000..a025df5c3ae
--- /dev/null
+++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/boss_rokmar_the_crackler.cpp
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * 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
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* ScriptData
+SDName: boss_rokmar_the_crackler
+SD%Complete: 100%
+SDComment:
+SDCategory: Coilfang Reservoir, The Slave Pens
+EndScriptData */
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "the_slave_pens.h"
+
+enum Spells
+{
+ SPELL_GRIEVOUS_WOUND = 31956,
+ SPELL_ENSNARING_MOSS = 31948,
+ SPELL_WATER_SPIT = 35008,
+ SPELL_FRENZY = 34970
+};
+
+enum Events
+{
+ EVENT_GRIEVOUS_WOUND = 1,
+ EVENT_ENSNARING_MOSS = 2,
+ EVENT_WATER_SPIT = 3
+};
+
+class boss_rokmar_the_crackler : public CreatureScript
+{
+ public:
+ boss_rokmar_the_crackler() : CreatureScript("boss_rokmar_the_crackler") { }
+
+ struct boss_rokmar_the_cracklerAI : public BossAI
+ {
+ boss_rokmar_the_cracklerAI(Creature* creature) : BossAI(creature, DATA_MENNU_THE_BETRAYER) { }
+
+ void Reset() OVERRIDE
+ {
+ _Reset();
+ rokmarFrenzy = false;
+ }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ _JustDied();
+ }
+
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_GRIEVOUS_WOUND, 10000);
+ events.ScheduleEvent(EVENT_ENSNARING_MOSS, 20000);
+ events.ScheduleEvent(EVENT_WATER_SPIT, 14000);
+ }
+
+ void KilledUnit(Unit* /*victim*/) OVERRIDE { }
+
+ 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_GRIEVOUS_WOUND:
+ DoCastVictim(SPELL_GRIEVOUS_WOUND, true);
+ events.ScheduleEvent(EVENT_GRIEVOUS_WOUND, urand(20000, 30000));
+ break;
+ case EVENT_ENSNARING_MOSS:
+ DoCastAOE(SPELL_ENSNARING_MOSS);
+ events.ScheduleEvent(EVENT_ENSNARING_MOSS, urand(20000, 30000));
+ break;
+ case EVENT_WATER_SPIT:
+ DoCastAOE(SPELL_WATER_SPIT);
+ events.ScheduleEvent(EVENT_WATER_SPIT, urand(14000, 18000));
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (HealthBelowPct(10) && !rokmarFrenzy)
+ {
+ DoCast(me, SPELL_FRENZY);
+ rokmarFrenzy = true;
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ bool rokmarFrenzy;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new boss_rokmar_the_cracklerAI(creature);
+ }
+};
+
+void AddSC_boss_rokmar_the_crackler()
+{
+ new boss_rokmar_the_crackler();
+}
diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/instance_the_slave_pens.cpp b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/instance_the_slave_pens.cpp
index cd11e2e1bf1..1c31bee7d4f 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/instance_the_slave_pens.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/instance_the_slave_pens.cpp
@@ -24,11 +24,12 @@ gets instead the deserter debuff.
#include "ScriptMgr.h"
#include "InstanceScript.h"
+#include "the_slave_pens.h"
class instance_the_slave_pens : public InstanceMapScript
{
public:
- instance_the_slave_pens() : InstanceMapScript("instance_the_slave_pens", 547) { }
+ instance_the_slave_pens() : InstanceMapScript(SPScriptName, 547) { }
InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
{
diff --git a/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h
new file mode 100644
index 00000000000..624ead7ef08
--- /dev/null
+++ b/src/server/scripts/Outland/CoilfangReservoir/TheSlavePens/the_slave_pens.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * 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
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef SLAVE_PENS_H
+#define SLAVE_PENS_H
+
+uint32 const EncounterCount = 3;
+
+#define SPScriptName "instance_the_slave_pens"
+
+enum DataTypes
+{
+ DATA_MENNU_THE_BETRAYER = 1,
+ DATA_ROKMAR_THE_CRACKLER = 2,
+ DATA_QUAGMIRRAN = 3
+};
+
+#endif // SLAVE_PENS_H
diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp
index 9c60c16d0af..c293a995467 100644
--- a/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp
+++ b/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp
@@ -16,7 +16,6 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-
#include "ScriptMgr.h"
#include "InstanceScript.h"
#include "mechanar.h"
@@ -26,7 +25,7 @@ static DoorData const doorData[] =
{ 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 }
+ { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE }
};
class instance_mechanar : public InstanceMapScript
@@ -42,7 +41,6 @@ class instance_mechanar : public InstanceMapScript
LoadDoorData(doorData);
}
-
void OnGameObjectCreate(GameObject* gameObject)
{
switch (gameObject->GetEntry())
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp
index 9206636893c..ff3145c5c78 100644
--- a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp
@@ -69,11 +69,8 @@ enum MillhouseSpells
class npc_millhouse_manastorm : public CreatureScript
{
public:
+ npc_millhouse_manastorm() : CreatureScript("npc_millhouse_manastorm") { }
- npc_millhouse_manastorm()
- : CreatureScript("npc_millhouse_manastorm")
- {
- }
struct npc_millhouse_manastormAI : public ScriptedAI
{
npc_millhouse_manastormAI(Creature* creature) : ScriptedAI(creature)
@@ -101,14 +98,11 @@ class npc_millhouse_manastorm : public CreatureScript
Pyroblast_Timer = 1000;
Fireball_Timer = 2500;
- if (instance)
- {
- if (instance->GetData(TYPE_WARDEN_2) == DONE)
- Init = true;
+ if (instance->GetData(DATA_WARDEN_2) == DONE)
+ Init = true;
- if (instance->GetData(TYPE_HARBINGERSKYRISS) == DONE)
- Talk(SAY_COMPLETE);
- }
+ if (instance->GetBossState(DATA_HARBINGER_SKYRISS) == DONE)
+ Talk(SAY_COMPLETE);
}
void AttackStart(Unit* who) OVERRIDE
@@ -122,7 +116,7 @@ class npc_millhouse_manastorm : public CreatureScript
}
}
- void EnterCombat(Unit* /*who*/)OVERRIDE { }
+ void EnterCombat(Unit* /*who*/) OVERRIDE { }
void KilledUnit(Unit* /*victim*/) OVERRIDE
{
@@ -134,7 +128,7 @@ class npc_millhouse_manastorm : public CreatureScript
Talk(SAY_DEATH);
/*for questId 10886 (heroic mode only)
- if (instance && instance->GetData(TYPE_HARBINGERSKYRISS) != DONE)
+ if (instance->GetBossState(DATA_HARBINGER_SKYRISS) != DONE)
->FailQuest();*/
}
@@ -176,8 +170,7 @@ class npc_millhouse_manastorm : public CreatureScript
EventProgress_Timer = 6000;
break;
case 7:
- if (instance)
- instance->SetData(TYPE_WARDEN_2, DONE);
+ instance->SetData(DATA_WARDEN_2, DONE);
Init = true;
break;
}
@@ -223,7 +216,7 @@ class npc_millhouse_manastorm : public CreatureScript
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- return new npc_millhouse_manastormAI(creature);
+ return GetArcatrazAI<npc_millhouse_manastormAI>(creature);
}
};
/*#####
@@ -273,10 +266,7 @@ enum WardenSpells
class npc_warden_mellichar : public CreatureScript
{
public:
-
- npc_warden_mellichar() : CreatureScript("npc_warden_mellichar")
- {
- }
+ npc_warden_mellichar() : CreatureScript("npc_warden_mellichar") { }
struct npc_warden_mellicharAI : public ScriptedAI
{
@@ -304,14 +294,12 @@ class npc_warden_mellichar : public CreatureScript
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
DoCast(me, SPELL_TARGET_OMEGA);
- if (instance)
- instance->SetData(TYPE_HARBINGERSKYRISS, NOT_STARTED);
+ instance->SetBossState(DATA_HARBINGER_SKYRISS, NOT_STARTED);
}
void AttackStart(Unit* /*who*/) OVERRIDE { }
void MoveInLineOfSight(Unit* who) OVERRIDE
-
{
if (IsRunning)
return;
@@ -334,69 +322,60 @@ class npc_warden_mellichar : public CreatureScript
Talk(YELL_INTRO1);
DoCast(me, SPELL_BUBBLE_VISUAL);
- if (instance)
- {
- instance->SetData(TYPE_HARBINGERSKYRISS, IN_PROGRESS);
- instance->HandleGameObject(instance->GetData64(DATA_SPHERE_SHIELD), false);
- IsRunning = true;
- }
+ instance->SetBossState(DATA_HARBINGER_SKYRISS, IN_PROGRESS);
+ instance->HandleGameObject(instance->GetData64(DATA_WARDENS_SHIELD), false);
+ IsRunning = true;
}
bool CanProgress()
{
- if (instance)
- {
- if (Phase == 7 && instance->GetData(TYPE_WARDEN_4) == DONE)
- return true;
- if (Phase == 6 && instance->GetData(TYPE_WARDEN_3) == DONE)
- return true;
- if (Phase == 5 && instance->GetData(TYPE_WARDEN_2) == DONE)
- return true;
- if (Phase == 4)
- return true;
- if (Phase == 3 && instance->GetData(TYPE_WARDEN_1) == DONE)
- return true;
- if (Phase == 2 && instance->GetData(TYPE_HARBINGERSKYRISS) == IN_PROGRESS)
- return true;
- if (Phase == 1 && instance->GetData(TYPE_HARBINGERSKYRISS) == IN_PROGRESS)
- return true;
- return false;
- }
+ if (Phase == 7 && instance->GetData(DATA_WARDEN_4) == DONE)
+ return true;
+ if (Phase == 6 && instance->GetData(DATA_WARDEN_3) == DONE)
+ return true;
+ if (Phase == 5 && instance->GetData(DATA_WARDEN_2) == DONE)
+ return true;
+ if (Phase == 4)
+ return true;
+ if (Phase == 3 && instance->GetData(DATA_WARDEN_1) == DONE)
+ return true;
+ if (Phase == 2 && instance->GetBossState(DATA_HARBINGER_SKYRISS) == IN_PROGRESS)
+ return true;
+ if (Phase == 1 && instance->GetBossState(DATA_HARBINGER_SKYRISS) == IN_PROGRESS)
+ return true;
+
return false;
}
void DoPrepareForPhase()
{
- if (instance)
- {
- me->InterruptNonMeleeSpells(true);
- me->RemoveAurasByType(SPELL_AURA_DUMMY);
+ me->InterruptNonMeleeSpells(true);
+ me->RemoveAurasByType(SPELL_AURA_DUMMY);
- switch (Phase)
- {
+ switch (Phase)
+ {
case 2:
DoCast(me, SPELL_TARGET_ALPHA);
- instance->SetData(TYPE_WARDEN_1, IN_PROGRESS);
- instance->HandleGameObject(instance->GetData64(DATA_SPHERE_SHIELD), false);
+ instance->SetData(DATA_WARDEN_1, IN_PROGRESS);
+ instance->HandleGameObject(instance->GetData64(DATA_WARDENS_SHIELD), false);
break;
case 3:
DoCast(me, SPELL_TARGET_BETA);
- instance->SetData(TYPE_WARDEN_2, IN_PROGRESS);
+ instance->SetData(DATA_WARDEN_2, IN_PROGRESS);
break;
case 5:
DoCast(me, SPELL_TARGET_DELTA);
- instance->SetData(TYPE_WARDEN_3, IN_PROGRESS);
+ instance->SetData(DATA_WARDEN_3, IN_PROGRESS);
break;
case 6:
DoCast(me, SPELL_TARGET_GAMMA);
- instance->SetData(TYPE_WARDEN_4, IN_PROGRESS);
+ instance->SetData(DATA_WARDEN_4, IN_PROGRESS);
break;
case 7:
- instance->SetData(TYPE_WARDEN_5, IN_PROGRESS);
+ instance->SetData(DATA_WARDEN_5, IN_PROGRESS);
break;
- }
- CanSpawn = true;
}
+ CanSpawn = true;
}
void UpdateAI(uint32 diff) OVERRIDE
@@ -406,13 +385,10 @@ class npc_warden_mellichar : public CreatureScript
if (EventProgress_Timer <= diff)
{
- if (instance)
+ if (instance->GetBossState(DATA_HARBINGER_SKYRISS) == FAIL)
{
- if (instance->GetData(TYPE_HARBINGERSKYRISS) == FAIL)
- {
- Reset();
- return;
- }
+ Reset();
+ return;
}
if (CanSpawn)
@@ -517,7 +493,7 @@ class npc_warden_mellichar : public CreatureScript
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- return new npc_warden_mellicharAI(creature);
+ return GetArcatrazAI<npc_warden_mellicharAI>(creature);
}
};
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h
index 37839d4794d..1ebfad4dfeb 100644
--- a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.h
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 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
@@ -16,23 +15,56 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef ARCATRAZ_H_
-#define ARCATRAZ_H_
+#ifndef ARCATRAZ_H
+#define ARCATRAZ_H
+
+#define ArcatrazScriptName "instance_arcatraz"
+
+uint32 const EncounterCount = 4;
enum DataTypes
{
- TYPE_ZEREKETH = 1,
- TYPE_DALLIAH = 2,
- TYPE_SOCCOTHRATES = 3,
- TYPE_HARBINGERSKYRISS = 4,
- TYPE_WARDEN_1 = 5,
- TYPE_WARDEN_2 = 6,
- TYPE_WARDEN_3 = 7,
- TYPE_WARDEN_4 = 8,
- TYPE_WARDEN_5 = 9,
- DATA_MELLICHAR = 10,
- TYPE_SHIELD_OPEN = 11,
- DATA_SPHERE_SHIELD = 12
+ // Encounter States/Boss GUIDs
+ DATA_ZEREKETH = 0,
+ DATA_DALLIAH = 1,
+ DATA_SOCCOTHRATES = 2,
+ DATA_HARBINGER_SKYRISS = 3,
+
+ // Additional Data
+ DATA_CONVERSATION = 4,
+ DATA_WARDEN_1 = 5, // used by EventAI
+ DATA_WARDEN_2 = 6, // used by EventAI
+ DATA_WARDEN_3 = 7, // used by EventAI
+ DATA_WARDEN_4 = 8, // used by EventAI
+ DATA_WARDEN_5 = 9, // used by EventAI
+ DATA_MELLICHAR = 10,
+ DATA_WARDENS_SHIELD = 11
+};
+
+enum CreatureIds
+{
+ NPC_DALLIAH = 20885,
+ NPC_SOCCOTHRATES = 20886,
+ NPC_MELLICHAR = 20904, // skyriss will kill this unit
+ NPC_ALPHA_POD_TARGET = 21436
};
-#endif // ARCATRAZ_H_
+enum GameObjectIds
+{
+ GO_CONTAINMENT_CORE_SECURITY_FIELD_ALPHA = 184318, // door opened when Wrath-Scryer Soccothrates dies
+ GO_CONTAINMENT_CORE_SECURITY_FIELD_BETA = 184319, // door opened when Dalliah the Doomsayer dies
+ GO_STASIS_POD_ALPHA = 183961, // pod first boss wave
+ GO_STASIS_POD_BETA = 183963, // pod second boss wave
+ GO_STASIS_POD_DELTA = 183964, // pod third boss wave
+ GO_STASIS_POD_GAMMA = 183962, // pod fourth boss wave
+ GO_STASIS_POD_OMEGA = 183965, // pod fifth boss wave
+ GO_WARDENS_SHIELD = 184802 // shield 'protecting' mellichar
+};
+
+template<class AI>
+AI* GetArcatrazAI(Creature* creature)
+{
+ return GetInstanceAI<AI>(creature, ArcatrazScriptName);
+}
+
+#endif // ARCATRAZ_H
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp
new file mode 100644
index 00000000000..36377b4d715
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * 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
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "arcatraz.h"
+
+enum Say
+{
+ // Dalliah the Doomsayer
+ SAY_AGGRO = 1,
+ SAY_SLAY = 2,
+ SAY_WHIRLWIND = 3,
+ SAY_HEAL = 4,
+ SAY_DEATH = 5,
+ SAY_SOCCOTHRATES_DEATH = 7,
+
+ // Wrath-Scryer Soccothrates
+ SAY_AGGRO_DALLIAH_FIRST = 0,
+ SAY_DALLIAH_25_PERCENT = 5
+};
+
+enum Spells
+{
+ SPELL_GIFT_OF_THE_DOOMSAYER = 36173,
+ SPELL_WHIRLWIND = 36142,
+ SPELL_HEAL = 36144,
+ SPELL_SHADOW_WAVE = 39016 // Heroic only
+};
+
+enum Events
+{
+ EVENT_GIFT_OF_THE_DOOMSAYER = 1,
+ EVENT_WHIRLWIND = 2,
+ EVENT_HEAL = 3,
+ EVENT_SHADOW_WAVE = 4, // Heroic only
+ EVENT_ME_FIRST = 5,
+ EVENT_SOCCOTHRATES_DEATH = 6
+};
+
+class boss_dalliah_the_doomsayer : public CreatureScript
+{
+ public:
+ boss_dalliah_the_doomsayer() : CreatureScript("boss_dalliah_the_doomsayer") { }
+
+ struct boss_dalliah_the_doomsayerAI : public BossAI
+ {
+ boss_dalliah_the_doomsayerAI(Creature* creature) : BossAI(creature, DATA_DALLIAH) { }
+
+ void Reset() OVERRIDE
+ {
+ _Reset();
+ soccothratesDeath = false;
+ }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+
+ if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SOCCOTHRATES)))
+ if (soccothrates->IsAlive() && !soccothrates->IsInCombat())
+ soccothrates->AI()->SetData(1, 1);
+ }
+
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_GIFT_OF_THE_DOOMSAYER, urand(1000, 4000));
+ events.ScheduleEvent(EVENT_WHIRLWIND, urand(7000, 9000));
+ if (IsHeroic())
+ events.ScheduleEvent(EVENT_SHADOW_WAVE, urand(11000, 16000));
+ events.ScheduleEvent(EVENT_ME_FIRST, 6000);
+ Talk(SAY_AGGRO);
+ }
+
+ void KilledUnit(Unit* /*victim*/) OVERRIDE
+ {
+ Talk(SAY_SLAY);
+ }
+
+ void SetData(uint32 /*type*/, uint32 data) OVERRIDE
+ {
+ switch (data)
+ {
+ case 1:
+ events.ScheduleEvent(EVENT_SOCCOTHRATES_DEATH, 6000);
+ soccothratesDeath = true;
+ break;
+ default:
+ break;
+ }
+ }
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim())
+ {
+ if (soccothratesDeath)
+ {
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_SOCCOTHRATES_DEATH:
+ Talk(SAY_SOCCOTHRATES_DEATH);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ return;
+ }
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_GIFT_OF_THE_DOOMSAYER:
+ DoCastVictim(SPELL_GIFT_OF_THE_DOOMSAYER, true);
+ events.ScheduleEvent(EVENT_GIFT_OF_THE_DOOMSAYER, urand(16000, 21000));
+ break;
+ case EVENT_WHIRLWIND:
+ DoCast(me, SPELL_WHIRLWIND);
+ Talk(SAY_WHIRLWIND);
+ events.ScheduleEvent(EVENT_WHIRLWIND, urand(19000, 21000));
+ events.ScheduleEvent(EVENT_HEAL, 6000);
+ break;
+ case EVENT_HEAL:
+ DoCast(me, SPELL_HEAL);
+ Talk(SAY_HEAL);
+ break;
+ case EVENT_SHADOW_WAVE:
+ DoCastVictim(SPELL_SHADOW_WAVE, true);
+ events.ScheduleEvent(EVENT_SHADOW_WAVE, urand(11000, 16000));
+ break;
+ case EVENT_ME_FIRST:
+ if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SOCCOTHRATES)))
+ if (soccothrates->IsAlive() && !soccothrates->IsInCombat())
+ soccothrates->AI()->Talk(SAY_AGGRO_DALLIAH_FIRST);
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (HealthBelowPct(25) && !soccothratesTaunt)
+ {
+ if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SOCCOTHRATES)))
+ soccothrates->AI()->Talk(SAY_DALLIAH_25_PERCENT);
+ soccothratesTaunt = true;
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ bool soccothratesTaunt;
+ bool soccothratesDeath;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetArcatrazAI<boss_dalliah_the_doomsayerAI>(creature);
+ }
+};
+
+void AddSC_boss_dalliah_the_doomsayer()
+{
+ new boss_dalliah_the_doomsayer();
+}
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp
index eda90d3b734..48d955acbc3 100644
--- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp
@@ -61,21 +61,15 @@ enum Spells
class boss_harbinger_skyriss : public CreatureScript
{
public:
+ boss_harbinger_skyriss() : CreatureScript("boss_harbinger_skyriss") { }
- boss_harbinger_skyriss()
- : CreatureScript("boss_harbinger_skyriss")
+ struct boss_harbinger_skyrissAI : public BossAI
{
- }
- struct boss_harbinger_skyrissAI : public ScriptedAI
- {
- boss_harbinger_skyrissAI(Creature* creature) : ScriptedAI(creature)
+ boss_harbinger_skyrissAI(Creature* creature) : BossAI(creature, DATA_HARBINGER_SKYRISS)
{
- instance = creature->GetInstanceScript();
Intro = false;
}
- InstanceScript* instance;
-
bool Intro;
bool IsImage33;
bool IsImage66;
@@ -104,7 +98,6 @@ class boss_harbinger_skyriss : public CreatureScript
}
void MoveInLineOfSight(Unit* who) OVERRIDE
-
{
if (!Intro)
return;
@@ -117,8 +110,7 @@ class boss_harbinger_skyriss : public CreatureScript
void JustDied(Unit* /*killer*/) OVERRIDE
{
Talk(SAY_DEATH);
- if (instance)
- instance->SetData(TYPE_HARBINGERSKYRISS, DONE);
+ _JustDied();
}
void JustSummoned(Creature* summon) OVERRIDE
@@ -137,7 +129,7 @@ class boss_harbinger_skyriss : public CreatureScript
void KilledUnit(Unit* victim) OVERRIDE
{
//won't yell killing pet/other unit
- if (victim->GetEntry() == 21436)
+ if (victim->GetEntry() == NPC_ALPHA_POD_TARGET)
return;
Talk(SAY_KILL);
@@ -160,27 +152,24 @@ class boss_harbinger_skyriss : public CreatureScript
{
if (!Intro)
{
- if (!instance)
- return;
-
if (Intro_Timer <= diff)
{
switch (Intro_Phase)
{
case 1:
Talk(SAY_INTRO);
- instance->HandleGameObject(instance->GetData64(DATA_SPHERE_SHIELD), true);
+ instance->HandleGameObject(instance->GetData64(DATA_WARDENS_SHIELD), true);
++Intro_Phase;
Intro_Timer = 25000;
break;
case 2:
Talk(SAY_AGGRO);
- if (Unit* mellic = Unit::GetUnit(*me, instance->GetData64(DATA_MELLICHAR)))
+ if (Unit* mellic = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_MELLICHAR)))
{
//should have a better way to do this. possibly spell exist.
mellic->setDeathState(JUST_DIED);
mellic->SetHealth(0);
- instance->SetData(TYPE_SHIELD_OPEN, IN_PROGRESS);
+ instance->HandleGameObject(instance->GetData64(DATA_WARDENS_SHIELD), false);
}
++Intro_Phase;
Intro_Timer = 3000;
@@ -275,18 +264,15 @@ class boss_harbinger_skyriss : public CreatureScript
CreatureAI* GetAI(Creature* creature) const OVERRIDE
{
- return new boss_harbinger_skyrissAI(creature);
+ return GetArcatrazAI<boss_harbinger_skyrissAI>(creature);
}
};
class boss_harbinger_skyriss_illusion : public CreatureScript
{
public:
+ boss_harbinger_skyriss_illusion() : CreatureScript("boss_harbinger_skyriss_illusion") { }
- boss_harbinger_skyriss_illusion()
- : CreatureScript("boss_harbinger_skyriss_illusion")
- {
- }
struct boss_harbinger_skyriss_illusionAI : public ScriptedAI
{
boss_harbinger_skyriss_illusionAI(Creature* creature) : ScriptedAI(creature) { }
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp
new file mode 100644
index 00000000000..2d9bfc92583
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp
@@ -0,0 +1,283 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * 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
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* ScriptData
+SDName: boss_wrath_scryer_soccothrates
+SD%Complete: 95%
+SDComment: charge left to script
+SDCategory: Tempest Keep, The Arcatraz
+EndScriptData */
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "arcatraz.h"
+
+enum Say
+{
+ // Wrath-Scryer Soccothrates
+ SAY_AGGRO = 1,
+ SAY_SLAY = 2,
+ SAY_KNOCK_AWAY = 3,
+ SAY_DEATH = 4,
+ SAY_DALLIAH_DEATH = 6,
+ SAY_SOCCOTHRATES_CONVO_1 = 7,
+ SAY_SOCCOTHRATES_CONVO_2 = 8,
+ SAY_SOCCOTHRATES_CONVO_3 = 9,
+ SAY_SOCCOTHRATES_CONVO_4 = 10,
+
+ // Dalliah the Doomsayer
+ SAY_AGGRO_SOCCOTHRATES_FIRST = 0,
+ SAY_SOCCOTHRATES_25_PERCENT = 6,
+ SAY_DALLIAH_CONVO_1 = 8,
+ SAY_DALLIAH_CONVO_2 = 9,
+ SAY_DALLIAH_CONVO_3 = 10
+};
+
+enum Spells
+{
+ SPELL_FEL_IMMOLATION = 36051,
+ SPELL_FELFIRE_SHOCK = 35759,
+ SPELL_KNOCK_AWAY = 36512,
+ SPELL_FELFIRE_LINE_UP = 35770,
+ SPELL_CHARGE_TARGETING = 36038,
+ SPELL_CHARGE = 35754
+};
+
+enum Events
+{
+ EVENT_FELFIRE_SHOCK = 1,
+ EVENT_KNOCK_AWAY = 2,
+
+ EVENT_PREFIGHT_1 = 3,
+ EVENT_PREFIGHT_2 = 4,
+ EVENT_PREFIGHT_3 = 5,
+ EVENT_PREFIGHT_4 = 6,
+ EVENT_PREFIGHT_5 = 7,
+ EVENT_PREFIGHT_6 = 8,
+ EVENT_PREFIGHT_7 = 9,
+ EVENT_PREFIGHT_8 = 10,
+ EVENT_PREFIGHT_9 = 11,
+ EVENT_ME_FIRST = 12,
+ EVENT_DALLIAH_DEATH = 13
+};
+
+class boss_wrath_scryer_soccothrates : public CreatureScript
+{
+ public:
+ boss_wrath_scryer_soccothrates() : CreatureScript("boss_wrath_scryer_soccothrates") { }
+
+ struct boss_wrath_scryer_soccothratesAI : public BossAI
+ {
+ boss_wrath_scryer_soccothratesAI(Creature* creature) : BossAI(creature, DATA_SOCCOTHRATES) { }
+
+ void Reset() OVERRIDE
+ {
+ _Reset();
+ preFight = false;
+ dalliahTaunt = false;
+ dalliahDeath = false;
+ DoCast(me, SPELL_FEL_IMMOLATION);
+ }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+
+ if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
+ if (dalliah->IsAlive() && !dalliah->IsInCombat())
+ dalliah->AI()->SetData(1, 1);
+ }
+
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_FELFIRE_SHOCK, urand(12000, 14000));
+ events.ScheduleEvent(EVENT_KNOCK_AWAY, urand(11000, 12000));
+ events.ScheduleEvent(EVENT_ME_FIRST, 6000);
+ Talk(SAY_AGGRO);
+ preFight = false;
+ }
+
+ void KilledUnit(Unit* /*victim*/) OVERRIDE
+ {
+ Talk(SAY_SLAY);
+ }
+
+ void MoveInLineOfSight(Unit* who) OVERRIDE
+ {
+ if (instance->GetData(DATA_CONVERSATION) == NOT_STARTED && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 70.0f))
+ {
+ Talk(SAY_SOCCOTHRATES_CONVO_1);
+ instance->SetData(DATA_CONVERSATION, DONE);
+
+ preFight = true;
+ events.ScheduleEvent(EVENT_PREFIGHT_1, 2000);
+ }
+ }
+
+ void SetData(uint32 /*type*/, uint32 data) OVERRIDE
+ {
+ switch (data)
+ {
+ case 1:
+ events.ScheduleEvent(EVENT_DALLIAH_DEATH, 6000);
+ dalliahDeath = true;
+ break;
+ default:
+ break;
+ }
+ }
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (!UpdateVictim())
+ {
+ if (preFight)
+ {
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_PREFIGHT_1:
+ if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
+ dalliah->AI()->Talk(SAY_DALLIAH_CONVO_1);
+ events.ScheduleEvent(EVENT_PREFIGHT_2, 3000);
+ break;
+ case EVENT_PREFIGHT_2:
+ Talk(SAY_SOCCOTHRATES_CONVO_2);
+ events.ScheduleEvent(EVENT_PREFIGHT_3, 3000);
+ break;
+ case EVENT_PREFIGHT_3:
+ if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
+ dalliah->AI()->Talk(SAY_DALLIAH_CONVO_2);
+ events.ScheduleEvent(EVENT_PREFIGHT_4, 6000);
+ break;
+ case EVENT_PREFIGHT_4:
+ Talk(SAY_SOCCOTHRATES_CONVO_3);
+ events.ScheduleEvent(EVENT_PREFIGHT_5, 2000);
+ break;
+ case EVENT_PREFIGHT_5:
+ if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
+ dalliah->AI()->Talk(SAY_DALLIAH_CONVO_3);
+ events.ScheduleEvent(EVENT_PREFIGHT_6, 3000);
+ break;
+ case EVENT_PREFIGHT_6:
+ Talk(SAY_SOCCOTHRATES_CONVO_4);
+ events.ScheduleEvent(EVENT_PREFIGHT_7, 2000);
+ break;
+ case EVENT_PREFIGHT_7:
+ if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
+ dalliah->GetMotionMaster()->MovePoint(0, 118.6048f, 96.84852f, 22.44115f);
+ events.ScheduleEvent(EVENT_PREFIGHT_8, 4000);
+ break;
+ case EVENT_PREFIGHT_8:
+ me->GetMotionMaster()->MovePoint(0, 122.1035f, 192.7203f, 22.44115f);
+ events.ScheduleEvent(EVENT_PREFIGHT_9, 4000);
+ break;
+ case EVENT_PREFIGHT_9:
+ if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
+ {
+ dalliah->SetFacingToObject(me);
+ me->SetFacingToObject(dalliah);
+ dalliah->SetHomePosition(dalliah->GetPositionX(), dalliah->GetPositionY(), dalliah->GetPositionZ(), 1.51737f);
+ me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 4.725722f);
+ preFight = false;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ if (dalliahDeath)
+ {
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_DALLIAH_DEATH:
+ Talk(SAY_DALLIAH_DEATH);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ return;
+ }
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_FELFIRE_SHOCK:
+ DoCastVictim(SPELL_FELFIRE_SHOCK, true);
+ events.ScheduleEvent(EVENT_FELFIRE_SHOCK, urand(12000, 14000));
+ break;
+ case EVENT_KNOCK_AWAY:
+ DoCast(me, SPELL_KNOCK_AWAY);
+ Talk(SAY_KNOCK_AWAY);
+ events.ScheduleEvent(EVENT_KNOCK_AWAY, urand(11000, 12000));
+ break;
+ case EVENT_ME_FIRST:
+ if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
+ if (dalliah->IsAlive() && !dalliah->IsInCombat())
+ dalliah->AI()->Talk(SAY_AGGRO_SOCCOTHRATES_FIRST);
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (HealthBelowPct(25) && !dalliahTaunt)
+ {
+ if (Creature* dalliah = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_DALLIAH)))
+ dalliah->AI()->Talk(SAY_SOCCOTHRATES_25_PERCENT);
+ dalliahTaunt = true;
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ bool preFight;
+ bool dalliahTaunt;
+ bool dalliahDeath;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return GetArcatrazAI<boss_wrath_scryer_soccothratesAI>(creature);
+ }
+};
+
+void AddSC_boss_wrath_scryer_soccothrates()
+{
+ new boss_wrath_scryer_soccothrates();
+}
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp
new file mode 100644
index 00000000000..7659f191ff7
--- /dev/null
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
+ *
+ * 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
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "arcatraz.h"
+
+enum Say
+{
+ SAY_AGGRO = 0,
+ SAY_SLAY = 1,
+ SAY_SHADOW_NOVA = 2,
+ SAY_DEATH = 3
+};
+
+enum Spells
+{
+ SPELL_VOID_ZONE = 36119,
+ SPELL_SHADOW_NOVA = 36127,
+ SPELL_SEED_OF_CORRUPTION = 36123
+};
+
+enum Events
+{
+ EVENT_VOID_ZONE = 1,
+ EVENT_SHADOW_NOVA = 2,
+ EVENT_SEED_OF_CORRUPTION = 3
+};
+
+class boss_zereketh_the_unbound : public CreatureScript
+{
+ public:
+ boss_zereketh_the_unbound() : CreatureScript("boss_zereketh_the_unbound") { }
+
+ struct boss_zereketh_the_unboundAI : public BossAI
+ {
+ boss_zereketh_the_unboundAI(Creature* creature) : BossAI(creature, DATA_ZEREKETH) { }
+
+ void Reset() OVERRIDE
+ {
+ _Reset();
+ }
+
+ void JustDied(Unit* /*killer*/) OVERRIDE
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ }
+
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ _EnterCombat();
+ events.ScheduleEvent(EVENT_VOID_ZONE, urand (6000, 10000));
+ events.ScheduleEvent(EVENT_SHADOW_NOVA, urand (6000, 10000));
+ events.ScheduleEvent(EVENT_SEED_OF_CORRUPTION, urand(12000, 20000));
+ Talk(SAY_AGGRO);
+ }
+
+ void KilledUnit(Unit* /*victim*/) OVERRIDE
+ {
+ Talk(SAY_SLAY);
+ }
+
+ 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_VOID_ZONE:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true))
+ DoCast(target, SPELL_VOID_ZONE);
+ events.ScheduleEvent(EVENT_VOID_ZONE, urand (6000, 10000));
+ break;
+ case EVENT_SHADOW_NOVA:
+ DoCastVictim(SPELL_SHADOW_NOVA, true);
+ Talk(SAY_SHADOW_NOVA);
+ events.ScheduleEvent(EVENT_SHADOW_NOVA, urand (6000, 10000));
+ break;
+ case EVENT_SEED_OF_CORRUPTION:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true))
+ DoCast(target, SPELL_SEED_OF_CORRUPTION);
+ events.ScheduleEvent(EVENT_SEED_OF_CORRUPTION, urand(12000, 20000));
+ break;
+ default:
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new boss_zereketh_the_unboundAI(creature);
+ }
+};
+
+void AddSC_boss_zereketh_the_unbound()
+{
+ new boss_zereketh_the_unbound();
+}
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp
index e836c5c4bf9..cb7cd3828e2 100644
--- a/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp
+++ b/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp
@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 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
@@ -16,217 +15,120 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Instance_Arcatraz
-SD%Complete: 80
-SDComment: Mainly Harbringer Skyriss event
-SDCategory: Tempest Keep, The Arcatraz
-EndScriptData */
-
#include "ScriptMgr.h"
#include "InstanceScript.h"
#include "arcatraz.h"
-#define MAX_ENCOUNTER 9
-
-enum Units
+DoorData const doorData[] =
{
- CONTAINMENT_CORE_SECURITY_FIELD_ALPHA = 184318, //door opened when Wrath-Scryer Soccothrates dies
- CONTAINMENT_CORE_SECURITY_FIELD_BETA = 184319, //door opened when Dalliah the Doomsayer dies
- POD_ALPHA = 183961, //pod first boss wave
- POD_BETA = 183963, //pod second boss wave
- POD_DELTA = 183964, //pod third boss wave
- POD_GAMMA = 183962, //pod fourth boss wave
- POD_OMEGA = 183965, //pod fifth boss wave
- WARDENS_SHIELD = 184802, // warden shield
- SEAL_SPHERE = 184802, //shield 'protecting' mellichar
-
- MELLICHAR = 20904, //skyriss will kill this unit
+ { GO_CONTAINMENT_CORE_SECURITY_FIELD_ALPHA, DATA_SOCCOTHRATES, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { GO_CONTAINMENT_CORE_SECURITY_FIELD_BETA, DATA_DALLIAH, DOOR_TYPE_PASSAGE, BOUNDARY_NONE },
+ { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END
};
-/* Arcatraz encounters:
-1 - Zereketh the Unbound event
-2 - Dalliah the Doomsayer event
-3 - Wrath-Scryer Soccothrates event
-4 - Harbinger Skyriss event, 5 sub-events
-*/
-
class instance_arcatraz : public InstanceMapScript
{
public:
- instance_arcatraz()
- : InstanceMapScript("instance_arcatraz", 552)
- {
- }
+ instance_arcatraz() : InstanceMapScript(ArcatrazScriptName, 552) { }
+
struct instance_arcatraz_InstanceMapScript : public InstanceScript
{
- instance_arcatraz_InstanceMapScript(Map* map) : InstanceScript(map) { }
-
- uint32 m_auiEncounter[MAX_ENCOUNTER];
+ instance_arcatraz_InstanceMapScript(Map* map) : InstanceScript(map)
+ {
+ SetBossNumber(EncounterCount);
+ LoadDoorData(doorData);
- uint64 Containment_Core_Security_Field_AlphaGUID;
- uint64 Containment_Core_Security_Field_BetaGUID;
- uint64 Pod_AlphaGUID;
- uint64 Pod_GammaGUID;
- uint64 Pod_BetaGUID;
- uint64 Pod_DeltaGUID;
- uint64 Pod_OmegaGUID;
- uint64 Wardens_ShieldGUID;
- uint64 GoSphereGUID;
- uint64 MellicharGUID;
+ DalliahGUID = 0;
+ SoccothratesGUID = 0;
+ MellicharGUID = 0;
+ WardensShieldGUID = 0;
- void Initialize() OVERRIDE
- {
- memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
+ ConversationState = NOT_STARTED;
- Containment_Core_Security_Field_AlphaGUID = 0;
- Containment_Core_Security_Field_BetaGUID = 0;
- Pod_AlphaGUID = 0;
- Pod_GammaGUID = 0;
- Pod_BetaGUID = 0;
- Pod_DeltaGUID = 0;
- Pod_OmegaGUID = 0;
- Wardens_ShieldGUID = 0;
- GoSphereGUID = 0;
- MellicharGUID = 0;
+ memset(StasisPodGUIDs, 0, 5 * sizeof(uint64));
+ memset(StasisPodStates, NOT_STARTED, 5 * sizeof(uint8));
}
- bool IsEncounterInProgress() const OVERRIDE
+ void OnCreatureCreate(Creature* creature) OVERRIDE
{
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (m_auiEncounter[i] == IN_PROGRESS)
- return true;
-
- return false;
+ switch (creature->GetEntry())
+ {
+ case NPC_DALLIAH:
+ DalliahGUID = creature->GetGUID();
+ break;
+ case NPC_SOCCOTHRATES:
+ SoccothratesGUID = creature->GetGUID();
+ break;
+ case NPC_MELLICHAR:
+ MellicharGUID = creature->GetGUID();
+ break;
+ default:
+ break;
+ }
}
void OnGameObjectCreate(GameObject* go) OVERRIDE
{
switch (go->GetEntry())
{
- case CONTAINMENT_CORE_SECURITY_FIELD_ALPHA:
- Containment_Core_Security_Field_AlphaGUID = go->GetGUID();
- break;
-
- case CONTAINMENT_CORE_SECURITY_FIELD_BETA:
- Containment_Core_Security_Field_BetaGUID = go->GetGUID();
- break;
-
- case POD_ALPHA:
- Pod_AlphaGUID = go->GetGUID();
- break;
-
- case POD_GAMMA:
- Pod_GammaGUID = go->GetGUID();
- break;
-
- case POD_BETA:
- Pod_BetaGUID = go->GetGUID();
- break;
-
- case POD_DELTA:
- Pod_DeltaGUID = go->GetGUID();
- break;
-
- case POD_OMEGA:
- Pod_OmegaGUID = go->GetGUID();
- break;
-
- case SEAL_SPHERE:
- GoSphereGUID = go->GetGUID();
- break;
-
- /*case WARDENS_SHIELD:
- Wardens_ShieldGUID = go->GetGUID();
- break;*/
+ case GO_CONTAINMENT_CORE_SECURITY_FIELD_ALPHA:
+ case GO_CONTAINMENT_CORE_SECURITY_FIELD_BETA:
+ AddDoor(go, true);
+ break;
+ case GO_STASIS_POD_ALPHA:
+ StasisPodGUIDs[0] = go->GetGUID();
+ break;
+ case GO_STASIS_POD_BETA:
+ StasisPodGUIDs[1] = go->GetGUID();
+ break;
+ case GO_STASIS_POD_DELTA:
+ StasisPodGUIDs[2] = go->GetGUID();
+ break;
+ case GO_STASIS_POD_GAMMA:
+ StasisPodGUIDs[3] = go->GetGUID();
+ break;
+ case GO_STASIS_POD_OMEGA:
+ StasisPodGUIDs[4] = go->GetGUID();
+ break;
+ case GO_WARDENS_SHIELD:
+ WardensShieldGUID = go->GetGUID();
+ break;
+ default:
+ break;
}
}
- void OnCreatureCreate(Creature* creature) OVERRIDE
+ void OnGameObjectRemove(GameObject* go) OVERRIDE
{
- if (creature->GetEntry() == MELLICHAR)
- MellicharGUID = creature->GetGUID();
+ switch (go->GetEntry())
+ {
+ case GO_CONTAINMENT_CORE_SECURITY_FIELD_ALPHA:
+ case GO_CONTAINMENT_CORE_SECURITY_FIELD_BETA:
+ AddDoor(go, false);
+ break;
+ default:
+ break;
+ }
}
void SetData(uint32 type, uint32 data) OVERRIDE
{
switch (type)
{
- case TYPE_ZEREKETH:
- m_auiEncounter[0] = data;
- break;
- case TYPE_DALLIAH:
- if (data == DONE)
- {
- if (GameObject* go = instance->GetGameObject(Containment_Core_Security_Field_BetaGUID))
- go->UseDoorOrButton();
- }
- m_auiEncounter[1] = data;
- break;
- case TYPE_SOCCOTHRATES:
- if (data == DONE)
- {
- if (GameObject* go = instance->GetGameObject(Containment_Core_Security_Field_AlphaGUID))
- go->UseDoorOrButton();
- }
- m_auiEncounter[2] = data;
- break;
- case TYPE_HARBINGERSKYRISS:
- if (data == NOT_STARTED || data == FAIL)
- {
- m_auiEncounter[4] = NOT_STARTED;
- m_auiEncounter[5] = NOT_STARTED;
- m_auiEncounter[6] = NOT_STARTED;
- m_auiEncounter[7] = NOT_STARTED;
- m_auiEncounter[8] = NOT_STARTED;
- }
- m_auiEncounter[3] = data;
- break;
- case TYPE_WARDEN_1:
- if (data == IN_PROGRESS)
- if (GameObject* go = instance->GetGameObject(Pod_AlphaGUID))
- go->UseDoorOrButton();
- m_auiEncounter[4] = data;
- break;
- case TYPE_WARDEN_2:
- if (data == IN_PROGRESS)
- {
- if (GameObject* go = instance->GetGameObject(Pod_BetaGUID))
- go->UseDoorOrButton();
- }
- m_auiEncounter[5] = data;
- break;
- case TYPE_WARDEN_3:
- if (data == IN_PROGRESS)
- {
- if (GameObject* go = instance->GetGameObject(Pod_DeltaGUID))
- go->UseDoorOrButton();
- }
- m_auiEncounter[6] = data;
- break;
- case TYPE_WARDEN_4:
- if (data == IN_PROGRESS)
- {
- if (GameObject* go = instance->GetGameObject(Pod_GammaGUID))
- go->UseDoorOrButton();
- }
- m_auiEncounter[7] = data;
- break;
- case TYPE_WARDEN_5:
- if (data == IN_PROGRESS)
- {
- if (GameObject* go = instance->GetGameObject(Pod_OmegaGUID))
- go->UseDoorOrButton();
- }
- m_auiEncounter[8] = data;
- break;
- case TYPE_SHIELD_OPEN:
- if (data == IN_PROGRESS)
- {
- if (GameObject* go = instance->GetGameObject(Wardens_ShieldGUID))
- go->UseDoorOrButton();
- }
- break;
+ case DATA_WARDEN_1:
+ case DATA_WARDEN_2:
+ case DATA_WARDEN_3:
+ case DATA_WARDEN_4:
+ case DATA_WARDEN_5:
+ if (data == IN_PROGRESS)
+ HandleGameObject(StasisPodGUIDs[type - DATA_WARDEN_1], true);
+ StasisPodStates[type - DATA_WARDEN_1] = uint8(data);
+ break;
+ case DATA_CONVERSATION:
+ ConversationState = uint8(data);
+ break;
+ default:
+ break;
}
}
@@ -234,12 +136,16 @@ class instance_arcatraz : public InstanceMapScript
{
switch (type)
{
- case TYPE_HARBINGERSKYRISS: return m_auiEncounter[3];
- case TYPE_WARDEN_1: return m_auiEncounter[4];
- case TYPE_WARDEN_2: return m_auiEncounter[5];
- case TYPE_WARDEN_3: return m_auiEncounter[6];
- case TYPE_WARDEN_4: return m_auiEncounter[7];
- case TYPE_WARDEN_5: return m_auiEncounter[8];
+ case DATA_WARDEN_1:
+ case DATA_WARDEN_2:
+ case DATA_WARDEN_3:
+ case DATA_WARDEN_4:
+ case DATA_WARDEN_5:
+ return StasisPodStates[type - DATA_WARDEN_1];
+ case DATA_CONVERSATION:
+ return ConversationState;
+ default:
+ break;
}
return 0;
}
@@ -248,11 +154,95 @@ class instance_arcatraz : public InstanceMapScript
{
switch (data)
{
- case DATA_MELLICHAR: return MellicharGUID;
- case DATA_SPHERE_SHIELD: return GoSphereGUID;
+ case DATA_DALLIAH:
+ return DalliahGUID;
+ case DATA_SOCCOTHRATES:
+ return SoccothratesGUID;
+ case DATA_MELLICHAR:
+ return MellicharGUID;
+ case DATA_WARDENS_SHIELD:
+ return WardensShieldGUID;
+ default:
+ break;
}
return 0;
}
+
+ bool SetBossState(uint32 type, EncounterState state) OVERRIDE
+ {
+ if (!InstanceScript::SetBossState(type, state))
+ return false;
+
+ switch (type)
+ {
+ case DATA_HARBINGER_SKYRISS:
+ if (state == NOT_STARTED || state == FAIL)
+ {
+ SetData(DATA_WARDEN_1, NOT_STARTED);
+ SetData(DATA_WARDEN_2, NOT_STARTED);
+ SetData(DATA_WARDEN_3, NOT_STARTED);
+ SetData(DATA_WARDEN_4, NOT_STARTED);
+ SetData(DATA_WARDEN_5, NOT_STARTED);
+ }
+ break;
+ default:
+ break;
+ }
+ return true;
+ }
+
+ std::string GetSaveData() OVERRIDE
+ {
+ OUT_SAVE_INST_DATA;
+
+ std::ostringstream saveStream;
+ saveStream << "A Z " << GetBossSaveData();
+
+ OUT_SAVE_INST_DATA_COMPLETE;
+ return saveStream.str();
+ }
+
+ void Load(char const* str) OVERRIDE
+ {
+ if (!str)
+ {
+ OUT_LOAD_INST_DATA_FAIL;
+ return;
+ }
+
+ OUT_LOAD_INST_DATA(str);
+
+ char dataHead1, dataHead2;
+
+ std::istringstream loadStream(str);
+ loadStream >> dataHead1 >> dataHead2;
+
+ if (dataHead1 == 'A' && dataHead2 == 'Z')
+ {
+ for (uint32 i = 0; i < EncounterCount; ++i)
+ {
+ uint32 tmpState;
+ loadStream >> tmpState;
+ if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
+ tmpState = NOT_STARTED;
+ SetBossState(i, EncounterState(tmpState));
+ }
+ }
+ else
+ OUT_LOAD_INST_DATA_FAIL;
+
+ OUT_LOAD_INST_DATA_COMPLETE;
+ }
+
+ protected:
+ uint64 DalliahGUID;
+ uint64 SoccothratesGUID;
+ uint64 StasisPodGUIDs[5];
+ uint64 MellicharGUID;
+ uint64 WardensShieldGUID;
+
+ uint8 ConversationState;
+ uint8 StasisPodStates[5];
};
InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE
@@ -263,6 +253,6 @@ class instance_arcatraz : public InstanceMapScript
void AddSC_instance_arcatraz()
{
- new instance_arcatraz;
+ new instance_arcatraz();
}
diff --git a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp
index a005153a4fc..167fd7f2074 100644
--- a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp
+++ b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp
@@ -19,7 +19,7 @@
/* ScriptData
SDName: Blades_Edge_Mountains
SD%Complete: 90
-SDComment: Quest support: 10503, 10504, 10556, 10609, 10682, 10821, 10980. Ogri'la->Skettis Flight. (npc_daranelle needs bit more work before consider complete)
+SDComment: Quest support: 10503, 10504, 10556, 10594, 10609, 10682, 10821, 10980. Ogri'la->Skettis Flight. (npc_daranelle needs bit more work before consider complete)
SDCategory: Blade's Edge Mountains
EndScriptData */
@@ -40,6 +40,10 @@ EndContentData */
#include "GridNotifiersImpl.h"
#include "Cell.h"
#include "CellImpl.h"
+#include "SpellInfo.h"
+#include "SpellScript.h"
+#include "SpellAuras.h"
+#include "SpellAuraEffects.h"
//Support for quest: You're Fired! (10821)
bool obelisk_one, obelisk_two, obelisk_three, obelisk_four, obelisk_five;
@@ -1143,6 +1147,99 @@ class go_apexis_relic : public GameObjectScript
}
};
+/*######
+## npc_oscillating_frequency_scanner_master_bunny used for quest 10594 "Gauging the Resonant Frequency"
+######*/
+
+enum ScannerMasterBunny
+{
+ NPC_OSCILLATING_FREQUENCY_SCANNER_TOP_BUNNY = 21759,
+ SPELL_OSCILLATION_FIELD = 37408,
+ QUEST_GAUGING_THE_RESONANT_FREQUENCY = 10594
+};
+
+class npc_oscillating_frequency_scanner_master_bunny : public CreatureScript
+{
+public:
+ npc_oscillating_frequency_scanner_master_bunny() : CreatureScript("npc_oscillating_frequency_scanner_master_bunny") { }
+
+ struct npc_oscillating_frequency_scanner_master_bunnyAI : public ScriptedAI
+ {
+ npc_oscillating_frequency_scanner_master_bunnyAI(Creature* creature) : ScriptedAI(creature) { }
+
+ void Reset() OVERRIDE
+ {
+ if (GetClosestCreatureWithEntry(me, NPC_OSCILLATING_FREQUENCY_SCANNER_TOP_BUNNY, 25.0f))
+ me->DespawnOrUnsummon();
+ else
+ {
+ // Spell 37392 does not exist in dbc, manually spawning
+ me->SummonCreature(21759, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ() + 0.5f, me->GetOrientation(), TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 50000);
+ me->SummonGameObject(184926, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), 0, 0, 0, 0, 50000);
+ me->DespawnOrUnsummon(50000);
+ }
+
+ timer = 500;
+ }
+
+ void IsSummonedBy(Unit* summoner) OVERRIDE
+ {
+ if (summoner->isType(TYPEMASK_PLAYER))
+ playerGuid = summoner->GetGUID();
+ }
+
+ void UpdateAI(uint32 diff) OVERRIDE
+ {
+ if (timer <= diff)
+ {
+ if (Player* player = ObjectAccessor::GetPlayer(*me, playerGuid))
+ DoCast(player, SPELL_OSCILLATION_FIELD);
+
+ timer = 3000;
+ }
+ else
+ timer -= diff;
+ }
+
+ private:
+ uint64 playerGuid;
+ uint32 timer;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const OVERRIDE
+ {
+ return new npc_oscillating_frequency_scanner_master_bunnyAI(creature);
+ }
+};
+
+class spell_oscillating_field : public SpellScriptLoader
+{
+ public:
+ spell_oscillating_field() : SpellScriptLoader("spell_oscillating_field") { }
+
+ class spell_oscillating_field_SpellScript : public SpellScript
+ {
+ PrepareSpellScript(spell_oscillating_field_SpellScript);
+
+ void HandleEffect(SpellEffIndex /*effIndex*/)
+ {
+ if (Player* player = GetHitPlayer())
+ if (player->GetAuraCount(SPELL_OSCILLATION_FIELD) == 5 && player->GetQuestStatus(QUEST_GAUGING_THE_RESONANT_FREQUENCY) == QUEST_STATUS_INCOMPLETE)
+ player->CompleteQuest(QUEST_GAUGING_THE_RESONANT_FREQUENCY);
+ }
+
+ void Register() OVERRIDE
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_oscillating_field_SpellScript::HandleEffect, EFFECT_0, SPELL_EFFECT_APPLY_AURA);
+ }
+ };
+
+ SpellScript* GetSpellScript() const OVERRIDE
+ {
+ return new spell_oscillating_field_SpellScript();
+ }
+};
+
void AddSC_blades_edge_mountains()
{
new npc_bladespire_ogre();
@@ -1157,4 +1254,6 @@ void AddSC_blades_edge_mountains()
new npc_simon_bunny();
new go_simon_cluster();
new go_apexis_relic();
+ new npc_oscillating_frequency_scanner_master_bunny();
+ new spell_oscillating_field();
}
diff --git a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
index db25f9f6158..41abc490d2b 100644
--- a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
+++ b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
@@ -1286,7 +1286,7 @@ public:
me->SetTarget(0);
}
- void EnterCombat(Unit* /*who*/)OVERRIDE { }
+ void EnterCombat(Unit* /*who*/) OVERRIDE { }
void HandleAnimation()
{
@@ -1818,7 +1818,7 @@ public:
void Reset() OVERRIDE { }
- void EnterCombat(Unit* /*who*/)OVERRIDE { }
+ void EnterCombat(Unit* /*who*/) OVERRIDE { }
void JustDied(Unit* /*killer*/) OVERRIDE
{