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
41
53
55{
56public:
58
60 {
67
68 void OnCreatureCreate(Creature* creature) override
69 {
70 switch (creature->GetEntry())
71 {
73 HighlordOmokk = creature->GetGUID();
74 break;
76 ShadowHunterVoshgajin = creature->GetGUID();
77 break;
79 WarMasterVoone = creature->GetGUID();
80 break;
82 MotherSmolderweb = creature->GetGUID();
83 break;
85 UrokDoomhowl = creature->GetGUID();
86 break;
88 QuartermasterZigris = creature->GetGUID();
89 break;
91 GizrultheSlavener = creature->GetGUID();
92 break;
93 case NPC_HALYCON:
94 Halycon = creature->GetGUID();
95 break;
97 OverlordWyrmthalak = creature->GetGUID();
98 break;
100 PyroguardEmberseer = creature->GetGUID();
102 creature->DespawnOrUnsummon(0s, 7_days);
103 break;
105 WarchiefRendBlackhand = creature->GetGUID();
107 creature->DespawnOrUnsummon(0s, 7_days);
108 break;
109 case NPC_GYTH:
110 Gyth = creature->GetGUID();
111 break;
112 case NPC_THE_BEAST:
113 TheBeast = creature->GetGUID();
114 break;
116 GeneralDrakkisath = creature->GetGUID();
117 break;
119 LordVictorNefarius = creature->GetGUID();
121 creature->DespawnOrUnsummon(0s, 7_days);
122 break;
124 ScarshieldInfiltrator = creature->GetGUID();
125 break;
127 creature->AI()->Talk(SAY_FINKLE_GANG);
128 break;
130 _incarceratorList.push_back(creature->GetGUID());
131 break;
132 }
133 }
134
136 {
138
139 switch (go->GetEntry())
140 {
141 case GO_WHELP_SPAWNER:
143 break;
144 case GO_EMBERSEER_IN:
145 go_emberseerin = go->GetGUID();
148 break;
149 case GO_DOORS:
150 go_doors = go->GetGUID();
153 break;
154 case GO_EMBERSEER_OUT:
155 go_emberseerout = go->GetGUID();
158 break;
159 case GO_HALL_RUNE_1:
160 go_roomrunes[0] = go->GetGUID();
163 break;
164 case GO_HALL_RUNE_2:
165 go_roomrunes[1] = go->GetGUID();
168 break;
169 case GO_HALL_RUNE_3:
170 go_roomrunes[2] = go->GetGUID();
173 break;
174 case GO_HALL_RUNE_4:
175 go_roomrunes[3] = go->GetGUID();
178 break;
179 case GO_HALL_RUNE_5:
180 go_roomrunes[4] = go->GetGUID();
183 break;
184 case GO_HALL_RUNE_6:
185 go_roomrunes[5] = go->GetGUID();
188 break;
189 case GO_HALL_RUNE_7:
190 go_roomrunes[6] = go->GetGUID();
193 break;
195 go_emberseerrunes[0] = go->GetGUID();
198 break;
200 go_emberseerrunes[1] = go->GetGUID();
203 break;
205 go_emberseerrunes[2] = go->GetGUID();
208 break;
210 go_emberseerrunes[3] = go->GetGUID();
213 break;
215 go_emberseerrunes[4] = go->GetGUID();
218 break;
220 go_emberseerrunes[5] = go->GetGUID();
223 break;
225 go_emberseerrunes[6] = go->GetGUID();
228 break;
233 break;
238 break;
239 default:
240 break;
241 }
242 }
243
244 bool SetBossState(uint32 type, EncounterState state) override
245 {
246 if (!InstanceScript::SetBossState(type, state))
247 return false;
248
249 switch (type)
250 {
258 case DATA_HALYCON:
262 case DATA_GYTH:
263 case DATA_THE_BEAST:
266 break;
267 default:
268 break;
269 }
270
271 return true;
272 }
273
274 void ProcessEvent(WorldObject* /*obj*/, uint32 eventId) override
275 {
276 switch (eventId)
277 {
280 {
282 Emberseer->AI()->SetData(1, 1);
283 }
284 break;
287 {
288
289 }
290 break;
291 default:
292 break;
293 }
294 }
295
296 void SetData(uint32 type, uint32 data) override
297 {
298 switch (type)
299 {
300 case AREATRIGGER:
302 {
304 Events.ScheduleEvent(EVENT_DARGONSPIRE_ROOM_STORE, 1s);
305 }
306 break;
308 for (GuidList::const_iterator itr = _incarceratorList.begin(); itr != _incarceratorList.end(); ++itr)
309 if (Creature* creature = instance->GetCreature(*itr))
310 creature->Respawn();
311 break;
312 default:
313 break;
314 }
315 }
316
317 ObjectGuid GetGuidData(uint32 type) const override
318 {
319 switch (type)
320 {
322 return HighlordOmokk;
326 return WarMasterVoone;
328 return MotherSmolderweb;
330 return UrokDoomhowl;
332 return QuartermasterZigris;
334 return GizrultheSlavener;
335 case DATA_HALYCON:
336 return Halycon;
338 return OverlordWyrmthalak;
340 return PyroguardEmberseer;
343 case DATA_GYTH:
344 return Gyth;
345 case DATA_THE_BEAST:
346 return TheBeast;
348 return GeneralDrakkisath;
351 case GO_EMBERSEER_IN:
352 return go_emberseerin;
353 case GO_DOORS:
354 return go_doors;
355 case GO_EMBERSEER_OUT:
356 return go_emberseerout;
357 case GO_HALL_RUNE_1:
358 return go_roomrunes[0];
359 case GO_HALL_RUNE_2:
360 return go_roomrunes[1];
361 case GO_HALL_RUNE_3:
362 return go_roomrunes[2];
363 case GO_HALL_RUNE_4:
364 return go_roomrunes[3];
365 case GO_HALL_RUNE_5:
366 return go_roomrunes[4];
367 case GO_HALL_RUNE_6:
368 return go_roomrunes[5];
369 case GO_HALL_RUNE_7:
370 return go_roomrunes[6];
372 return go_emberseerrunes[0];
374 return go_emberseerrunes[1];
376 return go_emberseerrunes[2];
378 return go_emberseerrunes[3];
380 return go_emberseerrunes[4];
382 return go_emberseerrunes[5];
384 return go_emberseerrunes[6];
389 default:
390 break;
391 }
392 return ObjectGuid::Empty;
393 }
394
395 void Update(uint32 diff) override
396 {
397 Events.Update(diff);
398
399 while (uint32 eventId = Events.ExecuteEvent())
400 {
401 switch (eventId)
402 {
405 Events.ScheduleEvent(EVENT_DARGONSPIRE_ROOM_CHECK, 3s);
406 break;
410 Events.ScheduleEvent(EVENT_DARGONSPIRE_ROOM_CHECK, 3s);
411 break;
412 default:
413 break;
414 }
415 }
416 }
417
419 {
420 for (uint8 i = 0; i < 7; ++i)
421 {
422 // Refresh the creature list
423 runecreaturelist[i].clear();
424
426 {
427 for (uint8 j = 0; j < 3; ++j)
428 {
429 std::list<Creature*> creatureList;
430 GetCreatureListWithEntryInGrid(creatureList, rune, DragonspireMobs[j], 15.0f);
431 for (std::list<Creature*>::iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr)
432 {
433 if (Creature* creature = *itr)
434 runecreaturelist[i].push_back(creature->GetGUID());
435 }
436 }
437 }
438 }
439 }
440
442 {
443 Creature* mob = nullptr;
444 GameObject* rune = nullptr;
445
446 for (uint8 i = 0; i < 7; ++i)
447 {
448 bool _mobAlive = false;
450 if (!rune)
451 continue;
452
453 if (rune->GetGoState() == GO_STATE_ACTIVE)
454 {
455 for (ObjectGuid const& guid : runecreaturelist[i])
456 {
457 mob = instance->GetCreature(guid);
458 if (mob && mob->IsAlive())
459 _mobAlive = true;
460 }
461 }
462
463 if (!_mobAlive && rune->GetGoState() == GO_STATE_ACTIVE)
464 {
466
467 switch (rune->GetEntry())
468 {
469 case GO_HALL_RUNE_1:
471 break;
472 case GO_HALL_RUNE_2:
474 break;
475 case GO_HALL_RUNE_3:
477 break;
478 case GO_HALL_RUNE_4:
480 break;
481 case GO_HALL_RUNE_5:
483 break;
484 case GO_HALL_RUNE_6:
486 break;
487 case GO_HALL_RUNE_7:
489 break;
490 default:
491 break;
492 }
493 }
494 }
495
499 {
505 }
506 }
507
508 protected:
536 };
537
539 {
540 return new instance_blackrock_spireMapScript(map);
541 }
542};
543
544/*#####
545# at_dragonspire_hall
546#####*/
547
549{
550public:
551 at_dragonspire_hall() : AreaTriggerScript("at_dragonspire_hall") { }
552
553 bool OnTrigger(Player* player, AreaTriggerEntry const* /*at*/) override
554 {
555 if (player && player->IsAlive())
556 {
557 if (InstanceScript* instance = player->GetInstanceScript())
558 {
559 instance->SetData(AREATRIGGER, AREATRIGGER_DRAGONSPIRE_HALL);
560 return true;
561 }
562 }
563
564 return false;
565 }
566};
567
568/*#####
569# at_blackrock_stadium
570#####*/
571
573{
574public:
575 at_blackrock_stadium() : AreaTriggerScript("at_blackrock_stadium") { }
576
577 bool OnTrigger(Player* player, AreaTriggerEntry const* /*at*/) override
578 {
579 if (player && player->IsAlive())
580 {
581 InstanceScript* instance = player->GetInstanceScript();
582 if (!instance)
583 return false;
584
585 if (Creature* rend = player->FindNearestCreature(NPC_WARCHIEF_REND_BLACKHAND, 50.0f))
586 {
588 return true;
589 }
590 }
591
592 return false;
593 }
594};
595
597{
598public:
599 at_nearby_scarshield_infiltrator() : AreaTriggerScript("at_nearby_scarshield_infiltrator") { }
600
601 bool OnTrigger(Player* player, AreaTriggerEntry const* /*at*/) override
602 {
603 if (player->IsAlive())
604 {
605 if (InstanceScript* instance = player->GetInstanceScript())
606 {
607 if (Creature* infiltrator = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_SCARSHIELD_INFILTRATOR)))
608 {
609 if (player->GetLevel() >= 57)
610 infiltrator->AI()->SetData(1, 1);
611 else if (infiltrator->GetEntry() == NPC_SCARSHIELD_INFILTRATOR)
612 infiltrator->AI()->Talk(0, player);
613
614 return true;
615 }
616 }
617 }
618
619 return false;
620 }
621};
622
uint8_t uint8
Definition Define.h:135
uint32_t uint32
Definition Define.h:133
EncounterState
@ DONE
@ NOT_STARTED
@ DOOR_TYPE_ROOM
@ DOOR_TYPE_PASSAGE
std::list< ObjectGuid > GuidList
Definition ObjectGuid.h:261
std::vector< ObjectGuid > GuidVector
Definition ObjectGuid.h:262
void GetCreatureListWithEntryInGrid(Container &container, WorldObject *source, uint32 entry, float maxSearchRange)
@ GO_STATE_ACTIVE
#define DataHeader
@ SPELL_SUMMON_ROOKERY_WHELP
@ SAY_FINKLE_GANG
@ AREATRIGGER
@ AREATRIGGER_DRAGONSPIRE_HALL
@ AREATRIGGER_BLACKROCK_STADIUM
@ EVENT_PYROGUARD_EMBERSEER
@ EVENT_UROK_DOOMHOWL
uint32 const EncounterCount
@ 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_FINKLE_EINHORN
@ 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 Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
CreatureAI * AI() const
Definition Creature.h:154
GOState GetGoState() const
Definition GameObject.h:178
void SetBossNumber(uint32 number)
virtual bool SetBossState(uint32 id, EncounterState state)
void HandleGameObject(ObjectGuid guid, bool open, GameObject *go=nullptr)
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:4430
Creature * GetCreature(ObjectGuid const &guid)
Definition Map.cpp:4397
static ObjectGuid const Empty
Definition ObjectGuid.h:140
uint32 GetEntry() const
Definition Object.h:81
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
bool IsAlive() const
Definition Unit.h:1234
uint8 GetLevel() const
Definition Unit.h:889
InstanceScript * GetInstanceScript() const
Definition Object.cpp:1087
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2832
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition Object.cpp:2099
virtual void SetData(uint32, uint32)
Definition ZoneScript.h:56
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
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