Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_assembly_of_iron.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/* ScriptData
7SDName: Assembly of Iron encounter
8SD%Complete: 60%
9SDComment: chain lightning won't cast, supercharge don't work (auras don't stack from different casters)
10SDCategory: Ulduar - Ulduar
11EndScriptData */
12
13#include "ScriptMgr.h"
14#include "ScriptedCreature.h"
15#include "SpellScript.h"
16#include "SpellAuraEffects.h"
17#include "ulduar.h"
18
20{
21 // General
23 SPELL_BERSERK = 47008, // Hard enrage, don't know the correct ID.
24 SPELL_KILL_CREDIT = 65195, // spell_dbc
25
26 // Steelbreaker
32
33 // Runemaster Molgeim
38 SPELL_RUNE_OF_SUMMONING = 62273, // This is the spell that summons the rune
39 SPELL_RUNE_OF_SUMMONING_SUMMON = 62020, // Spell that summons
40
41 // Stormcaller Brundir
49};
50
79
85
112
114{
116
118};
119
120#define FLOOR_Z 427.28f
121#define FINAL_FLIGHT_Z 435.0f
122
124{
125 public:
126 boss_steelbreaker() : CreatureScript("boss_steelbreaker") { }
127
129 {
131
133
135 {
136 _Reset();
137 phase = 0;
138 me->RemoveAllAuras();
139 }
140
141 void EnterCombat(Unit* /*who*/) OVERRIDE
142 {
143 _EnterCombat();
146 events.SetPhase(++phase);
147 events.ScheduleEvent(EVENT_BERSERK, 900000);
148 events.ScheduleEvent(EVENT_FUSION_PUNCH, 15000);
149 }
150
152 {
153 if (type == DATA_PHASE_3)
154 return (phase >= 3) ? 1 : 0;
155
156 return 0;
157 }
158
160 {
161 switch (action)
162 {
164 me->SetFullHealth();
165 me->AddAura(SPELL_SUPERCHARGE, me);
166 events.SetPhase(++phase);
167 events.RescheduleEvent(EVENT_FUSION_PUNCH, 15000);
168 if (phase >= 2)
169 events.RescheduleEvent(EVENT_STATIC_DISRUPTION, 30000);
170 if (phase >= 3)
171 events.RescheduleEvent(EVENT_OVERWHELMING_POWER, std::rand() % 5000 + 2000);
172 break;
175 break;
176 }
177 }
178
179 void JustDied(Unit* /*killer*/) OVERRIDE
180 {
181 _JustDied();
182
183 if (instance->GetBossState(BOSS_ASSEMBLY_OF_IRON) == DONE)
184 {
187 }
188 else
189 {
190 me->SetLootRecipient(NULL);
192 //DoCastAOE(SPELL_SUPERCHARGE, true);
193
194 if (Creature* Brundir = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BRUNDIR)))
195 if (Brundir->IsAlive())
196 Brundir->AI()->DoAction(ACTION_SUPERCHARGE);
197
198 if (Creature* Molgeim = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MOLGEIM)))
199 if (Molgeim->IsAlive())
200 Molgeim->AI()->DoAction(ACTION_SUPERCHARGE);
201 }
202 }
203
205 {
206 if (who->GetTypeId() == TypeID::TYPEID_PLAYER)
208
209 if (phase == 3)
211 }
212
214 {
215 if (!UpdateVictim())
216 return;
217
218 events.Update(diff);
219
220 if (me->HasUnitState(UNIT_STATE_CASTING))
221 return;
222
223 while (uint32 eventId = events.ExecuteEvent())
224 {
225 switch (eventId)
226 {
227 case EVENT_BERSERK:
230 events.CancelEvent(EVENT_BERSERK);
231 break;
233 if (me->IsWithinMeleeRange(me->GetVictim()))
235 events.ScheduleEvent(EVENT_FUSION_PUNCH, std::rand() % 22000 + 13000);
236 break;
238 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
240 events.ScheduleEvent(EVENT_STATIC_DISRUPTION, std::rand() % 40000 + 20000);
241 break;
245 events.ScheduleEvent(EVENT_OVERWHELMING_POWER, RAID_MODE(60000, 35000));
246 break;
247 }
248 }
249
251 }
252 };
253
255 {
256 return GetUlduarAI<boss_steelbreakerAI>(creature);
257 }
258};
259
261{
262 public:
263 boss_runemaster_molgeim() : CreatureScript("boss_runemaster_molgeim") { }
264
266 {
268
270
272 {
273 _Reset();
274 phase = 0;
275 me->RemoveAllAuras();
276 }
277
278 void EnterCombat(Unit* /*who*/) OVERRIDE
279 {
280 _EnterCombat();
282 events.SetPhase(++phase);
283 events.ScheduleEvent(EVENT_BERSERK, 900000);
284 events.ScheduleEvent(EVENT_SHIELD_OF_RUNES, 30000);
285 events.ScheduleEvent(EVENT_RUNE_OF_POWER, 20000);
286 }
287
289 {
290 if (type == DATA_PHASE_3)
291 return (phase >= 3) ? 1 : 0;
292
293 return 0;
294 }
295
297 {
298 switch (action)
299 {
301 {
302 me->SetFullHealth();
303 me->AddAura(SPELL_SUPERCHARGE, me);
304 events.SetPhase(++phase);
305 events.RescheduleEvent(EVENT_SHIELD_OF_RUNES, 27000);
306 events.RescheduleEvent(EVENT_RUNE_OF_POWER, 25000);
307 if (phase >= 2)
308 events.RescheduleEvent(EVENT_RUNE_OF_DEATH, 30000);
309 if (phase >= 3)
310 events.RescheduleEvent(EVENT_RUNE_OF_SUMMONING, std::rand() % 30000 + 20000);
311 break;
312 }
313 }
314 }
315
316 void JustDied(Unit* /*killer*/) OVERRIDE
317 {
318 _JustDied();
319
320 if (instance->GetBossState(BOSS_ASSEMBLY_OF_IRON) == DONE)
321 {
324 }
325 else
326 {
327 me->SetLootRecipient(NULL);
329 //DoCastAOE(SPELL_SUPERCHARGE, true);
330
331 if (Creature* Brundir = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_BRUNDIR)))
332 if (Brundir->IsAlive())
333 Brundir->AI()->DoAction(ACTION_SUPERCHARGE);
334
335 if (Creature* Steelbreaker = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_STEELBREAKER)))
336 if (Steelbreaker->IsAlive())
337 Steelbreaker->AI()->DoAction(ACTION_SUPERCHARGE);
338 }
339 }
340
342 {
343 if (who->GetTypeId() == TypeID::TYPEID_PLAYER)
345 }
346
348 {
349 if (!UpdateVictim())
350 return;
351
352 events.Update(diff);
353
354 if (me->HasUnitState(UNIT_STATE_CASTING))
355 return;
356
357 while (uint32 eventId = events.ExecuteEvent())
358 {
359 switch (eventId)
360 {
361 case EVENT_BERSERK:
364 events.CancelEvent(EVENT_BERSERK);
365 break;
367 {
368 Unit* target = me;
369 switch (std::rand() % 2)
370 {
371 case 1:
372 if (Creature* Steelbreaker = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_STEELBREAKER)))
373 if (Steelbreaker->IsAlive())
374 target = Steelbreaker;
375 break;
376 case 2:
378 if (Brundir->IsAlive())
379 target = Brundir;
380 break;
381 default:
382 break;
383 }
385 events.ScheduleEvent(EVENT_RUNE_OF_POWER, 60000);
386 break;
387 }
390 events.ScheduleEvent(EVENT_SHIELD_OF_RUNES, std::rand() % 34000 + 27000);
391 break;
394 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
396 events.ScheduleEvent(EVENT_RUNE_OF_DEATH, std::rand() % 40000 + 30000);
397 break;
400 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
402 events.ScheduleEvent(EVENT_RUNE_OF_SUMMONING, std::rand() % 45000 + 30000);
403 break;
404 }
405 }
406
408 }
409 };
410
412 {
414 }
415};
416
418{
419 public:
420 boss_stormcaller_brundir() : CreatureScript("boss_stormcaller_brundir") { }
421
423 {
425
427
429 {
430 _Reset();
431 phase = 0;
432 me->RemoveAllAuras();
433 me->SetDisableGravity(false);
434 me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_INTERRUPT, false); // Should be interruptable unless overridden by spell (Overload)
435 me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_STUN, false); // Reset immumity, Brundir should be stunnable by default
436 }
437
439 {
440 if (type == DATA_PHASE_3)
441 return (phase >= 3) ? 1 : 0;
442
443 return 0;
444 }
445
446 void EnterCombat(Unit* /*who*/) OVERRIDE
447 {
448 _EnterCombat();
450 events.SetPhase(++phase);
451 events.ScheduleEvent(EVENT_MOVE_POSITION, 1000);
452 events.ScheduleEvent(EVENT_BERSERK, 900000);
453 events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 4000);
454 events.ScheduleEvent(EVENT_OVERLOAD, std::rand() % 120000 + 60000);
455 }
456
458 {
459 switch (action)
460 {
462 {
463 me->SetFullHealth();
464 me->AddAura(SPELL_SUPERCHARGE, me);
465 events.SetPhase(++phase);
466 events.RescheduleEvent(EVENT_CHAIN_LIGHTNING, std::rand() % 12000 + 7000);
467 events.RescheduleEvent(EVENT_OVERLOAD, std::rand() % 50000 + 40000);
468 if (phase >= 2)
469 events.RescheduleEvent(EVENT_LIGHTNING_WHIRL, std::rand() % 250000 + 15000);
470 if (phase >= 3)
471 {
473 events.RescheduleEvent(EVENT_LIGHTNING_TENDRILS, std::rand() % 60000 + 50000);
474 me->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_STUN, true); // Apply immumity to stuns
475 }
476 break;
477 }
478 }
479 }
480
481 void JustDied(Unit* /*killer*/) OVERRIDE
482 {
483 _JustDied();
484
485 if (instance->GetBossState(BOSS_ASSEMBLY_OF_IRON) == DONE)
486 {
489 }
490 else
491 {
492 me->SetLootRecipient(NULL);
494 //DoCastAOE(SPELL_SUPERCHARGE, true);
495
496 if (Creature* Molgeim = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_MOLGEIM)))
497 if (Molgeim->IsAlive())
498 Molgeim->AI()->DoAction(ACTION_SUPERCHARGE);
499
500 if (Creature* Steelbreaker = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_STEELBREAKER)))
501 if (Steelbreaker->IsAlive())
502 Steelbreaker->AI()->DoAction(ACTION_SUPERCHARGE);
503 }
504
505 // Prevent to have Brundir somewhere in the air when he die in Air phase
506 if (me->GetPositionZ() > FLOOR_Z)
507 me->GetMotionMaster()->MoveFall();
508 }
509
511 {
512 if (who->GetTypeId() == TypeID::TYPEID_PLAYER)
514 }
515
517 {
518 if (!UpdateVictim())
519 return;
520
521 events.Update(diff);
522
523 if (me->HasUnitState(UNIT_STATE_CASTING))
524 return;
525
526 while (uint32 eventId = events.ExecuteEvent())
527 {
528 switch (eventId)
529 {
530 case EVENT_BERSERK:
533 events.CancelEvent(EVENT_BERSERK);
534 break;
536 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
538 events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, std::rand() % 10000 + 7000);
539 break;
540 case EVENT_OVERLOAD:
544 events.ScheduleEvent(EVENT_OVERLOAD, std::rand() % 120000 + 60000);
545 break;
548 events.ScheduleEvent(EVENT_LIGHTNING_WHIRL, std::rand() % 20000 + 15000);
549 break;
554 me->AttackStop();
555 //me->SetLevitate(true);
556 me->GetMotionMaster()->Initialize();
557 me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), FINAL_FLIGHT_Z);
558 events.DelayEvents(35000);
559 events.ScheduleEvent(EVENT_FLIGHT, 2500);
560 events.ScheduleEvent(EVENT_ENDFLIGHT, 32500);
561 events.ScheduleEvent(EVENT_LIGHTNING_TENDRILS, 90000);
562 break;
563 case EVENT_FLIGHT:
564 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
565 me->GetMotionMaster()->MovePoint(0, target->GetPositionX(), target->GetPositionY(), FINAL_FLIGHT_Z);
566 events.ScheduleEvent(EVENT_FLIGHT, 6000);
567 break;
568 case EVENT_ENDFLIGHT:
569 me->GetMotionMaster()->Initialize();
570 me->GetMotionMaster()->MovePoint(0, 1586.920166f, 119.848984f, FINAL_FLIGHT_Z);
571 events.CancelEvent(EVENT_FLIGHT);
572 events.CancelEvent(EVENT_ENDFLIGHT);
573 events.ScheduleEvent(EVENT_LAND, 4000);
574 break;
575 case EVENT_LAND:
576 me->GetMotionMaster()->Initialize();
577 me->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), FLOOR_Z);
578 events.CancelEvent(EVENT_LAND);
579 events.ScheduleEvent(EVENT_GROUND, 2500);
580 break;
581 case EVENT_GROUND:
582 //me->SetLevitate(false);
584 me->RemoveAurasDueToSpell(SPELL_LIGHTNING_TENDRILS_VISUAL);
585 DoStartMovement(me->GetVictim());
586 events.CancelEvent(EVENT_GROUND);
587 me->getThreatManager().resetAllAggro();
588 break;
590 if (me->IsWithinMeleeRange(me->GetVictim()))
591 {
592 float x = float(std::rand() % 25 + -25);
593 float y = float(std::rand() % 25 + -25);
594 me->GetMotionMaster()->MovePoint(0, me->GetPositionX() + x, me->GetPositionY() + y, FLOOR_Z);
595 // Prevention to go outside the room or into the walls
596 if (Creature* trigger = me->FindNearestCreature(NPC_WORLD_TRIGGER, 100.0f, true))
597 if (me->GetDistance(trigger) >= 50.0f)
598 me->GetMotionMaster()->MovePoint(0, trigger->GetPositionX(), trigger->GetPositionY(), FLOOR_Z);
599 }
600 events.ScheduleEvent(EVENT_MOVE_POSITION, std::rand() % 10000 + 7500);
601 break;
602 default:
603 break;
604 }
605 }
606
608 }
609 };
610
612 {
614 }
615};
616
618{
619 public:
620 spell_shield_of_runes() : SpellScriptLoader("spell_shield_of_runes") { }
621
638
643};
644
646{
647 public:
648 spell_assembly_meltdown() : SpellScriptLoader("spell_assembly_meltdown") { }
649
651 {
653
655 {
656 if (InstanceScript* instance = GetCaster()->GetInstanceScript())
657 if (Creature* Steelbreaker = ObjectAccessor::GetCreature(*GetCaster(), instance->GetData64(DATA_STEELBREAKER)))
658 Steelbreaker->AI()->DoAction(ACTION_ADD_CHARGE);
659 }
660
665 };
666
671};
672
674{
675 public:
676 spell_assembly_rune_of_summoning() : SpellScriptLoader("spell_assembly_rune_of_summoning") { }
677
679 {
681
682 bool Validate(SpellInfo const* /*spell*/) OVERRIDE
683 {
684 if (!sSpellMgr->GetSpellInfo(SPELL_RUNE_OF_SUMMONING_SUMMON))
685 return false;
686 return true;
687 }
688
689 void HandlePeriodic(AuraEffect const* aurEff)
690 {
692 GetTarget()->CastSpell(GetTarget(), SPELL_RUNE_OF_SUMMONING_SUMMON, true, NULL, aurEff, GetTarget()->IsSummon() ? GetTarget()->ToTempSummon()->GetSummonerGUID() : 0);
693 }
694
695 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
696 {
697 if (TempSummon* summ = GetTarget()->ToTempSummon())
698 summ->DespawnOrUnsummon(1);
699 }
700
706 };
707
712};
713
715{
716 public:
717 achievement_assembly_i_choose_you() : AchievementCriteriaScript("achievement_assembly_i_choose_you") { }
718
719 bool OnCheck(Player* /*player*/, Unit* target) OVERRIDE
720 {
721 return target && target->GetAI()->GetData(DATA_PHASE_3);
722 }
723};
724
std::int32_t int32
Definition Define.h:73
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
@ DONE
@ TYPEID_PLAYER
Definition Object.h:55
SpellEffIndex
@ EFFECT_1
@ EFFECT_0
@ SPELL_EFFECT_INSTAKILL
@ IMMUNITY_MECHANIC
@ MECHANIC_STUN
@ MECHANIC_INTERRUPT
@ SPELL_AURA_SCHOOL_ABSORB
@ SPELL_AURA_PERIODIC_DUMMY
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
#define sSpellMgr
Definition SpellMgr.h:744
#define SpellEffectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define AuraEffectRemoveFn(F, I, N, M)
@ AURA_REMOVE_BY_EXPIRE
Definition Unit.h:410
@ UNIT_STATE_CASTING
Definition Unit.h:527
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
#define FINAL_FLIGHT_Z
#define FLOOR_Z
@ SPELL_FUSION_PUNCH
@ SPELL_ELECTRICAL_CHARGE
@ SPELL_LIGHTNING_WHIRL
@ SPELL_LIGHTNING_TENDRILS_25M
@ SPELL_SUMMON_RUNE_OF_POWER
@ SPELL_SUPERCHARGE
@ SPELL_RUNE_OF_SUMMONING_SUMMON
@ SPELL_KILL_CREDIT
@ SPELL_SHIELD_OF_RUNES_BUFF
@ SPELL_STORMSHIELD
@ SPELL_LIGHTNING_TENDRILS_VISUAL
@ SPELL_STATIC_DISRUPTION
@ SPELL_SHIELD_OF_RUNES
@ SPELL_HIGH_VOLTAGE
@ SPELL_LIGHTNING_TENDRILS_10M
@ SPELL_CHAIN_LIGHTNING
@ SPELL_OVERWHELMING_POWER
@ SPELL_RUNE_OF_SUMMONING
@ SPELL_RUNE_OF_DEATH
@ ACTION_ADD_CHARGE
@ ACTION_SUPERCHARGE
@ EVENT_CHAIN_LIGHTNING
@ EVENT_LIGHTNING_BLAST
@ EVENT_SHIELD_OF_RUNES
@ EVENT_MOVE_POSITION
@ EVENT_RUNE_OF_DEATH
@ EVENT_RUNE_OF_SUMMONING
@ EVENT_RUNE_OF_POWER
@ EVENT_FUSION_PUNCH
@ EVENT_LIGHTNING_TENDRILS
@ EVENT_STATIC_DISRUPTION
@ EVENT_LIGHTNING_WHIRL
@ EVENT_OVERWHELMING_POWER
void AddSC_boss_assembly_of_iron()
@ SAY_STEELBREAKER_ENCOUNTER_DEFEATED
@ SAY_MOLGEIM_RUNE_DEATH
@ SAY_BRUNDIR_ENCOUNTER_DEFEATED
@ SAY_MOLGEIM_AGGRO
@ SAY_MOLGEIM_DEATH
@ SAY_MOLGEIM_SUMMON
@ SAY_MOLGEIM_BERSERK
@ SAY_BRUNDIR_BERSERK
@ SAY_BRUNDIR_SPECIAL
@ EMOTE_BRUNDIR_OVERLOAD
@ SAY_STEELBREAKER_DEATH
@ SAY_MOLGEIM_ENCOUNTER_DEFEATED
@ SAY_STEELBREAKER_POWER
@ SAY_STEELBREAKER_AGGRO
@ SAY_STEELBREAKER_SLAY
@ SAY_STEELBREAKER_BERSERK
@ EVENT_FLIGHT
#define SPELL_BERSERK
@ SPELL_KILL_CREDIT
@ EVENT_GROUND
Definition boss_noth.cpp:56
@ EVENT_BERSERK
@ EVENT_LAND
@ EVENT_CHAIN_LIGHTNING
@ SPELL_OVERLOAD
@ SPELL_CHAIN_LIGHTNING
AchievementCriteriaScript(const char *name)
void PreventDefaultAction()
AuraApplication const * GetTargetApplication() const
HookList< EffectApplyHandler > AfterEffectRemove
HookList< EffectPeriodicHandler > OnEffectPeriodic
Unit * GetCaster() const
Unit * GetTarget() const
HookList< EffectApplyHandler > OnEffectRemove
InstanceScript *const instance
EventMap events
BossAI(Creature *creature, uint32 bossId)
void _EnterCombat()
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
CreatureScript(const char *name)
static Creature * GetCreature(WorldObject const &u, uint64 guid)
HookList< EffectHandler > OnEffectHitTarget
Unit * GetCaster()
SpellScriptLoader(const char *name)
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:28
void DoCast(uint32 spellId)
Definition UnitAI.cpp:110
Unit * SelectTarget(SelectAggroTarget targetType, uint32 position=0, float dist=0.0f, bool playerOnly=false, int32 aura=0)
Definition UnitAI.cpp:66
void DoCastVictim(uint32 spellId, bool triggered=false)
Definition UnitAI.cpp:168
void DoCastAOE(uint32 spellId, bool triggered=false)
Definition UnitAI.cpp:176
Definition Unit.h:1367
void CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=NULL, AuraEffect const *triggeredByAura=NULL, uint64 originalCaster=0)
bool OnCheck(Player *, Unit *target) OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
PrepareSpellScript(spell_assembly_meltdown_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
AuraScript * GetAuraScript() const OVERRIDE
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
PrepareAuraScript(spell_shield_of_runes_AuraScript)
AuraScript * GetAuraScript() const OVERRIDE
@ NPC_WORLD_TRIGGER
Creature * me
const T & RAID_MODE(const T &normal10, const T &normal25) const
void DoStartMovement(Unit *target, float distance=0.0f, float angle=0.0f)
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
uint32 GetData(uint32 type) const OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
@ BOSS_ASSEMBLY_OF_IRON
Definition ulduar.h:24
@ DATA_MOLGEIM
Definition ulduar.h:277
@ DATA_BRUNDIR
Definition ulduar.h:278
@ DATA_STEELBREAKER
Definition ulduar.h:276
AI * GetUlduarAI(T *obj)
Definition ulduar.h:336