diff options
author | joschiwald <joschiwald@online.de> | 2013-09-02 16:31:35 +0200 |
---|---|---|
committer | joschiwald <joschiwald@online.de> | 2013-09-02 16:31:35 +0200 |
commit | 579f969d6a54b4fa2ea61eb718ad156d0e6dfce1 (patch) | |
tree | 577cfbce5036c32d300f6f805172ca3301afc1cb /src | |
parent | 79f446364c7d7a73138547fa215b25df574f7a10 (diff) |
Scripts/HallsOfStone: reworked InstanceScript
Diffstat (limited to 'src')
6 files changed, 328 insertions, 318 deletions
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp index e1c9dec8540..b6a4375d0eb 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_krystallus.cpp @@ -56,11 +56,6 @@ class boss_krystallus : public CreatureScript public: boss_krystallus() : CreatureScript("boss_krystallus") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new boss_krystallusAI(creature); - } - struct boss_krystallusAI : public ScriptedAI { boss_krystallusAI(Creature* creature) : ScriptedAI(creature) @@ -89,14 +84,14 @@ public: uiShatterTimer = 0; if (instance) - instance->SetData(DATA_KRYSTALLUS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_KRYSTALLUS, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE { Talk(SAY_AGGRO); if (instance) - instance->SetData(DATA_KRYSTALLUS_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_KRYSTALLUS, IN_PROGRESS); } void UpdateAI(uint32 diff) OVERRIDE @@ -149,7 +144,7 @@ public: Talk(SAY_DEATH); if (instance) - instance->SetData(DATA_KRYSTALLUS_EVENT, DONE); + instance->SetBossState(DATA_KRYSTALLUS, DONE); } void KilledUnit(Unit* victim) OVERRIDE @@ -182,6 +177,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetHallsOfStoneAI<boss_krystallusAI>(creature); + } }; class spell_krystallus_shatter : public SpellScriptLoader diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp index 5b34db663d5..0d14f337ab3 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_maiden_of_grief.cpp @@ -56,11 +56,6 @@ class boss_maiden_of_grief : public CreatureScript public: boss_maiden_of_grief() : CreatureScript("boss_maiden_of_grief") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new boss_maiden_of_griefAI(creature); - } - struct boss_maiden_of_griefAI : public ScriptedAI { boss_maiden_of_griefAI(Creature* creature) : ScriptedAI(creature) @@ -84,7 +79,7 @@ public: if (instance) { - instance->SetData(DATA_MAIDEN_OF_GRIEF_EVENT, NOT_STARTED); + instance->SetBossState(DATA_MAIDEN_OF_GRIEF, NOT_STARTED); instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_GOOD_GRIEF_START_EVENT); } } @@ -95,14 +90,15 @@ public: if (instance) { + /* if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetData64(DATA_MAIDEN_DOOR))) if (pDoor->GetGoState() == GO_STATE_READY) { EnterEvadeMode(); return; } - - instance->SetData(DATA_MAIDEN_OF_GRIEF_EVENT, IN_PROGRESS); + */ + instance->SetBossState(DATA_MAIDEN_OF_GRIEF, IN_PROGRESS); instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_GOOD_GRIEF_START_EVENT); } } @@ -158,7 +154,7 @@ public: Talk(SAY_DEATH); if (instance) - instance->SetData(DATA_MAIDEN_OF_GRIEF_EVENT, DONE); + instance->SetBossState(DATA_MAIDEN_OF_GRIEF, DONE); } void KilledUnit(Unit* victim) OVERRIDE @@ -170,6 +166,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetHallsOfStoneAI<boss_maiden_of_griefAI>(creature); + } }; void AddSC_boss_maiden_of_grief() diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp index 185d8e5fd0c..ed7ce0cb70b 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/boss_sjonnir.cpp @@ -84,11 +84,6 @@ class boss_sjonnir : public CreatureScript public: boss_sjonnir() : CreatureScript("boss_sjonnir") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new boss_sjonnirAI(creature); - } - struct boss_sjonnirAI : public ScriptedAI { boss_sjonnirAI(Creature* creature) : ScriptedAI(creature), lSummons(me) @@ -127,7 +122,7 @@ public: lSummons.DespawnAll(); if (instance) - instance->SetData(DATA_SJONNIR_EVENT, NOT_STARTED); + instance->SetBossState(DATA_SJONNIR, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE @@ -138,14 +133,15 @@ public: if (instance) { + /* if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetData64(DATA_SJONNIR_DOOR))) if (pDoor->GetGoState() == GO_STATE_READY) { EnterEvadeMode(); return; } - - instance->SetData(DATA_SJONNIR_EVENT, IN_PROGRESS); + */ + instance->SetBossState(DATA_SJONNIR, IN_PROGRESS); } } @@ -221,7 +217,7 @@ public: lSummons.DespawnAll(); if (instance) - instance->SetData(DATA_SJONNIR_EVENT, DONE); + instance->SetBossState(DATA_SJONNIR, DONE); } void KilledUnit(Unit* victim) OVERRIDE @@ -247,6 +243,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetHallsOfStoneAI<boss_sjonnirAI>(creature); + } }; class npc_malformed_ooze : public CreatureScript @@ -254,11 +254,6 @@ class npc_malformed_ooze : public CreatureScript public: npc_malformed_ooze() : CreatureScript("npc_malformed_ooze") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_malformed_oozeAI(creature); - } - struct npc_malformed_oozeAI : public ScriptedAI { npc_malformed_oozeAI(Creature* creature) : ScriptedAI(creature) {} @@ -290,35 +285,37 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetHallsOfStoneAI<npc_malformed_oozeAI>(creature); + } }; class npc_iron_sludge : public CreatureScript { -public: - npc_iron_sludge() : CreatureScript("npc_iron_sludge") { } - - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_iron_sludgeAI(creature); - } + public: + npc_iron_sludge() : CreatureScript("npc_iron_sludge") { } - struct npc_iron_sludgeAI : public ScriptedAI - { - npc_iron_sludgeAI(Creature* creature) : ScriptedAI(creature) + struct npc_iron_sludgeAI : public ScriptedAI { - instance = creature->GetInstanceScript(); - } + npc_iron_sludgeAI(Creature* creature) : ScriptedAI(creature) + { + instance = creature->GetInstanceScript(); + } - InstanceScript* instance; + InstanceScript* instance; - void JustDied(Unit* /*killer*/) OVERRIDE - { - if (instance) + void JustDied(Unit* /*killer*/) OVERRIDE + { if (Creature* Sjonnir = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SJONNIR))) Sjonnir->AI()->DoAction(ACTION_OOZE_DEAD); - } - }; + } + }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetHallsOfStoneAI<npc_iron_sludgeAI>(creature); + } }; class achievement_abuse_the_ooze : public AchievementCriteriaScript diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp index 7b5c7f2e061..ff4a5d1b43a 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp @@ -137,11 +137,6 @@ class npc_tribuna_controller : public CreatureScript public: npc_tribuna_controller() : CreatureScript("npc_tribuna_controller") { } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_tribuna_controllerAI(creature); - } - struct npc_tribuna_controllerAI : public ScriptedAI { npc_tribuna_controllerAI(Creature* creature) : ScriptedAI(creature) @@ -263,6 +258,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetHallsOfStoneAI<npc_tribuna_controllerAI>(creature); + } }; class npc_brann_hos : public CreatureScript @@ -293,11 +292,6 @@ public: return true; } - CreatureAI* GetAI(Creature* creature) const OVERRIDE - { - return new npc_brann_hosAI(creature); - } - struct npc_brann_hosAI : public npc_escortAI { npc_brann_hosAI(Creature* creature) : npc_escortAI(creature) @@ -331,7 +325,7 @@ public: DespawnDwarf(); if (instance) - instance->SetData(DATA_BRANN_EVENT, NOT_STARTED); + instance->SetBossState(DATA_BRANN_EVENT, NOT_STARTED); } } @@ -446,9 +440,9 @@ public: case 1: if (instance) { - if (instance->GetData(DATA_BRANN_EVENT) != NOT_STARTED) + if (instance->GetBossState(DATA_BRANN_EVENT) != NOT_STARTED) return; - instance->SetData(DATA_BRANN_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_BRANN_EVENT, IN_PROGRESS); } bIsBattle = false; Talk(SAY_ESCORT_START); @@ -598,7 +592,7 @@ public: case 29: Talk(SAY_EVENT_END_02); if (instance) - instance->SetData(DATA_BRANN_EVENT, DONE); + instance->SetBossState(DATA_BRANN_EVENT, DONE); me->CastSpell(me, SPELL_REWARD_ACHIEVEMENT, true); JumpToNextStep(5500); break; @@ -735,6 +729,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetHallsOfStoneAI<npc_brann_hosAI>(creature); + } }; class achievement_brann_spankin_new : public AchievementCriteriaScript diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h index d00649e409b..b8af76bba20 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.h @@ -15,55 +15,61 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef DEF_HALLS_OF_STONE_H -#define DEF_HALLS_OF_STONE_H -enum Data -{ - DATA_KRYSTALLUS_EVENT, - DATA_MAIDEN_OF_GRIEF_EVENT, - DATA_SJONNIR_EVENT, - DATA_BRANN_EVENT -}; +#ifndef HALLS_OF_STONE_H_ +#define HALLS_OF_STONE_H_ + +#define HoSScriptName "instance_halls_of_stone" + +uint32 const EncounterCount = 4; -enum Data64 +enum DataTypes { - DATA_KRYSTALLUS, - DATA_MAIDEN_OF_GRIEF, - DATA_SJONNIR, - DATA_KADDRAK, - DATA_MARNAK, - DATA_ABEDNEUM, - DATA_GO_TRIBUNAL_CONSOLE, - DATA_GO_KADDRAK, - DATA_GO_MARNAK, - DATA_GO_ABEDNEUM, - DATA_GO_SKY_FLOOR, - DATA_SJONNIR_DOOR, - DATA_MAIDEN_DOOR + // Encounter States/Boss GUIDs + DATA_KRYSTALLUS = 0, + DATA_MAIDEN_OF_GRIEF = 1, + DATA_BRANN_EVENT = 2, + DATA_SJONNIR = 3, + + // Additional data + DATA_KADDRAK = 4, + DATA_MARNAK = 5, + DATA_ABEDNEUM = 6, + DATA_GO_TRIBUNAL_CONSOLE = 7, + DATA_GO_KADDRAK = 8, + DATA_GO_MARNAK = 9, + DATA_GO_ABEDNEUM = 10, + DATA_GO_SKY_FLOOR = 11 }; -enum CreaturesIds +enum CreatureIds { - CREATURE_MAIDEN = 27975, - CREATURE_KRYSTALLUS = 27977, - CREATURE_SJONNIR = 27978, - CREATURE_MARNAK = 30897, - CREATURE_KADDRAK = 30898, - CREATURE_ABEDNEUM = 30899, - CREATURE_BRANN = 28070 + NPC_MAIDEN = 27975, + NPC_KRYSTALLUS = 27977, + NPC_SJONNIR = 27978, + NPC_MARNAK = 30897, + NPC_KADDRAK = 30898, + NPC_ABEDNEUM = 30899, + NPC_BRANN = 28070 }; enum GameObjectIds { - GO_ABEDNEUM = 191669, - GO_MARNAK = 192170, - GO_KADDRAK = 192171, - GO_MAIDEN_DOOR = 191292, - GO_BRANN_DOOR = 191295, - GO_SJONNIR_DOOR = 191296, - GO_TRIBUNAL_CONSOLE = 193907, - GO_TRIBUNAL_CHEST = 190586, - GO_TRIBUNAL_CHEST_HERO = 193996 + GO_ABEDNEUM = 191669, + GO_MARNAK = 191670, + GO_KADDRAK = 191671, + GO_MAIDEN_DOOR = 191292, + GO_BRANN_DOOR = 191295, + GO_SJONNIR_DOOR = 191296, + GO_TRIBUNAL_CONSOLE = 193907, + GO_TRIBUNAL_CHEST = 190586, + GO_TRIBUNAL_CHEST_HERO = 193996, + GO_TRIBUNAL_SKY_FLOOR = 191527 }; -#endif +template<class AI> +AI* GetHallsOfStoneAI(Creature* creature) +{ + return GetInstanceAI<AI>(creature, HoSScriptName); +} + +#endif // HALLS_OF_STONE_H_ diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp index d4b8750dbba..f207df9aff3 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/instance_halls_of_stone.cpp @@ -17,256 +17,266 @@ #include "ScriptMgr.h" #include "InstanceScript.h" +#include "WorldSession.h" #include "halls_of_stone.h" -#define MAX_ENCOUNTER 4 - -/* Halls of Stone encounters: -0- Krystallus -1- Maiden of Grief -2- Escort Event -3- Sjonnir The Ironshaper -*/ +DoorData const doorData[] = +{ + { GO_MAIDEN_DOOR, DATA_KRYSTALLUS, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_BRANN_DOOR, DATA_MAIDEN_OF_GRIEF, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_SJONNIR_DOOR, DATA_BRANN_EVENT, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END +}; class instance_halls_of_stone : public InstanceMapScript { -public: - instance_halls_of_stone() : InstanceMapScript("instance_halls_of_stone", 599) { } - - InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE - { - return new instance_halls_of_stone_InstanceMapScript(map); - } - - struct instance_halls_of_stone_InstanceMapScript : public InstanceScript - { - instance_halls_of_stone_InstanceMapScript(Map* map) : InstanceScript(map) {} - - uint64 uiMaidenOfGrief; - uint64 uiKrystallus; - uint64 uiSjonnir; - - uint64 uiKaddrak; - uint64 uiAbedneum; - uint64 uiMarnak; - uint64 uiBrann; - - uint64 uiMaidenOfGriefDoor; - uint64 uiSjonnirDoor; - uint64 uiBrannDoor; - uint64 uiTribunalConsole; - uint64 uiTribunalChest; - uint64 uiTribunalSkyFloor; - uint64 uiKaddrakGo; - uint64 uiAbedneumGo; - uint64 uiMarnakGo; - - uint32 m_auiEncounter[MAX_ENCOUNTER]; - - std::string str_data; - - void Initialize() OVERRIDE - { - uiMaidenOfGrief = 0; - uiKrystallus = 0; - uiSjonnir = 0; - - uiKaddrak = 0; - uiMarnak = 0; - uiAbedneum = 0; - uiBrann = 0; - - uiMaidenOfGriefDoor = 0; - uiSjonnirDoor = 0; - uiBrannDoor = 0; - uiKaddrakGo = 0; - uiMarnakGo = 0; - uiAbedneumGo = 0; - uiTribunalConsole = 0; - uiTribunalChest = 0; - uiTribunalSkyFloor = 0; - - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - m_auiEncounter[i] = NOT_STARTED; - } + public: + instance_halls_of_stone() : InstanceMapScript(HoSScriptName, 599) { } - void OnCreatureCreate(Creature* creature) OVERRIDE + struct instance_halls_of_stone_InstanceMapScript : public InstanceScript { - switch (creature->GetEntry()) + instance_halls_of_stone_InstanceMapScript(Map* map) : InstanceScript(map) { - case CREATURE_MAIDEN: uiMaidenOfGrief = creature->GetGUID(); break; - case CREATURE_KRYSTALLUS: uiKrystallus = creature->GetGUID(); break; - case CREATURE_SJONNIR: uiSjonnir = creature->GetGUID(); break; - case CREATURE_MARNAK: uiMarnak = creature->GetGUID(); break; - case CREATURE_KADDRAK: uiKaddrak = creature->GetGUID(); break; - case CREATURE_ABEDNEUM: uiAbedneum = creature->GetGUID(); break; - case CREATURE_BRANN: uiBrann = creature->GetGUID(); break; + SetBossNumber(EncounterCount); + LoadDoorData(doorData); + + KrystallusGUID = 0; + MaidenOfGriefGUID = 0; + SjonnirGUID = 0; + + KaddrakGUID = 0; + AbedneumGUID = 0; + MarnakGUID = 0; + BrannGUID = 0; + + TribunalConsoleGUID = 0; + TribunalChestGUID = 0; + TribunalSkyFloorGUID = 0; + KaddrakGoGUID = 0; + AbedneumGoGUID = 0; + MarnakGoGUID = 0; } - } - void OnGameObjectCreate(GameObject* go) OVERRIDE - { - switch (go->GetEntry()) + void OnCreatureCreate(Creature* creature) OVERRIDE { - case GO_ABEDNEUM: - uiAbedneumGo = go->GetGUID(); - break; - case GO_MARNAK: - uiMarnakGo = go->GetGUID(); - break; - case GO_KADDRAK: - uiKaddrakGo = go->GetGUID(); - break; - case GO_MAIDEN_DOOR: - uiMaidenOfGriefDoor = go->GetGUID(); - if (m_auiEncounter[0] == DONE) - go->SetGoState(GO_STATE_ACTIVE); - else - go->SetGoState(GO_STATE_READY); - break; - case GO_BRANN_DOOR: - uiBrannDoor = go->GetGUID(); - if (m_auiEncounter[1] == DONE) - go->SetGoState(GO_STATE_ACTIVE); - else - go->SetGoState(GO_STATE_READY); - break; - case GO_SJONNIR_DOOR: - uiSjonnirDoor = go->GetGUID(); - if (m_auiEncounter[2] == DONE) - go->SetGoState(GO_STATE_ACTIVE); - else - go->SetGoState(GO_STATE_READY); - break; - case GO_TRIBUNAL_CONSOLE: - uiTribunalConsole = go->GetGUID(); - break; - case GO_TRIBUNAL_CHEST: - case GO_TRIBUNAL_CHEST_HERO: - uiTribunalChest = go->GetGUID(); - if (m_auiEncounter[2] == DONE) - go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND); - break; - case 191527: - uiTribunalSkyFloor = go->GetGUID(); - break; + switch (creature->GetEntry()) + { + case NPC_KRYSTALLUS: + KrystallusGUID = creature->GetGUID(); + break; + case NPC_MAIDEN: + MaidenOfGriefGUID = creature->GetGUID(); + break; + case NPC_SJONNIR: + SjonnirGUID = creature->GetGUID(); + break; + case NPC_MARNAK: + MarnakGUID = creature->GetGUID(); + break; + case NPC_KADDRAK: + KaddrakGUID = creature->GetGUID(); + break; + case NPC_ABEDNEUM: + AbedneumGUID = creature->GetGUID(); + break; + case NPC_BRANN: + BrannGUID = creature->GetGUID(); + break; + default: + break; + } } - } - void SetData(uint32 type, uint32 data) OVERRIDE - { - switch (type) + void OnGameObjectCreate(GameObject* go) OVERRIDE { - case DATA_MAIDEN_OF_GRIEF_EVENT: - m_auiEncounter[1] = data; - if (m_auiEncounter[1] == DONE) - HandleGameObject(uiBrannDoor, true); - break; - case DATA_KRYSTALLUS_EVENT: - m_auiEncounter[0] = data; - if (m_auiEncounter[0] == DONE) - HandleGameObject(uiMaidenOfGriefDoor, true); - break; - case DATA_SJONNIR_EVENT: - m_auiEncounter[3] = data; - break; - case DATA_BRANN_EVENT: - m_auiEncounter[2] = data; - if (m_auiEncounter[2] == DONE) - { - HandleGameObject(uiSjonnirDoor, true); - GameObject* go = instance->GetGameObject(uiTribunalChest); - if (go) + switch (go->GetEntry()) + { + case GO_ABEDNEUM: + AbedneumGoGUID = go->GetGUID(); + break; + case GO_MARNAK: + MarnakGoGUID = go->GetGUID(); + break; + case GO_KADDRAK: + KaddrakGoGUID = go->GetGUID(); + break; + case GO_TRIBUNAL_CONSOLE: + TribunalConsoleGUID = go->GetGUID(); + break; + case GO_TRIBUNAL_CHEST: + case GO_TRIBUNAL_CHEST_HERO: + TribunalChestGUID = go->GetGUID(); + if (GetBossState(DATA_BRANN_EVENT) == DONE) go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_INTERACT_COND); - } - break; + break; + case GO_TRIBUNAL_SKY_FLOOR: + TribunalSkyFloorGUID = go->GetGUID(); + break; + case GO_MAIDEN_DOOR: + case GO_BRANN_DOOR: + case GO_SJONNIR_DOOR: + AddDoor(go, true); + break; + default: + break; + } } - if (data == DONE) - SaveToDB(); - } - - uint32 GetData(uint32 type) const OVERRIDE - { - switch (type) + void OnGameObjectRemove(GameObject* go) OVERRIDE { - case DATA_KRYSTALLUS_EVENT: return m_auiEncounter[0]; - case DATA_MAIDEN_OF_GRIEF_EVENT: return m_auiEncounter[1]; - case DATA_SJONNIR_EVENT: return m_auiEncounter[2]; - case DATA_BRANN_EVENT: return m_auiEncounter[3]; + switch (go->GetEntry()) + { + case GO_MAIDEN_DOOR: + case GO_BRANN_DOOR: + case GO_SJONNIR_DOOR: + AddDoor(go, false); + break; + default: + break; + } } - return 0; - } - - uint64 GetData64(uint32 identifier) const OVERRIDE - { - switch (identifier) + uint64 GetData64(uint32 type) const OVERRIDE { - case DATA_MAIDEN_OF_GRIEF: return uiMaidenOfGrief; - case DATA_KRYSTALLUS: return uiKrystallus; - case DATA_SJONNIR: return uiSjonnir; - case DATA_KADDRAK: return uiKaddrak; - case DATA_MARNAK: return uiMarnak; - case DATA_ABEDNEUM: return uiAbedneum; - case DATA_GO_TRIBUNAL_CONSOLE: return uiTribunalConsole; - case DATA_GO_KADDRAK: return uiKaddrakGo; - case DATA_GO_ABEDNEUM: return uiAbedneumGo; - case DATA_GO_MARNAK: return uiMarnakGo; - case DATA_GO_SKY_FLOOR: return uiTribunalSkyFloor; - case DATA_SJONNIR_DOOR: return uiSjonnirDoor; - case DATA_MAIDEN_DOOR: return uiMaidenOfGriefDoor; + switch (type) + { + case DATA_MAIDEN_OF_GRIEF: + return MaidenOfGriefGUID; + case DATA_KRYSTALLUS: + return KrystallusGUID; + case DATA_SJONNIR: + return SjonnirGUID; + case DATA_KADDRAK: + return KaddrakGUID; + case DATA_MARNAK: + return MarnakGUID; + case DATA_ABEDNEUM: + return AbedneumGUID; + case DATA_GO_TRIBUNAL_CONSOLE: + return TribunalConsoleGUID; + case DATA_GO_KADDRAK: + return KaddrakGoGUID; + case DATA_GO_ABEDNEUM: + return AbedneumGoGUID; + case DATA_GO_MARNAK: + return MarnakGoGUID; + case DATA_GO_SKY_FLOOR: + return TribunalSkyFloorGUID; + default: + break; + } + + return 0; } - return 0; - } - - std::string GetSaveData() OVERRIDE - { - OUT_SAVE_INST_DATA; + bool SetBossState(uint32 type, EncounterState state) OVERRIDE + { + if (!InstanceScript::SetBossState(type, state)) + return false; + + switch (type) + { + case DATA_BRANN_EVENT: + if (state == DONE) + { + if (GameObject* go = instance->GetGameObject(TribunalChestGUID)) + go->RemoveFlag(GAMEOBJECT_FLAGS,GO_FLAG_INTERACT_COND); + } + break; + default: + break; + } + + return true; + } - std::ostringstream saveStream; - saveStream << "H S " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' << m_auiEncounter[2] << ' ' << m_auiEncounter[3]; + bool CheckRequiredBosses(uint32 bossId, Player const* player /*= NULL*/) const OVERRIDE + { + if (player && player->GetSession()->HasPermission(RBAC_PERM_SKIP_CHECK_INSTANCE_REQUIRED_BOSSES)) + return true; + + switch (bossId) + { + case DATA_MAIDEN_OF_GRIEF: + if (GetBossState(DATA_KRYSTALLUS) != DONE) + return false; + break; + case DATA_SJONNIR: + if (GetBossState(DATA_BRANN_EVENT) != DONE) + return false; + break; + default: + break; + } + + return true; + } - str_data = saveStream.str(); + std::string GetSaveData() OVERRIDE + { + OUT_SAVE_INST_DATA; - OUT_SAVE_INST_DATA_COMPLETE; - return str_data; - } + std::ostringstream saveStream; + saveStream << "H S " << GetBossSaveData(); - void Load(const char* in) OVERRIDE - { - if (!in) - { - OUT_LOAD_INST_DATA_FAIL; - return; + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); } - OUT_LOAD_INST_DATA(in); + void Load(char const* str) OVERRIDE + { + if (!str) + { + OUT_LOAD_INST_DATA_FAIL; + return; + } - char dataHead1, dataHead2; - uint16 data0, data1, data2, data3; + OUT_LOAD_INST_DATA(str); - std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3; + char dataHead1, dataHead2; - if (dataHead1 == 'H' && dataHead2 == 'S') - { - m_auiEncounter[0] = data0; - m_auiEncounter[1] = data1; - m_auiEncounter[2] = data2; - m_auiEncounter[3] = data3; + std::istringstream loadStream(str); + loadStream >> dataHead1 >> dataHead2; - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) - m_auiEncounter[i] = NOT_STARTED; + if (dataHead1 == 'H' && dataHead2 == 'S') + { + 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; - } else OUT_LOAD_INST_DATA_FAIL; + OUT_LOAD_INST_DATA_COMPLETE; + } - OUT_LOAD_INST_DATA_COMPLETE; + protected: + uint64 KrystallusGUID; + uint64 MaidenOfGriefGUID; + uint64 SjonnirGUID; + + uint64 KaddrakGUID; + uint64 AbedneumGUID; + uint64 MarnakGUID; + uint64 BrannGUID; + + uint64 TribunalConsoleGUID; + uint64 TribunalChestGUID; + uint64 TribunalSkyFloorGUID; + uint64 KaddrakGoGUID; + uint64 AbedneumGoGUID; + uint64 MarnakGoGUID; + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE + { + return new instance_halls_of_stone_InstanceMapScript(map); } - }; - }; void AddSC_instance_halls_of_stone() |