Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
illidari_council.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: Illidari_Council
8SD%Complete: 95
9SDComment: Circle of Healing not working properly.
10SDCategory: Black Temple
11EndScriptData */
12
13#include "ScriptMgr.h"
14#include "ScriptedCreature.h"
15#include "SpellScript.h"
16#include "SpellAuraEffects.h"
17#include "black_temple.h"
18
79
80#define ERROR_INST_DATA "SD2 ERROR: Instance Data for Black Temple not set properly; Illidari Council event will not function properly."
81
87
89{
90 {0, 5000}, // Gathios
91 {0, 5500}, // Veras
92 {0, 5000}, // Malande
93 {0, 0}, // Zerevor
94};
95
96// Need to get proper timers for this later
98{
99 {1, 2000}, // Gathios
100 {1, 6000}, // Veras
101 {1, 5000}, // Malande
102 {1, 0}, // Zerevor
103};
104
106{
107public:
108 npc_blood_elf_council_voice_trigger() : CreatureScript("npc_blood_elf_council_voice_trigger") { }
109
111 {
113 }
114
116 {
118 {
119 for (uint8 i = 0; i < 4; ++i)
120 Council[i] = 0;
121 }
122
124
127
128 uint8 YellCounter; // Serves as the counter for both the aggro and enrage yells
129
131
133 {
134 EnrageTimer = 900000; // 15 minutes
135 AggroYellTimer = 500;
136
137 YellCounter = 0;
138
139 EventStarted = false;
140 }
141
142 // finds and stores the GUIDs for each Council member using instance data system.
144 {
145 if (InstanceScript* instance = me->GetInstanceScript())
146 {
147 Council[0] = instance->GetData64(DATA_GATHIOS_THE_SHATTERER);
148 Council[1] = instance->GetData64(DATA_VERAS_DARKSHADOW);
149 Council[2] = instance->GetData64(DATA_LADY_MALANDE);
150 Council[3] = instance->GetData64(DATA_HIGH_NETHERMANCER_ZEREVOR);
151 } else SF_LOG_ERROR("scripts", ERROR_INST_DATA);
152 }
153
154 void EnterCombat(Unit* /*who*/) OVERRIDE { }
155
156 void AttackStart(Unit* /*who*/) OVERRIDE { }
157 void MoveInLineOfSight(Unit* /*who*/) OVERRIDE { }
158
159
161 {
162 if (!EventStarted)
163 return;
164
165 if (YellCounter > 3)
166 return;
167
168 if (AggroYellTimer)
169 {
170 if (AggroYellTimer <= diff)
171 {
173 {
174 pMember->AI()->Talk(CouncilAggro[YellCounter].entry);
176 }
177 ++YellCounter;
178 if (YellCounter > 3)
179 YellCounter = 0; // Reuse for Enrage Yells
180 } else AggroYellTimer -= diff;
181 }
182
183 if (EnrageTimer)
184 {
185 if (EnrageTimer <= diff)
186 {
188 {
189 pMember->CastSpell(pMember, SPELL_BERSERK, true);
190 pMember->AI()->Talk(CouncilEnrage[YellCounter].entry);
192 }
193 ++YellCounter;
194 } else EnrageTimer -= diff;
195 }
196 }
197 };
198};
199
201{
202public:
203 npc_illidari_council() : CreatureScript("npc_illidari_council") { }
204
206 {
207 return new npc_illidari_councilAI(creature);
208 }
209
211 {
213 {
214 instance = creature->GetInstanceScript();
215 for (uint8 i = 0; i < 4; ++i)
216 Council[i] = 0;
217 }
218
220
222
225
227
229
231 {
232 CheckTimer = 2000;
233 EndEventTimer = 0;
234
235 DeathCount = 0;
236
237 Creature* pMember = NULL;
238 for (uint8 i = 0; i < 4; ++i)
239 {
240 pMember = Unit::GetCreature((*me), Council[i]);
241 if (!pMember)
242 continue;
243
244 if (!pMember->IsAlive())
245 {
246 pMember->RemoveCorpse();
247 pMember->Respawn();
248 }
249 pMember->AI()->EnterEvadeMode();
250 }
251
252 if (instance)
253 {
256 VoiceTrigger->AI()->EnterEvadeMode();
257 }
258
259 EventBegun = false;
260
263 me->SetDisplayId(11686);
264 }
265
266 void EnterCombat(Unit* /*who*/) OVERRIDE { }
267 void AttackStart(Unit* /*who*/) OVERRIDE { }
268 void MoveInLineOfSight(Unit* /*who*/) OVERRIDE { }
269
270
271 void StartEvent(Unit* target)
272 {
273 if (!instance)
274 return;
275
276 if (target && target->IsAlive())
277 {
280 Council[2] = instance->GetData64(DATA_LADY_MALANDE);
281 Council[3] = instance->GetData64(DATA_VERAS_DARKSHADOW);
282
283 // Start the event for the Voice Trigger
285 {
288 }
289
290 for (uint8 i = 0; i < 4; ++i)
291 {
292 if (Council[i])
293 {
295 if (member->IsAlive())
296 member->AI()->AttackStart(target);
297 }
298 }
299
301
302 EventBegun = true;
303 }
304 }
305
307 {
308 if (!EventBegun)
309 return;
310
311 if (EndEventTimer)
312 {
313 if (EndEventTimer <= diff)
314 {
315 if (DeathCount > 3)
316 {
317 if (instance)
318 {
320 VoiceTrigger->DealDamage(VoiceTrigger, VoiceTrigger->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
321 instance->SetBossState(DATA_ILLIDARI_COUNCIL, DONE);
322 //me->SummonCreature(AKAMAID, 746.466980f, 304.394989f, 311.90208f, 6.272870f, TEMPSUMMON_DEAD_DESPAWN, 0);
323 }
324 me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
325 return;
326 }
327
329 if (pMember && pMember->IsAlive())
330 pMember->DealDamage(pMember, pMember->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
331 ++DeathCount;
332 EndEventTimer = 1500;
333 } else EndEventTimer -= diff;
334 }
335
336 if (CheckTimer)
337 {
338 if (CheckTimer <= diff)
339 {
340 uint8 EvadeCheck = 0;
341 for (uint8 i = 0; i < 4; ++i)
342 {
343 if (Council[i])
344 {
345 if (Creature* Member = (Unit::GetCreature((*me), Council[i])))
346 {
347 // This is the evade/death check.
348 if (Member->IsAlive() && !Member->GetVictim())
349 ++EvadeCheck; //If all members evade, we reset so that players can properly reset the event
350 else if (!Member->IsAlive()) // If even one member dies, kill the rest, set instance data, and kill self.
351 {
352 EndEventTimer = 1000;
353 CheckTimer = 0;
354 return;
355 }
356 }
357 }
358 }
359
360 if (EvadeCheck > 3)
361 Reset();
362
363 CheckTimer = 2000;
364 } else CheckTimer -= diff;
365 }
366 }
367 };
368};
369
371{
373 {
374 instance = creature->GetInstanceScript();
375 for (uint8 i = 0; i < 4; ++i)
376 Council[i] = 0;
377 LoadedGUIDs = false;
378 }
379
381
383
385
387 {
388 if (instance)
389 {
391 CAST_AI(npc_illidari_council::npc_illidari_councilAI, controller->AI())->StartEvent(who);
392 }
393 else
394 {
395 SF_LOG_ERROR("scripts", ERROR_INST_DATA);
397 return;
398 }
400 // Load GUIDs on first aggro because the Creature guids are only set as the creatures are created in world-
401 // this means that for each creature, it will attempt to LoadGUIDs even though some of the other creatures are
402 // not in world, and thus have no GUID set in the instance data system. Putting it in aggro ensures that all the creatures
403 // have been loaded and have their GUIDs set in the instance data system.
404 if (!LoadedGUIDs)
405 LoadGUIDs();
406 }
407
409 {
410 for (uint8 i = 0; i < 4; ++i)
411 {
412 if (Unit* unit = Unit::GetUnit(*me, Council[i]))
413 if (unit != me && unit->GetVictim())
414 {
415 AttackStart(unit->GetVictim());
416 return;
417 }
418 }
420 }
421
422 void DamageTaken(Unit* done_by, uint32 &damage) OVERRIDE
423 {
424 if (done_by == me)
425 return;
426
427 damage /= 4;
428 for (uint8 i = 0; i < 4; ++i)
429 {
430 if (Creature* unit = Unit::GetCreature(*me, Council[i]))
431 if (unit != me && damage < unit->GetHealth())
432 {
433 unit->ModifyHealth(-int32(damage));
434 unit->LowerPlayerDamageReq(damage);
435 }
436 }
437 }
438
440 {
441 if (!instance)
442 {
443 SF_LOG_ERROR("scripts", ERROR_INST_DATA);
444 return;
445 }
446
447 Council[0] = instance->GetData64(DATA_LADY_MALANDE);
450 Council[3] = instance->GetData64(DATA_VERAS_DARKSHADOW);
451
452 LoadedGUIDs = true;
453 }
454};
455
457{
458public:
459 boss_gathios_the_shatterer() : CreatureScript("boss_gathios_the_shatterer") { }
460
462 {
463 return new boss_gathios_the_shattererAI(creature);
464 }
465
467 {
469
475
477 {
478 ConsecrationTimer = 40000;
479 HammerOfJusticeTimer = 10000;
480 SealTimer = 40000;
481 AuraTimer = 90000;
482 BlessingTimer = 60000;
483 }
484
485 void KilledUnit(Unit* /*victim*/) OVERRIDE
486 {
488 }
489
490 void JustDied(Unit* /*killer*/) OVERRIDE
491 {
493 }
494
496 {
497 Unit* unit = me;
498 uint32 member = 0; // He chooses Lady Malande most often
499
500 if (rand()%10 == 0) // But there is a chance he picks someone else.
501 member = std::rand() % 3 + 1;
502
503 if (member != 2) // No need to create another pointer to us using Unit::GetUnit
504 unit = Unit::GetUnit(*me, Council[member]);
505 return unit;
506 }
507
509 {
510 uint32 spellid = 0;
511 switch (std::rand() % 1)
512 {
513 case 0: spellid = SPELL_DEVOTION_AURA; break;
514 case 1: spellid = SPELL_CHROMATIC_AURA; break;
515 }
516 for (uint8 i = 0; i < 4; ++i)
517 {
518 Unit* unit = Unit::GetUnit(*me, Council[i]);
519 if (unit)
520 unit->CastSpell(unit, spellid, true, 0, 0, me->GetGUID());
521 }
522 }
523
525 {
526 if (!UpdateVictim())
527 return;
528
529 if (BlessingTimer <= diff)
530 {
531 if (Unit* unit = SelectCouncilMember())
532 {
533 switch (std::rand() % 1)
534 {
535 case 0:
537 break;
538
539 case 1:
541 break;
542 }
543 }
544 BlessingTimer = 60000;
545 } else BlessingTimer -= diff;
546
547 if (ConsecrationTimer <= diff)
548 {
550 ConsecrationTimer = 40000;
551 } else ConsecrationTimer -= diff;
552
553 if (HammerOfJusticeTimer <= diff)
554 {
555 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
556 {
557 // is in ~10-40 yd range
558 if (me->IsInRange(target, 10.0f, 40.0f, false))
559 {
561 HammerOfJusticeTimer = 20000;
562 }
563 }
564 } else HammerOfJusticeTimer -= diff;
565
566 if (SealTimer <= diff)
567 {
568 switch (std::rand() % 1)
569 {
570 case 0: DoCast(me, SPELL_SEAL_OF_COMMAND); break;
571 case 1: DoCast(me, SPELL_SEAL_OF_BLOOD); break;
572 }
573 SealTimer = 40000;
574 } else SealTimer -= diff;
575
576 if (AuraTimer <= diff)
577 {
579 AuraTimer = 90000;
580 } else AuraTimer -= diff;
581
583 }
584 };
585};
586
588{
589public:
590 boss_high_nethermancer_zerevor() : CreatureScript("boss_high_nethermancer_zerevor") { }
591
593 {
594 return new boss_high_nethermancer_zerevorAI(creature);
595 }
596
598 {
600
607
609 {
610 BlizzardTimer = std::rand() % (91 * IN_MILLISECONDS) + (30 * IN_MILLISECONDS);
611 FlamestrikeTimer = std::rand() % (91 * IN_MILLISECONDS) + (30 * IN_MILLISECONDS);
612 ArcaneBoltTimer = 10000;
613 DampenMagicTimer = 2000;
614 ArcaneExplosionTimer = 14000;
615 Cooldown = 0;
616 }
617
618 void KilledUnit(Unit* /*victim*/) OVERRIDE
619 {
621 }
622
623 void JustDied(Unit* /*killer*/) OVERRIDE
624 {
626 }
627
629 {
630 if (!UpdateVictim())
631 return;
632
633 if (Cooldown)
634 {
635 if (Cooldown <= diff) Cooldown = 0;
636 else
637 {
638 Cooldown -= diff;
639 return; // Don't cast any other spells if global cooldown is still ticking
640 }
641 }
642
643 if (DampenMagicTimer <= diff)
644 {
646 Cooldown = 1000;
647 DampenMagicTimer = 67200; // almost 1, 12 minutes
648 ArcaneBoltTimer += 1000; // Give the Mage some time to spellsteal Dampen.
649 } else DampenMagicTimer -= diff;
650
651 if (ArcaneExplosionTimer <= diff)
652 {
654 Cooldown = 1000;
655 ArcaneExplosionTimer = 14000;
656 } else ArcaneExplosionTimer -= diff;
657
658 if (ArcaneBoltTimer <= diff)
659 {
661 ArcaneBoltTimer = 3000;
662 Cooldown = 2000;
663 } else ArcaneBoltTimer -= diff;
664
665 if (BlizzardTimer <= diff)
666 {
667 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
668 {
669 DoCast(target, SPELL_BLIZZARD);
670 BlizzardTimer = std::rand() % (91 * IN_MILLISECONDS) + (45 * IN_MILLISECONDS);
671 FlamestrikeTimer += 10000;
672 Cooldown = 1000;
673 }
674 } else BlizzardTimer -= diff;
675
676 if (FlamestrikeTimer <= diff)
677 {
678 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
679 {
680 DoCast(target, SPELL_FLAMESTRIKE);
681 FlamestrikeTimer = std::rand() % (101 * IN_MILLISECONDS) + (55 * IN_MILLISECONDS);
682 BlizzardTimer += 10000;
683 Cooldown = 2000;
684 }
685 } else FlamestrikeTimer -= diff;
686 }
687 };
688};
689
691{
692public:
693 boss_lady_malande() : CreatureScript("boss_lady_malande") { }
694
696 {
697 return new boss_lady_malandeAI(creature);
698 }
699
701 {
703
708
710 {
711 EmpoweredSmiteTimer = 38000;
712 CircleOfHealingTimer = 20000;
713 DivineWrathTimer = 40000;
715 }
716
717 void KilledUnit(Unit* /*victim*/) OVERRIDE
718 {
720 }
721
722 void JustDied(Unit* /*killer*/) OVERRIDE
723 {
725 }
726
728 {
729 if (!UpdateVictim())
730 return;
731
732 if (EmpoweredSmiteTimer <= diff)
733 {
734 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
735 {
737 EmpoweredSmiteTimer = 38000;
738 }
739 } else EmpoweredSmiteTimer -= diff;
740
741 if (CircleOfHealingTimer <= diff)
742 {
744 CircleOfHealingTimer = 60000;
745 } else CircleOfHealingTimer -= diff;
746
747 if (DivineWrathTimer <= diff)
748 {
749 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
750 {
751 DoCast(target, SPELL_DIVINE_WRATH);
752 DivineWrathTimer = std::rand() % (81 * IN_MILLISECONDS) + (40 * IN_MILLISECONDS);
753 }
754 } else DivineWrathTimer -= diff;
755
756 if (ReflectiveShieldTimer <= diff)
757 {
759 ReflectiveShieldTimer = 65000;
760 } else ReflectiveShieldTimer -= diff;
761
763 }
764 };
765};
766
768{
769public:
770 boss_veras_darkshadow() : CreatureScript("boss_veras_darkshadow") { }
771
773 {
774 return new boss_veras_darkshadowAI(creature);
775 }
776
778 {
780
782
786
788
790 {
792
793 DeadlyPoisonTimer = 20000;
794 VanishTimer = std::rand() % (121 * IN_MILLISECONDS) + (60 * IN_MILLISECONDS);
795 AppearEnvenomTimer = 150000;
796
797 HasVanished = false;
798 me->SetVisible(true);
800 }
801
802 void KilledUnit(Unit* /*victim*/) OVERRIDE
803 {
805 }
806
807 void JustDied(Unit* /*killer*/) OVERRIDE
808 {
810 }
811
813 {
814 if (!UpdateVictim())
815 return;
816
817 if (!HasVanished)
818 {
819 if (DeadlyPoisonTimer <= diff)
820 {
822 DeadlyPoisonTimer = std::rand() % (46 * IN_MILLISECONDS) + (15 * IN_MILLISECONDS);
823 } else DeadlyPoisonTimer -= diff;
824
825 if (AppearEnvenomTimer <= diff) // Cast Envenom. This is cast 4 seconds after Vanish is over
826 {
828 AppearEnvenomTimer = 90000;
829 } else AppearEnvenomTimer -= diff;
830
831 if (VanishTimer <= diff) // Disappear and stop attacking, but follow a random unit
832 {
833 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
834 {
835 VanishTimer = 30000;
836 AppearEnvenomTimer= 28000;
837 HasVanished = true;
838 me->SetVisible(false);
841 // Chase a unit. Check before DoMeleeAttackIfReady prevents from attacking
842 me->AddThreat(target, 500000.0f);
843 me->GetMotionMaster()->MoveChase(target);
844 }
845 } else VanishTimer -= diff;
846
848 }
849 else
850 {
851 if (VanishTimer <= diff) // Become attackable and poison current target
852 {
853 Unit* target = me->GetVictim();
857 me->AddThreat(target, 3000.0f); // Make Veras attack his target for a while, he will cast Envenom 4 seconds after.
858 DeadlyPoisonTimer += 6000;
859 VanishTimer = 90000;
860 AppearEnvenomTimer = 4000;
861 HasVanished = false;
862 } else VanishTimer -= diff;
863
864 if (AppearEnvenomTimer <= diff) // Appear 2 seconds before becoming attackable (Shifting out of vanish)
865 {
866 me->GetMotionMaster()->Clear();
867 me->GetMotionMaster()->MoveChase(me->GetVictim());
868 me->SetVisible(true);
869 AppearEnvenomTimer = 6000;
870 } else AppearEnvenomTimer -= diff;
871 }
872 }
873 };
874};
875
876// SPELL_REFLECTIVE_SHIELD
878{
879public:
880 spell_boss_lady_malande_shield() : SpellScriptLoader("spell_boss_lady_malande_shield") { }
881
883 {
885
886 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
887 {
888 return sSpellMgr->GetSpellInfo(SPELL_REFLECTIVE_SHIELD_T);
889 }
890
891 void Trigger(AuraEffect* aurEff, DamageInfo & dmgInfo, uint32 & absorbAmount)
892 {
893 Unit* target = GetTarget();
894 if (dmgInfo.GetAttacker() == target)
895 return;
896 int32 bp = absorbAmount / 2;
897 target->CastCustomSpell(dmgInfo.GetAttacker(), SPELL_REFLECTIVE_SHIELD_T, &bp, NULL, NULL, true, NULL, aurEff);
898 }
899
904 };
905
910};
911
@ IN_MILLISECONDS
Definition Common.h:125
std::int32_t int32
Definition Define.h:73
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
std::uint64_t uint64
Definition Define.h:76
@ IN_PROGRESS
@ DONE
@ NOT_STARTED
#define SF_LOG_ERROR(filterType__,...)
Definition Log.h:143
#define CAST_AI(a, b)
@ EFFECT_0
@ SPELL_SCHOOL_MASK_NORMAL
#define sSpellMgr
Definition SpellMgr.h:744
#define AuraEffectAbsorbFn(F, I)
@ UNIT_FLAG_NOT_SELECTABLE
Definition Unit.h:650
@ DIRECT_DAMAGE
Definition Unit.h:614
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
@ UNIT_FIELD_FLAGS
@ DATA_ILLIDARI_COUNCIL
@ DATA_HIGH_NETHERMANCER_ZEREVOR
@ DATA_GATHIOS_THE_SHATTERER
@ DATA_BLOOD_ELF_COUNCIL_VOICE
@ DATA_VERAS_DARKSHADOW
@ DATA_LADY_MALANDE
@ SPELL_ARCANE_EXPLOSION
@ SPELL_HAMMER_OF_JUSTICE
@ SPELL_CONSECRATION
@ SPELL_DEVOTION_AURA
@ SPELL_SEAL_OF_COMMAND
#define SPELL_BERSERK
@ SPELL_VANISH
HookList< EffectAbsorbHandler > AfterEffectAbsorb
Unit * GetTarget() const
void DoZoneInCombat(Creature *creature=NULL, float maxRangeToNearestTarget=50.0f)
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
virtual void EnterEvadeMode()
void Respawn(bool force=false)
void RemoveCorpse(bool setSpawnTime=true)
Definition Creature.cpp:230
CreatureAI * AI() const
Definition Creature.h:483
CreatureScript(const char *name)
Unit * GetAttacker() const
Definition Unit.h:899
static Creature * GetCreature(WorldObject const &u, uint64 guid)
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
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 IsAlive() const
Definition Unit.h:2032
uint32 DealDamage(Unit *victim, uint32 damage, CleanDamage const *cleanDamage=NULL, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=NULL, bool durabilityLoss=true)
static Creature * GetCreature(WorldObject &object, uint64 guid)
Definition Unit.cpp:4905
uint32 GetHealth() const
Definition Unit.h:1600
static Unit * GetUnit(WorldObject &object, uint64 guid)
Definition Unit.cpp:4895
void CastCustomSpell(Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=NULL, AuraEffect const *triggeredByAura=NULL, uint64 originalCaster=0)
InstanceScript * GetInstanceScript()
Definition Object.cpp:1612
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *c) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
void Trigger(AuraEffect *aurEff, DamageInfo &dmgInfo, uint32 &absorbAmount)
AuraScript * GetAuraScript() const OVERRIDE
@ SPELL_FLAMESTRIKE
@ SPELL_DEADLY_POISON
static CouncilYells CouncilEnrage[]
IllidariCouncil
@ SPELL_CIRCLE_OF_HEALING
@ SPELL_HAMMER_OF_JUSTICE
@ SAY_VERA_DEATH
@ SPELL_DIVINE_WRATH
@ SAY_ZERE_DEATH
@ SPELL_FLAMESTRIKE
@ SPELL_BLESS_SPELLWARD
@ SAY_MALA_COMNT
@ SAY_VERA_SPECIAL2
@ SPELL_EMPOWERED_SMITE
@ AKAMAID
@ SPELL_REFLECTIVE_SHIELD
@ SPELL_ENVENOM
@ SPELL_CONSECRATION
@ SAY_VERA_COMNT
@ SPELL_ARCANE_EXPLOSION
@ SAY_ZERE_SLAY
@ SPELL_DEADLY_POISON
@ SAY_ZERE_SPECIAL2
@ SAY_VERA_SLAY
@ SAY_GATH_DEATH
@ SPELL_BLIZZARD
@ SPELL_BLESS_PROTECTION
@ SPELL_REFLECTIVE_SHIELD_T
@ SPELL_CHROMATIC_AURA
@ SPELL_DEVOTION_AURA
@ SAY_MALA_SPECIAL1
@ SAY_GATH_COMNT
@ SAY_ZERE_SPECIAL1
@ SPELL_SEAL_OF_BLOOD
@ SAY_GATH_SLAY
@ SAY_GATH_SPECIAL2
@ SAY_VERA_SPECIAL1
@ SPELL_HEAL_VISUAL
@ SAY_GATH_SPECIAL1
@ SAY_ZERE_COMNT
@ SPELL_ARCANE_BOLT
@ SPELL_BERSERK
@ SPELL_DAMPEN_MAGIC
@ SAY_MALA_SPECIAL2
@ SAY_MALA_DEATH
@ SAY_MALA_SLAY
@ SPELL_SEAL_OF_COMMAND
void AddSC_boss_illidari_council()
static CouncilYells CouncilAggro[]
#define ERROR_INST_DATA
Creature * me
ScriptedAI(Creature *creature)
void AttackStart(Unit *) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void DamageTaken(Unit *done_by, uint32 &damage) OVERRIDE
boss_illidari_councilAI(Creature *creature)
void EnterCombat(Unit *who) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================