TrinityCore
Loading...
Searching...
No Matches
boss_leotheras_the_blind.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/* ScriptData
19SDName: Boss_Leotheras_The_Blind
20SD%Complete: 80
21SDComment: Possesion Support
22SDCategory: Coilfang Resevoir, Serpent Shrine Cavern
23EndScriptData */
24
25#include "ScriptMgr.h"
26#include "InstanceScript.h"
27#include "Map.h"
28#include "MotionMaster.h"
29#include "ObjectAccessor.h"
30#include "Player.h"
31#include "ScriptedCreature.h"
32#include "serpent_shrine.h"
33#include "TemporarySummon.h"
34
36{
37 // Spells used by Leotheras The Blind
43
44 // Spells used in banish phase
45 BANISH_BEAM = 38909,
46 AURA_BANISH = 37833,
47
48 // Spells used by Greyheart Spellbinders
51
52 // Spells used by Inner Demons and Creature ID
58
59 //Misc.
60 MODEL_DEMON = 20125,
62 DEMON_FORM = 21875,
65
73 SAY_DEATH = 7
74};
75
77{
78 npc_inner_demon(Creature* creature) : ScriptedAI(creature)
79 {
80 Initialize();
81 }
82
84 {
85 ShadowBolt_Timer = 10000;
86 Link_Timer = 1000;
87 }
88
90
93
94 void Reset() override
95 {
96 Initialize();
97 }
98
99 void SetGUID(ObjectGuid const& guid, int32 id) override
100 {
101 if (id == INNER_DEMON_VICTIM)
102 victimGUID = guid;
103 }
104
105 ObjectGuid GetGUID(int32 id/* = 0 */) const override
106 {
107 if (id == INNER_DEMON_VICTIM)
108 return victimGUID;
109 return ObjectGuid::Empty;
110 }
111
112 void JustDied(Unit* /*killer*/) override
113 {
115 if (unit && unit->HasAura(SPELL_INSIDIOUS_WHISPER))
117 }
118
119 void DamageTaken(Unit* done_by, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
120 {
121 if (!done_by || (done_by->GetGUID() != victimGUID && done_by->GetGUID() != me->GetGUID()))
122 {
123 damage = 0;
124 ModifyThreatByPercent(done_by, -100);
125 }
126 }
127
128 void JustEngagedWith(Unit* /*who*/) override
129 {
130 if (!victimGUID)
131 return;
132 }
133
134 void UpdateAI(uint32 diff) override
135 {
136 //Return since we have no target
137 if (!UpdateVictim() || !me->GetVictim())
138 return;
139
140 if (me->EnsureVictim()->GetGUID() != victimGUID)
141 {
144 if (owner && owner->IsAlive())
145 {
146 AddThreat(owner, 999999);
147 AttackStart(owner);
148 } else if (owner && owner->isDead())
149 {
150 me->KillSelf();
151 return;
152 }
153 }
154
155 if (Link_Timer <= diff)
156 {
158 Link_Timer = 1000;
159 } else Link_Timer -= diff;
160
163
164 if (ShadowBolt_Timer <= diff)
165 {
167 ShadowBolt_Timer = 10000;
168 } else ShadowBolt_Timer -= diff;
169
171 }
172};
173
174//Original Leotheras the Blind AI
176{
178 {
179 Initialize();
180 creature->GetPosition(x, y, z);
181 }
182
184 {
185 BanishTimer = 1000;
186 Whirlwind_Timer = 15000;
187 ChaosBlast_Timer = 1000;
188 SwitchToDemon_Timer = 45000;
189 SwitchToHuman_Timer = 60000;
190 Berserk_Timer = 600000;
191 InnerDemons_Timer = 30000;
192
193 DealDamage = true;
194 DemonForm = false;
195 IsFinalForm = false;
196 NeedThreatReset = false;
197 EnrageUsed = false;
198 for (ObjectGuid& guid : InnderDemon)
199 guid.Clear();
201 }
202
210
216 float x, y, z;
217
222
223 void Reset() override
224 {
226 Initialize();
227 me->SetCanDualWield(true);
228 me->SetSpeedRate(MOVE_RUN, 2.0f);
230 me->SetVirtualItem(0, 0);
231 me->SetVirtualItem(1, 0);
232 DoCast(me, SPELL_DUAL_WIELD, true);
233 me->SetCorpseDelay(1000*60*60);
234 _Reset();
235 }
236
237 void CheckChannelers(/*bool DoEvade = true*/)
238 {
239 for (uint8 i = 0; i < 3; ++i)
240 {
242 add->DisappearAndDie();
243
244 float nx = x;
245 float ny = y;
246 float o = 2.4f;
247 if (i == 0) {nx += 10; ny -= 5; o=2.5f;}
248 if (i == 1) {nx -= 8; ny -= 7; o=0.9f;}
249 if (i == 2) {nx -= 3; ny += 9; o=5.0f;}
251 if (binder)
252 SpellBinderGUID[i] = binder->GetGUID();
253 }
254 }
255 void MoveInLineOfSight(Unit* who) override
256
257 {
258 if (me->HasAura(AURA_BANISH))
259 return;
260
261 if (!me->GetVictim() && me->CanCreatureAttack(who))
262 {
264 return;
265
266 float attackRadius = me->GetAttackDistance(who);
267 if (me->IsWithinDistInMap(who, attackRadius))
268 {
269 // Check first that object is in an angle in front of this one before LoS check
270 if (me->HasInArc(float(M_PI) / 2.0f, who) && me->IsWithinLOSInMap(who))
271 {
272 AttackStart(who);
273 }
274 }
275 }
276 }
277
283
285 {
286 uint8 AliveChannelers = 0;
287 for (uint8 i = 0; i < 3; ++i)
288 {
290 if (add && add->IsAlive())
291 ++AliveChannelers;
292 }
293
294 // channelers == 0 remove banish aura
295 if (AliveChannelers == 0 && me->HasAura(AURA_BANISH))
296 {
297 // removing banish aura
299
300 // Leotheras is getting immune again
302
303 // changing model to bloodelf
305
306 // and reseting equipment
307 me->LoadEquipment();
308
310 {
312 AddThreat(victim, 1);
313 StartEvent();
314 }
315 }
316 else if (AliveChannelers != 0 && !me->HasAura(AURA_BANISH))
317 {
318 // channelers != 0 apply banish aura
319 // removing Leotheras banish immune to apply AURA_BANISH
322
323 // changing model
325
326 // and removing weapons
327 me->SetVirtualItem(0, 0);
328 me->SetVirtualItem(1, 0);
329 }
330 }
331
332 //Despawn all Inner Demon summoned
334 {
335 for (uint8 i = 0; i < 5; ++i)
336 {
337 if (!InnderDemon[i].IsEmpty())
338 {
339 //delete creature
341 if (creature && creature->IsAlive())
342 creature->DespawnOrUnsummon();
343
344 InnderDemon[i].Clear();
345 }
346 }
347
349 }
350
351 void CastConsumingMadness() //remove this once SPELL_INSIDIOUS_WHISPER is supported by core
352 {
353 for (uint8 i = 0; i < 5; ++i)
354 {
355 if (!InnderDemon[i].IsEmpty())
356 {
358 if (unit && unit->IsAlive())
359 {
360 Unit* unit_target = ObjectAccessor::GetUnit(*unit, unit->AI()->GetGUID(INNER_DEMON_VICTIM));
361 if (unit_target && unit_target->IsAlive())
362 {
363 unit->CastSpell(unit_target, SPELL_CONSUMING_MADNESS, true);
364 ModifyThreatByPercent(unit_target, -100);
365 }
366 }
367 }
368 }
369 }
370
371 void KilledUnit(Unit* victim) override
372 {
373 if (victim->GetTypeId() != TYPEID_PLAYER)
374 return;
375
377 }
378
379 void JustDied(Unit* /*killer*/) override
380 {
382
383 //despawn copy
384 if (!Demon.IsEmpty())
385 {
387 pDemon->DespawnOrUnsummon();
388 }
389 _JustDied();
390 }
391
392 void JustEngagedWith(Unit* /*who*/) override
393 {
394 if (me->HasAura(AURA_BANISH))
395 return;
396
397 me->LoadEquipment();
398 }
399
400 void UpdateAI(uint32 diff) override
401 {
402 //Return since we have no target
404 {
405 if (BanishTimer <= diff)
406 {
407 CheckBanish();//no need to check every update tick
408 BanishTimer = 1000;
409 } else BanishTimer -= diff;
410 return;
411 }
413 {
414 if (Whirlwind_Timer <= diff)
415 {
417 if (newTarget)
418 {
421 me->GetMotionMaster()->MovePoint(0, newTarget->GetPositionX(), newTarget->GetPositionY(), newTarget->GetPositionZ());
422 }
423 Whirlwind_Timer = 2000;
424 } else Whirlwind_Timer -= diff;
425 }
426
427 // reseting after changing forms and after ending whirlwind
429 {
430 // when changing forms seting timers (or when ending whirlwind - to avoid adding new variable i use Whirlwind_Timer to countdown 2s while whirlwinding)
431 if (DemonForm)
432 InnerDemons_Timer = 30000;
433 else
434 Whirlwind_Timer = 15000;
435
436 NeedThreatReset = false;
440 }
441
442 //Enrage_Timer (10 min)
443 if (Berserk_Timer < diff && !EnrageUsed)
444 {
447 EnrageUsed = true;
448 } else Berserk_Timer -= diff;
449
450 if (!DemonForm)
451 {
452 //Whirldind Timer
454 {
455 if (Whirlwind_Timer <= diff)
456 {
458 // while whirlwinding this variable is used to countdown target's change
459 Whirlwind_Timer = 2000;
460 NeedThreatReset = true;
461 } else Whirlwind_Timer -= diff;
462 }
463 //Switch_Timer
464
465 if (!IsFinalForm)
466 {
467 if (SwitchToDemon_Timer <= diff)
468 {
469 //switch to demon form
473 me->SetVirtualItem(0, 0);
474 me->SetVirtualItem(1, 0);
475 DemonForm = true;
476 NeedThreatReset = true;
477 SwitchToDemon_Timer = 45000;
478 } else SwitchToDemon_Timer -= diff;
479 }
481 }
482 else
483 {
484 //ChaosBlast_Timer
485 if (!me->GetVictim())
486 return;
487 if (me->IsWithinDist(me->GetVictim(), 30))
488 me->StopMoving();
489 if (ChaosBlast_Timer <= diff)
490 {
491 // will cast only when in range of spell
492 if (me->IsWithinDist(me->GetVictim(), 30))
493 {
494 //DoCastVictim(SPELL_CHAOS_BLAST, true);
496 }
497 ChaosBlast_Timer = 3000;
498 } else ChaosBlast_Timer -= diff;
499 //Summon Inner Demon
500 if (InnerDemons_Timer <= diff)
501 {
502 ThreatManager const& mgr = me->GetThreatManager();
503 std::list<Unit*> TargetList;
504 Unit* currentVictim = mgr.GetLastVictim();
505 for (ThreatReference const* ref : mgr.GetSortedThreatList())
506 {
507 if (Player* tempTarget = ref->GetVictim()->ToPlayer())
508 if (tempTarget != currentVictim && TargetList.size()<5)
509 TargetList.push_back(tempTarget);
510 }
511 //SpellInfo* spell = GET_SPELL(SPELL_INSIDIOUS_WHISPER);
512 for (auto itr = TargetList.begin(), end = TargetList.end(); itr != end; ++itr)
513 {
514 if ((*itr) && (*itr)->IsAlive())
515 {
516 Creature* demon = me->SummonCreature(INNER_DEMON_ID, (*itr)->GetPositionX()+10, (*itr)->GetPositionY()+10, (*itr)->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5s);
517 if (demon)
518 {
519 demon->AI()->AttackStart((*itr));
520 demon->AI()->SetGUID((*itr)->GetGUID(), INNER_DEMON_VICTIM);
521
522 (*itr)->AddAura(SPELL_INSIDIOUS_WHISPER, *itr);
523
524 if (InnerDemon_Count > 4)
526
527 //Safe storing of creatures
529
530 //Update demon count
532 }
533 }
534 }
536
537 InnerDemons_Timer = 999999;
538 } else InnerDemons_Timer -= diff;
539
540 //Switch_Timer
541 if (SwitchToHuman_Timer <= diff)
542 {
543 //switch to nightelf form
545 me->LoadEquipment();
546
548 DespawnDemon();
549
550 DemonForm = false;
551 NeedThreatReset = true;
552
553 SwitchToHuman_Timer = 60000;
554 } else SwitchToHuman_Timer -= diff;
555 }
556
557 if (!IsFinalForm && HealthBelowPct(15))
558 {
559 //at this point he divides himself in two parts
561 DespawnDemon();
563 {
564 Demon = Copy->GetGUID();
565 if (me->GetVictim())
566 Copy->AI()->AttackStart(me->GetVictim());
567 }
568 //set nightelf final form
569 IsFinalForm = true;
570 DemonForm = false;
571
574 me->LoadEquipment();
575 }
576 }
577};
578
579//Leotheras the Blind Demon Form AI
581{
583 {
584 Initialize();
585 }
586
588 {
589 ChaosBlast_Timer = 1000;
590 DealDamage = true;
591 }
592
595
596 void Reset() override
597 {
598 Initialize();
599 }
600
602 {
603 Talk(SAY_FREE);
604 }
605
606 void KilledUnit(Unit* victim) override
607 {
608 if (victim->GetTypeId() != TYPEID_PLAYER)
609 return;
610
612 }
613
614 void JustDied(Unit* /*killer*/) override
615 {
616 //invisibility (blizzlike, at the end of the fight he doesn't die, he disappears)
617 DoCast(me, 8149, true);
618 }
619
620 void JustEngagedWith(Unit* /*who*/) override
621 {
622 StartEvent();
623 }
624
625 void UpdateAI(uint32 diff) override
626 {
627 //Return since we have no target
628 if (!UpdateVictim())
629 return;
630 //ChaosBlast_Timer
631 if (me->IsWithinDist(me->GetVictim(), 30))
632 me->StopMoving();
633
634 if (ChaosBlast_Timer <= diff)
635 {
636 // will cast only when in range od spell
637 if (me->IsWithinDist(me->GetVictim(), 30))
638 {
639 //DoCastVictim(SPELL_CHAOS_BLAST, true);
641 ChaosBlast_Timer = 3000;
642 }
643 } else ChaosBlast_Timer -= diff;
644
645 //Do NOT deal any melee damage to the target.
646 }
647};
648
650{
652 {
653 Initialize();
654 instance = creature->GetInstanceScript();
655 AddedBanish = false;
656 }
657
659 {
660 Mindblast_Timer = urand(3000, 8000);
661 Earthshock_Timer = urand(5000, 10000);
662 }
663
665
667
670
672
673 void Reset() override
674 {
675 Initialize();
676
679 if (leotheras && leotheras->IsAlive())
680 ENSURE_AI(boss_leotheras_the_blind, leotheras->AI())->CheckChannelers(/*false*/);
681 }
682
683 void JustEngagedWith(Unit* who) override
684 {
687 }
688
689 void JustAppeared() override
690 {
691 AddedBanish = false;
692 Reset();
693 }
694
696 {
698 {
699 if (!leotherasGUID.IsEmpty())
700 {
702 if (leotheras && leotheras->IsAlive())
703 DoCast(leotheras, BANISH_BEAM);
704 }
705 }
706 }
707
708 void UpdateAI(uint32 diff) override
709 {
710 if (!leotherasGUID)
712
714 {
716 AttackStart(victim);
717 }
718
719 if (!UpdateVictim())
720 {
722 return;
723 }
724
726 {
728 return;
729 }
730
731 if (Mindblast_Timer <= diff)
732 {
734 DoCast(target, SPELL_MINDBLAST);
735
736 Mindblast_Timer = urand(10000, 15000);
737 } else Mindblast_Timer -= diff;
738
739 if (Earthshock_Timer <= diff)
740 {
741 Map::PlayerList const& PlayerList = me->GetMap()->GetPlayers();
742 for (Map::PlayerList::const_iterator itr = PlayerList.begin(); itr != PlayerList.end(); ++itr)
743 {
744 if (Player* i_pl = itr->GetSource())
745 {
746 bool isCasting = false;
747 for (uint8 i = 0; i < CURRENT_MAX_SPELL; ++i)
748 if (i_pl->GetCurrentSpell(i))
749 isCasting = true;
750
751 if (isCasting)
752 {
754 break;
755 }
756 }
757 }
758 Earthshock_Timer = urand(8000, 15000);
759 } else Earthshock_Timer -= diff;
761 }
762};
763
#define M_PI
Definition Common.h:72
#define CREATURE_Z_ATTACK_RANGE
Definition Creature.h:53
uint8_t uint8
Definition Define.h:135
int32_t int32
Definition Define.h:129
uint32_t uint32
Definition Define.h:133
@ IN_PROGRESS
@ TEMPSUMMON_DEAD_DESPAWN
@ TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT
@ TYPEID_PLAYER
Definition ObjectGuid.h:39
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:42
@ MECHANIC_BANISH
@ IMMUNITY_MECHANIC
#define ENSURE_AI(a, b)
Definition UnitAI.h:28
@ MOVE_RUN
@ CURRENT_CHANNELED_SPELL
Definition Unit.h:608
#define CURRENT_MAX_SPELL
Definition Unit.h:613
DamageEffectType
Definition Unit.h:352
@ SPELL_CONSUMING_MADNESS
@ SPELL_INSIDIOUS_WHISPER
void AddSC_boss_leotheras_the_blind()
InstanceScript *const instance
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:82
virtual void EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
float GetAttackDistance(Unit const *player) const
void SetDisplayId(uint32 modelId) override
void LoadEquipment(int8 id=1, bool force=false)
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
bool CanCreatureAttack(Unit const *victim, bool force=true) const
void SetCorpseDelay(uint32 delay, bool ignoreCorpseDecayRatio=false)
Definition Creature.h:89
void SetCanDualWield(bool value) override
CreatureAI * AI() const
Definition Creature.h:154
virtual bool SetBossState(uint32 id, EncounterState state)
virtual ObjectGuid GetGuidData(uint32 type) const override
iterator end()
iterator begin()
PlayerList const & GetPlayers() const
Definition Map.h:448
void MoveChase(Unit *target, Optional< ChaseRange > dist={}, Optional< ChaseAngle > angle={})
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={})
static ObjectGuid const Empty
Definition ObjectGuid.h:140
bool IsEmpty() const
Definition ObjectGuid.h:172
void Clear()
Definition ObjectGuid.h:150
TypeID GetTypeId() const
Definition Object.h:93
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
static Player * ToPlayer(Object *o)
Definition Object.h:180
Unit * GetLastVictim() const
Trinity::IteratorPair< ThreatListIterator, std::nullptr_t > GetSortedThreatList() const
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:54
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.cpp:166
virtual ObjectGuid GetGUID(int32=0) const
Definition UnitAI.h:158
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition UnitAI.cpp:96
virtual void SetGUID(ObjectGuid const &, int32=0)
Definition UnitAI.h:157
virtual void AttackStart(Unit *)
Definition UnitAI.cpp:30
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:106
Definition Unit.h:769
void KillSelf(bool durabilityLoss=true)
Definition Unit.h:1023
ThreatManager & GetThreatManager()
Definition Unit.h:1155
void StopMoving(bool force=false)
Definition Unit.cpp:10312
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition Unit.cpp:3093
MotionMaster * GetMotionMaster()
Definition Unit.h:1667
bool IsAlive() const
Definition Unit.h:1234
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:4535
void SetVirtualItem(uint32 slot, uint32 itemId)
Definition Unit.cpp:13868
Unit * EnsureVictim() const
Definition Unit.h:861
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3784
Unit * GetVictim() const
Definition Unit.h:859
void SetSpeedRate(UnitMoveType mtype, float rate)
Definition Unit.cpp:8678
void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply)
Definition Unit.cpp:8142
bool IsInCombat() const
Definition Unit.h:1144
bool isDead() const
Definition Unit.h:1236
Spell * GetCurrentSpell(CurrentSpellTypes spellType) const
Definition Unit.h:1476
Map * GetMap() const
Definition Object.h:449
InstanceScript * GetInstanceScript() const
Definition Object.cpp:1087
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2832
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:1992
bool IsWithinLOSInMap(WorldObject const *obj, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing) const
Definition Object.cpp:1226
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition Object.cpp:1192
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true) const
Definition Object.cpp:1187
float GetDistanceZ(WorldObject const *obj) const
Definition Object.cpp:1093
virtual void SetGuidData(uint32, ObjectGuid)
Definition ZoneScript.h:49
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
@ DATA_LEOTHERAS
@ DATA_LEOTHERAS_EVENT_STARTER
@ BOSS_LEOTHERAS_THE_BLIND
#define RegisterSerpentshrineCavernCreatureAI(ai_name)
CastSpellExtraArgs & AddSpellBP0(int32 val)
float GetPositionZ() const
Definition Position.h:81
bool HasInArc(float arcangle, Position const *pos, float border=2.0f) const
Definition Position.cpp:120
float GetPositionX() const
Definition Position.h:79
void GetPosition(float &x, float &y) const
Definition Position.h:84
float GetPositionY() const
Definition Position.h:80
void AttackStart(Unit *) override
bool HealthBelowPct(uint32 pct) const
void ModifyThreatByPercent(Unit *victim, int32 pct, Unit *who=nullptr)
Creature * DoSpawnCreature(uint32 entry, float offsetX, float offsetY, float offsetZ, float angle, uint32 type, Milliseconds despawntime)
void ResetThreatList(Unit *who=nullptr)
void AddThreat(Unit *victim, float amount, Unit *who=nullptr)
void UpdateAI(uint32 diff) override
boss_leotheras_the_blind(Creature *creature)
void KilledUnit(Unit *victim) override
void MoveInLineOfSight(Unit *who) override
npc_greyheart_spellbinder(Creature *creature)
void JustEngagedWith(Unit *who) override
void UpdateAI(uint32 diff) override
void DamageTaken(Unit *done_by, uint32 &damage, DamageEffectType, SpellInfo const *) override
npc_inner_demon(Creature *creature)
void JustDied(Unit *) override
ObjectGuid GetGUID(int32 id) const override
void SetGUID(ObjectGuid const &guid, int32 id) override
void UpdateAI(uint32 diff) override
void JustEngagedWith(Unit *) override