TrinityCore
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
32{
40};
41
42static constexpr DungeonEncounterData Encounters[] =
43{
44 { DATA_HIGHLORD_OMOKK, { { 267 } } },
45 { DATA_SHADOW_HUNTER_VOSHGAJIN, { { 268 } } },
46 { DATA_WARMASTER_VOONE, { { 269 } } },
47 { DATA_MOTHER_SMOLDERWEB, { { 270 } } },
48 { DATA_UROK_DOOMHOWL, { { 271 } } },
49 { DATA_QUARTERMASTER_ZIGRIS, { { 272 } } },
50 { DATA_HALYCON, { { 274 } } },
51 { DATA_GIZRUL_THE_SLAVENER, { { 273 } } },
52 { DATA_OVERLORD_WYRMTHALAK, { { 275 } } },
53};
54
56{
65};
66
68{
69public:
71
73 {
75 {
80 }
81
82 void OnCreatureCreate(Creature* creature) override
83 {
84 switch (creature->GetEntry())
85 {
87 HighlordOmokk = creature->GetGUID();
88 break;
90 ShadowHunterVoshgajin = creature->GetGUID();
91 break;
93 WarMasterVoone = creature->GetGUID();
94 break;
96 MotherSmolderweb = creature->GetGUID();
97 break;
99 UrokDoomhowl = creature->GetGUID();
100 break;
102 QuartermasterZigris = creature->GetGUID();
103 break;
105 GizrultheSlavener = creature->GetGUID();
106 break;
107 case NPC_HALYCON:
108 Halycon = creature->GetGUID();
109 break;
111 OverlordWyrmthalak = creature->GetGUID();
112 break;
114 PyroguardEmberseer = creature->GetGUID();
116 creature->DespawnOrUnsummon(0s, 7_days);
117 break;
119 WarchiefRendBlackhand = creature->GetGUID();
121 creature->DespawnOrUnsummon(0s, 7_days);
122 break;
123 case NPC_GYTH:
124 Gyth = creature->GetGUID();
125 break;
126 case NPC_THE_BEAST:
127 TheBeast = creature->GetGUID();
128 break;
130 GeneralDrakkisath = creature->GetGUID();
131 break;
133 LordVictorNefarius = creature->GetGUID();
135 creature->DespawnOrUnsummon(0s, 7_days);
136 break;
138 ScarshieldInfiltrator = creature->GetGUID();
139 break;
141 _incarceratorList.push_back(creature->GetGUID());
142 break;
143 }
144 }
145
147 {
149
150 switch (go->GetEntry())
151 {
152 case GO_WHELP_SPAWNER:
154 break;
155 case GO_EMBERSEER_IN:
156 go_emberseerin = go->GetGUID();
159 break;
160 case GO_DOORS:
161 go_doors = go->GetGUID();
164 break;
165 case GO_EMBERSEER_OUT:
166 go_emberseerout = go->GetGUID();
169 break;
170 case GO_HALL_RUNE_1:
171 go_roomrunes[0] = go->GetGUID();
174 break;
175 case GO_HALL_RUNE_2:
176 go_roomrunes[1] = go->GetGUID();
179 break;
180 case GO_HALL_RUNE_3:
181 go_roomrunes[2] = go->GetGUID();
184 break;
185 case GO_HALL_RUNE_4:
186 go_roomrunes[3] = go->GetGUID();
189 break;
190 case GO_HALL_RUNE_5:
191 go_roomrunes[4] = go->GetGUID();
194 break;
195 case GO_HALL_RUNE_6:
196 go_roomrunes[5] = go->GetGUID();
199 break;
200 case GO_HALL_RUNE_7:
201 go_roomrunes[6] = go->GetGUID();
204 break;
206 go_emberseerrunes[0] = go->GetGUID();
209 break;
211 go_emberseerrunes[1] = go->GetGUID();
214 break;
216 go_emberseerrunes[2] = go->GetGUID();
219 break;
221 go_emberseerrunes[3] = go->GetGUID();
224 break;
226 go_emberseerrunes[4] = go->GetGUID();
229 break;
231 go_emberseerrunes[5] = go->GetGUID();
234 break;
236 go_emberseerrunes[6] = go->GetGUID();
239 break;
244 break;
249 break;
250 default:
251 break;
252 }
253 }
254
255 bool SetBossState(uint32 type, EncounterState state) override
256 {
257 if (!InstanceScript::SetBossState(type, state))
258 return false;
259
260 switch (type)
261 {
269 case DATA_HALYCON:
273 case DATA_GYTH:
274 case DATA_THE_BEAST:
277 break;
278 default:
279 break;
280 }
281
282 return true;
283 }
284
285 void ProcessEvent(WorldObject* /*obj*/, uint32 eventId, WorldObject* /*invoker*/) override
286 {
287 switch (eventId)
288 {
291 {
293 Emberseer->AI()->SetData(1, 1);
294 }
295 break;
298 {
299
300 }
301 break;
302 default:
303 break;
304 }
305 }
306
307 void SetData(uint32 type, uint32 data) override
308 {
309 switch (type)
310 {
311 case AREATRIGGER:
313 {
315 Events.ScheduleEvent(EVENT_DARGONSPIRE_ROOM_STORE, 1s);
316 }
317 break;
319 for (GuidList::const_iterator itr = _incarceratorList.begin(); itr != _incarceratorList.end(); ++itr)
320 if (Creature* creature = instance->GetCreature(*itr))
321 creature->Respawn();
322 break;
323 default:
324 break;
325 }
326 }
327
328 ObjectGuid GetGuidData(uint32 type) const override
329 {
330 switch (type)
331 {
333 return HighlordOmokk;
337 return WarMasterVoone;
339 return MotherSmolderweb;
341 return UrokDoomhowl;
343 return QuartermasterZigris;
345 return GizrultheSlavener;
346 case DATA_HALYCON:
347 return Halycon;
349 return OverlordWyrmthalak;
351 return PyroguardEmberseer;
354 case DATA_GYTH:
355 return Gyth;
356 case DATA_THE_BEAST:
357 return TheBeast;
359 return GeneralDrakkisath;
362 case GO_EMBERSEER_IN:
363 return go_emberseerin;
364 case GO_DOORS:
365 return go_doors;
366 case GO_EMBERSEER_OUT:
367 return go_emberseerout;
368 case GO_HALL_RUNE_1:
369 return go_roomrunes[0];
370 case GO_HALL_RUNE_2:
371 return go_roomrunes[1];
372 case GO_HALL_RUNE_3:
373 return go_roomrunes[2];
374 case GO_HALL_RUNE_4:
375 return go_roomrunes[3];
376 case GO_HALL_RUNE_5:
377 return go_roomrunes[4];
378 case GO_HALL_RUNE_6:
379 return go_roomrunes[5];
380 case GO_HALL_RUNE_7:
381 return go_roomrunes[6];
383 return go_emberseerrunes[0];
385 return go_emberseerrunes[1];
387 return go_emberseerrunes[2];
389 return go_emberseerrunes[3];
391 return go_emberseerrunes[4];
393 return go_emberseerrunes[5];
395 return go_emberseerrunes[6];
400 default:
401 break;
402 }
403 return ObjectGuid::Empty;
404 }
405
406 void Update(uint32 diff) override
407 {
408 Events.Update(diff);
409
410 while (uint32 eventId = Events.ExecuteEvent())
411 {
412 switch (eventId)
413 {
416 Events.ScheduleEvent(EVENT_DARGONSPIRE_ROOM_CHECK, 3s);
417 break;
421 Events.ScheduleEvent(EVENT_DARGONSPIRE_ROOM_CHECK, 3s);
422 break;
423 default:
424 break;
425 }
426 }
427 }
428
430 {
431 for (uint8 i = 0; i < 7; ++i)
432 {
433 // Refresh the creature list
434 runecreaturelist[i].clear();
435
437 {
438 for (uint8 j = 0; j < 3; ++j)
439 {
440 std::list<Creature*> creatureList;
441 GetCreatureListWithEntryInGrid(creatureList, rune, DragonspireMobs[j], 15.0f);
442 for (std::list<Creature*>::iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr)
443 {
444 if (Creature* creature = *itr)
445 runecreaturelist[i].push_back(creature->GetGUID());
446 }
447 }
448 }
449 }
450 }
451
453 {
454 Creature* mob = nullptr;
455 GameObject* rune = nullptr;
456
457 for (uint8 i = 0; i < 7; ++i)
458 {
459 bool _mobAlive = false;
461 if (!rune)
462 continue;
463
464 if (rune->GetGoState() == GO_STATE_ACTIVE)
465 {
466 for (ObjectGuid const& guid : runecreaturelist[i])
467 {
468 mob = instance->GetCreature(guid);
469 if (mob && mob->IsAlive())
470 _mobAlive = true;
471 }
472 }
473
474 if (!_mobAlive && rune->GetGoState() == GO_STATE_ACTIVE)
475 {
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 {
516 }
517 }
518
519 protected:
547 };
548
550 {
551 return new instance_blackrock_spireMapScript(map);
552 }
553};
554
555/*#####
556# at_dragonspire_hall
557#####*/
558
560{
561public:
562 at_dragonspire_hall() : AreaTriggerScript("at_dragonspire_hall") { }
563
564 bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
565 {
566 if (player && player->IsAlive())
567 {
568 if (InstanceScript* instance = player->GetInstanceScript())
569 {
570 instance->SetData(AREATRIGGER, AREATRIGGER_DRAGONSPIRE_HALL);
571 return true;
572 }
573 }
574
575 return false;
576 }
577};
578
579/*#####
580# at_blackrock_stadium
581#####*/
582
584{
585public:
586 at_blackrock_stadium() : AreaTriggerScript("at_blackrock_stadium") { }
587
588 bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
589 {
590 if (player && player->IsAlive())
591 {
592 InstanceScript* instance = player->GetInstanceScript();
593 if (!instance)
594 return false;
595
596 if (Creature* rend = player->FindNearestCreature(NPC_WARCHIEF_REND_BLACKHAND, 50.0f))
597 {
599 return true;
600 }
601 }
602
603 return false;
604 }
605};
606
608{
609public:
610 at_nearby_scarshield_infiltrator() : AreaTriggerScript("at_nearby_scarshield_infiltrator") { }
611
612 bool OnTrigger(Player* player, AreaTriggerEntry const* /*at*/) override
613 {
614 if (player->IsAlive())
615 {
616 if (InstanceScript* instance = player->GetInstanceScript())
617 {
618 if (Creature* infiltrator = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_SCARSHIELD_INFILTRATOR)))
619 {
620 if (player->GetLevel() >= 57)
621 infiltrator->AI()->SetData(1, 1);
622 else if (infiltrator->GetEntry() == NPC_SCARSHIELD_INFILTRATOR)
623 infiltrator->AI()->Talk(0, player);
624
625 return true;
626 }
627 }
628 }
629
630 return false;
631 }
632};
633
635{
640}
uint8_t uint8
Definition: Define.h:144
uint32_t uint32
Definition: Define.h:142
EncounterState
@ DONE
@ NOT_STARTED
std::list< ObjectGuid > GuidList
Definition: ObjectGuid.h:394
std::vector< ObjectGuid > GuidVector
Definition: ObjectGuid.h:395
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
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
Definition: Creature.cpp:2415
GOState GetGoState() const
Definition: GameObject.h:281
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
virtual void OnGameObjectCreate(GameObject *go) override
void LoadDoorData(DoorData const *data)
void SetHeaders(std::string const &dataHeaders)
GameObject * GetGameObject(ObjectGuid const &guid)
Definition: Map.cpp:3489
Creature * GetCreature(ObjectGuid const &guid)
Definition: Map.cpp:3479
static ObjectGuid const Empty
Definition: ObjectGuid.h:274
uint32 GetEntry() const
Definition: Object.h:161
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
bool IsAlive() const
Definition: Unit.h:1164
uint8 GetLevel() const
Definition: Unit.h:746
InstanceScript * GetInstanceScript() const
Definition: Object.cpp:1042
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2896
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition: Object.cpp:2148
virtual void SetData(uint32, uint32)
Definition: ZoneScript.h:92
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[]
DoorData const 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