TrinityCore
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
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 "Creature.h"
21#include "CreatureAI.h"
22#include "GameObject.h"
23#include "InstanceScript.h"
24#include "Log.h"
25#include "Map.h"
26#include "MotionMaster.h"
27#include "MapReference.h"
28#include "Player.h"
29
30#define TIMER_TOMBOFTHESEVEN 15000
31#define MAX_ENCOUNTER 6
33
35{
45 NPC_MAGMUS = 9938,
46 NPC_MOIRA = 8929,
48 NPC_COREN = 23872,
49};
50
52{
53 GO_ARENA1 = 161525,
54 GO_ARENA2 = 161522,
55 GO_ARENA3 = 161524,
56 GO_ARENA4 = 161523,
63 GO_BAR_DOOR = 170571,
64 GO_TOMB_ENTER = 170576,
65 GO_TOMB_EXIT = 170577,
66 GO_LYCEUM = 170558,
67 GO_SF_N = 174745, // Shadowforge Brazier North
68 GO_SF_S = 174744, // Shadowforge Brazier South
69 GO_GOLEM_ROOM_N = 170573, // Magmus door North
70 GO_GOLEM_ROOM_S = 170574, // Magmus door Soutsh
71 GO_THRONE_ROOM = 170575, // Throne door
73 GO_CHEST_SEVEN = 169243
74};
75
77{
78 QUEST_THE_PRINCESS_SURPRISE = 4363, // Alliance
79 QUEST_THE_PRINCESS_SAVED = 4004 // Horde
80};
81
83{
84public:
86
88 {
90 }
91
93 {
95 {
97 memset(&encounter, 0, sizeof(encounter));
98
99 BarAleCount = 0;
100 GhostKillCount = 0;
103 }
104
106 std::string str_data;
107
113
135
142
144 {
145 InstanceMap::PlayerList const& players = instance->GetPlayers();
146
147 for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i)
148 if (Player * player = i->GetSource())
149 if ((player->GetTeamId() == TEAM_ALLIANCE && !player->IsActiveQuest(QUEST_THE_PRINCESS_SURPRISE))
150 || (player->GetTeamId() == TEAM_HORDE && !player->IsActiveQuest(QUEST_THE_PRINCESS_SAVED)))
151 return;
152
154 }
155
156 void OnCreatureCreate(Creature* creature) override
157 {
158 switch (creature->GetEntry())
159 {
160 case NPC_EMPEROR: EmperorGUID = creature->GetGUID(); break;
161 case NPC_PHALANX: PhalanxGUID = creature->GetGUID(); break;
162 case NPC_MOIRA: MoiraGUID = creature->GetGUID(); UpdateMoira(creature); break;
163 case NPC_COREN: CorenGUID = creature->GetGUID(); break;
164 case NPC_DOOMREL: TombBossGUIDs[0] = creature->GetGUID(); break;
165 case NPC_DOPEREL: TombBossGUIDs[1] = creature->GetGUID(); break;
166 case NPC_HATEREL: TombBossGUIDs[2] = creature->GetGUID(); break;
167 case NPC_VILEREL: TombBossGUIDs[3] = creature->GetGUID(); break;
168 case NPC_SEETHREL: TombBossGUIDs[4] = creature->GetGUID(); break;
169 case NPC_GLOOMREL: TombBossGUIDs[5] = creature->GetGUID(); break;
170 case NPC_ANGERREL: TombBossGUIDs[6] = creature->GetGUID(); break;
171 case NPC_MAGMUS:
172 MagmusGUID = creature->GetGUID();
173 if (!creature->IsAlive())
174 HandleGameObject(GetGuidData(DATA_THRONE_DOOR), true); // if Magmus is dead open door to last boss
175 break;
176 }
177 }
178
180 {
181 switch (go->GetEntry())
182 {
183 case GO_ARENA1: GoArena1GUID = go->GetGUID(); break;
184 case GO_ARENA2: GoArena2GUID = go->GetGUID(); break;
185 case GO_ARENA3: GoArena3GUID = go->GetGUID(); break;
186 case GO_ARENA4: GoArena4GUID = go->GetGUID(); break;
187 case GO_SHADOW_LOCK: GoShadowLockGUID = go->GetGUID(); break;
188 case GO_SHADOW_MECHANISM: GoShadowMechGUID = go->GetGUID(); break;
190 case GO_SHADOW_DUMMY: GoShadowDummyGUID = go->GetGUID(); break;
191 case GO_BAR_KEG_SHOT: GoBarKegGUID = go->GetGUID(); break;
192 case GO_BAR_KEG_TRAP: GoBarKegTrapGUID = go->GetGUID(); break;
193 case GO_BAR_DOOR: GoBarDoorGUID = go->GetGUID(); break;
194 case GO_TOMB_ENTER: GoTombEnterGUID = go->GetGUID(); break;
195 case GO_TOMB_EXIT:
196 GoTombExitGUID = go->GetGUID();
199 else
201 break;
202 case GO_LYCEUM: GoLyceumGUID = go->GetGUID(); break;
203 case GO_SF_S: GoSFSGUID = go->GetGUID(); break;
204 case GO_SF_N: GoSFNGUID = go->GetGUID(); break;
205 case GO_GOLEM_ROOM_N: GoGolemNGUID = go->GetGUID(); break;
206 case GO_GOLEM_ROOM_S: GoGolemSGUID = go->GetGUID(); break;
207 case GO_THRONE_ROOM: GoThroneGUID = go->GetGUID(); break;
208 case GO_CHEST_SEVEN: GoChestGUID = go->GetGUID(); break;
210 }
211 }
212
213 void SetGuidData(uint32 type, ObjectGuid data) override
214 {
215 TC_LOG_DEBUG("scripts", "Instance Blackrock Depths: SetGuidData update (Type: {} Data {})", type, data.ToString());
216
217 switch (type)
218 {
219 case DATA_EVENSTARTER:
222 TombOfSevenReset();//reset
223 else
224 TombOfSevenStart();//start
225 break;
226 }
227 }
228
229 void SetData(uint32 type, uint32 data) override
230 {
231 TC_LOG_DEBUG("scripts", "Instance Blackrock Depths: SetData update (Type: {} Data {})", type, data);
232
233 switch (type)
234 {
235 case TYPE_RING_OF_LAW:
236 encounter[0] = data;
237 break;
238 case TYPE_VAULT:
239 encounter[1] = data;
240 break;
241 case TYPE_BAR:
242 if (data == SPECIAL)
243 ++BarAleCount;
244 else
245 encounter[2] = data;
246 break;
248 encounter[3] = data;
249 break;
250 case TYPE_LYCEUM:
251 encounter[4] = data;
252 break;
253 case TYPE_IRON_HALL:
254 encounter[5] = data;
255 break;
256 case DATA_GHOSTKILL:
257 GhostKillCount += data;
258 break;
259 }
260
262 {
264
265 std::ostringstream saveStream;
266 saveStream << encounter[0] << ' ' << encounter[1] << ' ' << encounter[2] << ' '
267 << encounter[3] << ' ' << encounter[4] << ' ' << encounter[5] << ' ' << GhostKillCount;
268
269 str_data = saveStream.str();
270
271 SaveToDB();
273 }
274 }
275
276 uint32 GetData(uint32 type) const override
277 {
278 switch (type)
279 {
280 case TYPE_RING_OF_LAW:
281 return encounter[0];
282 case TYPE_VAULT:
283 return encounter[1];
284 case TYPE_BAR:
285 if (encounter[2] == IN_PROGRESS && BarAleCount == 3)
286 return SPECIAL;
287 else
288 return encounter[2];
290 return encounter[3];
291 case TYPE_LYCEUM:
292 return encounter[4];
293 case TYPE_IRON_HALL:
294 return encounter[5];
295 case DATA_GHOSTKILL:
296 return GhostKillCount;
297 }
298 return 0;
299 }
300
301 ObjectGuid GetGuidData(uint32 data) const override
302 {
303 switch (data)
304 {
305 case DATA_EMPEROR:
306 return EmperorGUID;
307 case DATA_PHALANX:
308 return PhalanxGUID;
309 case DATA_MOIRA:
310 return MoiraGUID;
311 case DATA_COREN:
312 return CorenGUID;
313 case DATA_ARENA1:
314 return GoArena1GUID;
315 case DATA_ARENA2:
316 return GoArena2GUID;
317 case DATA_ARENA3:
318 return GoArena3GUID;
319 case DATA_ARENA4:
320 return GoArena4GUID;
321 case DATA_GO_BAR_KEG:
322 return GoBarKegGUID;
324 return GoBarKegTrapGUID;
325 case DATA_GO_BAR_DOOR:
326 return GoBarDoorGUID;
327 case DATA_EVENSTARTER:
330 return GoSFNGUID;
332 return GoSFSGUID;
333 case DATA_THRONE_DOOR:
334 return GoThroneGUID;
336 return GoGolemNGUID;
338 return GoGolemSGUID;
339 case DATA_GO_CHALICE:
341 }
342 return ObjectGuid::Empty;
343 }
344
345 std::string GetSaveData() override
346 {
347 return str_data;
348 }
349
350 void Load(char const* in) override
351 {
352 if (!in)
353 {
355 return;
356 }
357
359
360 std::istringstream loadStream(in);
361 loadStream >> encounter[0] >> encounter[1] >> encounter[2] >> encounter[3]
362 >> encounter[4] >> encounter[5] >> GhostKillCount;
363
364 for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
365 if (encounter[i] == IN_PROGRESS)
368 GhostKillCount = 0;//reset tomb of seven event
371
373 }
374
376 {
378 {
380 {
381 boss->SetFaction(FACTION_DARK_IRON_DWARVES);
382 boss->SetImmuneToPC(false);
383 if (Unit* target = boss->SelectNearestTarget(500))
384 boss->AI()->AttackStart(target);
385 }
386 }
387 }
388
390 {
391 HandleGameObject(GoTombExitGUID, false);//event reseted, close exit door
392 HandleGameObject(GoTombEnterGUID, true);//event reseted, open entrance door
393 for (uint8 i = 0; i < TOMB_OF_SEVEN_BOSS_NUM; ++i)
394 {
396 {
397 if (!boss->IsAlive())
398 boss->Respawn();
399 else
400 boss->SetFaction(FACTION_FRIENDLY);
401 }
402 }
403 GhostKillCount = 0;
408 }
409
411 {
412 HandleGameObject(GoTombExitGUID, false);//event started, close exit door
413 HandleGameObject(GoTombEnterGUID, false);//event started, close entrance door
415 }
416
418 {
420 HandleGameObject(GoTombExitGUID, true);//event done, open exit door
421 HandleGameObject(GoTombEnterGUID, true);//event done, open entrance door
424 }
425
426 void Update(uint32 diff) override
427 {
429 {
430 if (TombTimer <= diff)
431 {
434 {
437 }
438
439 // Check Killed bosses
440 for (uint8 i = 0; i < TOMB_OF_SEVEN_BOSS_NUM; ++i)
441 {
443 {
444 if (!boss->IsAlive())
445 {
446 GhostKillCount = i+1;
447 }
448 }
449 }
450 } else TombTimer -= diff;
451 }
454 }
455 };
456};
457
459{
461}
uint8_t uint8
Definition: Define.h:135
uint32_t uint32
Definition: Define.h:133
#define OUT_LOAD_INST_DATA_FAIL
@ IN_PROGRESS
@ DONE
@ SPECIAL
@ NOT_STARTED
#define OUT_SAVE_INST_DATA_COMPLETE
#define OUT_LOAD_INST_DATA_COMPLETE
#define OUT_SAVE_INST_DATA
#define OUT_LOAD_INST_DATA(a)
#define TC_LOG_DEBUG(filterType__,...)
Definition: Log.h:156
@ TEAM_ALLIANCE
@ TEAM_HORDE
@ FACTION_FRIENDLY
@ FACTION_DARK_IRON_DWARVES
Creatures
#define DataHeader
@ 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
bool UpdateEntry(uint32 entry, CreatureData const *data=nullptr, bool updateLevel=true)
Definition: Creature.cpp:540
void HandleGameObject(ObjectGuid guid, bool open, GameObject *go=nullptr)
InstanceMap * instance
void DoRespawnGameObject(ObjectGuid guid, Seconds timeToDespawn=1min)
void SetHeaders(std::string const &dataHeaders)
iterator end()
Definition: MapRefManager.h:35
iterator begin()
Definition: MapRefManager.h:34
PlayerList const & GetPlayers() const
Definition: Map.h:448
Creature * GetCreature(ObjectGuid const &guid)
Definition: Map.cpp:4395
static ObjectGuid const Empty
Definition: ObjectGuid.h:132
std::string ToString() const
Definition: ObjectGuid.cpp:110
void Clear()
Definition: ObjectGuid.h:151
uint32 GetEntry() const
Definition: Object.h:80
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:77
Definition: Player.h:915
Definition: Unit.h:769
bool IsAlive() const
Definition: Unit.h:1234
InstanceScript * GetInstanceScript(InstanceMap *map) const override
void AddSC_instance_blackrock_depths()
@ NPC_PRIESTESS_THAURISSAN
@ QUEST_THE_PRINCESS_SURPRISE
@ QUEST_THE_PRINCESS_SAVED
#define TIMER_TOMBOFTHESEVEN
constexpr uint8 TOMB_OF_SEVEN_BOSS_NUM
#define MAX_ENCOUNTER