Scripts/AzjolNerub: reworked InstanceScript

This commit is contained in:
joschiwald
2013-08-20 23:05:00 +02:00
parent 296da5df12
commit 7a14e366ac
6 changed files with 202 additions and 195 deletions
@@ -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
{
DATA_KRIKTHIR_THE_GATEWATCHER,
DATA_HADRONOX,
DATA_ANUBARAK,
DATA_WATCHER_GASHRA,
DATA_WATCHER_SILTHIK,
DATA_WATCHER_NARJIL
// 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 Data
enum CreatureIds
{
DATA_KRIKTHIR_THE_GATEWATCHER_EVENT,
DATA_HADRONOX_EVENT,
DATA_ANUBARAK_EVENT
NPC_KRIKTHIR = 28684,
NPC_HADRONOX = 28921,
NPC_ANUBARAK = 29120,
NPC_WATCHER_NARJIL = 28729,
NPC_WATCHER_GASHRA = 28730,
NPC_WATCHER_SILTHIK = 28731
};
#endif
enum GameObjectIds
{
GO_KRIKTHIR_DOOR = 192395,
GO_ANUBARAK_DOOR_1 = 192396,
GO_ANUBARAK_DOOR_2 = 192397,
GO_ANUBARAK_DOOR_3 = 192398
};
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_
@@ -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
@@ -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();
}
@@ -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;
@@ -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) { }
public:
instance_azjol_nerub() : InstanceMapScript(AzjolNerubScriptName, 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;
}
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);
void OnGameObjectCreate(GameObject* go) OVERRIDE
{
switch (go->GetEntry())
{
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;
}
}
uint64 GetData64(uint32 identifier) const OVERRIDE
{
switch (identifier)
{
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;
KrikthirGUID = 0;
HadronoxGUID = 0;
AnubarakGUID = 0;
WatcherGashraGUID = 0;
WatcherSilthikGUID = 0;
WatcherNarjilGUID = 0;
}
return 0;
}
void SetData(uint32 type, uint32 data) OVERRIDE
{
switch (type)
void OnCreatureCreate(Creature* creature) 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 (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;
}
}
if (data == DONE)
void OnGameObjectCreate(GameObject* go) OVERRIDE
{
SaveToDB();
}
}
uint32 GetData(uint32 type) const OVERRIDE
{
switch (type)
{
case DATA_KRIKTHIR_THE_GATEWATCHER_EVENT: return auiEncounter[0];
case DATA_HADRONOX_EVENT: return auiEncounter[1];
case DATA_ANUBARAK_EVENT: return auiEncounter[2];
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;
}
std::string GetSaveData() OVERRIDE
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << "A N " << auiEncounter[0] << ' ' << auiEncounter[1] << ' '
<< auiEncounter[2];
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
}
void Load(const char* in) OVERRIDE
{
if (!in)
void OnGameObjectRemove(GameObject* go) OVERRIDE
{
OUT_LOAD_INST_DATA_FAIL;
return;
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;
}
}
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')
uint64 GetData64(uint32 type) const OVERRIDE
{
auiEncounter[0] = data0;
auiEncounter[1] = data1;
auiEncounter[2] = data2;
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;
}
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (auiEncounter[i] == IN_PROGRESS)
auiEncounter[i] = NOT_STARTED;
return 0;
}
} else OUT_LOAD_INST_DATA_FAIL;
std::string GetSaveData() OVERRIDE
{
OUT_SAVE_INST_DATA;
OUT_LOAD_INST_DATA_COMPLETE;
std::ostringstream saveStream;
saveStream << "A N " << 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 == '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;
}
protected:
uint64 KrikthirGUID;
uint64 HadronoxGUID;
uint64 AnubarakGUID;
uint64 WatcherGashraGUID;
uint64 WatcherSilthikGUID;
uint64 WatcherNarjilGUID;
};
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()
@@ -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