TrinityCore
Loading...
Searching...
No Matches
instance_blackrock_spire.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_spire.h"
20#include "CellImpl.h"
21#include "GridNotifiersImpl.h"
22#include "InstanceScript.h"
23#include "ObjectAccessor.h"
24#include "Player.h"
25#include "ScriptedCreature.h"
26
27//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 };
28
30
40
41static constexpr DungeonEncounterData Encounters[] =
42{
43 { DATA_HIGHLORD_OMOKK, { { 267 } } },
44 { DATA_SHADOW_HUNTER_VOSHGAJIN, { { 268 } } },
45 { DATA_WARMASTER_VOONE, { { 269 } } },
46 { DATA_MOTHER_SMOLDERWEB, { { 270 } } },
47 { DATA_UROK_DOOMHOWL, { { 271 } } },
48 { DATA_QUARTERMASTER_ZIGRIS, { { 272 } } },
49 { DATA_HALYCON, { { 274 } } },
50 { DATA_GIZRUL_THE_SLAVENER, { { 273 } } },
51 { DATA_OVERLORD_WYRMTHALAK, { { 275 } } },
52};
53
65
67{
68public:
70
72 {
80
81 void OnCreatureCreate(Creature* creature) override
82 {
83 switch (creature->GetEntry())
84 {
86 HighlordOmokk = creature->GetGUID();
87 break;
89 ShadowHunterVoshgajin = creature->GetGUID();
90 break;
92 WarMasterVoone = creature->GetGUID();
93 break;
95 MotherSmolderweb = creature->GetGUID();
96 break;
98 UrokDoomhowl = creature->GetGUID();
99 break;
101 QuartermasterZigris = creature->GetGUID();
102 break;
104 GizrultheSlavener = creature->GetGUID();
105 break;
106 case NPC_HALYCON:
107 Halycon = creature->GetGUID();
108 break;
110 OverlordWyrmthalak = creature->GetGUID();
111 break;
113 PyroguardEmberseer = creature->GetGUID();
115 creature->DespawnOrUnsummon(0s, 7_days);
116 break;
118 WarchiefRendBlackhand = creature->GetGUID();
120 creature->DespawnOrUnsummon(0s, 7_days);
121 break;
122 case NPC_GYTH:
123 Gyth = creature->GetGUID();
124 break;
125 case NPC_THE_BEAST:
126 TheBeast = creature->GetGUID();
127 break;
129 GeneralDrakkisath = creature->GetGUID();
130 break;
132 LordVictorNefarius = creature->GetGUID();
134 creature->DespawnOrUnsummon(0s, 7_days);
135 break;
137 ScarshieldInfiltrator = creature->GetGUID();
138 break;
140 _incarceratorList.push_back(creature->GetGUID());
141 break;
142 }
143 }
144
146 {
148
149 switch (go->GetEntry())
150 {
151 case GO_WHELP_SPAWNER:
153 break;
154 case GO_EMBERSEER_IN:
155 go_emberseerin = go->GetGUID();
158 break;
159 case GO_DOORS:
160 go_doors = go->GetGUID();
163 break;
164 case GO_EMBERSEER_OUT:
165 go_emberseerout = go->GetGUID();
168 break;
169 case GO_HALL_RUNE_1:
170 go_roomrunes[0] = go->GetGUID();
173 break;
174 case GO_HALL_RUNE_2:
175 go_roomrunes[1] = go->GetGUID();
178 break;
179 case GO_HALL_RUNE_3:
180 go_roomrunes[2] = go->GetGUID();
183 break;
184 case GO_HALL_RUNE_4:
185 go_roomrunes[3] = go->GetGUID();
188 break;
189 case GO_HALL_RUNE_5:
190 go_roomrunes[4] = go->GetGUID();
193 break;
194 case GO_HALL_RUNE_6:
195 go_roomrunes[5] = go->GetGUID();
198 break;
199 case GO_HALL_RUNE_7:
200 go_roomrunes[6] = go->GetGUID();
203 break;
205 go_emberseerrunes[0] = go->GetGUID();
208 break;
210 go_emberseerrunes[1] = go->GetGUID();
213 break;
215 go_emberseerrunes[2] = go->GetGUID();
218 break;
220 go_emberseerrunes[3] = go->GetGUID();
223 break;
225 go_emberseerrunes[4] = go->GetGUID();
228 break;
230 go_emberseerrunes[5] = go->GetGUID();
233 break;
235 go_emberseerrunes[6] = go->GetGUID();
238 break;
243 break;
248 break;
249 default:
250 break;
251 }
252 }
253
254 bool SetBossState(uint32 type, EncounterState state) override
255 {
256 if (!InstanceScript::SetBossState(type, state))
257 return false;
258
259 switch (type)
260 {
268 case DATA_HALYCON:
272 case DATA_GYTH:
273 case DATA_THE_BEAST:
276 break;
277 default:
278 break;
279 }
280
281 return true;
282 }
283
284 void ProcessEvent(WorldObject* /*obj*/, uint32 eventId, WorldObject* /*invoker*/) override
285 {
286 switch (eventId)
287 {
290 {
292 Emberseer->AI()->SetData(1, 1);
293 }
294 break;
297 {
298
299 }
300 break;
301 default:
302 break;
303 }
304 }
305
306 void SetData(uint32 type, uint32 data) override
307 {
308 switch (type)
309 {
310 case AREATRIGGER:
312 {
314 Events.ScheduleEvent(EVENT_DARGONSPIRE_ROOM_STORE, 1s);
315 }
316 break;
318 for (GuidList::const_iterator itr = _incarceratorList.begin(); itr != _incarceratorList.end(); ++itr)
319 if (Creature* creature = instance->GetCreature(*itr))
320 creature->Respawn();
321 break;
322 default:
323 break;
324 }
325 }
326
327 ObjectGuid GetGuidData(uint32 type) const override
328 {
329 switch (type)
330 {
332 return HighlordOmokk;
336 return WarMasterVoone;
338 return MotherSmolderweb;
340 return UrokDoomhowl;
342 return QuartermasterZigris;
344 return GizrultheSlavener;
345 case DATA_HALYCON:
346 return Halycon;
348 return OverlordWyrmthalak;
350 return PyroguardEmberseer;
353 case DATA_GYTH:
354 return Gyth;
355 case DATA_THE_BEAST:
356 return TheBeast;
358 return GeneralDrakkisath;
361 case GO_EMBERSEER_IN:
362 return go_emberseerin;
363 case GO_DOORS:
364 return go_doors;
365 case GO_EMBERSEER_OUT:
366 return go_emberseerout;
367 case GO_HALL_RUNE_1:
368 return go_roomrunes[0];
369 case GO_HALL_RUNE_2:
370 return go_roomrunes[1];
371 case GO_HALL_RUNE_3:
372 return go_roomrunes[2];
373 case GO_HALL_RUNE_4:
374 return go_roomrunes[3];
375 case GO_HALL_RUNE_5:
376 return go_roomrunes[4];
377 case GO_HALL_RUNE_6:
378 return go_roomrunes[5];
379 case GO_HALL_RUNE_7:
380 return go_roomrunes[6];
382 return go_emberseerrunes[0];
384 return go_emberseerrunes[1];
386 return go_emberseerrunes[2];
388 return go_emberseerrunes[3];
390 return go_emberseerrunes[4];
392 return go_emberseerrunes[5];
394 return go_emberseerrunes[6];
399 default:
400 break;
401 }
402 return ObjectGuid::Empty;
403 }
404
405 void Update(uint32 diff) override
406 {
407 Events.Update(diff);
408
409 while (uint32 eventId = Events.ExecuteEvent())
410 {
411 switch (eventId)
412 {
415 Events.ScheduleEvent(EVENT_DARGONSPIRE_ROOM_CHECK, 3s);
416 break;
420 Events.ScheduleEvent(EVENT_DARGONSPIRE_ROOM_CHECK, 3s);
421 break;
422 default:
423 break;
424 }
425 }
426 }
427
429 {
430 for (uint8 i = 0; i < 7; ++i)
431 {
432 // Refresh the creature list
433 runecreaturelist[i].clear();
434
436 {
437 for (uint8 j = 0; j < 3; ++j)
438 {
439 std::list<Creature*> creatureList;
440 GetCreatureListWithEntryInGrid(creatureList, rune, DragonspireMobs[j], 15.0f);
441 for (std::list<Creature*>::iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr)
442 {
443 if (Creature* creature = *itr)
444 runecreaturelist[i].push_back(creature->GetGUID());
445 }
446 }
447 }
448 }
449 }
450
452 {
453 Creature* mob = nullptr;
454 GameObject* rune = nullptr;
455
456 for (uint8 i = 0; i < 7; ++i)
457 {
458 bool _mobAlive = false;
460 if (!rune)
461 continue;
462
463 if (rune->GetGoState() == GO_STATE_ACTIVE)
464 {
465 for (ObjectGuid const& guid : runecreaturelist[i])
466 {
467 mob = instance->GetCreature(guid);
468 if (mob && mob->IsAlive())
469 _mobAlive = true;
470 }
471 }
472
473 if (!_mobAlive && rune->GetGoState() == GO_STATE_ACTIVE)
474 {
476
477 switch (rune->GetEntry())
478 {
479 case GO_HALL_RUNE_1:
481 break;
482 case GO_HALL_RUNE_2:
484 break;
485 case GO_HALL_RUNE_3:
487 break;
488 case GO_HALL_RUNE_4:
490 break;
491 case GO_HALL_RUNE_5:
493 break;
494 case GO_HALL_RUNE_6:
496 break;
497 case GO_HALL_RUNE_7:
499 break;
500 default:
501 break;
502 }
503 }
504 }
505
509 {
515 }
516 }
517
518 protected:
546 };
547
549 {
550 return new instance_blackrock_spireMapScript(map);
551 }
552};
553
554/*#####
555# at_dragonspire_hall
556#####*/
557
559{
560public:
561 at_dragonspire_hall() : AreaTriggerScript("at_dragonspire_hall") { }
562
563 bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
564 {
565 if (player && player->IsAlive())
566 {
567 if (InstanceScript* instance = player->GetInstanceScript())
568 {
569 instance->SetData(AREATRIGGER, AREATRIGGER_DRAGONSPIRE_HALL);
570 return true;
571 }
572 }
573
574 return false;
575 }
576};
577
578/*#####
579# at_blackrock_stadium
580#####*/
581
583{
584public:
585 at_blackrock_stadium() : AreaTriggerScript("at_blackrock_stadium") { }
586
587 bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
588 {
589 if (player && player->IsAlive())
590 {
591 InstanceScript* instance = player->GetInstanceScript();
592 if (!instance)
593 return false;
594
595 if (Creature* rend = player->FindNearestCreature(NPC_WARCHIEF_REND_BLACKHAND, 50.0f))
596 {
598 return true;
599 }
600 }
601
602 return false;
603 }
604};
605
607{
608public:
609 at_nearby_scarshield_infiltrator() : AreaTriggerScript("at_nearby_scarshield_infiltrator") { }
610
611 bool OnTrigger(Player* player, AreaTriggerEntry const* /*at*/) override
612 {
613 if (player->IsAlive())
614 {
615 if (InstanceScript* instance = player->GetInstanceScript())
616 {
617 if (Creature* infiltrator = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_SCARSHIELD_INFILTRATOR)))
618 {
619 if (player->GetLevel() >= 57)
620 infiltrator->AI()->SetData(1, 1);
621 else if (infiltrator->GetEntry() == NPC_SCARSHIELD_INFILTRATOR)
622 infiltrator->AI()->Talk(0, player);
623
624 return true;
625 }
626 }
627 }
628
629 return false;
630 }
631};
632
uint8_t uint8
Definition Define.h:156
uint32_t uint32
Definition Define.h:154
EncounterState
@ DONE
@ NOT_STARTED
std::list< ObjectGuid > GuidList
Definition ObjectGuid.h:433
std::vector< ObjectGuid > GuidVector
Definition ObjectGuid.h:434
void GetCreatureListWithEntryInGrid(Container &container, WorldObject *source, uint32 entry, float maxSearchRange)
@ GO_STATE_ACTIVE
#define DataHeader
uint32 const EncounterCount
@ SPELL_SUMMON_ROOKERY_WHELP
@ AREATRIGGER
@ AREATRIGGER_DRAGONSPIRE_HALL
@ AREATRIGGER_BLACKROCK_STADIUM
@ EVENT_PYROGUARD_EMBERSEER
@ EVENT_UROK_DOOMHOWL
@ 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_DRAKKISATH_DOOR_2
@ GO_DOORS
@ GO_PORTCULLIS_ACTIVE
@ GO_EMBERSEER_RUNE_1
@ GO_HALL_RUNE_5
@ GO_DRAKKISATH_DOOR_1
@ GO_EMBERSEER_RUNE_5
@ GO_WHELP_SPAWNER
@ GO_HALL_RUNE_2
@ GO_EMBERSEER_RUNE_6
@ NPC_MOTHER_SMOLDERWEB
@ NPC_BLACKHAND_INCARCERATOR
@ NPC_GENERAL_DRAKKISATH
@ NPC_BLACKHAND_SUMMONER
@ NPC_HALYCON
@ NPC_SHADOW_HUNTER_VOSHGAJIN
@ NPC_SCARSHIELD_INFILTRATOR
@ 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
@ DATA_THE_BEAST
@ DATA_HALL_RUNE_3
@ DATA_HALL_RUNE_1
@ DATA_HIGHLORD_OMOKK
@ DATA_HALYCON
@ DATA_BLACKHAND_INCARCERATOR
@ DATA_PYROGAURD_EMBERSEER
@ DATA_WARMASTER_VOONE
@ DATA_QUARTERMASTER_ZIGRIS
@ DATA_HALL_RUNE_2
@ DATA_DRAGONSPIRE_ROOM
@ DATA_GYTH
@ DATA_HALL_RUNE_7
@ DATA_SCARSHIELD_INFILTRATOR
@ 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
#define BRSScriptName
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
GOState GetGoState() const
Definition GameObject.h:284
void SetBossNumber(uint32 number)
virtual bool SetBossState(uint32 id, EncounterState state)
void HandleGameObject(ObjectGuid guid, bool open, GameObject *go=nullptr)
InstanceMap * instance
void SetHeaders(std::string_view dataHeaders)
void LoadDungeonEncounterData(std::span< DungeonEncounterData const > encounters)
EncounterState GetBossState(uint32 id) const
virtual void OnGameObjectCreate(GameObject *go) override
void LoadDoorData(std::span< DoorData const > data)
GameObject * GetGameObject(ObjectGuid const &guid)
Definition Map.cpp:3552
Creature * GetCreature(ObjectGuid const &guid)
Definition Map.cpp:3542
static ObjectGuid const Empty
Definition ObjectGuid.h:314
uint32 GetEntry() const
Definition Object.h:89
bool IsAlive() const
Definition Unit.h:1185
uint8 GetLevel() const
Definition Unit.h:757
InstanceScript * GetInstanceScript() const
Definition Object.cpp:396
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2217
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition Object.cpp:1517
virtual void SetData(uint32, uint32)
Definition ZoneScript.h:100
bool OnTrigger(Player *player, AreaTriggerEntry const *) override
bool OnTrigger(Player *player, AreaTriggerEntry const *) override
bool OnTrigger(Player *player, AreaTriggerEntry const *) override
InstanceScript * GetInstanceScript(InstanceMap *map) const override
static constexpr DungeonEncounterData Encounters[]
static constexpr DoorData doorData[]
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
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
bool SetBossState(uint32 type, EncounterState state) override
void ProcessEvent(WorldObject *, uint32 eventId, WorldObject *) override