aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockSpire/blackrock_spire.h63
-rw-r--r--src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp248
2 files changed, 249 insertions, 62 deletions
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/blackrock_spire.h b/src/server/scripts/EasternKingdoms/BlackrockSpire/blackrock_spire.h
index 82500ab90b0..21ba1854c40 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/blackrock_spire.h
+++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/blackrock_spire.h
@@ -18,25 +18,38 @@
#ifndef DEF_BLACKROCK_SPIRE_H
#define DEF_BLACKROCK_SPIRE_H
-enum Data
+uint32 const EncounterCount = 22;
+
+#define UBRSScriptName "instance_blackrock_spire"
+
+enum DataTypes
{
- DATA_OMOKK,
- DATA_SHADOW_HUNTER_VOSHGAJIN,
- DATA_WARMASTER_VOONE,
- DATA_MOTHER_SMOLDERWEB,
- DATA_UROK_DOOMHOWL, // not scripted
- DATA_QUARTERMASTER_ZIGRIS,
- DATA_GIZRUL_THE_SLAVENER, // not scripted
- DATA_HALYCON,
- DATA_OVERLORD_WYRMTHALAK,
- DATA_PYROGAURD_EMBERSEER,
- DATA_WARCHIEF_REND_BLACKHAND,
- DATA_GYTH,
- DATA_THE_BEAST,
- DATA_GENERAL_DRAKKISATH,
- DATA_DRAGONSPIRE_ROOM,
+ DATA_OMOKK = 0,
+ DATA_SHADOW_HUNTER_VOSHGAJIN = 1,
+ DATA_WARMASTER_VOONE = 2,
+ DATA_MOTHER_SMOLDERWEB = 3,
+ DATA_UROK_DOOMHOWL = 4, // not scripted
+ DATA_QUARTERMASTER_ZIGRIS = 5,
+ DATA_GIZRUL_THE_SLAVENER = 6, // not scripted
+ DATA_HALYCON = 7,
+ DATA_OVERLORD_WYRMTHALAK = 8,
+ DATA_PYROGAURD_EMBERSEER = 9,
+ DATA_WARCHIEF_REND_BLACKHAND = 10,
+ DATA_GYTH = 11,
+ DATA_THE_BEAST = 12,
+ DATA_GENERAL_DRAKKISATH = 13,
+ // Extra
+ DATA_DRAGONSPIRE_ROOM = 14,
+ DATA_ROOM_1_RUNE = 15,
+ DATA_ROOM_2_RUNE = 16,
+ DATA_ROOM_3_RUNE = 17,
+ DATA_ROOM_4_RUNE = 18,
+ DATA_ROOM_5_RUNE = 19,
+ DATA_ROOM_6_RUNE = 20,
+ DATA_ROOM_7_RUNE = 21
};
-enum Npc
+
+enum CreaturesIds
{
NPC_OMOKK = 9196,
NPC_SHADOW_HUNTER_VOSHGAJIN = 9236,
@@ -54,23 +67,21 @@ enum Npc
NPC_GENERAL_DRAKKISATH = 10363,
NPC_BLACKHAND_DREADWEAVER = 9817,
NPC_BLACKHAND_SUMMONER = 9818,
- NPC_BLACKHAND_VETERAN = 9819,
+ NPC_BLACKHAND_VETERAN = 9819
};
enum AdditionalData
{
SPELL_SUMMON_ROOKERY_WHELP = 15745,
- MAX_ENCOUNTER = 14,
MAX_DRAGONSPIRE_HALL_RUNES = 7,
EVENT_PYROGUARD_EMBERSEER = 4884,
AREATRIGGER_ENTER_UBRS = 2046,
- AREATRIGGER_STADIUM = 2026,
+ AREATRIGGER_STADIUM = 2026
};
-enum GameObjects
+enum GameObjectsIds
{
GO_WHELP_SPAWNER = 175622, // trap spawned by go id 175124
-
// Doors
GO_EMBERSEER_IN = 175244, // First door to Pyroguard Emberseer
GO_DOORS = 175705, // Second door to Pyroguard Emberseer
@@ -80,8 +91,7 @@ enum GameObjects
GO_GYTH_EXIT_DOOR = 175186,
GO_DRAKKISATH_DOOR_1 = 175946,
GO_DRAKKISATH_DOOR_2 = 175947,
-
- // Runes
+ // Runes in dragonspire hall
GO_ROOM_1_RUNE = 175197,
GO_ROOM_2_RUNE = 175199,
GO_ROOM_3_RUNE = 175195,
@@ -89,15 +99,14 @@ enum GameObjects
GO_ROOM_5_RUNE = 175198,
GO_ROOM_6_RUNE = 175196,
GO_ROOM_7_RUNE = 175194,
-
+ // Runes in emberseers room
GO_EMBERSEER_RUNE_1 = 175266,
GO_EMBERSEER_RUNE_2 = 175267,
GO_EMBERSEER_RUNE_3 = 175268,
GO_EMBERSEER_RUNE_4 = 175269,
GO_EMBERSEER_RUNE_5 = 175270,
GO_EMBERSEER_RUNE_6 = 175271,
- GO_EMBERSEER_RUNE_7 = 175272,
+ GO_EMBERSEER_RUNE_7 = 175272
};
#endif
-
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp
index 06ba0036ef3..ffa33ea3cf0 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/instance_blackrock_spire.cpp
@@ -15,50 +15,35 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include "ObjectDefines.h"
+#include "ObjectMgr.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "blackrock_spire.h"
+#include "InstanceScript.h"
+
+uint32 const DragonspireRunes[7] = { GO_ROOM_1_RUNE, GO_ROOM_2_RUNE, GO_ROOM_3_RUNE, GO_ROOM_4_RUNE, GO_ROOM_5_RUNE, GO_ROOM_6_RUNE, GO_ROOM_7_RUNE };
+
+uint32 const DragonspireMobs[3] = { NPC_BLACKHAND_DREADWEAVER, NPC_BLACKHAND_SUMMONER, NPC_BLACKHAND_VETERAN };
+
+enum EventIds
+{
+ EVENT_DARGONSPIRE_ROOM_STORE = 1,
+ EVENT_DARGONSPIRE_ROOM_CHECK = 2
+};
class instance_blackrock_spire : public InstanceMapScript
{
public:
- instance_blackrock_spire() : InstanceMapScript("instance_blackrock_spire", 229) { }
-
- InstanceScript* GetInstanceScript(InstanceMap* map) const
- {
- return new instance_blackrock_spireMapScript(map);
- }
+ instance_blackrock_spire() : InstanceMapScript(UBRSScriptName, 229) { }
struct instance_blackrock_spireMapScript : public InstanceScript
{
- instance_blackrock_spireMapScript(InstanceMap* map) : InstanceScript(map) {}
-
- uint32 encounter[MAX_ENCOUNTER];
- std::string m_strInstData;
- uint64 HighlordOmokk;
- uint64 ShadowHunterVoshgajin;
- uint64 WarMasterVoone;
- uint64 MotherSmolderweb;
- uint64 UrokDoomhowl;
- uint64 QuartermasterZigris;
- uint64 GizrultheSlavener;
- uint64 Halycon;
- uint64 OverlordWyrmthalak;
- uint64 PyroguardEmberseer;
- uint64 WarchiefRendBlackhand;
- uint64 Gyth;
- uint64 TheBeast;
- uint64 GeneralDrakkisath;
- uint64 go_emberseerin;
- uint64 go_doors;
- uint64 go_emberseerout;
- uint64 go_roomrunes[MAX_DRAGONSPIRE_HALL_RUNES];
- uint8 Runemaxprotectors[MAX_DRAGONSPIRE_HALL_RUNES];
- uint8 Runeprotectorsdead[MAX_DRAGONSPIRE_HALL_RUNES];
+ instance_blackrock_spireMapScript(InstanceMap* map) : InstanceScript(map) { }
void Initialize()
{
- SetBossNumber(MAX_ENCOUNTER);
+ SetBossNumber(EncounterCount);
HighlordOmokk = 0;
ShadowHunterVoshgajin = 0;
WarMasterVoone = 0;
@@ -78,9 +63,15 @@ public:
go_emberseerout = 0;
}
+ void OnPlayerEnter(Player* player)
+ {
+ if ((GetBossState(DATA_DRAGONSPIRE_ROOM) != DONE))
+ Events.ScheduleEvent(EVENT_DARGONSPIRE_ROOM_STORE, 4000);
+ }
+
bool IsEncounterInProgress() const
{
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
+ for (uint8 i = 0; i < EncounterCount; ++i)
{
if (encounter[i] == IN_PROGRESS)
return true;
@@ -150,33 +141,56 @@ public:
break;
case GO_EMBERSEER_IN:
go_emberseerin = go->GetGUID();
+
+ if ((GetBossState(DATA_DRAGONSPIRE_ROOM) == DONE))
+ go->SetGoState(GO_STATE_ACTIVE);
break;
case GO_DOORS:
go_doors = go->GetGUID();
+
+ if ((GetBossState(DATA_DRAGONSPIRE_ROOM) == DONE))
+ go->SetGoState(GO_STATE_ACTIVE);
break;
case GO_EMBERSEER_OUT:
go_emberseerout = go->GetGUID();
+
+ if ((GetBossState(DATA_PYROGAURD_EMBERSEER) == DONE))
+ go->SetGoState(GO_STATE_ACTIVE);
break;
case GO_ROOM_1_RUNE:
go_roomrunes[0] = go->GetGUID();
+ if ((GetBossState(DATA_ROOM_1_RUNE) == DONE))
+ go->SetGoState(GO_STATE_READY);
break;
case GO_ROOM_2_RUNE:
go_roomrunes[1] = go->GetGUID();
+ if ((GetBossState(DATA_ROOM_2_RUNE) == DONE))
+ go->SetGoState(GO_STATE_READY);
break;
case GO_ROOM_3_RUNE:
go_roomrunes[2] = go->GetGUID();
+ if ((GetBossState(DATA_ROOM_3_RUNE) == DONE))
+ go->SetGoState(GO_STATE_READY);
break;
case GO_ROOM_4_RUNE:
go_roomrunes[3] = go->GetGUID();
+ if ((GetBossState(DATA_ROOM_4_RUNE) == DONE))
+ go->SetGoState(GO_STATE_READY);
break;
case GO_ROOM_5_RUNE:
go_roomrunes[4] = go->GetGUID();
+ if ((GetBossState(DATA_ROOM_5_RUNE) == DONE))
+ go->SetGoState(GO_STATE_READY);
break;
case GO_ROOM_6_RUNE:
go_roomrunes[5] = go->GetGUID();
+ if ((GetBossState(DATA_ROOM_6_RUNE) == DONE))
+ go->SetGoState(GO_STATE_READY);
break;
case GO_ROOM_7_RUNE:
go_roomrunes[6] = go->GetGUID();
+ if ((GetBossState(DATA_ROOM_7_RUNE) == DONE))
+ go->SetGoState(GO_STATE_READY);
break;
}
}
@@ -202,7 +216,7 @@ public:
case DATA_GYTH:
case DATA_THE_BEAST:
case DATA_GENERAL_DRAKKISATH:
- break;
+ case DATA_DRAGONSPIRE_ROOM:
default:
break;
}
@@ -229,57 +243,192 @@ public:
{
case DATA_OMOKK:
return HighlordOmokk;
+ break;
case DATA_SHADOW_HUNTER_VOSHGAJIN:
return ShadowHunterVoshgajin;
+ break;
case DATA_WARMASTER_VOONE:
return WarMasterVoone;
+ break;
case DATA_MOTHER_SMOLDERWEB:
return MotherSmolderweb;
+ break;
case DATA_UROK_DOOMHOWL:
return UrokDoomhowl;
+ break;
case DATA_QUARTERMASTER_ZIGRIS:
return QuartermasterZigris;
+ break;
case DATA_GIZRUL_THE_SLAVENER:
return GizrultheSlavener;
+ break;
case DATA_HALYCON:
return Halycon;
+ break;
case DATA_OVERLORD_WYRMTHALAK:
return OverlordWyrmthalak;
+ break;
case DATA_PYROGAURD_EMBERSEER:
return PyroguardEmberseer;
+ break;
case DATA_WARCHIEF_REND_BLACKHAND:
return WarchiefRendBlackhand;
+ break;
case DATA_GYTH:
return Gyth;
+ break;
case DATA_THE_BEAST:
return TheBeast;
+ break;
case DATA_GENERAL_DRAKKISATH:
return GeneralDrakkisath;
+ break;
case GO_EMBERSEER_IN:
return go_emberseerin;
+ break;
case GO_DOORS:
return go_doors;
+ break;
case GO_EMBERSEER_OUT:
return go_emberseerout;
+ break;
case GO_ROOM_1_RUNE:
return go_roomrunes[0];
+ break;
case GO_ROOM_2_RUNE:
return go_roomrunes[1];
case GO_ROOM_3_RUNE:
return go_roomrunes[2];
+ break;
case GO_ROOM_4_RUNE:
return go_roomrunes[3];
+ break;
case GO_ROOM_5_RUNE:
return go_roomrunes[4];
+ break;
case GO_ROOM_6_RUNE:
return go_roomrunes[5];
+ break;
case GO_ROOM_7_RUNE:
return go_roomrunes[6];
+ break;
}
-
return 0;
}
+ void Update(uint32 diff)
+ {
+ Events.Update(diff);
+
+ while (uint32 eventId = Events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_DARGONSPIRE_ROOM_STORE:
+ Dragonspireroomstore();
+ Events.ScheduleEvent(EVENT_DARGONSPIRE_ROOM_CHECK, 2500);
+ break;
+ case EVENT_DARGONSPIRE_ROOM_CHECK:
+ Dragonspireroomcheck();
+ if ((GetBossState(DATA_DRAGONSPIRE_ROOM) != DONE))
+ Events.ScheduleEvent(EVENT_DARGONSPIRE_ROOM_CHECK, 2500);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ void Dragonspireroomstore()
+ {
+ uint8 creaturecount = 0;
+
+ for (uint8 i = 0; i < 7; ++i)
+ {
+ if (GameObject* rune = instance->GetGameObject(go_roomrunes[i]))
+ {
+ for (uint8 ii = 0; ii < 3; ++ii)
+ {
+ std::list<Creature*> creatureList;
+ GetCreatureListWithEntryInGrid(creatureList, rune, DragonspireMobs[ii], 15.0f);
+ for (std::list<Creature*>::iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr)
+ {
+ if (Creature* creatureList = *itr)
+ {
+ runecreaturelist[i] [creaturecount] = creatureList->GetGUID();
+ ++creaturecount;
+ }
+ }
+ }
+ creaturecount = 0;
+ }
+ }
+ }
+
+ void Dragonspireroomcheck()
+ {
+ for (uint8 i = 0; i < 7; ++i)
+ {
+ bool _mobAlive = false;
+
+ if (GameObject* rune = instance->GetGameObject(go_roomrunes[i]))
+ {
+ if (rune->GetGoState() == GO_STATE_ACTIVE)
+ {
+ for (uint8 ii = 0; ii < 5; ++ii)
+ {
+ if (Creature* mob = instance->GetCreature(runecreaturelist[i] [ii]))
+ {
+ if (mob->IsAlive())
+ _mobAlive = true;
+ }
+ }
+ }
+
+ if (!_mobAlive && rune->GetGoState() == GO_STATE_ACTIVE)
+ {
+ rune->SetGoState(GO_STATE_READY);
+
+ switch (rune->GetEntry())
+ {
+ case GO_ROOM_1_RUNE:
+ SetBossState(DATA_ROOM_1_RUNE, DONE);
+ break;
+ case GO_ROOM_2_RUNE:
+ SetBossState(DATA_ROOM_2_RUNE, DONE);
+ break;
+ case GO_ROOM_3_RUNE:
+ SetBossState(DATA_ROOM_3_RUNE, DONE);
+ break;
+ case GO_ROOM_4_RUNE:
+ SetBossState(DATA_ROOM_4_RUNE, DONE);
+ break;
+ case GO_ROOM_5_RUNE:
+ SetBossState(DATA_ROOM_5_RUNE, DONE);
+ break;
+ case GO_ROOM_6_RUNE:
+ SetBossState(DATA_ROOM_6_RUNE, DONE);
+ break;
+ case GO_ROOM_7_RUNE:
+ SetBossState(DATA_ROOM_7_RUNE, DONE);
+ break;
+ }
+ }
+
+ if (GetBossState(DATA_ROOM_1_RUNE) == DONE && GetBossState(DATA_ROOM_2_RUNE) == DONE && GetBossState(DATA_ROOM_3_RUNE) == DONE &&
+ GetBossState(DATA_ROOM_4_RUNE) == DONE &&GetBossState(DATA_ROOM_5_RUNE) == DONE && GetBossState(DATA_ROOM_6_RUNE) == DONE &&
+ GetBossState(DATA_ROOM_7_RUNE) == DONE)
+ {
+ SetBossState(DATA_DRAGONSPIRE_ROOM, DONE);
+ if (GameObject* door1 = instance->GetGameObject(go_emberseerin))
+ door1->SetGoState(GO_STATE_ACTIVE);
+ if (GameObject* door2 = instance->GetGameObject(go_doors))
+ door2->SetGoState(GO_STATE_ACTIVE);
+ }
+ }
+ }
+ }
+
std::string GetSaveData()
{
OUT_SAVE_INST_DATA;
@@ -308,7 +457,7 @@ public:
if (dataHead1 == 'B' && dataHead2 == 'S')
{
- for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
+ for (uint8 i = 0; i < EncounterCount; ++i)
{
uint32 tmpState;
loadStream >> tmpState;
@@ -319,8 +468,37 @@ public:
OUT_LOAD_INST_DATA_COMPLETE;
}
+
+ protected:
+ EventMap Events;
+ uint32 encounter[EncounterCount];
+ std::string m_strInstData;
+ uint64 HighlordOmokk;
+ uint64 ShadowHunterVoshgajin;
+ uint64 WarMasterVoone;
+ uint64 MotherSmolderweb;
+ uint64 UrokDoomhowl;
+ uint64 QuartermasterZigris;
+ uint64 GizrultheSlavener;
+ uint64 Halycon;
+ uint64 OverlordWyrmthalak;
+ uint64 PyroguardEmberseer;
+ uint64 WarchiefRendBlackhand;
+ uint64 Gyth;
+ uint64 TheBeast;
+ uint64 GeneralDrakkisath;
+ uint64 go_emberseerin;
+ uint64 go_doors;
+ uint64 go_emberseerout;
+ uint64 go_roomrunes[MAX_DRAGONSPIRE_HALL_RUNES];
+ uint64 runecreaturelist[7] [5];
};
+ InstanceScript* GetInstanceScript(InstanceMap* map) const
+ {
+ return new instance_blackrock_spireMapScript(map);
+ }
+
};
void AddSC_instance_blackrock_spire()