This code was written for a mid 2019 Version of AC, so it might require adjustments.
We need to re-instate the door between LBRS and UBRS. The door may only open, If a player has the Item [Seal of Ascension]
in their inventory and approaches the door.
When the opening is triggered, some braiziers are lit and the door swings open. Players may not enter UBRS without one party/raid member having the required item.
Of course not every piece of code below belongs to the door. Also, we wanna allow the door to open, only when it's not a RDF party.
Given some players will to cheat, we might wanna add one-shot mechanics to the boss encounters, as long as the door remains closed.
From a7ddeaa634a95f781a6b64e2c634ada86faa86bf Mon Sep 17 00:00:00 2001
From: MaloW <[email protected]>
Date: Tue, 16 Jul 2019 13:38:13 +0200
Subject: [PATCH] Re-added Seal of Ascension requirement for opening UBRS doors
Signed-off-by: MaloW <[email protected]>
---
VanillaRemixSQL/world.sql | 11 ++
.../BlackrockSpire/blackrock_spire.h | 14 ++
.../BlackrockSpire/instance_blackrock_spire.cpp | 141 +++++++++++++++++++--
3 files changed, 156 insertions(+), 10 deletions(-)
diff --git a/VanillaRemixSQL/world.sql b/VanillaRemixSQL/world.sql
index 329aae31..07394ac2 100644
--- a/VanillaRemixSQL/world.sql
+++ b/VanillaRemixSQL/world.sql
@@ -216,6 +216,17 @@ INSERT INTO achievement_reward VALUES('5001','178','178','0','0','','','0');
UPDATE gameobject_template SET ScriptName = 'go_molten_core_rune' WHERE entry IN (176951, 176952, 176953, 176954, 176955, 176956, 176957);
+-- Delete the default UBRS door
+DELETE FROM gameobject WHERE id = 164725;
+-- Create the new UBRS door
+DELETE FROM gameobject_template WHERE entry = 500001;
+DELETE FROM gameobject_template_addon WHERE entry = 500001;
+DELETE FROM gameobject WHERE guid = 2134999;
+INSERT INTO gameobject_template VALUES('500001','0','2750','UBRS Enter Door','','','','1.01','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','','','12340');
+INSERT INTO gameobject_template_addon VALUES('500001','114','32','0','0');
+INSERT INTO gameobject VALUES('2134999','500001','229','0','0','1','1','126.229','-318.919','70.9553','3.16535','-0','-0','-0.999929','0.0118789','300','0','1','','0');
+
+
-- Delete WOTLK / TBC stuff
-- Delete the Meeting Stone in Tanaris for Caverns of Time
DELETE FROM gameobject WHERE guid = 17269;
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/blackrock_spire.h b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/blackrock_spire.h
index b4198a05..6d9ffdf4 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/blackrock_spire.h
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/blackrock_spire.h
@@ -106,6 +106,20 @@ enum GameObjectsIds
GO_PORTCULLIS_TOBOSSROOMS = 175186,
// Urok Doomhowl
GO_UROK_PILE = 175621,
+ // The doors to enter URBS
+ GO_UBRS_ENTER_DOOR = 500001,
+ GO_UBRS_ENTER_BRAZIER_1 = 175528,
+ GO_UBRS_ENTER_BRAZIER_2 = 175529,
+ GO_UBRS_ENTER_BRAZIER_3 = 175530,
+ GO_UBRS_ENTER_BRAZIER_4 = 175531,
+ GO_UBRS_ENTER_BRAZIER_5 = 175532,
+ GO_UBRS_ENTER_BRAZIER_6 = 175533,
+};
+
+enum UbrsDoorState
+{
+ UBRS_DOOR_CLOSED = 0,
+ UBRS_DOOR_OPEN = 1,
};
enum npcspells
diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp
index 18151303..d0754382 100644
--- a/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp
+++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/BlackrockSpire/instance_blackrock_spire.cpp
@@ -21,14 +21,18 @@ uint32 const DragonspireMobs[3] = { NPC_BLACKHAND_DREADWEAVER, NPC_BLACKHAND_SUM
enum EventIds
{
- EVENT_DARGONSPIRE_ROOM_STORE = 1,
- EVENT_DARGONSPIRE_ROOM_CHECK = 2,
- EVENT_UROK_DOOMHOWL_SPAWNS_1 = 3,
- EVENT_UROK_DOOMHOWL_SPAWNS_2 = 4,
- EVENT_UROK_DOOMHOWL_SPAWNS_3 = 5,
- EVENT_UROK_DOOMHOWL_SPAWNS_4 = 6,
- EVENT_UROK_DOOMHOWL_SPAWNS_5 = 7,
- EVENT_UROK_DOOMHOWL_SPAWN_IN = 8
+ EVENT_DARGONSPIRE_ROOM_STORE = 1,
+ EVENT_DARGONSPIRE_ROOM_CHECK = 2,
+ EVENT_UROK_DOOMHOWL_SPAWNS_1 = 3,
+ EVENT_UROK_DOOMHOWL_SPAWNS_2 = 4,
+ EVENT_UROK_DOOMHOWL_SPAWNS_3 = 5,
+ EVENT_UROK_DOOMHOWL_SPAWNS_4 = 6,
+ EVENT_UROK_DOOMHOWL_SPAWNS_5 = 7,
+ EVENT_UROK_DOOMHOWL_SPAWN_IN = 8,
+ EVENT_UBRS_DOOR_OPEN_STAGE_1 = 9,
+ EVENT_UBRS_DOOR_OPEN_STAGE_2 = 10,
+ EVENT_UBRS_DOOR_OPEN_STAGE_3 = 11,
+ EVENT_UBRS_DOOR_OPEN_STAGE_4 = 12,
};
class instance_blackrock_spire : public InstanceMapScript
@@ -142,6 +146,47 @@ public:
{
switch (go->GetEntry())
{
+ case GO_UBRS_ENTER_DOOR:
+ case GO_UBRS_ENTER_BRAZIER_1:
+ case GO_UBRS_ENTER_BRAZIER_2:
+ case GO_UBRS_ENTER_BRAZIER_3:
+ case GO_UBRS_ENTER_BRAZIER_4:
+ case GO_UBRS_ENTER_BRAZIER_5:
+ case GO_UBRS_ENTER_BRAZIER_6:
+ if (ubrsDoorState == UBRS_DOOR_OPEN)
+ {
+ go->SetGoState(GO_STATE_ACTIVE);
+ }
+ else
+ {
+ go->SetGoState(GO_STATE_READY);
+ }
+ break;
+ }
+
+ switch (go->GetEntry())
+ {
+ case GO_UBRS_ENTER_DOOR:
+ go_ubrsEnterDoors = go->GetGUID();
+ break;
+ case GO_UBRS_ENTER_BRAZIER_1:
+ go_ubrsEnterBraziers[0] = go->GetGUID();
+ break;
+ case GO_UBRS_ENTER_BRAZIER_2:
+ go_ubrsEnterBraziers[1] = go->GetGUID();
+ break;
+ case GO_UBRS_ENTER_BRAZIER_3:
+ go_ubrsEnterBraziers[2] = go->GetGUID();
+ break;
+ case GO_UBRS_ENTER_BRAZIER_4:
+ go_ubrsEnterBraziers[3] = go->GetGUID();
+ break;
+ case GO_UBRS_ENTER_BRAZIER_5:
+ go_ubrsEnterBraziers[4] = go->GetGUID();
+ break;
+ case GO_UBRS_ENTER_BRAZIER_6:
+ go_ubrsEnterBraziers[5] = go->GetGUID();
+ break;
case GO_WHELP_SPAWNER:
go->CastSpell(NULL, SPELL_SUMMON_ROOKERY_WHELP);
break;
@@ -391,10 +436,55 @@ public:
return 0;
}
+ void OpenUbrsDoors()
+ {
+ ubrsDoorState = UBRS_DOOR_OPEN;
+ Events.ScheduleEvent(EVENT_UBRS_DOOR_OPEN_STAGE_1, 1);
+ InstanceScript::SaveToDB();
+ }
+
+ bool CheckOpenUbrsDoors()
+ {
+ if (GameObject* doors = instance->GetGameObject(go_ubrsEnterDoors))
+ {
+ Map::PlayerList const& players = instance->GetPlayers();
+ for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
+ {
+ if (Player* player = itr->GetSource())
+ {
+ if (player && !player->IsGameMaster() && player->IsWithinDist2d(doors->GetPositionX(), doors->GetPositionY(), 30.0f))
+ {
+ if (player->HasItemCount(12344))
+ {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ return false;
+ }
+
void Update(uint32 diff)
{
Events.Update(diff);
+ if (ubrsDoorState == UBRS_DOOR_CLOSED)
+ {
+ if (ubrsDoorCheckTimer <= diff)
+ {
+ ubrsDoorCheckTimer = 2000;
+ if (CheckOpenUbrsDoors())
+ {
+ OpenUbrsDoors();
+ }
+ }
+ else
+ {
+ ubrsDoorCheckTimer -= diff;
+ }
+ }
+
while (uint32 eventId = Events.ExecuteEvent())
{
switch (eventId)
@@ -408,6 +498,31 @@ public:
if ((GetBossState(DATA_DRAGONSPIRE_ROOM) != DONE))
Events.ScheduleEvent(EVENT_DARGONSPIRE_ROOM_CHECK, 3000);
break;
+ case EVENT_UBRS_DOOR_OPEN_STAGE_1:
+ Events.ScheduleEvent(EVENT_UBRS_DOOR_OPEN_STAGE_2, 1000);
+ if (GameObject* brazier = instance->GetGameObject(go_ubrsEnterBraziers[0]))
+ brazier->SetGoState(GO_STATE_ACTIVE);
+ if (GameObject* brazier = instance->GetGameObject(go_ubrsEnterBraziers[1]))
+ brazier->SetGoState(GO_STATE_ACTIVE);
+ break;
+ case EVENT_UBRS_DOOR_OPEN_STAGE_2:
+ Events.ScheduleEvent(EVENT_UBRS_DOOR_OPEN_STAGE_3, 1000);
+ if (GameObject* brazier = instance->GetGameObject(go_ubrsEnterBraziers[2]))
+ brazier->SetGoState(GO_STATE_ACTIVE);
+ if (GameObject* brazier = instance->GetGameObject(go_ubrsEnterBraziers[3]))
+ brazier->SetGoState(GO_STATE_ACTIVE);
+ break;
+ case EVENT_UBRS_DOOR_OPEN_STAGE_3:
+ Events.ScheduleEvent(EVENT_UBRS_DOOR_OPEN_STAGE_4, 1000);
+ if (GameObject* brazier = instance->GetGameObject(go_ubrsEnterBraziers[4]))
+ brazier->SetGoState(GO_STATE_ACTIVE);
+ if (GameObject* brazier = instance->GetGameObject(go_ubrsEnterBraziers[5]))
+ brazier->SetGoState(GO_STATE_ACTIVE);
+ break;
+ case EVENT_UBRS_DOOR_OPEN_STAGE_4:
+ if (GameObject* doors = instance->GetGameObject(go_ubrsEnterDoors))
+ doors->SetGoState(GO_STATE_ACTIVE);
+ break;
default:
break;
}
@@ -515,7 +630,7 @@ public:
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
- saveStream << "B S " << GetBossSaveData();
+ saveStream << "B S " << GetBossSaveData() << (uint32)ubrsDoorState << ' ';
OUT_SAVE_INST_DATA_COMPLETE;
return saveStream.str();
@@ -538,15 +653,17 @@ public:
if (dataHead1 == 'B' && dataHead2 == 'S')
{
+ uint32 tmpState;
for (uint8 i = 0; i < EncounterCount; ++i)
{
- uint32 tmpState;
loadStream >> tmpState;
if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
tmpState = NOT_STARTED;
SetBossState(i, EncounterState(tmpState));
}
+ loadStream >> tmpState;
+ ubrsDoorState = UbrsDoorState(tmpState);
}
else
OUT_LOAD_INST_DATA_FAIL;
@@ -581,6 +698,10 @@ public:
uint64 go_portcullis_active;
uint64 go_portcullis_tobossrooms;
uint64 go_urok_pile;
+ uint64 go_ubrsEnterDoors = 0;
+ uint64 go_ubrsEnterBraziers[6] = { 0 };
+ UbrsDoorState ubrsDoorState = UBRS_DOOR_CLOSED;
+ uint32 ubrsDoorCheckTimer = 2000;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const
--
2.11.1.windows.1