Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_kalecgos.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: Boss_Kalecgos
8SD%Complete: 95
9SDComment:
10SDCategory: Sunwell_Plateau
11EndScriptData */
12
13#include "ScriptMgr.h"
14#include "ScriptedCreature.h"
15#include "sunwell_plateau.h"
16#include "Player.h"
17#include "WorldSession.h"
18
36
62
64{
67};
68
69#define GO_FAILED "You are unable to use this currently."
70
71#define EMOTE_UNABLE_TO_FIND "is unable to find Kalecgos"
72
73#define FLY_X 1679
74#define FLY_Y 900
75#define FLY_Z 82
76
77#define CENTER_X 1705
78#define CENTER_Y 930
79#define RADIUS 30
80
81#define DRAGON_REALM_Z 53.079f
82#define DEMON_REALM_Z -74.558f
83
84#define MAX_PLAYERS_IN_SPECTRAL_REALM 0 //over this, teleport object won't work, 0 disables check
85
86uint32 WildMagic[] = { 44978, 45001, 45002, 45004, 45006, 45010 };
87
89{
90public:
91 boss_kalecgos() : CreatureScript("boss_kalecgos") { }
92
94 {
95 return new boss_kalecgosAI(creature);
96 }
97
99 {
100 boss_kalecgosAI(Creature* creature) : ScriptedAI(creature)
101 {
102 instance = creature->GetInstanceScript();
103 SathGUID = 0;
104 DoorGUID = 0;
105 bJustReset = false;
106 me->setActive(true);
107 }
108
110
120
125
128
130 {
131 if (instance)
132 {
133 SathGUID = instance->GetData64(DATA_SATHROVARR);
135 }
136
137 if (Creature* Sath = Unit::GetCreature(*me, SathGUID))
138 Sath->AI()->EnterEvadeMode();
139
140 me->setFaction(14);
141 if (!bJustReset) //first reset at create
142 {
144 me->SetDisableGravity(false);
145 me->SetVisible(true);
146 me->SetStandState(UNIT_STAND_STATE_SLEEP);
147 }
148 me->SetFullHealth();//dunno why it does not resets health at evade..
149 ArcaneBuffetTimer = 8000;
150 FrostBreathTimer = 15000;
151 WildMagicTimer = 10000;
152 TailLashTimer = 25000;
153 SpectralBlastTimer = std::rand() % 25000 + 20000;
154 CheckTimer = 1000;
155 ResetTimer = 30000;
156
157 TalkTimer = 0;
158 TalkSequence = 0;
159 isFriendly = false;
160 isEnraged = false;
161 isBanished = false;
162 }
163
165 {
166 bJustReset = true;
167 me->SetVisible(false);
170 }
171
173 {
174 switch (param)
175 {
176 case DO_ENRAGE:
177 isEnraged = true;
178 me->CastSpell(me, SPELL_ENRAGE, true);
179 break;
180 case DO_BANISH:
181 isBanished = true;
182 me->CastSpell(me, SPELL_BANISH, true);
183 break;
184 }
185 }
186
188 {
189 if (TalkTimer)
190 {
191 if (!TalkSequence)
192 {
194 me->InterruptNonMeleeSpells(true);
195 me->RemoveAllAuras();
196 me->DeleteThreatList();
197 me->CombatStop();
198 ++TalkSequence;
199 }
200 if (TalkTimer <= diff)
201 {
202 if (isFriendly)
203 GoodEnding();
204 else
205 BadEnding();
206 ++TalkSequence;
207 } else TalkTimer -= diff;
208 }
209 else
210 {
211 if (bJustReset)
212 {
213 if (ResetTimer <= diff)
214 {
216 me->SetDisableGravity(false);
217 me->SetVisible(true);
218 me->SetStandState(UNIT_STAND_STATE_SLEEP);
219 ResetTimer = 10000;
220 bJustReset = false;
221 } else ResetTimer -= diff;
222 return;
223 }
224 if (!UpdateVictim())
225 return;
226
227 if (CheckTimer <= diff)
228 {
229 if (me->GetDistance(CENTER_X, CENTER_Y, DRAGON_REALM_Z) >= 75)
230 {
231 me->AI()->EnterEvadeMode();
232 return;
233 }
234 if (HealthBelowPct(10) && !isEnraged)
235 {
236 if (Creature* Sath = Unit::GetCreature(*me, SathGUID))
237 Sath->AI()->DoAction(DO_ENRAGE);
239 }
240 if (!isBanished && HealthBelowPct(1))
241 {
242 if (Creature* Sath = Unit::GetCreature(*me, SathGUID))
243 {
244 if (Sath->HasAura(SPELL_BANISH))
245 {
246 Sath->DealDamage(Sath, Sath->GetHealth());
247 return;
248 }
249 else
251 }
252 else
253 {
254 SF_LOG_ERROR("scripts", "Didn't find Shathrowar. Kalecgos event reseted.");
256 return;
257 }
258 }
259 CheckTimer = 1000;
260 } else CheckTimer -= diff;
261
262 if (ArcaneBuffetTimer <= diff)
263 {
265 ArcaneBuffetTimer = 8000;
266 } else ArcaneBuffetTimer -= diff;
267
268 if (FrostBreathTimer <= diff)
269 {
271 FrostBreathTimer = 15000;
272 } else FrostBreathTimer -= diff;
273
274 if (TailLashTimer <= diff)
275 {
277 TailLashTimer = 15000;
278 } else TailLashTimer -= diff;
279
280 if (WildMagicTimer <= diff)
281 {
282 DoCastAOE(WildMagic[rand()%6]);
283 WildMagicTimer = 20000;
284 } else WildMagicTimer -= diff;
285
286 if (SpectralBlastTimer <= diff)
287 {
288 ThreatContainer::StorageType const& m_threatlist = me->getThreatManager().getThreatList();
289 std::list<Unit*> targetList;
290 for (ThreatContainer::StorageType::const_iterator itr = m_threatlist.begin(); itr!= m_threatlist.end(); ++itr)
291 {
292 Unit* target = (*itr)->getTarget();
293 if (target
294 && target->GetTypeId() == TypeID::TYPEID_PLAYER
295 && target->GetGUID() != me->GetVictim()->GetGUID()
296 && target->GetPositionZ() > me->GetPositionZ() - 5
298 {
299 targetList.push_back(target);
300 }
301 }
302 if (targetList.empty())
303 {
304 SpectralBlastTimer = 1000;
305 return;
306 }
307 std::list<Unit*>::const_iterator i = targetList.begin();
308 advance(i, rand()%targetList.size());
309 if ((*i))
310 {
311 (*i)->CastSpell((*i), SPELL_SPECTRAL_BLAST, true);
312 SpectralBlastTimer = 20000+rand()%5000;
313 } else SpectralBlastTimer = 1000;
314 } else SpectralBlastTimer -= diff;
315
317 }
318 }
319
321
322 {
323 if (bJustReset)//boss is invisible, don't attack
324 return;
325
326 if (!me->GetVictim() && me->IsValidAttackTarget(who))
327 {
328 float attackRadius = me->GetAttackDistance(who);
329 if (me->IsWithinDistInMap(who, attackRadius))
330 AttackStart(who);
331 }
332 }
333
334 void DamageTaken(Unit* done_by, uint32 &damage) OVERRIDE
335 {
336 if (damage >= me->GetHealth() && done_by != me)
337 damage = 0;
338 }
339
340 void EnterCombat(Unit* /*who*/) OVERRIDE
341 {
342 me->SetStandState(UNIT_STAND_STATE_STAND);
345
346 if (instance)
348 }
349
350 void KilledUnit(Unit* /*victim*/) OVERRIDE
351 {
353 }
354
356 {
357 if (type != POINT_MOTION_TYPE)
358 return;
359 me->SetVisible(false);
360 if (isFriendly)
361 {
362 me->setDeathState(DeathState::JUST_DIED);
363
364 Map::PlayerList const& players = me->GetMap()->GetPlayers();
365 if (!players.isEmpty())
366 {
367 for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
368 {
369 Player* player = itr->GetSource();
370 if (player)
371 me->GetMap()->ToInstanceMap()->PermBindAllPlayers(player);
372 }
373 }
374 }
375 else
376 {
377 me->GetMotionMaster()->MoveTargetedHome();
378 TalkTimer = 1000;
379 }
380 }
381
383 {
384 switch (TalkSequence)
385 {
386 case 1:
387 me->setFaction(35);
388 TalkTimer = 1000;
389 break;
390 case 2:
392 TalkTimer = 10000;
393 break;
394 case 3:
395 me->SetDisableGravity(true);
396 me->GetMotionMaster()->MovePoint(0, FLY_X, FLY_Y, FLY_Z);
397 TalkTimer = 600000;
398 break;
399 default:
400 break;
401 }
402 }
403
405 {
406 switch (TalkSequence)
407 {
408 case 1:
410 TalkTimer = 3000;
411 break;
412 case 2:
413 me->SetDisableGravity(true);
414 me->GetMotionMaster()->MovePoint(0, FLY_X, FLY_Y, FLY_Z);
415 TalkTimer = 15000;
416 break;
417 case 3:
419 break;
420 default:
421 break;
422 }
423 }
424 };
425};
426
428{
429public:
430 boss_kalec() : CreatureScript("boss_kalec") { }
431
433 {
434 return new boss_kalecAI(creature);
435 }
436
437 struct boss_kalecAI : public ScriptedAI
438 {
440
445
447
448 bool isEnraged; // if demon is enraged
449
450 boss_kalecAI(Creature* creature) : ScriptedAI(creature)
451 {
452 instance = creature->GetInstanceScript();
453 }
454
456 {
457 if (instance)
458 SathGUID = instance->GetData64(DATA_SATHROVARR);
459
460 RevitalizeTimer = 5000;
461 HeroicStrikeTimer = 3000;
462 YellTimer = 5000;
463 YellSequence = 0;
464
465 isEnraged = false;
466 }
467
468 void DamageTaken(Unit* done_by, uint32 &damage) OVERRIDE
469 {
470 if (done_by->GetGUID() != SathGUID)
471 damage = 0;
472 else if (isEnraged)
473 damage *= 3;
474 }
475
477 {
478 if (!me->HasAura(AURA_SPECTRAL_INVISIBILITY))
479 me->CastSpell(me, AURA_SPECTRAL_INVISIBILITY, true);
480 if (!UpdateVictim())
481 return;
482
483 if (YellTimer <= diff)
484 {
485 switch (YellSequence)
486 {
487 case 0:
489 ++YellSequence;
490 break;
491 case 1:
492 if (HealthBelowPct(50))
493 {
495 ++YellSequence;
496 }
497 break;
498 case 2:
499 if (HealthBelowPct(10))
500 {
502 ++YellSequence;
503 }
504 break;
505 default:
506 break;
507 }
508 YellTimer = 5000;
509 }
510
511 if (RevitalizeTimer <= diff)
512 {
514 RevitalizeTimer = 5000;
515 } else RevitalizeTimer -= diff;
516
517 if (HeroicStrikeTimer <= diff)
518 {
520 HeroicStrikeTimer = 2000;
521 } else HeroicStrikeTimer -= diff;
522
524 }
525 };
526};
527
529{
530public:
531 kalecgos_teleporter() : GameObjectScript("kalecgos_teleporter") { }
532
534 {
535 Map* map = go->GetMap();
536 if (!map->IsRaid())
537 return true;
538
539#if MAX_PLAYERS_IN_SPECTRAL_REALM > 0
540 uint8 SpectralPlayers = 0;
541 Map::PlayerList const &PlayerList = map->GetPlayers();
542 for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
543 {
544 if (i->GetSource() && i->GetSource()->GetPositionZ() < DEMON_REALM_Z + 5)
545 ++SpectralPlayers;
546 }
547
548 if (player->HasAura(AURA_SPECTRAL_EXHAUSTION) || SpectralPlayers >= MAX_PLAYERS_IN_SPECTRAL_REALM)
549 {
550 player->GetSession()->SendNotification(GO_FAILED);
551 return true;
552 }
553#endif
554
555 player->CastSpell(player, SPELL_TELEPORT_SPECTRAL, true);
556 return true;
557 }
558};
559
561{
562public:
563 boss_sathrovarr() : CreatureScript("boss_sathrovarr") { }
564
566 {
567 return new boss_sathrovarrAI(creature);
568 }
569
571 {
572 boss_sathrovarrAI(Creature* creature) : ScriptedAI(creature)
573 {
574 instance = creature->GetInstanceScript();
575 KalecGUID = 0;
576 KalecgosGUID = 0;
577 }
578
580
586
589
592
594 {
595 me->SetFullHealth();//dunno why it does not resets health at evade..
596 me->setActive(true);
597 if (instance)
598 {
601 }
602 if (KalecGUID)
603 {
604 if (Creature* Kalec = Unit::GetCreature(*me, KalecGUID))
605 Kalec->setDeathState(DeathState::JUST_DIED);
606 KalecGUID = 0;
607 }
608
609 ShadowBoltTimer = (std::rand() % 10 + 7) * 1000;
610 AgonyCurseTimer = 20000;
611 CorruptionStrikeTimer = 13000;
612 CheckTimer = 1000;
613 ResetThreat = 1000;
614 isEnraged = false;
615 isBanished = false;
616
617 me->CastSpell(me, AURA_DEMONIC_VISUAL, true);
619 }
620
621 void EnterCombat(Unit* /*who*/) OVERRIDE
622 {
623 if (Creature* Kalec = me->SummonCreature(NPC_KALEC, me->GetPositionX() + 10, me->GetPositionY() + 5, me->GetPositionZ(), 0, TempSummonType::TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 0))
624 {
625 KalecGUID = Kalec->GetGUID();
626 me->CombatStart(Kalec);
627 me->AddThreat(Kalec, 100.0f);
628 Kalec->setActive(true);
629 }
631 }
632
633 void DamageTaken(Unit* done_by, uint32 &damage) OVERRIDE
634 {
635 if (damage >= me->GetHealth() && done_by != me)
636 damage = 0;
637 }
638
640 {
641 if (target->GetGUID() == KalecGUID)
642 {
644 if (Creature* Kalecgos = Unit::GetCreature(*me, KalecgosGUID))
645 {
646 CAST_AI(boss_kalecgos::boss_kalecgosAI, Kalecgos->AI())->TalkTimer = 1;
647 CAST_AI(boss_kalecgos::boss_kalecgosAI, Kalecgos->AI())->isFriendly = false;
648 }
650 return;
651 }
653 }
654
655 void JustDied(Unit* /*killer*/) OVERRIDE
656 {
658 me->SetPosition(me->GetPositionX(), me->GetPositionY(), DRAGON_REALM_Z, me->GetOrientation());
660 if (Creature* Kalecgos = Unit::GetCreature(*me, KalecgosGUID))
661 {
662 CAST_AI(boss_kalecgos::boss_kalecgosAI, Kalecgos->AI())->TalkTimer = 1;
663 CAST_AI(boss_kalecgos::boss_kalecgosAI, Kalecgos->AI())->isFriendly = true;
664 }
665
666 if (instance)
668 }
669
671 {
672 Map* map = me->GetMap();
673 if (!map->IsRaid())
674 return;
675
676 Map::PlayerList const &PlayerList = map->GetPlayers();
677 for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
678 {
679 if (i->GetSource()->GetPositionZ() <= DRAGON_REALM_Z-5)
680 {
681 i->GetSource()->RemoveAura(AURA_SPECTRAL_REALM);
682 i->GetSource()->TeleportTo(me->GetMap()->GetId(), i->GetSource()->GetPositionX(), i->GetSource()->GetPositionY(), DRAGON_REALM_Z+5, i->GetSource()->GetOrientation());
683 }
684 }
685 }
686
688 {
689 switch (param)
690 {
691 case DO_ENRAGE:
692 isEnraged = true;
693 me->CastSpell(me, SPELL_ENRAGE, true);
694 break;
695 case DO_BANISH:
696 isBanished = true;
697 me->CastSpell(me, SPELL_BANISH, true);
698 break;
699 }
700 }
701
703 {
704 if (!me->HasAura(AURA_SPECTRAL_INVISIBILITY))
705 me->CastSpell(me, AURA_SPECTRAL_INVISIBILITY, true);
706 if (!UpdateVictim())
707 return;
708
709 if (CheckTimer <= diff)
710 {
712 if (!Kalec || !Kalec->IsAlive())
713 {
714 if (Creature* Kalecgos = Unit::GetCreature(*me, KalecgosGUID))
715 Kalecgos->AI()->EnterEvadeMode();
716 return;
717 }
718
719 if (HealthBelowPct(10) && !isEnraged)
720 {
721 if (Creature* Kalecgos = Unit::GetCreature(*me, KalecgosGUID))
722 Kalecgos->AI()->DoAction(DO_ENRAGE);
724 }
725
727 if (Kalecgos && !Kalecgos->IsInCombat())
728 {
729 me->AI()->EnterEvadeMode();
730 return;
731 }
732
733 if (!isBanished && HealthBelowPct(1))
734 {
735 if (Kalecgos)
736 {
737 if (Kalecgos->HasAura(SPELL_BANISH))
738 {
739 me->DealDamage(me, me->GetHealth());
740 return;
741 }
743 }
744 else
745 {
746 me->MonsterTextEmote(EMOTE_UNABLE_TO_FIND, 0);
748 return;
749 }
750 }
751 CheckTimer = 1000;
752 } else CheckTimer -= diff;
753
754 if (ResetThreat <= diff)
755 {
756 ThreatContainer::StorageType threatlist = me->getThreatManager().getThreatList();
757 for (ThreatContainer::StorageType::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr)
758 {
759 if (Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()))
760 if (unit->GetPositionZ() > me->GetPositionZ() + 5)
761 me->getThreatManager().modifyThreatPercent(unit, -100);
762 }
763 ResetThreat = 1000;
764 } else ResetThreat -= diff;
765
766 if (ShadowBoltTimer <= diff)
767 {
768 if (!(rand()%5))Talk(SAY_SATH_SPELL1);
770 ShadowBoltTimer = 7000+(rand()%3000);
771 } else ShadowBoltTimer -= diff;
772
773 if (AgonyCurseTimer <= diff)
774 {
776 if (!target)
777 target = me->GetVictim();
778 DoCast(target, SPELL_AGONY_CURSE);
779 AgonyCurseTimer = 20000;
780 } else AgonyCurseTimer -= diff;
781
782 if (CorruptionStrikeTimer <= diff)
783 {
784 if (!(rand()%5))Talk(SAY_SATH_SPELL2);
786 CorruptionStrikeTimer = 13000;
787 } else CorruptionStrikeTimer -= diff;
788
790 }
791 };
792};
793
795{
796 new boss_kalecgos();
797 new boss_sathrovarr();
798 new boss_kalec();
800}
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
@ POINT_MOTION_TYPE
@ TYPEID_PLAYER
Definition Object.h:55
@ TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT
Definition Object.h:71
#define CAST_AI(a, b)
@ JUST_DIED
Definition Unit.h:504
@ UNIT_STAND_STATE_SLEEP
Definition Unit.h:165
@ UNIT_STAND_STATE_STAND
Definition Unit.h:162
@ UNIT_FLAG_NON_ATTACKABLE
Definition Unit.h:626
@ UNIT_FLAG_NOT_SELECTABLE
Definition Unit.h:650
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
@ UNIT_FIELD_FLAGS
@ SPELL_ENRAGE
@ AURA_SUNWELL_RADIANCE
@ SPELL_SHADOW_BOLT
#define FLY_X
uint32 WildMagic[]
#define DRAGON_REALM_Z
void AddSC_boss_kalecgos()
@ SAY_SATH_AGGRO
@ SAY_GOOD_NEAR_DEATH
@ SAY_SATH_SLAY
@ SAY_SATH_DEATH
@ SAY_GOOD_NEAR_DEATH2
@ SAY_GOOD_AGGRO
@ SAY_SATH_SPELL1
@ SAY_EVIL_AGGRO
@ SAY_EVIL_SLAY
@ SAY_SATH_SPELL2
@ SAY_EVIL_ENRAGE
@ SAY_GOOD_PLRWIN
#define DEMON_REALM_Z
#define GO_FAILED
#define EMOTE_UNABLE_TO_FIND
#define FLY_Z
@ SPELL_TRANSFORM_KALEC
@ SPELL_FROST_BREATH
@ SPELL_ARCANE_BUFFET
@ SPELL_ENRAGE
@ SPELL_AGONY_CURSE
@ SPELL_REVITALIZE
@ SPELL_CORRUPTION_STRIKE
@ SPELL_TELEPORT_SPECTRAL
@ AURA_SPECTRAL_EXHAUSTION
@ AURA_DEMONIC_VISUAL
@ SPELL_SHADOW_BOLT
@ SPELL_TAIL_LASH
@ AURA_SPECTRAL_INVISIBILITY
@ SPELL_HEROIC_STRIKE
@ SPELL_BANISH
@ AURA_SPECTRAL_REALM
@ SPELL_SPECTRAL_BLAST
#define CENTER_Y
#define MAX_PLAYERS_IN_SPECTRAL_REALM
#define FLY_Y
SWPActions
@ DO_ENRAGE
@ DO_BANISH
#define CENTER_X
void DoZoneInCombat(Creature *creature=NULL, float maxRangeToNearestTarget=50.0f)
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
virtual void EnterEvadeMode()
CreatureScript(const char *name)
GameObjectScript(const char *name)
bool isEmpty() const
Definition LinkedList.h:86
Definition Map.h:238
MapRefManager PlayerList
Definition Map.h:406
bool IsRaid() const
Definition Map.h:372
PlayerList const & GetPlayers() const
Definition Map.h:407
iterator end()
iterator begin()
LinkedListHead::Iterator< MapReference const > const_iterator
uint64 GetGUID() const
Definition Object.h:119
TypeID GetTypeId() const
Definition Object.h:131
std::list< HostileReference * > StorageType
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
bool IsAlive() const
Definition Unit.h:2032
bool HasAura(uint32 spellId, uint64 casterGUID=0, uint64 itemCasterGUID=0, uint32 reqEffMask=0) const
static Creature * GetCreature(WorldObject &object, uint64 guid)
Definition Unit.cpp:4905
static Unit * GetUnit(WorldObject &object, uint64 guid)
Definition Unit.cpp:4895
bool IsInCombat() const
Definition Unit.h:1896
InstanceScript * GetInstanceScript()
Definition Object.cpp:1612
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
bool OnGossipHello(Player *player, GameObject *go) OVERRIDE
float GetPositionZ() const
Definition Object.h:330
Creature * me
bool HealthBelowPct(uint32 pct) const
ScriptedAI(Creature *creature)
void AttackStart(Unit *) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void DamageTaken(Unit *done_by, uint32 &damage) OVERRIDE
boss_kalecAI(Creature *creature)
void MovementInform(uint32 type, uint32) OVERRIDE
void EnterCombat(Unit *) OVERRIDE
void DamageTaken(Unit *done_by, uint32 &damage) OVERRIDE
void DoAction(int32 param) OVERRIDE
boss_kalecgosAI(Creature *creature)
void KilledUnit(Unit *) OVERRIDE
void MoveInLineOfSight(Unit *who) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void DamageTaken(Unit *done_by, uint32 &damage) OVERRIDE
void KilledUnit(Unit *target) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void DoAction(int32 param) OVERRIDE
@ NPC_KALEC
@ DATA_SATHROVARR
@ DATA_KALECGOS_DRAGON
@ DATA_KALECGOS_EVENT