Scripts/Arcatraz: cleanup InstanceScript to make it work with BossAI

This commit is contained in:
joschiwald
2013-11-26 15:38:02 +01:00
parent b069ade49b
commit 00d5c59f5b
7 changed files with 281 additions and 322 deletions
@@ -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);
}
};
@@ -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
@@ -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;
}
@@ -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) { }
@@ -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;
}
@@ -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"
@@ -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,113 +15,36 @@
* 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));
SetBossNumber(EncounterCount);
LoadDoorData(doorData);
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;
}
MellicharGUID = 0;
WardensShieldGUID = 0;
bool IsEncounterInProgress() const OVERRIDE
{
for (uint8 i = 0; i < EncounterCount; ++i)
if (m_auiEncounter[i] == IN_PROGRESS)
return true;
ConversationState = NOT_STARTED;
return false;
}
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;*/
}
memset(StasisPodGUIDs, 0, 5 * sizeof(uint64));
memset(StasisPodStates, NOT_STARTED, 5 * sizeof(uint8));
}
void OnCreatureCreate(Creature* creature) OVERRIDE
@@ -131,88 +53,84 @@ class instance_arcatraz : public InstanceMapScript
MellicharGUID = creature->GetGUID();
}
void OnGameObjectCreate(GameObject* go) OVERRIDE
{
switch (go->GetEntry())
{
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 OnGameObjectRemove(GameObject* go) OVERRIDE
{
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();
}