diff options
6 files changed, 196 insertions, 189 deletions
diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h index 5970a85cc38..ea0382cdd80 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/azjol_nerub.h @@ -15,24 +15,56 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef DEF_AZJOL_NERUB_H -#define DEF_AZJOL_NERUB_H +#ifndef AZJOL_NERUB_H_ +#define AZJOL_NERUB_H_ -enum Data64 +#include "Map.h" +#include "Creature.h" + +#define AzjolNerubScriptName "instance_azjol_nerub" + +uint32 const EncounterCount = 3; + +enum DataTypes +{ + // Encounter States/Boss GUIDs + DATA_KRIKTHIR_THE_GATEWATCHER = 0, + DATA_HADRONOX = 1, + DATA_ANUBARAK = 2, + + // Additional Data + DATA_WATCHER_GASHRA = 3, + DATA_WATCHER_SILTHIK = 4, + DATA_WATCHER_NARJIL = 5 +}; + +enum CreatureIds { - DATA_KRIKTHIR_THE_GATEWATCHER, - DATA_HADRONOX, - DATA_ANUBARAK, - DATA_WATCHER_GASHRA, - DATA_WATCHER_SILTHIK, - DATA_WATCHER_NARJIL + NPC_KRIKTHIR = 28684, + NPC_HADRONOX = 28921, + NPC_ANUBARAK = 29120, + + NPC_WATCHER_NARJIL = 28729, + NPC_WATCHER_GASHRA = 28730, + NPC_WATCHER_SILTHIK = 28731 }; -enum Data +enum GameObjectIds { - DATA_KRIKTHIR_THE_GATEWATCHER_EVENT, - DATA_HADRONOX_EVENT, - DATA_ANUBARAK_EVENT + GO_KRIKTHIR_DOOR = 192395, + GO_ANUBARAK_DOOR_1 = 192396, + GO_ANUBARAK_DOOR_2 = 192397, + GO_ANUBARAK_DOOR_3 = 192398 }; -#endif +template<class AI> +AI* GetAzjolNerubAI(Creature* creature) +{ + if (InstanceMap* instance = creature->GetMap()->ToInstanceMap()) + if (instance->GetInstanceScript()) + if (instance->GetScriptId() == sObjectMgr->GetScriptId(AzjolNerubScriptName)) + return new AI(creature); + return NULL; +} + +#endif // AZJOL_NERUB_H_ diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp index 05e758f5cf9..81530265617 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_anubarak.cpp @@ -132,7 +132,7 @@ public: if (instance) { - instance->SetData(DATA_ANUBARAK_EVENT, NOT_STARTED); + instance->SetBossState(DATA_ANUBARAK, NOT_STARTED); instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT); } } @@ -165,7 +165,7 @@ public: void DelayEventStart() { if (instance) - instance->SetData(DATA_ANUBARAK_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_ANUBARAK, IN_PROGRESS); } void UpdateAI(uint32 diff) OVERRIDE @@ -336,7 +336,7 @@ public: Talk(SAY_DEATH); Summons.DespawnAll(); if (instance) - instance->SetData(DATA_ANUBARAK_EVENT, DONE); + instance->SetBossState(DATA_ANUBARAK, DONE); } void KilledUnit(Unit* victim) OVERRIDE diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp index 6b556f4fe4d..1664a1375ae 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_hadronox.cpp @@ -84,8 +84,8 @@ public: uiDoorsTimer = urand(20*IN_MILLISECONDS, 30*IN_MILLISECONDS); uiCheckDistanceTimer = 2*IN_MILLISECONDS; - if (instance && (instance->GetData(DATA_HADRONOX_EVENT) != DONE && !bFirstTime)) - instance->SetData(DATA_HADRONOX_EVENT, FAIL); + if (instance && (instance->GetBossState(DATA_HADRONOX) != DONE && !bFirstTime)) + instance->SetBossState(DATA_HADRONOX, FAIL); bFirstTime = false; } @@ -103,13 +103,13 @@ public: void JustDied(Unit* /*killer*/) OVERRIDE { if (instance) - instance->SetData(DATA_HADRONOX_EVENT, DONE); + instance->SetBossState(DATA_HADRONOX, DONE); } void EnterCombat(Unit* /*who*/) OVERRIDE { if (instance) - instance->SetData(DATA_HADRONOX_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_HADRONOX, IN_PROGRESS); me->SetInCombatWithZone(); } diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp index 2222d16f68b..c5e40052a9d 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/boss_krikthir_the_gatewatcher.cpp @@ -105,7 +105,7 @@ public: uiCurseFatigueTimer = 12*IN_MILLISECONDS; if (instance) - instance->SetData(DATA_KRIKTHIR_THE_GATEWATCHER_EVENT, NOT_STARTED); + instance->SetBossState(DATA_KRIKTHIR_THE_GATEWATCHER, NOT_STARTED); } void EnterCombat(Unit* /*who*/) OVERRIDE @@ -115,7 +115,7 @@ public: uiSummonTimer = 15*IN_MILLISECONDS; if (instance) - instance->SetData(DATA_KRIKTHIR_THE_GATEWATCHER_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_KRIKTHIR_THE_GATEWATCHER, IN_PROGRESS); } void Summon() @@ -176,7 +176,7 @@ public: Talk(SAY_DEATH); if (instance) - instance->SetData(DATA_KRIKTHIR_THE_GATEWATCHER_EVENT, DONE); + instance->SetBossState(DATA_KRIKTHIR_THE_GATEWATCHER, DONE); } void KilledUnit(Unit* victim) OVERRIDE @@ -537,15 +537,14 @@ class achievement_watch_him_die : public AchievementCriteriaScript return false; InstanceScript* instance = target->GetInstanceScript(); - Creature* Watcher[3]; if (!instance) return false; for (uint8 n = 0; n < 3; ++n) { - Watcher[n] = ObjectAccessor::GetCreature(*target, instance->GetData64(DATA_WATCHER_GASHRA + n)); - if (Watcher[n] && !Watcher[n]->IsAlive()) - return false; + if (Creature* watcher = ObjectAccessor::GetCreature(*target, instance->GetData64(DATA_WATCHER_GASHRA + n))) + if (!watcher->IsAlive()) + return false; } return true; diff --git a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp index 261a2748579..b20a28b7a75 100644 --- a/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/AzjolNerub/instance_azjol_nerub.cpp @@ -19,196 +19,171 @@ #include "InstanceScript.h" #include "azjol_nerub.h" -#define MAX_ENCOUNTER 3 - -/* Azjol Nerub encounters: -0 - Krik'thir the Gatewatcher -1 - Hadronox -2 - Anub'arak -*/ +DoorData const doorData[] = +{ + { GO_KRIKTHIR_DOOR, DATA_KRIKTHIR_THE_GATEWATCHER, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_ANUBARAK_DOOR_1, DATA_ANUBARAK, DOOR_TYPE_ROOM, BOUNDARY_NONE }, + { GO_ANUBARAK_DOOR_2, DATA_ANUBARAK, DOOR_TYPE_ROOM, BOUNDARY_NONE }, + { GO_ANUBARAK_DOOR_3, DATA_ANUBARAK, DOOR_TYPE_ROOM, BOUNDARY_NONE }, + { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END +}; class instance_azjol_nerub : public InstanceMapScript { -public: - instance_azjol_nerub() : InstanceMapScript("instance_azjol_nerub", 601) { } - - struct instance_azjol_nerub_InstanceScript : public InstanceScript - { - instance_azjol_nerub_InstanceScript(Map* map) : InstanceScript(map) {} - - uint64 uiKrikthir; - uint64 uiHadronox; - uint64 uiAnubarak; - uint64 uiWatcherGashra; - uint64 uiWatcherSilthik; - uint64 uiWatcherNarjil; - uint64 uiAnubarakDoor[3]; - - uint64 uiKrikthirDoor; - - uint32 auiEncounter[MAX_ENCOUNTER]; - - void Initialize() OVERRIDE - { - memset(&auiEncounter, 0, sizeof(auiEncounter)); - memset(&uiAnubarakDoor, 0, sizeof(uiAnubarakDoor)); - - uiKrikthir = 0; - uiHadronox = 0; - uiAnubarak = 0; - uiWatcherGashra = 0; - uiWatcherSilthik = 0; - uiWatcherNarjil = 0; - uiKrikthirDoor = 0; - } + public: + instance_azjol_nerub() : InstanceMapScript(AzjolNerubScriptName, 601) { } - bool IsEncounterInProgress() const OVERRIDE + struct instance_azjol_nerub_InstanceScript : public InstanceScript { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (auiEncounter[i] == IN_PROGRESS) - return true; - - return false; - } - - void OnCreatureCreate(Creature* creature) OVERRIDE - { - switch (creature->GetEntry()) + instance_azjol_nerub_InstanceScript(Map* map) : InstanceScript(map) { - case 28684: uiKrikthir = creature->GetGUID(); break; - case 28921: uiHadronox = creature->GetGUID(); break; - case 29120: uiAnubarak = creature->GetGUID(); break; - case 28730: uiWatcherGashra = creature->GetGUID(); break; - case 28731: uiWatcherSilthik = creature->GetGUID(); break; - case 28729: uiWatcherNarjil = creature->GetGUID(); break; + SetBossNumber(EncounterCount); + LoadDoorData(doorData); + + KrikthirGUID = 0; + HadronoxGUID = 0; + AnubarakGUID = 0; + WatcherGashraGUID = 0; + WatcherSilthikGUID = 0; + WatcherNarjilGUID = 0; } - } - void OnGameObjectCreate(GameObject* go) OVERRIDE - { - switch (go->GetEntry()) + void OnCreatureCreate(Creature* creature) OVERRIDE { - case 192395: - uiKrikthirDoor = go->GetGUID(); - if (auiEncounter[0] == DONE) - HandleGameObject(0, true, go); - break; - case 192396: - uiAnubarakDoor[0] = go->GetGUID(); - break; - case 192397: - uiAnubarakDoor[1] = go->GetGUID(); - break; - case 192398: - uiAnubarakDoor[2] = go->GetGUID(); - break; + switch (creature->GetEntry()) + { + case NPC_KRIKTHIR: + KrikthirGUID = creature->GetGUID(); + break; + case NPC_HADRONOX: + HadronoxGUID = creature->GetGUID(); + break; + case NPC_ANUBARAK: + AnubarakGUID = creature->GetGUID(); + break; + case NPC_WATCHER_NARJIL: + WatcherNarjilGUID = creature->GetGUID(); + break; + case NPC_WATCHER_GASHRA: + WatcherGashraGUID = creature->GetGUID(); + break; + case NPC_WATCHER_SILTHIK: + WatcherSilthikGUID = creature->GetGUID(); + break; + default: + break; + } } - } - uint64 GetData64(uint32 identifier) const OVERRIDE - { - switch (identifier) + void OnGameObjectCreate(GameObject* go) OVERRIDE { - case DATA_KRIKTHIR_THE_GATEWATCHER: return uiKrikthir; - case DATA_HADRONOX: return uiHadronox; - case DATA_ANUBARAK: return uiAnubarak; - case DATA_WATCHER_GASHRA: return uiWatcherGashra; - case DATA_WATCHER_SILTHIK: return uiWatcherSilthik; - case DATA_WATCHER_NARJIL: return uiWatcherNarjil; + switch (go->GetEntry()) + { + case GO_KRIKTHIR_DOOR: + case GO_ANUBARAK_DOOR_1: + case GO_ANUBARAK_DOOR_2: + case GO_ANUBARAK_DOOR_3: + AddDoor(go, true); + break; + default: + break; + } } - return 0; - } - - void SetData(uint32 type, uint32 data) OVERRIDE - { - switch (type) + void OnGameObjectRemove(GameObject* go) OVERRIDE { - case DATA_KRIKTHIR_THE_GATEWATCHER_EVENT: - auiEncounter[0] = data; - if (data == DONE) - HandleGameObject(uiKrikthirDoor, true); - break; - case DATA_HADRONOX_EVENT: - auiEncounter[1] = data; - break; - case DATA_ANUBARAK_EVENT: - auiEncounter[2] = data; - if (data == IN_PROGRESS) - for (uint8 i = 0; i < 3; ++i) - HandleGameObject(uiAnubarakDoor[i], false); - else if (data == NOT_STARTED || data == DONE) - for (uint8 i = 0; i < 3; ++i) - HandleGameObject(uiAnubarakDoor[i], true); - break; + switch (go->GetEntry()) + { + case GO_KRIKTHIR_DOOR: + case GO_ANUBARAK_DOOR_1: + case GO_ANUBARAK_DOOR_2: + case GO_ANUBARAK_DOOR_3: + AddDoor(go, false); + break; + default: + break; + } } - if (data == DONE) + uint64 GetData64(uint32 type) const OVERRIDE { - SaveToDB(); + switch (type) + { + case DATA_KRIKTHIR_THE_GATEWATCHER: + return KrikthirGUID; + case DATA_HADRONOX: + return HadronoxGUID; + case DATA_ANUBARAK: + return AnubarakGUID; + case DATA_WATCHER_GASHRA: + return WatcherGashraGUID; + case DATA_WATCHER_SILTHIK: + return WatcherSilthikGUID; + case DATA_WATCHER_NARJIL: + return WatcherNarjilGUID; + default: + break; + } + + return 0; } - } - uint32 GetData(uint32 type) const OVERRIDE - { - switch (type) + std::string GetSaveData() OVERRIDE { - case DATA_KRIKTHIR_THE_GATEWATCHER_EVENT: return auiEncounter[0]; - case DATA_HADRONOX_EVENT: return auiEncounter[1]; - case DATA_ANUBARAK_EVENT: return auiEncounter[2]; - } - - return 0; - } - - std::string GetSaveData() OVERRIDE - { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - saveStream << "A N " << auiEncounter[0] << ' ' << auiEncounter[1] << ' ' - << auiEncounter[2]; + OUT_SAVE_INST_DATA; - OUT_SAVE_INST_DATA_COMPLETE; - return saveStream.str(); - } + std::ostringstream saveStream; + saveStream << "A N " << 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); - - char dataHead1, dataHead2; - uint16 data0, data1, data2; - - std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2; - - if (dataHead1 == 'A' && dataHead2 == 'N') + void Load(char const* str) OVERRIDE { - auiEncounter[0] = data0; - auiEncounter[1] = data1; - auiEncounter[2] = data2; - - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (auiEncounter[i] == IN_PROGRESS) - auiEncounter[i] = NOT_STARTED; + 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 == 'N') + { + 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; + } - } else OUT_LOAD_INST_DATA_FAIL; + protected: + uint64 KrikthirGUID; + uint64 HadronoxGUID; + uint64 AnubarakGUID; + uint64 WatcherGashraGUID; + uint64 WatcherSilthikGUID; + uint64 WatcherNarjilGUID; + }; - OUT_LOAD_INST_DATA_COMPLETE; + InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE + { + return new instance_azjol_nerub_InstanceScript(map); } - }; - - InstanceScript* GetInstanceScript(InstanceMap* map) const OVERRIDE - { - return new instance_azjol_nerub_InstanceScript(map); - } }; void AddSC_instance_azjol_nerub() diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp index 95967f3a7bc..6baf5dc6d93 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfLightning/instance_halls_of_lightning.cpp @@ -25,6 +25,7 @@ DoorData const doorData[] = { GO_VOLKHAN_DOOR, DATA_VOLKHAN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, { GO_IONAR_DOOR, DATA_IONAR, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, { GO_LOKEN_DOOR, DATA_LOKEN, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } // END }; class instance_halls_of_lightning : public InstanceMapScript |