TrinityCore
instance_blackrock_depths.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "ScriptMgr.h"
19#include "blackrock_depths.h"
20#include "GameObject.h"
21#include "InstanceScript.h"
22#include "Log.h"
23#include "Map.h"
24#include "ScriptedCreature.h"
25
26#define TIMER_TOMBOFTHESEVEN 15000
28
30{
51 NPC_MAGMUS = 9938,
52 NPC_MOIRA = 8929,
53 NPC_COREN = 23872,
54};
55
57{
58 GO_ARENA1 = 161525,
59 GO_ARENA2 = 161522,
60 GO_ARENA3 = 161524,
61 GO_ARENA4 = 161523,
68 GO_BAR_DOOR = 170571,
69 GO_TOMB_ENTER = 170576,
70 GO_TOMB_EXIT = 170577,
71 GO_LYCEUM = 170558,
72 GO_SF_N = 174745, // Shadowforge Brazier North
73 GO_SF_S = 174744, // Shadowforge Brazier South
74 GO_GOLEM_ROOM_N = 170573, // Magmus door North
75 GO_GOLEM_ROOM_S = 170574, // Magmus door Soutsh
76 GO_THRONE_ROOM = 170575, // Throne door
78 GO_CHEST_SEVEN = 169243
79};
80
81static constexpr DungeonEncounterData encounters[] =
82{
83 { BOSS_HIGH_INTERROGATOR_GERSTAHN, { { 227 }} },
84 { BOSS_LORD_ROCCOR, { { 228 }} },
85 { BOSS_HOUNDMASTER_GREBMAR, { { 229 }} },
86 { BOSS_RING_OF_LAW, { { 230 }} },
87 { BOSS_PYROMANCER_LOREGRAIN, { { 231 }} },
88 { BOSS_LORD_INCENDIUS, { { 232 }} },
89 { BOSS_WARDER_STILGISS, { { 233 }} },
90 { BOSS_FINEOUS_DARKVIRE, { { 234 }} },
91 { BOSS_BAELGAR, { { 235 }} },
92 { BOSS_GENERAL_ANGERFORGE, { { 236 }} },
93 { BOSS_GOLEM_LORD_ARGELMACH, { { 237 }} },
94 { BOSS_HURLEY_BLACKBREATH, { { 238 }} },
95 { BOSS_PHALANX, { { 239 }} },
96 { BOSS_RIBBLY_SCREWSPIGOT, { { 240 }} },
97 { BOSS_PLUGGER_SPAZZRING, { { 241 }} },
98 { BOSS_AMBASSADOR_FLAMELASH, { { 242 }} },
99 { BOSS_THE_SEVEN, { { 243 }} },
100 { BOSS_MAGMUS, { { 244 }} },
101 { BOSS_EMPEROR_DAGRAN_THAURISSAN, { { 245 }} }
102};
103
105{
106public:
108
110 {
112 }
113
115 {
117 {
121
122 BarAleCount = 0;
123 GhostKillCount = 0;
126 }
127
133
155
162
163 void OnCreatureCreate(Creature* creature) override
164 {
165 switch (creature->GetEntry())
166 {
167 case NPC_EMPEROR: EmperorGUID = creature->GetGUID(); break;
168 case NPC_PHALANX: PhalanxGUID = creature->GetGUID(); break;
169 case NPC_MOIRA: MoiraGUID = creature->GetGUID(); break;
170 case NPC_COREN: CorenGUID = creature->GetGUID(); break;
171 case NPC_DOOMREL: TombBossGUIDs[0] = creature->GetGUID(); break;
172 case NPC_DOPEREL: TombBossGUIDs[1] = creature->GetGUID(); break;
173 case NPC_HATEREL: TombBossGUIDs[2] = creature->GetGUID(); break;
174 case NPC_VILEREL: TombBossGUIDs[3] = creature->GetGUID(); break;
175 case NPC_SEETHREL: TombBossGUIDs[4] = creature->GetGUID(); break;
176 case NPC_GLOOMREL: TombBossGUIDs[5] = creature->GetGUID(); break;
177 case NPC_ANGERREL: TombBossGUIDs[6] = creature->GetGUID(); break;
178 case NPC_MAGMUS:
179 MagmusGUID = creature->GetGUID();
180 if (!creature->IsAlive())
181 HandleGameObject(GetGuidData(DATA_THRONE_DOOR), true); // if Magmus is dead open door to last boss
182 break;
183 }
184 }
185
187 {
188 switch (go->GetEntry())
189 {
190 case GO_ARENA1: GoArena1GUID = go->GetGUID(); break;
191 case GO_ARENA2: GoArena2GUID = go->GetGUID(); break;
192 case GO_ARENA3: GoArena3GUID = go->GetGUID(); break;
193 case GO_ARENA4: GoArena4GUID = go->GetGUID(); break;
194 case GO_SHADOW_LOCK: GoShadowLockGUID = go->GetGUID(); break;
195 case GO_SHADOW_MECHANISM: GoShadowMechGUID = go->GetGUID(); break;
197 case GO_SHADOW_DUMMY: GoShadowDummyGUID = go->GetGUID(); break;
198 case GO_BAR_KEG_SHOT: GoBarKegGUID = go->GetGUID(); break;
199 case GO_BAR_KEG_TRAP: GoBarKegTrapGUID = go->GetGUID(); break;
200 case GO_BAR_DOOR: GoBarDoorGUID = go->GetGUID(); break;
201 case GO_TOMB_ENTER: GoTombEnterGUID = go->GetGUID(); break;
202 case GO_TOMB_EXIT:
203 GoTombExitGUID = go->GetGUID();
206 else
208 break;
209 case GO_LYCEUM: GoLyceumGUID = go->GetGUID(); break;
210 case GO_SF_S: GoSFSGUID = go->GetGUID(); break;
211 case GO_SF_N: GoSFNGUID = go->GetGUID(); break;
212 case GO_GOLEM_ROOM_N: GoGolemNGUID = go->GetGUID(); break;
213 case GO_GOLEM_ROOM_S: GoGolemSGUID = go->GetGUID(); break;
214 case GO_THRONE_ROOM: GoThroneGUID = go->GetGUID(); break;
215 case GO_CHEST_SEVEN: GoChestGUID = go->GetGUID(); break;
217 }
218 }
219
220 void OnUnitDeath(Unit* unit) override
221 {
222 switch (unit->GetEntry())
223 {
235 default: break;
236 }
237 }
238
239 void SetGuidData(uint32 type, ObjectGuid data) override
240 {
241 TC_LOG_DEBUG("scripts", "Instance Blackrock Depths: SetGuidData update (Type: {} Data {})", type, data.ToString());
242
243 switch (type)
244 {
245 case DATA_EVENSTARTER:
248 TombOfSevenReset();//reset
249 else
250 TombOfSevenStart();//start
251 break;
252 }
253 }
254
255 void SetData(uint32 type, uint32 data) override
256 {
257 TC_LOG_DEBUG("scripts", "Instance Blackrock Depths: SetData update (Type: {} Data {})", type, data);
258
259 switch (type)
260 {
261 case TYPE_RING_OF_LAW:
263 break;
264 case TYPE_VAULT:
266 break;
267 case TYPE_BAR:
268 if (data == SPECIAL)
269 ++BarAleCount;
270 else
272 break;
275 break;
276 case TYPE_LYCEUM:
278 break;
279 case TYPE_IRON_HALL:
281 break;
282 case DATA_GHOSTKILL:
283 GhostKillCount += data;
284 break;
285 }
286 }
287
288 uint32 GetData(uint32 type) const override
289 {
290 switch (type)
291 {
292 case TYPE_RING_OF_LAW:
294 case TYPE_VAULT:
295 return GetBossState(1);
296 case TYPE_BAR:
297 if (GetBossState(2) == IN_PROGRESS && BarAleCount == 3)
298 return SPECIAL;
299 else
300 return GetBossState(2);
303 case TYPE_LYCEUM:
304 return GetBossState(4);
305 case TYPE_IRON_HALL:
307 case DATA_GHOSTKILL:
308 return GhostKillCount;
309 }
310 return 0;
311 }
312
313 ObjectGuid GetGuidData(uint32 data) const override
314 {
315 switch (data)
316 {
317 case DATA_EMPEROR:
318 return EmperorGUID;
319 case DATA_PHALANX:
320 return PhalanxGUID;
321 case DATA_MOIRA:
322 return MoiraGUID;
323 case DATA_COREN:
324 return CorenGUID;
325 case DATA_ARENA1:
326 return GoArena1GUID;
327 case DATA_ARENA2:
328 return GoArena2GUID;
329 case DATA_ARENA3:
330 return GoArena3GUID;
331 case DATA_ARENA4:
332 return GoArena4GUID;
333 case DATA_GO_BAR_KEG:
334 return GoBarKegGUID;
336 return GoBarKegTrapGUID;
337 case DATA_GO_BAR_DOOR:
338 return GoBarDoorGUID;
339 case DATA_EVENSTARTER:
342 return GoSFNGUID;
344 return GoSFSGUID;
345 case DATA_THRONE_DOOR:
346 return GoThroneGUID;
348 return GoGolemNGUID;
350 return GoGolemSGUID;
351 case DATA_GO_CHALICE:
353 }
354 return ObjectGuid::Empty;
355 }
356
358 {
360 {
362 {
363 boss->SetFaction(FACTION_DARK_IRON_DWARVES);
364 boss->SetImmuneToPC(false);
365 if (Unit* target = boss->SelectNearestTarget(500))
366 boss->AI()->AttackStart(target);
367 }
368 }
369 }
370
372 {
373 HandleGameObject(GoTombExitGUID, false);//event reseted, close exit door
374 HandleGameObject(GoTombEnterGUID, true);//event reseted, open entrance door
375 for (uint8 i = 0; i < TOMB_OF_SEVEN_BOSS_NUM; ++i)
376 {
378 {
379 if (!boss->IsAlive())
380 boss->Respawn();
381 else
382 boss->SetFaction(FACTION_FRIENDLY);
383 }
384 }
385 GhostKillCount = 0;
390 }
391
393 {
394 HandleGameObject(GoTombExitGUID, false);//event started, close exit door
395 HandleGameObject(GoTombEnterGUID, false);//event started, close entrance door
397 }
398
400 {
402 HandleGameObject(GoTombExitGUID, true);//event done, open exit door
403 HandleGameObject(GoTombEnterGUID, true);//event done, open entrance door
406 }
407 void Update(uint32 diff) override
408 {
410 {
411 if (TombTimer <= diff)
412 {
415 {
418 }
419
420 // Check Killed bosses
421 for (uint8 i = 0; i < TOMB_OF_SEVEN_BOSS_NUM; ++i)
422 {
424 {
425 if (!boss->IsAlive())
426 {
427 GhostKillCount = i+1;
428 }
429 }
430 }
431 } else TombTimer -= diff;
432 }
435 }
436 };
437};
438
440{
442}
uint8_t uint8
Definition: Define.h:144
uint32_t uint32
Definition: Define.h:142
EncounterState
@ IN_PROGRESS
@ DONE
@ SPECIAL
@ NOT_STARTED
#define TC_LOG_DEBUG(filterType__,...)
Definition: Log.h:156
@ FACTION_FRIENDLY
@ FACTION_DARK_IRON_DWARVES
#define DataHeader
@ BOSS_PHALANX
@ BOSS_THE_SEVEN
@ BOSS_EMPEROR_DAGRAN_THAURISSAN
@ BOSS_PLUGGER_SPAZZRING
@ BOSS_BAELGAR
@ BOSS_GOLEM_LORD_ARGELMACH
@ BOSS_PYROMANCER_LOREGRAIN
@ BOSS_HURLEY_BLACKBREATH
@ BOSS_HIGH_INTERROGATOR_GERSTAHN
@ BOSS_AMBASSADOR_FLAMELASH
@ BOSS_LORD_INCENDIUS
@ BOSS_MAGMUS
@ BOSS_HOUNDMASTER_GREBMAR
@ BOSS_GENERAL_ANGERFORGE
@ BOSS_WARDER_STILGISS
@ BOSS_RING_OF_LAW
@ BOSS_FINEOUS_DARKVIRE
@ BOSS_LORD_ROCCOR
@ BOSS_RIBBLY_SCREWSPIGOT
@ DATA_PHALANX
@ TYPE_RING_OF_LAW
@ TYPE_IRON_HALL
@ TYPE_BAR
@ TYPE_TOMB_OF_SEVEN
@ DATA_COREN
@ DATA_EVENSTARTER
@ DATA_EMPEROR
@ DATA_GO_BAR_KEG
@ TYPE_LYCEUM
@ DATA_ARENA3
@ DATA_GHOSTKILL
@ DATA_ARENA2
@ DATA_GO_CHALICE
@ DATA_MOIRA
@ TYPE_VAULT
@ DATA_GOLEM_DOOR_S
@ DATA_GOLEM_DOOR_N
@ DATA_THRONE_DOOR
@ DATA_SF_BRAZIER_N
@ DATA_ARENA4
@ DATA_GO_BAR_KEG_TRAP
@ DATA_ARENA1
@ DATA_SF_BRAZIER_S
@ DATA_GO_BAR_DOOR
#define BRDScriptName
void SetBossNumber(uint32 number)
virtual bool SetBossState(uint32 id, EncounterState state)
void HandleGameObject(ObjectGuid guid, bool open, GameObject *go=nullptr)
void LoadDungeonEncounterData(T const &encounters)
InstanceMap * instance
EncounterState GetBossState(uint32 id) const
void DoRespawnGameObject(ObjectGuid guid, Seconds timeToDespawn=1min)
void SetHeaders(std::string const &dataHeaders)
Creature * GetCreature(ObjectGuid const &guid)
Definition: Map.cpp:3479
static ObjectGuid const Empty
Definition: ObjectGuid.h:274
bool IsEmpty() const
Definition: ObjectGuid.h:319
std::string ToString() const
Definition: ObjectGuid.cpp:554
void Clear()
Definition: ObjectGuid.h:286
uint32 GetEntry() const
Definition: Object.h:161
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
Definition: Unit.h:627
bool IsAlive() const
Definition: Unit.h:1164
InstanceScript * GetInstanceScript(InstanceMap *map) const override
void AddSC_instance_blackrock_depths()
@ NPC_RIBBLY_SCREWSPIGOT
@ NPC_HURLEY_BLACKBREATH
@ NPC_HOUNDMASTER_GREBMAR
@ NPC_GOLEM_LORD_ARGELMACH
@ NPC_PYROMANCER_LOREGRAIN
#define TIMER_TOMBOFTHESEVEN
constexpr uint8 TOMB_OF_SEVEN_BOSS_NUM
static constexpr DungeonEncounterData encounters[]
#define MAX_ENCOUNTER