Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
instance_blackrock_depths.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6#include "ScriptMgr.h"
7#include "ScriptedCreature.h"
8#include "InstanceScript.h"
9#include "blackrock_depths.h"
10
11#define TIMER_TOMBOFTHESEVEN 15000
12#define MAX_ENCOUNTER 6
13
15{
25 NPC_MAGMUS = 9938,
26 NPC_MOIRA = 8929
27};
28
30{
31 GO_ARENA1 = 161525,
32 GO_ARENA2 = 161522,
33 GO_ARENA3 = 161524,
34 GO_ARENA4 = 161523,
41 GO_BAR_DOOR = 170571,
42 GO_TOMB_ENTER = 170576,
43 GO_TOMB_EXIT = 170577,
44 GO_LYCEUM = 170558,
45 GO_SF_N = 174745, // Shadowforge Brazier North
46 GO_SF_S = 174744, // Shadowforge Brazier South
47 GO_GOLEM_ROOM_N = 170573, // Magmus door North
48 GO_GOLEM_ROOM_S = 170574, // Magmus door Soutsh
49 GO_THRONE_ROOM = 170575, // Throne door
52};
53
55{
56public:
57 instance_blackrock_depths() : InstanceMapScript("instance_blackrock_depths", 230) { }
58
63
65 {
67
69 std::string str_data;
70
75
97
104
106 {
107 memset(&encounter, 0, sizeof(encounter));
108
109 EmperorGUID = 0;
110 PhalanxGUID = 0;
111 MagmusGUID = 0;
112 MoiraGUID = 0;
113
114 GoArena1GUID = 0;
115 GoArena2GUID = 0;
116 GoArena3GUID = 0;
117 GoArena4GUID = 0;
122 GoBarKegGUID = 0;
124 GoBarDoorGUID = 0;
125 GoTombEnterGUID = 0;
126 GoTombExitGUID = 0;
127 GoLyceumGUID = 0;
128 GoSFSGUID = 0;
129 GoSFNGUID = 0;
130 GoGolemNGUID = 0;
131 GoGolemSGUID = 0;
132 GoThroneGUID = 0;
133 GoChestGUID = 0;
135
136 BarAleCount = 0;
137 GhostKillCount = 0;
141
142 for (uint8 i = 0; i < 7; ++i)
143 TombBossGUIDs[i] = 0;
144 }
145
147 {
148 switch (creature->GetEntry())
149 {
150 case NPC_EMPEROR: EmperorGUID = creature->GetGUID(); break;
151 case NPC_PHALANX: PhalanxGUID = creature->GetGUID(); break;
152 case NPC_MOIRA: MoiraGUID = creature->GetGUID(); break;
153 case NPC_DOOMREL: TombBossGUIDs[0] = creature->GetGUID(); break;
154 case NPC_DOPEREL: TombBossGUIDs[1] = creature->GetGUID(); break;
155 case NPC_HATEREL: TombBossGUIDs[2] = creature->GetGUID(); break;
156 case NPC_VILEREL: TombBossGUIDs[3] = creature->GetGUID(); break;
157 case NPC_SEETHREL: TombBossGUIDs[4] = creature->GetGUID(); break;
158 case NPC_GLOOMREL: TombBossGUIDs[5] = creature->GetGUID(); break;
159 case NPC_ANGERREL: TombBossGUIDs[6] = creature->GetGUID(); break;
160 case NPC_MAGMUS:
161 MagmusGUID = creature->GetGUID();
162 if (!creature->IsAlive())
163 HandleGameObject(GetData64(DATA_THRONE_DOOR), true); // if Magmus is dead open door to last boss
164 break;
165 }
166 }
167
169 {
170 switch (go->GetEntry())
171 {
172 case GO_ARENA1: GoArena1GUID = go->GetGUID(); break;
173 case GO_ARENA2: GoArena2GUID = go->GetGUID(); break;
174 case GO_ARENA3: GoArena3GUID = go->GetGUID(); break;
175 case GO_ARENA4: GoArena4GUID = go->GetGUID(); break;
176 case GO_SHADOW_LOCK: GoShadowLockGUID = go->GetGUID(); break;
177 case GO_SHADOW_MECHANISM: GoShadowMechGUID = go->GetGUID(); break;
178 case GO_SHADOW_GIANT_DOOR: GoShadowGiantGUID = go->GetGUID(); break;
179 case GO_SHADOW_DUMMY: GoShadowDummyGUID = go->GetGUID(); break;
180 case GO_BAR_KEG_SHOT: GoBarKegGUID = go->GetGUID(); break;
181 case GO_BAR_KEG_TRAP: GoBarKegTrapGUID = go->GetGUID(); break;
182 case GO_BAR_DOOR: GoBarDoorGUID = go->GetGUID(); break;
183 case GO_TOMB_ENTER: GoTombEnterGUID = go->GetGUID(); break;
184 case GO_TOMB_EXIT:
185 GoTombExitGUID = go->GetGUID();
186 if (GhostKillCount >= 7)
187 HandleGameObject(0, true, go);
188 else
189 HandleGameObject(0, false, go);
190 break;
191 case GO_LYCEUM: GoLyceumGUID = go->GetGUID(); break;
192 case GO_SF_S: GoSFSGUID = go->GetGUID(); break;
193 case GO_SF_N: GoSFNGUID = go->GetGUID(); break;
194 case GO_GOLEM_ROOM_N: GoGolemNGUID = go->GetGUID(); break;
195 case GO_GOLEM_ROOM_S: GoGolemSGUID = go->GetGUID(); break;
196 case GO_THRONE_ROOM: GoThroneGUID = go->GetGUID(); break;
197 case GO_CHEST_SEVEN: GoChestGUID = go->GetGUID(); break;
198 case GO_SPECTRAL_CHALICE: GoSpectralChaliceGUID = go->GetGUID(); break;
199 }
200 }
201
203 {
204 SF_LOG_DEBUG("scripts", "Instance Blackrock Depths: SetData64 update (Type: %u Data " UI64FMTD ")", type, data);
205
206 switch (type)
207 {
208 case DATA_EVENSTARTER:
211 TombOfSevenReset();//reset
212 else
213 TombOfSevenStart();//start
214 break;
215 }
216 }
217
218 void SetData(uint32 type, uint32 data) OVERRIDE
219 {
220 SF_LOG_DEBUG("scripts", "Instance Blackrock Depths: SetData update (Type: %u Data %u)", type, data);
221
222 switch (type)
223 {
224 case TYPE_RING_OF_LAW:
225 encounter[0] = data;
226 break;
227 case TYPE_VAULT:
228 encounter[1] = data;
229 break;
230 case TYPE_BAR:
231 if (data == SPECIAL)
232 ++BarAleCount;
233 else
234 encounter[2] = data;
235 break;
237 encounter[3] = data;
238 break;
239 case TYPE_LYCEUM:
240 encounter[4] = data;
241 break;
242 case TYPE_IRON_HALL:
243 encounter[5] = data;
244 break;
245 case DATA_GHOSTKILL:
246 GhostKillCount += data;
247 break;
248 }
249
250 if (data == DONE || GhostKillCount >= 7)
251 {
253
254 std::ostringstream saveStream;
255 saveStream << encounter[0] << ' ' << encounter[1] << ' ' << encounter[2] << ' '
256 << encounter[3] << ' ' << encounter[4] << ' ' << encounter[5] << ' ' << GhostKillCount;
257
258 str_data = saveStream.str();
259
260 SaveToDB();
262 }
263 }
264
266 {
267 switch (type)
268 {
269 case TYPE_RING_OF_LAW:
270 return encounter[0];
271 case TYPE_VAULT:
272 return encounter[1];
273 case TYPE_BAR:
274 if (encounter[2] == IN_PROGRESS && BarAleCount == 3)
275 return SPECIAL;
276 else
277 return encounter[2];
279 return encounter[3];
280 case TYPE_LYCEUM:
281 return encounter[4];
282 case TYPE_IRON_HALL:
283 return encounter[5];
284 case DATA_GHOSTKILL:
285 return GhostKillCount;
286 }
287 return 0;
288 }
289
291 {
292 switch (data)
293 {
294 case DATA_EMPEROR:
295 return EmperorGUID;
296 case DATA_PHALANX:
297 return PhalanxGUID;
298 case DATA_MOIRA:
299 return MoiraGUID;
300 case DATA_ARENA1:
301 return GoArena1GUID;
302 case DATA_ARENA2:
303 return GoArena2GUID;
304 case DATA_ARENA3:
305 return GoArena3GUID;
306 case DATA_ARENA4:
307 return GoArena4GUID;
308 case DATA_GO_BAR_KEG:
309 return GoBarKegGUID;
311 return GoBarKegTrapGUID;
312 case DATA_GO_BAR_DOOR:
313 return GoBarDoorGUID;
314 case DATA_EVENSTARTER:
317 return GoSFNGUID;
319 return GoSFSGUID;
320 case DATA_THRONE_DOOR:
321 return GoThroneGUID;
323 return GoGolemNGUID;
325 return GoGolemSGUID;
326 case DATA_GO_CHALICE:
328 }
329 return 0;
330 }
331
332 std::string GetSaveData() OVERRIDE
333 {
334 return str_data;
335 }
336
337 void Load(const char* in) OVERRIDE
338 {
339 if (!in)
340 {
342 return;
343 }
344
346
347 std::istringstream loadStream(in);
348 loadStream >> encounter[0] >> encounter[1] >> encounter[2] >> encounter[3]
349 >> encounter[4] >> encounter[5] >> GhostKillCount;
350
351 for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
352 if (encounter[i] == IN_PROGRESS)
354 if (GhostKillCount > 0 && GhostKillCount < 7)
355 GhostKillCount = 0;//reset tomb of seven event
356 if (GhostKillCount >= 7)
357 GhostKillCount = 7;
358
360 }
361
363 {
365 {
366 if (Creature* boss = instance->GetCreature(TombBossGUIDs[TombEventCounter]))
367 {
368 boss->setFaction(FACTION_HOSTILE);
369 boss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);
370 if (Unit* target = boss->SelectNearestTarget(500))
371 boss->AI()->AttackStart(target);
372 }
373 }
374 }
375
377 {
378 HandleGameObject(GoTombExitGUID, false);//event reseted, close exit door
379 HandleGameObject(GoTombEnterGUID, true);//event reseted, open entrance door
380 for (uint8 i = 0; i < 7; ++i)
381 {
382 if (Creature* boss = instance->GetCreature(TombBossGUIDs[i]))
383 {
384 if (!boss->IsAlive())
385 {//do not call EnterEvadeMode(), it will create infinit loops
386 boss->Respawn();
387 boss->RemoveAllAuras();
388 boss->DeleteThreatList();
389 boss->CombatStop(true);
390 boss->LoadCreaturesAddon();
391 boss->GetMotionMaster()->MoveTargetedHome();
392 boss->SetLootRecipient(NULL);
393 }
394 boss->setFaction(FACTION_FRIEND);
395 }
396 }
397 GhostKillCount = 0;
402 }
403
405 {
406 HandleGameObject(GoTombExitGUID, false);//event started, close exit door
407 HandleGameObject(GoTombEnterGUID, false);//event started, close entrance door
409 }
410
412 {
414 HandleGameObject(GoTombExitGUID, true);//event done, open exit door
415 HandleGameObject(GoTombEnterGUID, true);//event done, open entrance door
418 }
420 {
422 {
423 if (TombTimer <= diff)
424 {
428 // Check Killed bosses
429 for (uint8 i = 0; i < 7; ++i)
430 {
431 if (Creature* boss = instance->GetCreature(TombBossGUIDs[i]))
432 {
433 if (!boss->IsAlive())
434 {
435 GhostKillCount = i+1;
436 }
437 }
438 }
439 } else TombTimer -= diff;
440 }
443 }
444 };
445};
446
@ DAY
Definition Common.h:121
#define UI64FMTD
Definition Define.h:64
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
std::uint64_t uint64
Definition Define.h:76
#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 SF_LOG_DEBUG(filterType__,...)
Definition Log.h:134
@ UNIT_FLAG_IMMUNE_TO_PC
Definition Unit.h:633
@ UNIT_FIELD_FLAGS
Creatures
@ FACTION_HOSTILE
@ FACTION_FRIEND
@ DATA_PHALANX
@ TYPE_RING_OF_LAW
@ TYPE_IRON_HALL
@ TYPE_BAR
@ TYPE_TOMB_OF_SEVEN
@ 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
InstanceMapScript(const char *name, uint32 mapId)
InstanceScript(Map *map)
void HandleGameObject(uint64 guid, bool open, GameObject *go=NULL)
void DoRespawnGameObject(uint64 guid, uint32 timeToDespawn=MINUTE)
Definition Map.h:238
Definition Unit.h:1367
InstanceScript * GetInstanceScript(InstanceMap *map) const OVERRIDE
void AddSC_instance_blackrock_depths()
#define TIMER_TOMBOFTHESEVEN
#define MAX_ENCOUNTER