Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
instance_blackrock_spire.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 "ObjectMgr.h"
7#include "ScriptMgr.h"
8#include "ObjectDefines.h"
9#include "Cell.h"
10#include "CellImpl.h"
11#include "GridNotifiers.h"
12#include "GridNotifiersImpl.h"
13#include "InstanceScript.h"
14#include "ScriptedCreature.h"
15#include "blackrock_spire.h"
16
17//uint32 const DragonspireRunes[7] = { GO_HALL_RUNE_1, GO_HALL_RUNE_2, GO_HALL_RUNE_3, GO_HALL_RUNE_4, GO_HALL_RUNE_5, GO_HALL_RUNE_6, GO_HALL_RUNE_7 };
18
20
32
34{
35public:
37
39 {
65
67 {
68 switch (creature->GetEntry())
69 {
71 HighlordOmokk = creature->GetGUID();
72 break;
74 ShadowHunterVoshgajin = creature->GetGUID();
75 break;
77 WarMasterVoone = creature->GetGUID();
78 break;
80 MotherSmolderweb = creature->GetGUID();
81 break;
83 UrokDoomhowl = creature->GetGUID();
84 break;
86 QuartermasterZigris = creature->GetGUID();
87 break;
89 GizrultheSlavener = creature->GetGUID();
90 break;
91 case NPC_HALYCON:
92 Halycon = creature->GetGUID();
93 break;
95 OverlordWyrmthalak = creature->GetGUID();
96 break;
98 PyroguardEmberseer = creature->GetGUID();
100 creature->DisappearAndDie();
101 break;
103 WarchiefRendBlackhand = creature->GetGUID();
105 creature->DisappearAndDie();
106 break;
107 case NPC_GYTH:
108 Gyth = creature->GetGUID();
109 break;
110 case NPC_THE_BEAST:
111 TheBeast = creature->GetGUID();
112 break;
114 GeneralDrakkisath = creature->GetGUID();
115 break;
117 LordVictorNefarius = creature->GetGUID();
119 creature->DisappearAndDie();
120 break;
121 }
122 }
123
125 {
126 switch (go->GetEntry())
127 {
128 case GO_WHELP_SPAWNER:
129 go->CastSpell(NULL, SPELL_SUMMON_ROOKERY_WHELP);
130 break;
131 case GO_EMBERSEER_IN:
132 go_emberseerin = go->GetGUID();
134 HandleGameObject(0, true, go);
135 break;
136 case GO_DOORS:
137 go_doors = go->GetGUID();
139 HandleGameObject(0, true, go);
140 break;
141 case GO_EMBERSEER_OUT:
142 go_emberseerout = go->GetGUID();
144 HandleGameObject(0, true, go);
145 break;
146 case GO_HALL_RUNE_1:
147 go_roomrunes[0] = go->GetGUID();
149 HandleGameObject(0, false, go);
150 break;
151 case GO_HALL_RUNE_2:
152 go_roomrunes[1] = go->GetGUID();
154 HandleGameObject(0, false, go);
155 break;
156 case GO_HALL_RUNE_3:
157 go_roomrunes[2] = go->GetGUID();
159 HandleGameObject(0, false, go);
160 break;
161 case GO_HALL_RUNE_4:
162 go_roomrunes[3] = go->GetGUID();
164 HandleGameObject(0, false, go);
165 break;
166 case GO_HALL_RUNE_5:
167 go_roomrunes[4] = go->GetGUID();
169 HandleGameObject(0, false, go);
170 break;
171 case GO_HALL_RUNE_6:
172 go_roomrunes[5] = go->GetGUID();
174 HandleGameObject(0, false, go);
175 break;
176 case GO_HALL_RUNE_7:
177 go_roomrunes[6] = go->GetGUID();
179 HandleGameObject(0, false, go);
180 break;
182 go_emberseerrunes[0] = go->GetGUID();
184 HandleGameObject(0, false, go);
185 break;
187 go_emberseerrunes[1] = go->GetGUID();
189 HandleGameObject(0, false, go);
190 break;
192 go_emberseerrunes[2] = go->GetGUID();
194 HandleGameObject(0, false, go);
195 break;
197 go_emberseerrunes[3] = go->GetGUID();
199 HandleGameObject(0, false, go);
200 break;
202 go_emberseerrunes[4] = go->GetGUID();
204 HandleGameObject(0, false, go);
205 break;
207 go_emberseerrunes[5] = go->GetGUID();
209 HandleGameObject(0, false, go);
210 break;
212 go_emberseerrunes[6] = go->GetGUID();
214 HandleGameObject(0, false, go);
215 break;
217 go_portcullis_active = go->GetGUID();
219 HandleGameObject(0, true, go);
220 break;
222 go_portcullis_tobossrooms = go->GetGUID();
224 HandleGameObject(0, true, go);
225 break;
226 default:
227 break;
228 }
229 }
230
232 {
233 if (!InstanceScript::SetBossState(type, state))
234 return false;
235
236 switch (type)
237 {
245 case DATA_HALYCON:
249 case DATA_GYTH:
250 case DATA_THE_BEAST:
253 break;
254 default:
255 break;
256 }
257
258 return true;
259 }
260
261 void ProcessEvent(WorldObject* /*gameObject*/, uint32 eventId) OVERRIDE
262 {
263 switch (eventId)
264 {
267 {
268 if (Creature* Emberseer = instance->GetCreature(PyroguardEmberseer))
269 Emberseer->AI()->SetData(1, 1);
270 }
271 break;
274 break;
275 default:
276 break;
277 }
278 }
279
280 void SetData(uint32 type, uint32 data) OVERRIDE
281 {
282 switch (type)
283 {
284 case AREATRIGGER:
286 {
288 Events.ScheduleEvent(EVENT_DARGONSPIRE_ROOM_STORE, 1000);
289 }
290 default:
291 break;
292 }
293 }
294
296 {
297 switch (type)
298 {
300 return HighlordOmokk;
301 break;
304 break;
306 return WarMasterVoone;
307 break;
309 return MotherSmolderweb;
310 break;
312 return UrokDoomhowl;
313 break;
315 return QuartermasterZigris;
316 break;
318 return GizrultheSlavener;
319 break;
320 case DATA_HALYCON:
321 return Halycon;
322 break;
324 return OverlordWyrmthalak;
325 break;
327 return PyroguardEmberseer;
328 break;
331 break;
332 case DATA_GYTH:
333 return Gyth;
334 break;
335 case DATA_THE_BEAST:
336 return TheBeast;
337 break;
339 return GeneralDrakkisath;
340 break;
341 case GO_EMBERSEER_IN:
342 return go_emberseerin;
343 break;
344 case GO_DOORS:
345 return go_doors;
346 break;
347 case GO_EMBERSEER_OUT:
348 return go_emberseerout;
349 break;
350 case GO_HALL_RUNE_1:
351 return go_roomrunes[0];
352 break;
353 case GO_HALL_RUNE_2:
354 return go_roomrunes[1];
355 break;
356 case GO_HALL_RUNE_3:
357 return go_roomrunes[2];
358 break;
359 case GO_HALL_RUNE_4:
360 return go_roomrunes[3];
361 break;
362 case GO_HALL_RUNE_5:
363 return go_roomrunes[4];
364 break;
365 case GO_HALL_RUNE_6:
366 return go_roomrunes[5];
367 break;
368 case GO_HALL_RUNE_7:
369 return go_roomrunes[6];
370 break;
372 return go_emberseerrunes[0];
373 break;
375 return go_emberseerrunes[1];
376 break;
378 return go_emberseerrunes[2];
379 break;
381 return go_emberseerrunes[3];
382 break;
384 return go_emberseerrunes[4];
385 break;
387 return go_emberseerrunes[5];
388 break;
390 return go_emberseerrunes[6];
391 break;
394 break;
397 break;
398 }
399 return 0;
400 }
401
403 {
404 Events.Update(diff);
405
406 while (uint32 eventId = Events.ExecuteEvent())
407 {
408 switch (eventId)
409 {
412 Events.ScheduleEvent(EVENT_DARGONSPIRE_ROOM_CHECK, 3000);
413 break;
417 Events.ScheduleEvent(EVENT_DARGONSPIRE_ROOM_CHECK, 3000);
418 break;
419 default:
420 break;
421 }
422 }
423 }
424
426 {
427 uint8 creaturecount;
428
429 for (uint8 i = 0; i < 7; ++i)
430 {
431 creaturecount = 0;
432
433 if (GameObject* rune = instance->GetGameObject(go_roomrunes[i]))
434 {
435 for (uint8 ii = 0; ii < 3; ++ii)
436 {
437 std::list<Creature*> creatureList;
438 GetCreatureListWithEntryInGrid(creatureList, rune, DragonspireMobs[ii], 15.0f);
439 for (std::list<Creature*>::iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr)
440 {
441 if (Creature* creatureList = *itr)
442 {
443 runecreaturelist[i] [creaturecount] = creatureList->GetGUID();
444 ++creaturecount;
445 }
446 }
447 }
448 }
449 }
450 }
451
453 {
454 Creature* mob = NULL;
455 GameObject* rune = NULL;
456
457 for (uint8 i = 0; i < 7; ++i)
458 {
459 bool _mobAlive = false;
460 rune = instance->GetGameObject(go_roomrunes[i]);
461 if (!rune)
462 continue;
463
465 {
466 for (uint8 ii = 0; ii < 5; ++ii)
467 {
468 mob = instance->GetCreature(runecreaturelist[i][ii]);
469 if (mob && mob->IsAlive())
470 _mobAlive = true;
471 }
472 }
473
474 if (!_mobAlive && rune->GetGoState() == GOState::GO_STATE_ACTIVE)
475 {
476 HandleGameObject(0, false, rune);
477
478 switch (rune->GetEntry())
479 {
480 case GO_HALL_RUNE_1:
482 break;
483 case GO_HALL_RUNE_2:
485 break;
486 case GO_HALL_RUNE_3:
488 break;
489 case GO_HALL_RUNE_4:
491 break;
492 case GO_HALL_RUNE_5:
494 break;
495 case GO_HALL_RUNE_6:
497 break;
498 case GO_HALL_RUNE_7:
500 break;
501 default:
502 break;
503 }
504 }
505 }
506
510 {
512 if (GameObject* door1 = instance->GetGameObject(go_emberseerin))
513 HandleGameObject(0, true, door1);
514 if (GameObject* door2 = instance->GetGameObject(go_doors))
515 HandleGameObject(0, true, door2);
516 }
517 }
518
519 std::string GetSaveData() OVERRIDE
520 {
522
523 std::ostringstream saveStream;
524 saveStream << "B S " << GetBossSaveData();
525
527 return saveStream.str();
528 }
529
530 void Load(const char* strIn) OVERRIDE
531 {
532 if (!strIn)
533 {
535 return;
536 }
537
538 OUT_LOAD_INST_DATA(strIn);
539
540 char dataHead1, dataHead2;
541
542 std::istringstream loadStream(strIn);
543 loadStream >> dataHead1 >> dataHead2;
544
545 if (dataHead1 == 'B' && dataHead2 == 'S')
546 {
547 for (uint8 i = 0; i < EncounterCount; ++i)
548 {
549 uint32 tmpState;
550 loadStream >> tmpState;
551 if (tmpState == IN_PROGRESS || tmpState > SPECIAL)
552 tmpState = NOT_STARTED;
553
554 SetBossState(i, EncounterState(tmpState));
555 }
556 }
557 else
559
561 }
562
563 protected:
566 std::string m_strInstData;
591 };
592
597};
598
599/*#####
600# at_dragonspire_hall
601#####*/
602
604{
605public:
606 at_dragonspire_hall() : AreaTriggerScript("at_dragonspire_hall") { }
607
608 bool OnTrigger(Player* player, const AreaTriggerEntry* /*at*/) OVERRIDE
609 {
610 if (player && player->IsAlive())
611 {
612 if (InstanceScript* instance = player->GetInstanceScript())
613 {
614 instance->SetData(AREATRIGGER, AREATRIGGER_DRAGONSPIRE_HALL);
615 return true;
616 }
617 }
618
619 return false;
620 }
621};
622
623/*#####
624# at_blackrock_stadium
625#####*/
626
628{
629public:
630 at_blackrock_stadium() : AreaTriggerScript("at_blackrock_stadium") { }
631
632 bool OnTrigger(Player* player, const AreaTriggerEntry* /*at*/) OVERRIDE
633 {
634 if (player && player->IsAlive())
635 {
636 InstanceScript* instance = player->GetInstanceScript();
637 if (!instance)
638 return false;
639
640 if (Creature* rend = player->FindNearestCreature(NPC_WARCHIEF_REND_BLACKHAND, 50.0f))
641 {
642 rend->AI()->SetData(AREATRIGGER, AREATRIGGER_BLACKROCK_STADIUM);
643 return true;
644 }
645 }
646
647 return false;
648 }
649};
650
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
@ GO_STATE_ACTIVE
Definition GameObject.h:576
#define OUT_LOAD_INST_DATA_FAIL
EncounterState
@ 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)
void GetCreatureListWithEntryInGrid(std::list< Creature * > &list, WorldObject *source, uint32 entry, float maxSearchRange)
uint32 const EncounterCount
@ NPC_MOTHER_SMOLDERWEB
@ NPC_GENERAL_DRAKKISATH
@ NPC_BLACKHAND_SUMMONER
@ NPC_HALYCON
@ NPC_SHADOW_HUNTER_VOSHGAJIN
@ NPC_WARCHIEF_REND_BLACKHAND
@ NPC_OVERLORD_WYRMTHALAK
@ NPC_QUARTERMASTER_ZIGRIS
@ NPC_UROK_DOOMHOWL
@ NPC_HIGHLORD_OMOKK
@ NPC_GIZRUL_THE_SLAVENER
@ NPC_BLACKHAND_VETERAN
@ NPC_THE_BEAST
@ NPC_GYTH
@ NPC_PYROGAURD_EMBERSEER
@ NPC_BLACKHAND_DREADWEAVER
@ NPC_LORD_VICTOR_NEFARIUS
@ NPC_WARMASTER_VOONE
@ SPELL_SUMMON_ROOKERY_WHELP
@ AREATRIGGER
@ AREATRIGGER_DRAGONSPIRE_HALL
@ AREATRIGGER_BLACKROCK_STADIUM
@ EVENT_PYROGUARD_EMBERSEER
@ EVENT_UROK_DOOMHOWL
#define BRSScriptName
@ GO_HALL_RUNE_4
@ GO_HALL_RUNE_6
@ GO_HALL_RUNE_1
@ GO_EMBERSEER_RUNE_3
@ GO_PORTCULLIS_TOBOSSROOMS
@ GO_EMBERSEER_RUNE_7
@ GO_EMBERSEER_IN
@ GO_EMBERSEER_RUNE_4
@ GO_EMBERSEER_OUT
@ GO_HALL_RUNE_7
@ GO_EMBERSEER_RUNE_2
@ GO_HALL_RUNE_3
@ GO_DOORS
@ GO_PORTCULLIS_ACTIVE
@ GO_EMBERSEER_RUNE_1
@ GO_HALL_RUNE_5
@ GO_EMBERSEER_RUNE_5
@ GO_WHELP_SPAWNER
@ GO_HALL_RUNE_2
@ GO_EMBERSEER_RUNE_6
@ DATA_THE_BEAST
@ DATA_HALL_RUNE_3
@ DATA_HALL_RUNE_1
@ DATA_HIGHLORD_OMOKK
@ DATA_HALYCON
@ DATA_PYROGAURD_EMBERSEER
@ DATA_WARMASTER_VOONE
@ DATA_QUARTERMASTER_ZIGRIS
@ DATA_HALL_RUNE_2
@ DATA_DRAGONSPIRE_ROOM
@ DATA_GYTH
@ DATA_HALL_RUNE_7
@ DATA_GIZRUL_THE_SLAVENER
@ DATA_WARCHIEF_REND_BLACKHAND
@ DATA_GENERAL_DRAKKISATH
@ DATA_SHADOW_HUNTER_VOSHGAJIN
@ DATA_HALL_RUNE_6
@ DATA_HALL_RUNE_5
@ DATA_OVERLORD_WYRMTHALAK
@ DATA_UROK_DOOMHOWL
@ DATA_MOTHER_SMOLDERWEB
@ DATA_HALL_RUNE_4
AreaTriggerScript(const char *name)
GOState GetGoState() const
Definition GameObject.h:717
InstanceMapScript(const char *name, uint32 mapId)
InstanceScript(Map *map)
void SetBossNumber(uint32 number)
virtual bool SetBossState(uint32 id, EncounterState state)
std::string GetBossSaveData()
EncounterState GetBossState(uint32 id) const
void HandleGameObject(uint64 guid, bool open, GameObject *go=NULL)
uint32 GetEntry() const
Definition Object.h:125
bool IsAlive() const
Definition Unit.h:2032
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition Object.cpp:2801
bool OnTrigger(Player *player, const AreaTriggerEntry *) OVERRIDE
bool OnTrigger(Player *player, const AreaTriggerEntry *) OVERRIDE
InstanceScript * GetInstanceScript(InstanceMap *map) const OVERRIDE
uint32 const DragonspireMobs[3]
void AddSC_instance_blackrock_spire()
@ EVENT_UROK_DOOMHOWL_SPAWN_IN
@ EVENT_UROK_DOOMHOWL_SPAWNS_5
@ EVENT_UROK_DOOMHOWL_SPAWNS_2
@ EVENT_DARGONSPIRE_ROOM_CHECK
@ EVENT_DARGONSPIRE_ROOM_STORE
@ EVENT_UROK_DOOMHOWL_SPAWNS_4
@ EVENT_UROK_DOOMHOWL_SPAWNS_1
@ EVENT_UROK_DOOMHOWL_SPAWNS_3
bool SetBossState(uint32 type, EncounterState state) OVERRIDE