diff options
7 files changed, 277 insertions, 318 deletions
diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/arcatraz.cpp index cd3fe507592..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(DATA_WARDEN_2) == DONE) - Init = true; + if (instance->GetData(DATA_WARDEN_2) == DONE) + Init = true; - if (instance->GetData(DATA_HARBINGERSKYRISS) == DONE) - Talk(SAY_COMPLETE); - } + if (instance->GetBossState(DATA_HARBINGER_SKYRISS) == DONE) + Talk(SAY_COMPLETE); } void AttackStart(Unit* who) 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(DATA_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(DATA_HARBINGERSKYRISS, NOT_STARTED); + instance->SetBossState(DATA_HARBINGER_SKYRISS, NOT_STARTED); } void AttackStart(Unit* /*who*/) OVERRIDE { } void MoveInLineOfSight(Unit* who) OVERRIDE - { if (IsRunning) return; @@ -334,50 +322,42 @@ class npc_warden_mellichar : public CreatureScript Talk(YELL_INTRO1); DoCast(me, SPELL_BUBBLE_VISUAL); - if (instance) - { - instance->SetData(DATA_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(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->GetData(DATA_HARBINGERSKYRISS) == IN_PROGRESS) - return true; - if (Phase == 1 && instance->GetData(DATA_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(DATA_WARDEN_1, IN_PROGRESS); - instance->HandleGameObject(instance->GetData64(DATA_SPHERE_SHIELD), false); + instance->HandleGameObject(instance->GetData64(DATA_WARDENS_SHIELD), false); break; case 3: DoCast(me, SPELL_TARGET_BETA); @@ -394,9 +374,8 @@ class npc_warden_mellichar : public CreatureScript case 7: 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(DATA_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 038d94fc960..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 @@ -19,46 +18,53 @@ #ifndef ARCATRAZ_H #define ARCATRAZ_H -uint32 const EncounterCount = 13; +#define ArcatrazScriptName "instance_arcatraz" -#define AScriptName "instance_arcatraz" +uint32 const EncounterCount = 4; enum DataTypes { - DATA_ZEREKETH = 1, - DATA_DALLIAH = 2, - DATA_SOCCOTHRATES = 3, - DATA_HARBINGERSKYRISS = 4, - DATA_WARDEN_1 = 5, - DATA_WARDEN_2 = 6, - DATA_WARDEN_3 = 7, - DATA_WARDEN_4 = 8, - DATA_WARDEN_5 = 9, - DATA_MELLICHAR = 10, - DATA_SHIELD_OPEN = 11, - DATA_SPHERE_SHIELD = 12, - DATA_CONVERSATION = 13 + // 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 CreaturesIds +enum CreatureIds { - NPC_MELLICHAR = 20904, //skyriss will kill this unit - NPC_ALPHA_POD_TARGET = 21436, - NPC_DALLIAH = 20885, - NPC_SOCCOTHRATES = 20886 + NPC_DALLIAH = 20885, + NPC_SOCCOTHRATES = 20886, + NPC_MELLICHAR = 20904, // skyriss will kill this unit + NPC_ALPHA_POD_TARGET = 21436 }; -enum GameObjectsIds +enum GameObjectIds { - 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 + 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 index eacd5b3835e..b5947e93216 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_dalliah_the_doomsayer.cpp @@ -15,19 +15,13 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -SDName: boss_dalliah_the_doomsayer -SD%Complete: 100% -SDComment: -SDCategory: Tempest Keep, The Arcatraz -EndScriptData */ - #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "arcatraz.h" enum Say { + // Dalliah the Doomsayer SAY_AGGRO = 1, SAY_SLAY = 2, SAY_WHIRLWIND = 3, @@ -35,7 +29,7 @@ enum Say SAY_DEATH = 5, SAY_SOCCOTHRATES_DEATH = 7, - // boss_wrath_scryer_soccothrates + // Wrath-Scryer Soccothrates SAY_AGGRO_DALLIAH_FIRST = 0, SAY_DALLIAH_25_PERCENT = 5 }; @@ -78,7 +72,7 @@ class boss_dalliah_the_doomsayer : public CreatureScript _JustDied(); Talk(SAY_DEATH); - if (Creature* soccothrates = me->GetCreature(*me, soccothratesGUID)) + if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, soccothratesGUID)) if (soccothrates->IsAlive() && !soccothrates->IsInCombat()) soccothrates->AI()->SetData(1, 1); } @@ -110,9 +104,8 @@ class boss_dalliah_the_doomsayer : public CreatureScript events.ScheduleEvent(EVENT_SOCCOTHRATES_DEATH, 6000); soccothratesDeath = true; break; - break; - default: - break; + default: + break; } } @@ -168,7 +161,7 @@ class boss_dalliah_the_doomsayer : public CreatureScript events.ScheduleEvent(EVENT_SHADOW_WAVE, urand(11000, 16000)); break; case EVENT_ME_FIRST: - if (Creature* soccothrates = me->GetCreature(*me, soccothratesGUID)) + if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, soccothratesGUID)) if (soccothrates->IsAlive() && !soccothrates->IsInCombat()) soccothrates->AI()->Talk(SAY_AGGRO_DALLIAH_FIRST); break; @@ -179,7 +172,7 @@ class boss_dalliah_the_doomsayer : public CreatureScript if (HealthBelowPct(25) && !soccothratesTaunt) { - if (Creature* soccothrates = me->GetCreature(*me, soccothratesGUID)) + if (Creature* soccothrates = ObjectAccessor::GetCreature(*me, soccothratesGUID)) soccothrates->AI()->Talk(SAY_DALLIAH_25_PERCENT); soccothratesTaunt = true; } 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 3748b704e0a..48d955acbc3 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_harbinger_skyriss.cpp @@ -65,7 +65,7 @@ class boss_harbinger_skyriss : public CreatureScript struct boss_harbinger_skyrissAI : public BossAI { - boss_harbinger_skyrissAI(Creature* creature) : BossAI(creature, DATA_HARBINGERSKYRISS) + boss_harbinger_skyrissAI(Creature* creature) : BossAI(creature, DATA_HARBINGER_SKYRISS) { Intro = false; } @@ -98,7 +98,6 @@ class boss_harbinger_skyriss : public CreatureScript } void MoveInLineOfSight(Unit* who) OVERRIDE - { if (!Intro) return; @@ -153,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(DATA_SHIELD_OPEN, IN_PROGRESS); + instance->HandleGameObject(instance->GetData64(DATA_WARDENS_SHIELD), false); } ++Intro_Phase; Intro_Timer = 3000; @@ -268,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 index 8d4b18b4d47..046ef93bf10 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_wrath_scryer_soccothrates.cpp @@ -28,7 +28,7 @@ EndScriptData */ enum Say { - // boss_wrath_scryer_soccothrates + // Wrath-Scryer Soccothrates SAY_AGGRO = 1, SAY_SLAY = 2, SAY_KNOCK_AWAY = 3, @@ -39,7 +39,7 @@ enum Say SAY_SOCCOTHRATES_CONVO_3 = 9, SAY_SOCCOTHRATES_CONVO_4 = 10, - // boss_dalliah_the_doomsayer + // Dalliah the Doomsayer SAY_AGGRO_SOCCOTHRATES_FIRST = 0, SAY_SOCCOTHRATES_25_PERCENT = 6, SAY_DALLIAH_CONVO_1 = 8, @@ -98,7 +98,7 @@ class boss_wrath_scryer_soccothrates : public CreatureScript _JustDied(); Talk(SAY_DEATH); - if (Creature* dalliah = me->GetCreature(*me, dalliahGUID)) + if (Creature* dalliah = ObjectAccessor::GetCreature(*me, dalliahGUID)) if (dalliah->IsAlive() && !dalliah->IsInCombat()) dalliah->AI()->SetData(1, 1); } @@ -145,9 +145,8 @@ class boss_wrath_scryer_soccothrates : public CreatureScript events.ScheduleEvent(EVENT_DALLIAH_DEATH, 6000); dalliahDeath = true; break; - break; - default: - break; + default: + break; } } @@ -164,7 +163,7 @@ class boss_wrath_scryer_soccothrates : public CreatureScript switch (eventId) { case EVENT_PREFIGHT_1: - if (Creature* dalliah = me->GetCreature(*me, dalliahGUID)) + if (Creature* dalliah = ObjectAccessor::GetCreature(*me, dalliahGUID)) dalliah->AI()->Talk(SAY_DALLIAH_CONVO_1); events.ScheduleEvent(EVENT_PREFIGHT_2, 3000); break; @@ -173,7 +172,7 @@ class boss_wrath_scryer_soccothrates : public CreatureScript events.ScheduleEvent(EVENT_PREFIGHT_3, 3000); break; case EVENT_PREFIGHT_3: - if (Creature* dalliah = me->GetCreature(*me, dalliahGUID)) + if (Creature* dalliah = ObjectAccessor::GetCreature(*me, dalliahGUID)) dalliah->AI()->Talk(SAY_DALLIAH_CONVO_2); events.ScheduleEvent(EVENT_PREFIGHT_4, 6000); break; @@ -182,7 +181,7 @@ class boss_wrath_scryer_soccothrates : public CreatureScript events.ScheduleEvent(EVENT_PREFIGHT_5, 2000); break; case EVENT_PREFIGHT_5: - if (Creature* dalliah = me->GetCreature(*me, dalliahGUID)) + if (Creature* dalliah = ObjectAccessor::GetCreature(*me, dalliahGUID)) dalliah->AI()->Talk(SAY_DALLIAH_CONVO_3); events.ScheduleEvent(EVENT_PREFIGHT_6, 3000); break; @@ -191,7 +190,7 @@ class boss_wrath_scryer_soccothrates : public CreatureScript events.ScheduleEvent(EVENT_PREFIGHT_7, 2000); break; case EVENT_PREFIGHT_7: - if (Creature* dalliah = me->GetCreature(*me, dalliahGUID)) + if (Creature* dalliah = ObjectAccessor::GetCreature(*me, dalliahGUID)) dalliah->GetMotionMaster()->MovePoint(0, 118.6048f, 96.84852f, 22.44115f); events.ScheduleEvent(EVENT_PREFIGHT_8, 4000); break; @@ -200,7 +199,7 @@ class boss_wrath_scryer_soccothrates : public CreatureScript events.ScheduleEvent(EVENT_PREFIGHT_9, 4000); break; case EVENT_PREFIGHT_9: - if (Creature* dalliah = me->GetCreature(*me, dalliahGUID)) + if (Creature* dalliah = ObjectAccessor::GetCreature(*me, dalliahGUID)) { dalliah->SetFacingToObject(me); me->SetFacingToObject(dalliah); @@ -254,7 +253,7 @@ class boss_wrath_scryer_soccothrates : public CreatureScript events.ScheduleEvent(EVENT_KNOCK_AWAY, urand(11000, 12000)); break; case EVENT_ME_FIRST: - if (Creature* dalliah = me->GetCreature(*me, dalliahGUID)) + if (Creature* dalliah = ObjectAccessor::GetCreature(*me, dalliahGUID)) if (dalliah->IsAlive() && !dalliah->IsInCombat()) dalliah->AI()->Talk(SAY_AGGRO_SOCCOTHRATES_FIRST); break; @@ -265,7 +264,7 @@ class boss_wrath_scryer_soccothrates : public CreatureScript if (HealthBelowPct(25) && !dalliahTaunt) { - if (Creature* dalliah = me->GetCreature(*me, dalliahGUID)) + if (Creature* dalliah = ObjectAccessor::GetCreature(*me, dalliahGUID)) dalliah->AI()->Talk(SAY_SOCCOTHRATES_25_PERCENT); dalliahTaunt = true; } 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 index 062c88bb666..7659f191ff7 100644 --- a/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp +++ b/src/server/scripts/Outland/TempestKeep/arcatraz/boss_zereketh_the_unbound.cpp @@ -15,13 +15,6 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -SDName: boss_zereketh_the_unbound -SD%Complete: 100% -SDComment: -SDCategory: Tempest Keep, The Arcatraz -EndScriptData */ - #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "arcatraz.h" diff --git a/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp b/src/server/scripts/Outland/TempestKeep/arcatraz/instance_arcatraz.cpp index 43f4a98c8cf..0145636f9d2 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,203 +15,122 @@ * 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" -/* Arcatraz encounters: -1 - Zereketh the Unbound event -2 - Dalliah the Doomsayer event -3 - Wrath-Scryer Soccothrates event -4 - Harbinger Skyriss event, 5 sub-events -*/ +DoorData const doorData[] = +{ + { 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 +}; class instance_arcatraz : public InstanceMapScript { public: - instance_arcatraz() - : InstanceMapScript(AScriptName, 552) - { - } + instance_arcatraz() : InstanceMapScript(ArcatrazScriptName, 552) { } + struct instance_arcatraz_InstanceMapScript : public InstanceScript { - instance_arcatraz_InstanceMapScript(Map* map) : InstanceScript(map) { } - - uint32 m_auiEncounter[EncounterCount]; - - 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; - - void Initialize() OVERRIDE + instance_arcatraz_InstanceMapScript(Map* map) : InstanceScript(map) { - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); - - 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; + SetBossNumber(EncounterCount); + LoadDoorData(doorData); + + MellicharGUID = 0; + WardensShieldGUID = 0; + + ConversationState = NOT_STARTED; + + 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 < EncounterCount; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) - return true; - - return false; + if (creature->GetEntry() == NPC_MELLICHAR) + MellicharGUID = creature->GetGUID(); } 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() == NPC_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 DATA_ZEREKETH: - m_auiEncounter[0] = data; - break; - case DATA_DALLIAH: - if (data == DONE) - { - if (GameObject* go = instance->GetGameObject(Containment_Core_Security_Field_BetaGUID)) - go->UseDoorOrButton(); - } - m_auiEncounter[1] = data; - break; - case DATA_SOCCOTHRATES: - if (data == DONE) - { - if (GameObject* go = instance->GetGameObject(Containment_Core_Security_Field_AlphaGUID)) - go->UseDoorOrButton(); - } - m_auiEncounter[2] = data; - break; - case DATA_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 DATA_WARDEN_1: - if (data == IN_PROGRESS) - if (GameObject* go = instance->GetGameObject(Pod_AlphaGUID)) - go->UseDoorOrButton(); - m_auiEncounter[4] = data; - break; - case DATA_WARDEN_2: - if (data == IN_PROGRESS) - { - if (GameObject* go = instance->GetGameObject(Pod_BetaGUID)) - go->UseDoorOrButton(); - } - m_auiEncounter[5] = data; - break; - case DATA_WARDEN_3: - if (data == IN_PROGRESS) - { - if (GameObject* go = instance->GetGameObject(Pod_DeltaGUID)) - go->UseDoorOrButton(); - } - m_auiEncounter[6] = data; - break; - case DATA_WARDEN_4: - if (data == IN_PROGRESS) - { - if (GameObject* go = instance->GetGameObject(Pod_GammaGUID)) - go->UseDoorOrButton(); - } - m_auiEncounter[7] = data; - break; - case DATA_WARDEN_5: - if (data == IN_PROGRESS) - { - if (GameObject* go = instance->GetGameObject(Pod_OmegaGUID)) - go->UseDoorOrButton(); - } - m_auiEncounter[8] = data; - break; - case DATA_SHIELD_OPEN: - if (data == IN_PROGRESS) - { - if (GameObject* go = instance->GetGameObject(Wardens_ShieldGUID)) - go->UseDoorOrButton(); - } - break; - case DATA_CONVERSATION: - m_auiEncounter[12] = data; - break; + case DATA_WARDEN_1: + if (data == IN_PROGRESS) + HandleGameObject(StasisPodGUIDs[0], true); + StasisPodStates[0] = uint8(data); + break; + case DATA_WARDEN_2: + if (data == IN_PROGRESS) + HandleGameObject(StasisPodGUIDs[1], true); + StasisPodStates[1] = uint8(data); + break; + case DATA_WARDEN_3: + if (data == IN_PROGRESS) + HandleGameObject(StasisPodGUIDs[2], true); + StasisPodStates[2] = uint8(data); + break; + case DATA_WARDEN_4: + if (data == IN_PROGRESS) + HandleGameObject(StasisPodGUIDs[3], true); + StasisPodStates[3] = uint8(data); + break; + case DATA_WARDEN_5: + if (data == IN_PROGRESS) + HandleGameObject(StasisPodGUIDs[4], true); + StasisPodStates[4] = uint8(data); + break; + case DATA_CONVERSATION: + ConversationState = uint8(data); + break; + default: + break; } } @@ -220,13 +138,16 @@ class instance_arcatraz : public InstanceMapScript { switch (type) { - case DATA_HARBINGERSKYRISS: return m_auiEncounter[3]; - case DATA_WARDEN_1: return m_auiEncounter[4]; - case DATA_WARDEN_2: return m_auiEncounter[5]; - case DATA_WARDEN_3: return m_auiEncounter[6]; - case DATA_WARDEN_4: return m_auiEncounter[7]; - case DATA_WARDEN_5: return m_auiEncounter[8]; - case DATA_CONVERSATION: return m_auiEncounter[12]; + 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; } @@ -235,11 +156,89 @@ class instance_arcatraz : public InstanceMapScript { switch (data) { - case DATA_MELLICHAR: return MellicharGUID; - case DATA_SPHERE_SHIELD: return GoSphereGUID; + 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 StasisPodGUIDs[5]; + uint64 MellicharGUID; + uint64 WardensShieldGUID; + + uint8 ConversationState; + uint8 StasisPodStates[5]; }; InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE @@ -250,6 +249,6 @@ class instance_arcatraz : public InstanceMapScript void AddSC_instance_arcatraz() { - new instance_arcatraz; + new instance_arcatraz(); } |
