TrinityCore
halls_of_stone.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 "halls_of_stone.h"
20#include "InstanceScript.h"
21#include "ObjectAccessor.h"
22#include "Player.h"
23#include "ScriptedEscortAI.h"
24#include "ScriptedGossip.h"
25#include "TemporarySummon.h"
26
28{
34
39
50
62
66
75
80
85
87 TEXT_ID_PROGRESS = 13101
88};
89
91{
99};
100
102{
104
105 // Kadrak
107
108 // Marnak
110
111 // Abedneum
113
115};
116
118{
120
122
124
126{
127 GOSSIP_ITEM_START_MID = 9669, //Brann, it would be our honor!
129 GOSSIP_ITEM_PROGRESS_MID = 9670, //Let's move Brann, enough of the history lessons!
132
134{
135 {946.992f, 397.016f, 208.374f, 0.0f},
136 {960.748f, 382.944f, 208.374f, 0.0f},
137};
138
140{
142 {
143 Initialize();
144 instance = creature->GetInstanceScript();
145 SetCombatMovement(false);
146 }
147
149 {
153
154 bKaddrakActivated = false;
155 bMarnakActivated = false;
156 bAbedneumActivated = false;
157 }
158
160
164
168
170
171 void Reset() override
172 {
173 Initialize();
174
179
180 KaddrakGUIDList.clear();
181 }
182
184 {
185 /*GetCreatureListWithEntryInGrid(lKaddrakGUIDList, me, CREATURE_KADDRAK, 50.0f);
186 if (!lKaddrakGUIDList.empty())
187 {
188 uint32 uiPositionCounter = 0;
189 for (std::list<Creature*>::const_iterator itr = lKaddrakGUIDList.begin(); itr != lKaddrakGUIDList.end(); ++itr)
190 {
191 if ((*itr)->IsAlive())
192 {
193 if (uiPositionCounter == 0)
194 {
195 (*itr)->GetMap()->CreatureRelocation((*itr), 927.265f, 333.200f, 218.780f, (*itr)->GetOrientation());
196 (*itr)->SendMonsterMove(927.265f, 333.200f, 218.780f, 0, (*itr)->GetMovementFlags(), 1);
197 }
198 else
199 {
200 (*itr)->GetMap()->CreatureRelocation((*itr), 921.745f, 328.076f, 218.780f, (*itr)->GetOrientation());
201 (*itr)->SendMonsterMove(921.745f, 328.076f, 218.780f, 0, (*itr)->GetMovementFlags(), 1);
202 }
203 }
204 ++uiPositionCounter;
205 }
206 }*/
207 }
208
209 void UpdateAI(uint32 diff) override
210 {
212 {
213 if (uiKaddrakEncounterTimer <= diff)
214 {
215 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
216 if (!KaddrakGUIDList.empty())
217 for (GuidList::const_iterator itr = KaddrakGUIDList.begin(); itr != KaddrakGUIDList.end(); ++itr)
218 {
219 if (Creature* pKaddrak = ObjectAccessor::GetCreature(*me, *itr))
220 {
221 if (pKaddrak->IsAlive())
222 pKaddrak->CastSpell(target, SPELL_GLARE_OF_THE_TRIBUNAL, true);
223 }
224 }
226 } else uiKaddrakEncounterTimer -= diff;
227 }
229 {
230 if (uiMarnakEncounterTimer <= diff)
231 {
232 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
233 {
234 if (Creature* summon = me->SummonCreature(NPC_DARK_MATTER_TARGET, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 1s))
235 {
236 summon->SetDisplayId(11686);
237 summon->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
238 summon->CastSpell(target, SPELL_DARK_MATTER, true);
239 }
240 }
241 uiMarnakEncounterTimer = urand(30000, 31000);
242 } else uiMarnakEncounterTimer -= diff;
243 }
245 {
246 if (uiAbedneumEncounterTimer <= diff)
247 {
248 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
249 {
250 if (Creature* summon = me->SummonCreature(NPC_SEARING_GAZE_TARGET, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 1s))
251 {
252 summon->SetDisplayId(11686);
253 summon->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
254 summon->CastSpell(target, SPELL_SEARING_GAZE, true);
255 }
256 }
257 uiAbedneumEncounterTimer = urand(30000, 31000);
258 } else uiAbedneumEncounterTimer -= diff;
259 }
260 }
261};
262
263static constexpr uint32 PATH_ESCORT_BRANN = 224562;
264
265struct npc_brann_hos : public EscortAI
266{
267 npc_brann_hos(Creature* creature) : EscortAI(creature)
268 {
269 Initialize();
270 instance = creature->GetInstanceScript();
271 }
272
274 {
275 bIsLowHP = false;
276 bIsBattle = false;
277 uiStep = 0;
278 uiPhaseTimer = 0;
280 brannSparklinNews = true;
281 }
282
285
288
290
294
295 void Reset() override
296 {
298 {
299 Initialize();
300
301 DespawnDwarf();
302
304 }
305 }
306
308 {
309 if (lDwarfGUIDList.empty())
310 return;
311 for (GuidList::const_iterator itr = lDwarfGUIDList.begin(); itr != lDwarfGUIDList.end(); ++itr)
312 {
314 if (temp && temp->IsAlive())
315 temp->DespawnOrUnsummon();
316 }
317 lDwarfGUIDList.clear();
318 }
319
320 void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override
321 {
322 switch (waypointId)
323 {
324 case 7:
326 {
327 if (!creature->IsAlive())
328 creature->Respawn();
329 ENSURE_AI(npc_tribuna_controller, creature->AI())->UpdateFacesList();
330 uiControllerGUID = creature->GetGUID();
331 }
332 break;
333 case 13:
336 SetEscortPaused(true);
337 JumpToNextStep(20000);
338 // @todo: There should be a pause here and a gossip should start the next step.
339 break;
340 case 17:
344 SetEscortPaused(true);
345 JumpToNextStep(8500);
346 break;
347 case 18:
348 SetEscortPaused(true);
349 break;
350 }
351 }
352
353 void SpawnDwarf(uint32 uiType)
354 {
355 switch (uiType)
356 {
357 case 1:
358 {
359 uint32 uiSpawnNumber = DUNGEON_MODE(2, 3);
360 for (uint8 i = 0; i < uiSpawnNumber; ++i)
363 break;
364 }
365 case 2:
366 for (uint8 i = 0; i < 2; ++i)
368 break;
369 case 3:
371 break;
372 }
373 }
374
375 void JustSummoned(Creature* summoned) override
376 {
377 lDwarfGUIDList.push_back(summoned->GetGUID());
378 AddThreat(me, 0.0f, summoned);
379 summoned->AI()->AttackStart(me);
380 }
381
382 void JumpToNextStep(uint32 uiTimer)
383 {
384 uiPhaseTimer = uiTimer;
385 ++uiStep;
386 }
387
388 void StartWP()
389 {
391 SetEscortPaused(false);
392 uiStep = 1;
394 Start();
395 }
396
397 void DamageTaken(Unit* /*done_by*/, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
398 {
400 brannSparklinNews = false;
401 }
402
403 uint32 GetData(uint32 type) const override
404 {
405 if (type == DATA_BRANN_SPARKLIN_NEWS)
406 return brannSparklinNews ? 1 : 0;
407
408 return 0;
409 }
410
411 void UpdateEscortAI(uint32 uiDiff) override
412 {
413 if (uiPhaseTimer <= uiDiff)
414 {
415 switch (uiStep)
416 {
417 case 1:
419 return;
420 bIsBattle = false;
423 break;
424 case 3:
425 SetEscortPaused(false);
427 break;
428 case 5:
430 temp->AI()->Talk(SAY_EVENT_INTRO_3_ABED);
431 JumpToNextStep(8500);
432 break;
433 case 6:
435 JumpToNextStep(6500);
436 break;
437 case 7:
439 temp->AI()->Talk(SAY_EVENT_A_2_KADD);
440 JumpToNextStep(12500);
441 break;
442 case 8:
446 ENSURE_AI(npc_tribuna_controller, temp->AI())->bKaddrakActivated = true;
447 JumpToNextStep(5000);
448 break;
449 case 9:
451 SpawnDwarf(1);
452 JumpToNextStep(20000);
453 break;
454 case 10:
456 JumpToNextStep(6000);
457 break;
458 case 11:
460 temp->AI()->Talk(SAY_EVENT_B_2_MARN);
461 SpawnDwarf(1);
462 JumpToNextStep(20000);
463 break;
464 case 12:
468 ENSURE_AI(npc_tribuna_controller, temp->AI())->bMarnakActivated = true;
469 JumpToNextStep(10000);
470 break;
471 case 13:
472 SpawnDwarf(1);
473 JumpToNextStep(10000);
474 break;
475 case 14:
476 SpawnDwarf(2);
477 JumpToNextStep(20000);
478 break;
479 case 15:
481 SpawnDwarf(1);
482 JumpToNextStep(10000);
483 break;
484 case 16:
485 SpawnDwarf(2);
486 JumpToNextStep(20000);
487 break;
488 case 17:
490 temp->AI()->Talk(SAY_EVENT_C_2_ABED);
491 SpawnDwarf(1);
492 JumpToNextStep(20000);
493 break;
494 case 18:
498 ENSURE_AI(npc_tribuna_controller, temp->AI())->bAbedneumActivated = true;
499 JumpToNextStep(5000);
500 break;
501 case 19:
502 SpawnDwarf(2);
503 JumpToNextStep(10000);
504 break;
505 case 20:
506 SpawnDwarf(1);
507 JumpToNextStep(15000);
508 break;
509 case 21:
511 SpawnDwarf(3);
512 JumpToNextStep(20000);
513 break;
514 case 22:
516 temp->AI()->Talk(SAY_EVENT_D_2_ABED);
517 SpawnDwarf(1);
518 JumpToNextStep(5000);
519 break;
520 case 23:
521 SpawnDwarf(2);
522 JumpToNextStep(15000);
523 break;
524 case 24:
526 SpawnDwarf(3);
527 JumpToNextStep(5000);
528 break;
529 case 25:
530 SpawnDwarf(1);
531 JumpToNextStep(5000);
532 break;
533 case 26:
534 SpawnDwarf(2);
535 JumpToNextStep(10000);
536 break;
537 case 27:
539 temp->AI()->Talk(SAY_EVENT_D_4_ABED);
540 SpawnDwarf(1);
541 JumpToNextStep(10000);
542 break;
543 case 28:
549 temp->KillSelf();
550 bIsBattle = true;
551 SetEscortPaused(false);
552 JumpToNextStep(6500);
553 break;
554 case 29:
558 JumpToNextStep(5500);
559 break;
560 case 30:
562 temp->AI()->Talk(SAY_EVENT_END_03_ABED);
563 JumpToNextStep(8500);
564 break;
565 case 31:
567 JumpToNextStep(11500);
568 break;
569 case 32:
571 temp->AI()->Talk(SAY_EVENT_END_05_ABED);
572 JumpToNextStep(11500);
573 break;
574 case 33:
576 JumpToNextStep(4500);
577 break;
578 case 34:
580 temp->AI()->Talk(SAY_EVENT_END_07_ABED);
581 JumpToNextStep(22500);
582 break;
583 case 35:
585 JumpToNextStep(7500);
586 break;
587 case 36:
589 temp->AI()->Talk(SAY_EVENT_END_09_KADD);
590 JumpToNextStep(18500);
591 break;
592 case 37:
594 JumpToNextStep(5500);
595 break;
596 case 38:
598 temp->AI()->Talk(SAY_EVENT_END_11_KADD);
599 JumpToNextStep(20500);
600 break;
601 case 39:
603 JumpToNextStep(2500);
604 break;
605 case 40:
607 temp->AI()->Talk(SAY_EVENT_END_13_KADD);
608 JumpToNextStep(19500);
609 break;
610 case 41:
612 JumpToNextStep(10500);
613 break;
614 case 42:
616 temp->AI()->Talk(SAY_EVENT_END_15_MARN);
617 JumpToNextStep(6500);
618 break;
619 case 43:
621 JumpToNextStep(6500);
622 break;
623 case 44:
625 temp->AI()->Talk(SAY_EVENT_END_17_MARN);
626 JumpToNextStep(25500);
627 break;
628 case 45:
630 JumpToNextStep(23500);
631 break;
632 case 46:
634 temp->AI()->Talk(SAY_EVENT_END_19_MARN);
635 JumpToNextStep(3500);
636 break;
637 case 47:
639 JumpToNextStep(8500);
640 break;
641 case 48:
643 temp->AI()->Talk(SAY_EVENT_END_21_ABED);
644 JumpToNextStep(5500);
645 break;
646 case 49:
647 {
652 Player* player = GetPlayerForEscort();
653 if (player)
656 JumpToNextStep(180000);
657 break;
658 }
659 case 50:
660 SetEscortPaused(false);
661 break;
662 }
663 } else uiPhaseTimer -= uiDiff;
664
665 if (!bIsLowHP && HealthBelowPct(30))
666 {
668 bIsLowHP = true;
669 }
670 else if (bIsLowHP && !HealthBelowPct(30))
671 bIsLowHP = false;
672
673 if (!UpdateVictim())
674 return;
675 }
676
677 bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
678 {
679 uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId);
680 ClearGossipMenuFor(player);
681 if (action == GOSSIP_ACTION_INFO_DEF + 1 || action == GOSSIP_ACTION_INFO_DEF + 2)
682 {
683 CloseGossipMenuFor(player);
684 StartWP();
685 }
686
687 return true;
688 }
689
690 bool OnGossipHello(Player* player) override
691 {
693 if (me->IsQuestGiver())
694 player->PrepareQuestMenu(me->GetGUID());
695
698
699 return true;
700 }
701};
702
704{
705 public:
706 achievement_brann_spankin_new() : AchievementCriteriaScript("achievement_brann_spankin_new") { }
707
708 bool OnCheck(Player* /*player*/, Unit* target) override
709 {
710 if (!target)
711 return false;
712
713 if (Creature* Brann = target->ToCreature())
714 if (Brann->AI()->GetData(DATA_BRANN_SPARKLIN_NEWS))
715 return true;
716
717 return false;
718 }
719};
720
722{
726}
Texts
uint8_t uint8
Definition: Define.h:144
uint32_t uint32
Definition: Define.h:142
@ IN_PROGRESS
@ DONE
@ NOT_STARTED
@ TEMPSUMMON_TIMED_DESPAWN
Definition: ObjectDefines.h:65
@ TEMPSUMMON_CORPSE_TIMED_DESPAWN
Definition: ObjectDefines.h:68
std::list< ObjectGuid > GuidList
Definition: ObjectGuid.h:394
Spells
Definition: PlayerAI.cpp:32
uint32 urand(uint32 min, uint32 max)
Definition: Random.cpp:42
Creature * GetClosestCreatureWithEntry(WorldObject *source, uint32 entry, float maxSearchRange, bool alive=true)
@ STATE_ESCORT_ESCORTING
void AddGossipItemFor(Player *player, GossipOptionNpc optionNpc, std::string text, uint32 sender, uint32 action)
void SendGossipMenuFor(Player *player, uint32 npcTextID, ObjectGuid const &guid)
void ClearGossipMenuFor(Player *player)
void InitGossipMenuFor(Player *player, uint32 menuId)
void CloseGossipMenuFor(Player *player)
@ GOSSIP_SENDER_MAIN
@ GOSSIP_ACTION_INFO_DEF
#define ENSURE_AI(a, b)
Definition: UnitAI.h:29
@ REACT_DEFENSIVE
Definition: UnitDefines.h:507
@ REACT_PASSIVE
Definition: UnitDefines.h:506
@ UNIT_STAND_STATE_KNEEL
Definition: UnitDefines.h:50
@ UNIT_STAND_STATE_STAND
Definition: UnitDefines.h:42
@ UNIT_NPC_FLAG_GOSSIP
Definition: UnitDefines.h:297
DamageEffectType
Definition: UnitDefines.h:131
@ UNIT_FLAG_NON_ATTACKABLE
Definition: UnitDefines.h:145
Gossip
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
Definition: CreatureAI.cpp:56
bool UpdateVictim()
Definition: CreatureAI.cpp:245
void AttackStart(Unit *victim) override
== Triggered Actions Requested ==================
Definition: CreatureAI.cpp:328
Creature *const me
Definition: CreatureAI.h:61
void SetReactState(ReactStates st)
Definition: Creature.h:160
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
Definition: Creature.cpp:2415
CreatureAI * AI() const
Definition: Creature.h:214
virtual bool SetBossState(uint32 id, EncounterState state)
void HandleGameObject(ObjectGuid guid, bool open, GameObject *go=nullptr)
virtual ObjectGuid GetGuidData(uint32 type) const override
EncounterState GetBossState(uint32 id) const
static ObjectGuid const Empty
Definition: ObjectGuid.h:274
void Clear()
Definition: ObjectGuid.h:286
static Creature * ToCreature(Object *o)
Definition: Object.h:219
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
void GroupEventHappens(uint32 questId, WorldObject const *pEventObject)
Definition: Player.cpp:16598
void PrepareQuestMenu(ObjectGuid guid)
Definition: Player.cpp:14474
std::unique_ptr< PlayerMenu > PlayerTalkClass
Definition: Player.h:2380
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition: UnitAI.cpp:79
Definition: Unit.h:627
void SetStandState(UnitStandStateType state, uint32 animKitID=0)
Definition: Unit.cpp:10100
bool IsAlive() const
Definition: Unit.h:1164
void RemoveNpcFlag(NPCFlags flags)
Definition: Unit.h:983
bool IsQuestGiver() const
Definition: Unit.h:994
void SetNpcFlag(NPCFlags flags)
Definition: Unit.h:982
InstanceScript * GetInstanceScript() const
Definition: Object.cpp:1042
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2896
TempSummon * SummonCreature(uint32 entry, Position const &pos, TempSummonType despawnType=TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime=0s, uint32 vehId=0, uint32 spellId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty)
Definition: Object.cpp:2025
bool OnCheck(Player *, Unit *target) override
@ NPC_TRIBUNAL_OF_THE_AGES
@ NPC_DARK_RUNE_STORMCALLER
@ NPC_SEARING_GAZE_TARGET
@ NPC_DARK_MATTER_TARGET
@ NPC_BRANN_BRONZEBEARD
@ NPC_IRON_GOLEM_CUSTODIAN
@ NPC_DARK_RUNE_PROTECTOR
@ QUEST_HALLS_OF_STONE
@ DATA_BRANN_SPARKLIN_NEWS
@ SPELL_SEARING_GAZE
@ SPELL_DARK_MATTER
@ SPELL_GLARE_OF_THE_TRIBUNAL
@ SPELL_REWARD_ACHIEVEMENT
@ SPELL_STEALTH
void AddSC_halls_of_stone()
static constexpr uint32 PATH_ESCORT_BRANN
@ SAY_DEATH
@ SAY_SPAWN_TROGG
@ SAY_EVENT_D_1
@ SAY_EVENT_END_10
@ SAY_EVENT_END_19_MARN
@ SAY_EVENT_END_16
@ SAY_EVENT_END_06
@ SAY_LOW_HEALTH
@ SAY_EVENT_END_21_ABED
@ SAY_SPAWN_DWARF
@ SAY_EVENT_END_12
@ SAY_EVENT_END_20
@ SAY_VICTORY_SJONNIR_1
@ SAY_ESCORT_START
@ SAY_EVENT_END_15_MARN
@ SAY_EVENT_D_4_ABED
@ SAY_VICTORY_SJONNIR_2
@ TEXT_ID_PROGRESS
@ SAY_SPAWN_EARTHEN
@ SAY_EVENT_END_13_KADD
@ SAY_EVENT_END_01
@ SAY_EVENT_END_09_KADD
@ SAY_EVENT_END_17_MARN
@ SAY_EVENT_B_2_MARN
@ SAY_EVENT_C_2_ABED
@ SAY_EVENT_INTRO_3_ABED
@ SAY_SPAWN_OOZE
@ SAY_KILL
@ SAY_EVENT_D_3
@ SAY_EVENT_A_2_KADD
@ SAY_EVENT_D_2_ABED
@ SAY_EVENT_END_18
@ SAY_EVENT_END_04
@ SAY_EVENT_B_1
@ SAY_EVENT_INTRO_1
@ SAY_ENTRANCE_MEET
@ SAY_PLAYER_DEATH
@ SAY_EVENT_A_1
@ SAY_EVENT_END_07_ABED
@ SAY_EVENT_END_11_KADD
@ SAY_EVENT_END_03_ABED
@ SAY_EVENT_A_3
@ SAY_EVENT_END_14
@ SAY_EVENT_END_05_ABED
@ SAY_EVENT_C_1
@ SAY_EVENT_INTRO_2
@ SAY_EVENT_END_02
@ SAY_EVENT_END_08
@ SAY_EVENT_B_3
@ SAY_EVENT_C_3
@ TEXT_ID_START
static Position SpawnLocations[]
@ GOSSIP_ITEM_START_MID
@ GOSSIP_ITEM_START_OID
@ GOSSIP_ITEM_PROGRESS_OID
@ GOSSIP_ITEM_PROGRESS_MID
@ DATA_GO_SKY_FLOOR
@ DATA_GO_MARNAK
@ DATA_MARNAK
@ DATA_GO_KADDRAK
@ DATA_TRIBUNAL_OF_AGES
@ DATA_ABEDNEUM
@ DATA_GO_ABEDNEUM
@ DATA_GO_TRIBUNAL_CONSOLE
@ DATA_KADDRAK
#define RegisterHallsOfStoneCreatureAI(ai_name)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
void Start(bool isActiveAttacker=true, ObjectGuid playerGUID=ObjectGuid::Empty, Quest const *quest=nullptr, bool instantRespawn=false, bool canLoopPath=false)
bool HasEscortState(uint32 escortState)
void LoadPath(uint32 pathId)
Player * GetPlayerForEscort()
void SetEscortPaused(bool on)
T const & DUNGEON_MODE(T const &normal5, T const &heroic10) const
void SetCombatMovement(bool allowMovement)
bool HealthBelowPct(uint32 pct) const
void AddThreat(Unit *victim, float amount, Unit *who=nullptr)
void JustSummoned(Creature *summoned) override
void UpdateEscortAI(uint32 uiDiff) override
void DamageTaken(Unit *, uint32 &, DamageEffectType, SpellInfo const *) override
GuidList lDwarfGUIDList
void JumpToNextStep(uint32 uiTimer)
void Reset() override
bool OnGossipHello(Player *player) override
void WaypointReached(uint32 waypointId, uint32) override
bool OnGossipSelect(Player *player, uint32, uint32 gossipListId) override
uint32 GetData(uint32 type) const override
npc_brann_hos(Creature *creature)
InstanceScript * instance
void SpawnDwarf(uint32 uiType)
ObjectGuid uiControllerGUID
InstanceScript * instance
void UpdateAI(uint32 diff) override
npc_tribuna_controller(Creature *creature)