Scripts/AzjolNerub: reworked InstanceScript
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
+6
-7
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user