Scripts/Karazhan: Clean up instance script

Closes: #16533
(cherry picked from commit f9eff81388b12f6f8275f892c67bf197188c3450)
This commit is contained in:
Nyeriah
2016-04-08 22:22:32 +02:00
committed by Shauren
parent a168a2d442
commit 39c6f1ce3b
10 changed files with 239 additions and 271 deletions
@@ -50,19 +50,9 @@ class boss_maiden_of_virtue : public CreatureScript
public:
boss_maiden_of_virtue() : CreatureScript("boss_maiden_of_virtue") { }
CreatureAI* GetAI(Creature* creature) const override
{
return new boss_maiden_of_virtueAI(creature);
}
struct boss_maiden_of_virtueAI : public BossAI
{
boss_maiden_of_virtueAI(Creature* creature) : BossAI(creature, TYPE_MAIDEN) { }
void Reset() override
{
_Reset();
}
boss_maiden_of_virtueAI(Creature* creature) : BossAI(creature, DATA_MAIDEN_OF_VIRTUE) { }
void KilledUnit(Unit* /*Victim*/) override
{
@@ -132,6 +122,11 @@ public:
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* creature) const override
{
return new boss_maiden_of_virtueAI(creature);
}
};
void AddSC_boss_maiden_of_virtue()
@@ -26,6 +26,7 @@ EndScriptData */
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "SpellInfo.h"
#include "karazhan.h"
enum Midnight
{
@@ -109,6 +110,9 @@ public:
Talk(SAY_DEATH);
if (Unit* midnight = ObjectAccessor::GetUnit(*me, Midnight))
midnight->KillSelf();
if (InstanceScript* instance = me->GetInstanceScript())
instance->SetBossState(DATA_ATTUMEN, DONE);
}
void UpdateAI(uint32 diff) override;
@@ -157,7 +161,11 @@ public:
me->SetVisible(true);
}
void EnterCombat(Unit* /*who*/) override { }
void EnterCombat(Unit* /*who*/) override
{
if (InstanceScript* instance = me->GetInstanceScript())
instance->SetBossState(DATA_ATTUMEN, IN_PROGRESS);
}
void KilledUnit(Unit* /*victim*/) override
{
@@ -143,12 +143,12 @@ public:
if (me->IsAlive())
SpawnAdds();
instance->SetData(TYPE_MOROES, NOT_STARTED);
instance->SetBossState(DATA_MOROES, NOT_STARTED);
}
void StartEvent()
{
instance->SetData(TYPE_MOROES, IN_PROGRESS);
instance->SetBossState(DATA_MOROES, IN_PROGRESS);
DoZoneInCombat();
}
@@ -171,7 +171,7 @@ public:
{
Talk(SAY_DEATH);
instance->SetData(TYPE_MOROES, DONE);
instance->SetBossState(DATA_MOROES, DONE);
DeSpawnAdds();
@@ -257,12 +257,6 @@ public:
if (!UpdateVictim())
return;
if (!instance->GetData(TYPE_MOROES))
{
EnterEvadeMode();
return;
}
if (!Enrage && HealthBelowPct(30))
{
DoCast(me, SPELL_FRENZY);
@@ -347,7 +341,7 @@ struct boss_moroes_guestAI : public ScriptedAI
void Reset() override
{
instance->SetData(TYPE_MOROES, NOT_STARTED);
instance->SetBossState(DATA_MOROES, NOT_STARTED);
}
void AcquireGUID()
@@ -378,7 +372,7 @@ struct boss_moroes_guestAI : public ScriptedAI
void UpdateAI(uint32 /*diff*/) override
{
if (!instance->GetData(TYPE_MOROES))
if (instance->GetBossState(DATA_MOROES) != IN_PROGRESS)
EnterEvadeMode();
DoMeleeAttackIfReady();
@@ -143,10 +143,10 @@ public:
me->SetWalk(false);
me->setActive(true);
if (instance->GetData(TYPE_NIGHTBANE) == DONE || instance->GetData(TYPE_NIGHTBANE) == IN_PROGRESS)
if (instance->GetBossState(DATA_NIGHTBANE) == DONE || instance->GetBossState(DATA_NIGHTBANE) == IN_PROGRESS)
me->DisappearAndDie();
else
instance->SetData(TYPE_NIGHTBANE, NOT_STARTED);
instance->SetBossState(DATA_NIGHTBANE, NOT_STARTED);
HandleTerraceDoors(true);
@@ -165,10 +165,10 @@ public:
void EnterCombat(Unit* /*who*/) override
{
instance->SetData(TYPE_NIGHTBANE, IN_PROGRESS);
instance->SetBossState(DATA_NIGHTBANE, IN_PROGRESS);
HandleTerraceDoors(false);
Talk(YELL_AGGRO);
Talk(YELL_AGGRO);
}
void AttackStart(Unit* who) override
@@ -179,7 +179,7 @@ public:
void JustDied(Unit* /*killer*/) override
{
instance->SetData(TYPE_NIGHTBANE, DONE);
instance->SetBossState(DATA_NIGHTBANE, DONE);
HandleTerraceDoors(true);
}
@@ -154,7 +154,7 @@ public:
Initialize();
// Not in progress
instance->SetData(TYPE_ARAN, NOT_STARTED);
instance->SetBossState(DATA_ARAN, NOT_STARTED);
instance->HandleGameObject(instance->GetGuidData(DATA_GO_LIBRARY_DOOR), true);
}
@@ -167,7 +167,7 @@ public:
{
Talk(SAY_DEATH);
instance->SetData(TYPE_ARAN, DONE);
instance->SetBossState(DATA_ARAN, DONE);
instance->HandleGameObject(instance->GetGuidData(DATA_GO_LIBRARY_DOOR), true);
}
@@ -175,7 +175,7 @@ public:
{
Talk(SAY_AGGRO);
instance->SetData(TYPE_ARAN, IN_PROGRESS);
instance->SetBossState(DATA_ARAN, IN_PROGRESS);
instance->HandleGameObject(instance->GetGuidData(DATA_GO_LIBRARY_DOOR), false);
}
@@ -61,7 +61,6 @@ enum Creatures
NPC_DEMONCHAINS = 17248,
NPC_FIENDISHIMP = 17267,
NPC_PORTAL = 17265,
NPC_KILREK = 17229
};
class npc_kilrek : public CreatureScript
@@ -315,7 +314,7 @@ public:
Initialize();
instance->SetData(TYPE_TERESTIAN, NOT_STARTED);
instance->SetBossState(DATA_TERESTIAN, NOT_STARTED);
me->RemoveAurasDueToSpell(SPELL_BROKEN_PACT);
@@ -370,7 +369,7 @@ public:
Talk(SAY_DEATH);
instance->SetData(TYPE_TERESTIAN, DONE);
instance->SetBossState(DATA_TERESTIAN, DONE);
}
void UpdateAI(uint32 diff) override
@@ -708,13 +708,7 @@ public:
void JustDied(Unit* /*killer*/) override
{
Talk(SAY_CRONE_DEATH);
instance->SetData(TYPE_OPERA, DONE);
instance->HandleGameObject(instance->GetGuidData(DATA_GO_STAGEDOORLEFT), true);
instance->HandleGameObject(instance->GetGuidData(DATA_GO_STAGEDOORRIGHT), true);
if (GameObject* pSideEntrance = instance->instance->GetGameObject(instance->GetGuidData(DATA_GO_SIDE_ENTRANCE_DOOR)))
pSideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED);
instance->SetBossState(DATA_OPERA_PERFORMANCE, DONE);
}
void UpdateAI(uint32 diff) override
@@ -908,13 +902,7 @@ public:
void JustDied(Unit* /*killer*/) override
{
DoPlaySoundToSet(me, SOUND_WOLF_DEATH);
instance->SetData(TYPE_OPERA, DONE);
instance->HandleGameObject(instance->GetGuidData(DATA_GO_STAGEDOORLEFT), true);
instance->HandleGameObject(instance->GetGuidData(DATA_GO_STAGEDOORRIGHT), true);
if (GameObject* pSideEntrance = instance->instance->GetGameObject(instance->GetGuidData(DATA_GO_SIDE_ENTRANCE_DOOR)))
pSideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED);
instance->SetBossState(DATA_OPERA_PERFORMANCE, DONE);
}
void UpdateAI(uint32 diff) override
@@ -1158,12 +1146,7 @@ public:
void JustDied(Unit* /*killer*/) override
{
Talk(SAY_JULIANNE_DEATH02);
instance->SetData(TYPE_OPERA, DONE);
instance->HandleGameObject(instance->GetGuidData(DATA_GO_STAGEDOORLEFT), true);
instance->HandleGameObject(instance->GetGuidData(DATA_GO_STAGEDOORRIGHT), true);
if (GameObject* pSideEntrance = instance->instance->GetGameObject(instance->GetGuidData(DATA_GO_SIDE_ENTRANCE_DOOR)))
pSideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED);
instance->SetBossState(DATA_OPERA_PERFORMANCE, DONE);
}
void KilledUnit(Unit* /*victim*/) override
@@ -1316,13 +1299,7 @@ public:
void JustDied(Unit* /*killer*/) override
{
Talk(SAY_ROMULO_DEATH);
instance->SetData(TYPE_OPERA, DONE);
instance->HandleGameObject(instance->GetGuidData(DATA_GO_STAGEDOORLEFT), true);
instance->HandleGameObject(instance->GetGuidData(DATA_GO_STAGEDOORRIGHT), true);
if (GameObject* pSideEntrance = instance->instance->GetGameObject(instance->GetGuidData(DATA_GO_SIDE_ENTRANCE_DOOR)))
pSideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED);
instance->SetBossState(DATA_OPERA_PERFORMANCE, DONE);
}
void KilledUnit(Unit* /*victim*/) override
@@ -27,8 +27,6 @@ EndScriptData */
#include "InstanceScript.h"
#include "karazhan.h"
#define MAX_ENCOUNTER 12
/*
0 - Attumen + Midnight (optional)
1 - Moroes
@@ -47,8 +45,8 @@ EndScriptData */
const Position OptionalSpawn[] =
{
{ -10960.981445f, -1940.138428f, 46.178097f, 4.12f }, // Hyakiss the Lurker
{ -10899.903320f, -2085.573730f, 49.474449f, 1.38f }, // Rokad the Ravager
{ -10945.769531f, -2040.153320f, 49.474438f, 0.077f } // Shadikith the Glider
{ -10945.769531f, -2040.153320f, 49.474438f, 0.077f }, // Shadikith the Glider
{ -10899.903320f, -2085.573730f, 49.474449f, 1.38f } // Rokad the Ravager
};
class instance_karazhan : public InstanceMapScript
@@ -66,53 +64,27 @@ public:
instance_karazhan_InstanceMapScript(Map* map) : InstanceScript(map)
{
SetHeaders(DataHeader);
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
SetBossNumber(EncounterCount);
// 1 - OZ, 2 - HOOD, 3 - RAJ, this never gets altered.
m_uiOperaEvent = urand(1, 3);
m_uiOzDeathCount = 0;
OperaEvent = urand(EVENT_OZ, EVENT_RAJ);
OzDeathCount = 0;
OptionalBossCount = 0;
}
uint32 m_auiEncounter[MAX_ENCOUNTER];
std::string strSaveData;
uint32 m_uiOperaEvent;
uint32 m_uiOzDeathCount;
uint32 OptionalBossCount;
ObjectGuid m_uiCurtainGUID;
ObjectGuid m_uiStageDoorLeftGUID;
ObjectGuid m_uiStageDoorRightGUID;
ObjectGuid m_uiKilrekGUID;
ObjectGuid m_uiTerestianGUID;
ObjectGuid m_uiMoroesGUID;
ObjectGuid m_uiLibraryDoor; // Door at Shade of Aran
ObjectGuid m_uiMassiveDoor; // Door at Netherspite
ObjectGuid m_uiSideEntranceDoor; // Side Entrance
ObjectGuid m_uiGamesmansDoor; // Door before Chess
ObjectGuid m_uiGamesmansExitDoor; // Door after Chess
ObjectGuid m_uiNetherspaceDoor; // Door at Malchezaar
ObjectGuid MastersTerraceDoor[2];
ObjectGuid ImageGUID;
ObjectGuid DustCoveredChest;
bool IsEncounterInProgress() const override
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS)
return true;
return false;
}
void OnCreatureCreate(Creature* creature) override
{
switch (creature->GetEntry())
{
case 17229: m_uiKilrekGUID = creature->GetGUID(); break;
case 15688: m_uiTerestianGUID = creature->GetGUID(); break;
case 15687: m_uiMoroesGUID = creature->GetGUID(); break;
case NPC_KILREK:
KilrekGUID = creature->GetGUID();
break;
case NPC_TERESTIAN_ILLHOOF:
TerestianGUID = creature->GetGUID();
break;
case NPC_MOROES:
MoroesGUID = creature->GetGUID();
break;
}
}
@@ -132,130 +104,129 @@ public:
case NPC_PHASE_HOUND:
case NPC_DREADBEAST:
case NPC_SHADOWBEAST:
SetData(TYPE_OPTIONAL_BOSS, NOT_STARTED);
if (GetBossState(DATA_OPTIONAL_BOSS) == TO_BE_DECIDED)
{
++OptionalBossCount;
if (OptionalBossCount == OPTIONAL_BOSS_REQUIRED_DEATH_COUNT)
{
switch (urand(NPC_HYAKISS_THE_LURKER, NPC_ROKAD_THE_RAVAGER))
{
case NPC_HYAKISS_THE_LURKER:
instance->SummonCreature(NPC_HYAKISS_THE_LURKER, OptionalSpawn[0]);
break;
case NPC_SHADIKITH_THE_GLIDER:
instance->SummonCreature(NPC_SHADIKITH_THE_GLIDER, OptionalSpawn[1]);
break;
case NPC_ROKAD_THE_RAVAGER:
instance->SummonCreature(NPC_ROKAD_THE_RAVAGER, OptionalSpawn[2]);
break;
}
}
}
break;
default:
break;
}
}
void SetData(uint32 type, uint32 uiData) override
void SetData(uint32 type, uint32 data) override
{
switch (type)
{
case TYPE_ATTUMEN: m_auiEncounter[0] = uiData; break;
case TYPE_MOROES:
if (m_auiEncounter[1] == DONE)
break;
m_auiEncounter[1] = uiData;
break;
case TYPE_MAIDEN: m_auiEncounter[2] = uiData; break;
case TYPE_OPTIONAL_BOSS:
m_auiEncounter[3] = uiData;
if (uiData == NOT_STARTED)
{
++OptionalBossCount;
if (OptionalBossCount == 50)
{
switch (urand(0, 2))
{
case 0:
instance->SummonCreature(NPC_HYAKISS_THE_LURKER, OptionalSpawn[0]);
break;
case 1:
instance->SummonCreature(NPC_ROKAD_THE_RAVAGER, OptionalSpawn[1]);
break;
case 2:
instance->SummonCreature(NPC_SHADIKITH_THE_GLIDER, OptionalSpawn[2]);
break;
}
}
}
break;
case TYPE_OPERA:
m_auiEncounter[4] = uiData;
if (uiData == DONE)
UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, 16812, NULL);
break;
case TYPE_CURATOR: m_auiEncounter[5] = uiData; break;
case TYPE_ARAN: m_auiEncounter[6] = uiData; break;
case TYPE_TERESTIAN: m_auiEncounter[7] = uiData; break;
case TYPE_NETHERSPITE: m_auiEncounter[8] = uiData; break;
case TYPE_CHESS:
if (uiData == DONE)
DoRespawnGameObject(DustCoveredChest, DAY);
m_auiEncounter[9] = uiData;
break;
case TYPE_MALCHEZZAR: m_auiEncounter[10] = uiData; break;
case TYPE_NIGHTBANE:
if (m_auiEncounter[11] != DONE)
m_auiEncounter[11] = uiData;
break;
case DATA_OPERA_OZ_DEATHCOUNT:
if (uiData == SPECIAL)
++m_uiOzDeathCount;
else if (uiData == IN_PROGRESS)
m_uiOzDeathCount = 0;
if (data == SPECIAL)
++OzDeathCount;
else if (data == IN_PROGRESS)
OzDeathCount = 0;
break;
}
if (uiData == DONE)
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' << m_auiEncounter[2] << ' '
<< m_auiEncounter[3] << ' ' << m_auiEncounter[4] << ' ' << m_auiEncounter[5] << ' ' << m_auiEncounter[6] << ' '
<< m_auiEncounter[7] << ' ' << m_auiEncounter[8] << ' ' << m_auiEncounter[9] << ' ' << m_auiEncounter[10] << ' ' << m_auiEncounter[11];
strSaveData = saveStream.str();
SaveToDB();
OUT_SAVE_INST_DATA_COMPLETE;
}
}
void SetGuidData(uint32 identifier, ObjectGuid data) override
bool SetBossState(uint32 type, EncounterState state) override
{
if (!InstanceScript::SetBossState(type, state))
return false;
switch (type)
{
case DATA_OPERA_PERFORMANCE:
if (state == DONE)
{
HandleGameObject(StageDoorLeftGUID, true);
HandleGameObject(StageDoorRightGUID, true);
if (GameObject* pSideEntrance = GetGameObject(SideEntranceDoor))
pSideEntrance->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED);
UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, 16812, NULL);
}
break;
case DATA_CHESS:
if (state == DONE)
DoRespawnGameObject(DustCoveredChest, DAY);
break;
default:
break;
}
return true;
}
void SetGuidData(uint32 type, ObjectGuid data) override
{
switch (identifier)
{
case DATA_IMAGE_OF_MEDIVH: ImageGUID = data;
}
if (type == DATA_IMAGE_OF_MEDIVH)
ImageGUID = data;
}
void OnGameObjectCreate(GameObject* go) override
{
switch (go->GetEntry())
{
case 183932: m_uiCurtainGUID = go->GetGUID(); break;
case 184278:
m_uiStageDoorLeftGUID = go->GetGUID();
if (m_auiEncounter[4] == DONE)
case GO_STAGE_CURTAIN:
CurtainGUID = go->GetGUID();
break;
case GO_STAGE_DOOR_LEFT:
StageDoorLeftGUID = go->GetGUID();
if (GetBossState(DATA_OPERA_PERFORMANCE) == DONE)
go->SetGoState(GO_STATE_ACTIVE);
break;
case 184279:
m_uiStageDoorRightGUID = go->GetGUID();
if (m_auiEncounter[4] == DONE)
case GO_STAGE_DOOR_RIGHT:
StageDoorRightGUID = go->GetGUID();
if (GetBossState(DATA_OPERA_PERFORMANCE) == DONE)
go->SetGoState(GO_STATE_ACTIVE);
break;
case 184517: m_uiLibraryDoor = go->GetGUID(); break;
case 185521: m_uiMassiveDoor = go->GetGUID(); break;
case 184276: m_uiGamesmansDoor = go->GetGUID(); break;
case 184277: m_uiGamesmansExitDoor = go->GetGUID(); break;
case 185134: m_uiNetherspaceDoor = go->GetGUID(); break;
case 184274: MastersTerraceDoor[0] = go->GetGUID(); break;
case 184280: MastersTerraceDoor[1] = go->GetGUID(); break;
case 184275:
m_uiSideEntranceDoor = go->GetGUID();
if (m_auiEncounter[4] == DONE)
case GO_PRIVATE_LIBRARY_DOOR:
LibraryDoor = go->GetGUID();
break;
case GO_MASSIVE_DOOR:
MassiveDoor = go->GetGUID();
break;
case GO_GAMESMAN_HALL_DOOR:
GamesmansDoor = go->GetGUID();
break;
case GO_GAMESMAN_HALL_EXIT_DOOR:
GamesmansExitDoor = go->GetGUID();
break;
case GO_NETHERSPACE_DOOR:
NetherspaceDoor = go->GetGUID();
break;
case GO_MASTERS_TERRACE_DOOR:
MastersTerraceDoor[0] = go->GetGUID();
break;
case GO_MASTERS_TERRACE_DOOR2:
MastersTerraceDoor[1] = go->GetGUID();
break;
case GO_SIDE_ENTRANCE_DOOR:
SideEntranceDoor = go->GetGUID();
if (GetBossState(DATA_OPERA_PERFORMANCE) == DONE)
go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED);
else
go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_LOCKED);
break;
case 185119: DustCoveredChest = go->GetGUID(); break;
case GO_DUST_COVERED_CHEST:
DustCoveredChest = go->GetGUID();
break;
}
switch (m_uiOperaEvent)
switch (OperaEvent)
{
/// @todo Set Object visibilities for Opera based on performance
case EVENT_OZ:
@@ -269,77 +240,77 @@ public:
}
}
std::string GetSaveData() override
uint32 GetData(uint32 type) const override
{
return strSaveData;
}
uint32 GetData(uint32 uiData) const override
{
switch (uiData)
switch (type)
{
case TYPE_ATTUMEN: return m_auiEncounter[0];
case TYPE_MOROES: return m_auiEncounter[1];
case TYPE_MAIDEN: return m_auiEncounter[2];
case TYPE_OPTIONAL_BOSS: return m_auiEncounter[3];
case TYPE_OPERA: return m_auiEncounter[4];
case TYPE_CURATOR: return m_auiEncounter[5];
case TYPE_ARAN: return m_auiEncounter[6];
case TYPE_TERESTIAN: return m_auiEncounter[7];
case TYPE_NETHERSPITE: return m_auiEncounter[8];
case TYPE_CHESS: return m_auiEncounter[9];
case TYPE_MALCHEZZAR: return m_auiEncounter[10];
case TYPE_NIGHTBANE: return m_auiEncounter[11];
case DATA_OPERA_PERFORMANCE: return m_uiOperaEvent;
case DATA_OPERA_OZ_DEATHCOUNT: return m_uiOzDeathCount;
case DATA_OPERA_PERFORMANCE:
return OperaEvent;
case DATA_OPERA_OZ_DEATHCOUNT:
return OzDeathCount;
}
return 0;
}
ObjectGuid GetGuidData(uint32 uiData) const override
ObjectGuid GetGuidData(uint32 type) const override
{
switch (uiData)
switch (type)
{
case DATA_KILREK: return m_uiKilrekGUID;
case DATA_TERESTIAN: return m_uiTerestianGUID;
case DATA_MOROES: return m_uiMoroesGUID;
case DATA_GO_STAGEDOORLEFT: return m_uiStageDoorLeftGUID;
case DATA_GO_STAGEDOORRIGHT: return m_uiStageDoorRightGUID;
case DATA_GO_CURTAINS: return m_uiCurtainGUID;
case DATA_GO_LIBRARY_DOOR: return m_uiLibraryDoor;
case DATA_GO_MASSIVE_DOOR: return m_uiMassiveDoor;
case DATA_GO_SIDE_ENTRANCE_DOOR: return m_uiSideEntranceDoor;
case DATA_GO_GAME_DOOR: return m_uiGamesmansDoor;
case DATA_GO_GAME_EXIT_DOOR: return m_uiGamesmansExitDoor;
case DATA_GO_NETHER_DOOR: return m_uiNetherspaceDoor;
case DATA_MASTERS_TERRACE_DOOR_1: return MastersTerraceDoor[0];
case DATA_MASTERS_TERRACE_DOOR_2: return MastersTerraceDoor[1];
case DATA_IMAGE_OF_MEDIVH: return ImageGUID;
case DATA_KILREK:
return KilrekGUID;
case DATA_TERESTIAN:
return TerestianGUID;
case DATA_MOROES:
return MoroesGUID;
case DATA_GO_STAGEDOORLEFT:
return StageDoorLeftGUID;
case DATA_GO_STAGEDOORRIGHT:
return StageDoorRightGUID;
case DATA_GO_CURTAINS:
return CurtainGUID;
case DATA_GO_LIBRARY_DOOR:
return LibraryDoor;
case DATA_GO_MASSIVE_DOOR:
return MassiveDoor;
case DATA_GO_SIDE_ENTRANCE_DOOR:
return SideEntranceDoor;
case DATA_GO_GAME_DOOR:
return GamesmansDoor;
case DATA_GO_GAME_EXIT_DOOR:
return GamesmansExitDoor;
case DATA_GO_NETHER_DOOR:
return NetherspaceDoor;
case DATA_MASTERS_TERRACE_DOOR_1:
return MastersTerraceDoor[0];
case DATA_MASTERS_TERRACE_DOOR_2:
return MastersTerraceDoor[1];
case DATA_IMAGE_OF_MEDIVH:
return ImageGUID;
}
return ObjectGuid::Empty;
}
void Load(char const* chrIn) override
{
if (!chrIn)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(chrIn);
std::istringstream loadStream(chrIn);
loadStream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3]
>> m_auiEncounter[4] >> m_auiEncounter[5] >> m_auiEncounter[6] >> m_auiEncounter[7]
>> m_auiEncounter[8] >> m_auiEncounter[9] >> m_auiEncounter[10] >> m_auiEncounter[11];
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS) // Do not load an encounter as "In Progress" - reset it instead.
m_auiEncounter[i] = NOT_STARTED;
OUT_LOAD_INST_DATA_COMPLETE;
}
private:
uint32 OperaEvent;
uint32 OzDeathCount;
uint32 OptionalBossCount;
ObjectGuid CurtainGUID;
ObjectGuid StageDoorLeftGUID;
ObjectGuid StageDoorRightGUID;
ObjectGuid KilrekGUID;
ObjectGuid TerestianGUID;
ObjectGuid MoroesGUID;
ObjectGuid LibraryDoor; // Door at Shade of Aran
ObjectGuid MassiveDoor; // Door at Netherspite
ObjectGuid SideEntranceDoor; // Side Entrance
ObjectGuid GamesmansDoor; // Door before Chess
ObjectGuid GamesmansExitDoor; // Door after Chess
ObjectGuid NetherspaceDoor; // Door at Malchezaar
ObjectGuid MastersTerraceDoor[2];
ObjectGuid ImageGUID;
ObjectGuid DustCoveredChest;
};
};
@@ -168,7 +168,7 @@ public:
void StartEvent()
{
instance->SetData(TYPE_OPERA, IN_PROGRESS);
instance->SetBossState(DATA_OPERA_PERFORMANCE, IN_PROGRESS);
//resets count for this event, in case earlier failed
if (m_uiEventId == EVENT_OZ)
@@ -377,7 +377,7 @@ public:
if (InstanceScript* instance = creature->GetInstanceScript())
{
// Check for death of Moroes and if opera event is not done already
if (instance->GetData(TYPE_MOROES) == DONE && instance->GetData(TYPE_OPERA) != DONE)
if (instance->GetBossState(DATA_MOROES) == DONE && instance->GetBossState(DATA_OPERA_PERFORMANCE) != DONE)
{
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, OZ_GOSSIP1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
@@ -21,27 +21,26 @@
#define DataHeader "KZ"
uint32 const EncounterCount = 12;
enum DataTypes
{
TYPE_ATTUMEN = 1,
TYPE_MOROES = 2,
TYPE_MAIDEN = 3,
TYPE_OPTIONAL_BOSS = 4,
TYPE_OPERA = 5,
TYPE_CURATOR = 6,
TYPE_ARAN = 7,
TYPE_TERESTIAN = 8,
TYPE_NETHERSPITE = 9,
TYPE_CHESS = 10,
TYPE_MALCHEZZAR = 11,
TYPE_NIGHTBANE = 12,
DATA_ATTUMEN = 0,
DATA_MOROES = 1,
DATA_MAIDEN_OF_VIRTUE = 2,
DATA_OPTIONAL_BOSS = 3,
DATA_OPERA_PERFORMANCE = 4,
DATA_CURATOR = 5,
DATA_ARAN = 6,
DATA_TERESTIAN = 7,
DATA_NETHERSPITE = 8,
DATA_CHESS = 9,
DATA_MALCHEZZAR = 10,
DATA_NIGHTBANE = 11,
DATA_OPERA_PERFORMANCE = 13,
DATA_OPERA_OZ_DEATHCOUNT = 14,
DATA_KILREK = 15,
DATA_TERESTIAN = 16,
DATA_MOROES = 17,
DATA_GO_CURTAINS = 18,
DATA_GO_STAGEDOORLEFT = 19,
DATA_GO_STAGEDOORRIGHT = 20,
@@ -69,6 +68,8 @@ enum MiscCreatures
NPC_HYAKISS_THE_LURKER = 16179,
NPC_ROKAD_THE_RAVAGER = 16181,
NPC_SHADIKITH_THE_GLIDER = 16180,
NPC_TERESTIAN_ILLHOOF = 15688,
NPC_MOROES = 15687,
// Trash
NPC_COLDMIST_WIDOW = 16171,
@@ -78,6 +79,29 @@ enum MiscCreatures
NPC_GREATER_SHADOWBAT = 16174,
NPC_PHASE_HOUND = 16178,
NPC_DREADBEAST = 16177,
NPC_SHADOWBEAST = 16176
NPC_SHADOWBEAST = 16176,
NPC_KILREK = 17229
};
enum GameObjectIds
{
GO_STAGE_CURTAIN = 183932,
GO_STAGE_DOOR_LEFT = 184278,
GO_STAGE_DOOR_RIGHT = 184279,
GO_PRIVATE_LIBRARY_DOOR = 184517,
GO_MASSIVE_DOOR = 185521,
GO_GAMESMAN_HALL_DOOR = 184276,
GO_GAMESMAN_HALL_EXIT_DOOR = 184277,
GO_NETHERSPACE_DOOR = 185134,
GO_MASTERS_TERRACE_DOOR = 184274,
GO_MASTERS_TERRACE_DOOR2 = 184280,
GO_SIDE_ENTRANCE_DOOR = 184275,
GO_DUST_COVERED_CHEST = 185119
};
enum Misc
{
OPTIONAL_BOSS_REQUIRED_DEATH_COUNT = 50
};
#endif