Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_leotheras_the_blind.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_Leotheras_The_Blind
8SD%Complete: 80
9SDComment: Possesion Support
10SDCategory: Coilfang Resevoir, Serpent Shrine Cavern
11EndScriptData */
12
13#include "ScriptMgr.h"
14#include "ScriptedCreature.h"
15#include "serpent_shrine.h"
16#include "Player.h"
17
19{
20 // Spells used by Leotheras The Blind
26
27 // Spells used in banish phase
28 BANISH_BEAM = 38909,
29 AURA_BANISH = 37833,
30
31 // Spells used by Greyheart Spellbinders
34
35 // Spells used by Inner Demons and Creature ID
41
42 //Misc.
43 MODEL_DEMON = 20125,
45 DEMON_FORM = 21875,
48
57};
58
60{
61public:
62 npc_inner_demon() : CreatureScript("npc_inner_demon") { }
63
65 {
66 return new npc_inner_demonAI(creature);
67 }
68
70 {
71 npc_inner_demonAI(Creature* creature) : ScriptedAI(creature)
72 {
73 victimGUID = 0;
74 }
75
77
80
82 {
83 ShadowBolt_Timer = 10000;
84 Link_Timer = 1000;
85 }
86
87 void SetGUID(uint64 guid, int32 id/* = 0 */) OVERRIDE
88 {
89 if (id == INNER_DEMON_VICTIM)
90 victimGUID = guid;
91 }
92
93 uint64 GetGUID(int32 id/* = 0 */) const OVERRIDE
94 {
95 if (id == INNER_DEMON_VICTIM)
96 return victimGUID;
97 return 0;
98 }
99
100 void JustDied(Unit* /*killer*/) OVERRIDE
101 {
102 Unit* unit = Unit::GetUnit(*me, victimGUID);
103 if (unit && unit->HasAura(SPELL_INSIDIOUS_WHISPER))
105 }
106
107 void DamageTaken(Unit* done_by, uint32 &damage) OVERRIDE
108 {
109 if (done_by->GetGUID() != victimGUID && done_by->GetGUID() != me->GetGUID())
110 {
111 damage = 0;
112 DoModifyThreatPercent(done_by, -100);
113 }
114 }
115
116 void EnterCombat(Unit* /*who*/) OVERRIDE
117 {
118 if (!victimGUID)
119 return;
120 }
121
123 {
124 //Return since we have no target
125 if (!UpdateVictim())
126 return;
127
128 if (me->GetVictim()->GetGUID() != victimGUID)
129 {
130 DoModifyThreatPercent(me->GetVictim(), -100);
131 Unit* owner = Unit::GetUnit(*me, victimGUID);
132 if (owner && owner->IsAlive())
133 {
134 me->AddThreat(owner, 999999);
135 AttackStart(owner);
136 } else if (owner && owner->isDead())
137 {
138 me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
139 return;
140 }
141 }
142
143 if (Link_Timer <= diff)
144 {
146 Link_Timer = 1000;
147 } else Link_Timer -= diff;
148
149 if (!me->HasAura(AURA_DEMONIC_ALIGNMENT))
151
152 if (ShadowBolt_Timer <= diff)
153 {
155 ShadowBolt_Timer = 10000;
156 } else ShadowBolt_Timer -= diff;
157
159 }
160 };
161};
162
163//Original Leotheras the Blind AI
165{
166public:
167 boss_leotheras_the_blind() : CreatureScript("boss_leotheras_the_blind") { }
168
170 {
171 return new boss_leotheras_the_blindAI(creature);
172 }
173
175 {
177 {
178 creature->GetPosition(x, y, z);
179 instance = creature->GetInstanceScript();
180 Demon = 0;
181
182 for (uint8 i = 0; i < 3; ++i)//clear guids
183 SpellBinderGUID[i] = 0;
184 }
185
187
195
201 float x, y, z;
202
207
209 {
211 BanishTimer = 1000;
212 Whirlwind_Timer = 15000;
213 ChaosBlast_Timer = 1000;
214 SwitchToDemon_Timer = 45000;
215 SwitchToHuman_Timer = 60000;
216 Berserk_Timer = 600000;
217 InnerDemons_Timer = 30000;
218 me->SetCanDualWield(true);
219 DealDamage = true;
220 DemonForm = false;
221 IsFinalForm = false;
222 NeedThreatReset = false;
223 EnrageUsed = false;
224 memset(InnderDemon, 0, sizeof(InnderDemon));
226 me->SetSpeed(MOVE_RUN, 2.0f, true);
227 me->SetDisplayId(MODEL_NIGHTELF);
228 me->SetUInt32Value(UNIT_FIELD_VIRTUAL_ITEM_ID , 0);
229 me->SetUInt32Value(UNIT_FIELD_VIRTUAL_ITEM_ID+1, 0);
230 DoCast(me, SPELL_DUAL_WIELD, true);
231 me->SetCorpseDelay(1000*60*60);
232 if (instance)
234 }
235
236 void CheckChannelers(/*bool DoEvade = true*/)
237 {
238 for (uint8 i = 0; i < 3; ++i)
239 {
241 add->DisappearAndDie();
242
243 float nx = x;
244 float ny = y;
245 float o = 2.4f;
246 if (i == 0) {nx += 10; ny -= 5; o=2.5f;}
247 if (i == 1) {nx -= 8; ny -= 7; o=0.9f;}
248 if (i == 2) {nx -= 3; ny += 9; o=5.0f;}
249 Creature* binder = me->SummonCreature(NPC_SPELLBINDER, nx, ny, z, o, TempSummonType::TEMPSUMMON_DEAD_DESPAWN, 0);
250 if (binder)
251 SpellBinderGUID[i] = binder->GetGUID();
252 }
253 }
255
256 {
257 if (me->HasAura(AURA_BANISH))
258 return;
259
260 if (!me->GetVictim() && me->CanCreatureAttack(who))
261 {
262 if (me->GetDistanceZ(who) > CREATURE_Z_ATTACK_RANGE)
263 return;
264
265 float attackRadius = me->GetAttackDistance(who);
266 if (me->IsWithinDistInMap(who, attackRadius))
267 {
268 // Check first that object is in an angle in front of this one before LoS check
269 if (me->HasInArc(M_PI/2.0f, who) && me->IsWithinLOSInMap(who))
270 {
271 AttackStart(who);
272 }
273 }
274 }
275 }
276
278 {
280 if (instance)
282 }
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
298 me->RemoveAurasDueToSpell(AURA_BANISH);
299
300 // Leotheras is getting immune again
301 me->ApplySpellImmune(AURA_BANISH, IMMUNITY_MECHANIC, MECHANIC_BANISH, true);
302
303 // changing model to bloodelf
304 me->SetDisplayId(MODEL_NIGHTELF);
305
306 // and reseting equipment
307 me->LoadEquipment();
308
310 {
311 Unit* victim = NULL;
313 if (victim)
314 me->getThreatManager().addThreat(victim, 1);
315 StartEvent();
316 }
317 }
318 else if (AliveChannelers != 0 && !me->HasAura(AURA_BANISH))
319 {
320 // channelers != 0 apply banish aura
321 // removing Leotheras banish immune to apply AURA_BANISH
322 me->ApplySpellImmune(AURA_BANISH, IMMUNITY_MECHANIC, MECHANIC_BANISH, false);
324
325 // changing model
326 me->SetDisplayId(MODEL_DEMON);
327
328 // and removing weapons
329 me->SetUInt32Value(UNIT_FIELD_VIRTUAL_ITEM_ID , 0);
330 me->SetUInt32Value(UNIT_FIELD_VIRTUAL_ITEM_ID+1, 0);
331 }
332 }
333
334 //Despawn all Inner Demon summoned
336 {
337 for (uint8 i=0; i<5; ++i)
338 {
339 if (InnderDemon[i])
340 {
341 //delete creature
342 Creature* creature = Unit::GetCreature((*me), InnderDemon[i]);
343 if (creature && creature->IsAlive())
344 {
345 creature->DespawnOrUnsummon();
346 }
347 InnderDemon[i] = 0;
348 }
349 }
350
352 }
353
354 void CastConsumingMadness() //remove this once SPELL_INSIDIOUS_WHISPER is supported by core
355 {
356 for (uint8 i=0; i<5; ++i)
357 {
358 if (InnderDemon[i] > 0)
359 {
361 if (unit && unit->IsAlive())
362 {
363 Unit* unit_target = Unit::GetUnit(*unit, unit->AI()->GetGUID(INNER_DEMON_VICTIM));
364 if (unit_target && unit_target->IsAlive())
365 {
366 unit->CastSpell(unit_target, SPELL_CONSUMING_MADNESS, true);
367 DoModifyThreatPercent(unit_target, -100);
368 }
369 }
370 }
371 }
372 }
373
375 {
376 if (victim->GetTypeId() != TypeID::TYPEID_PLAYER)
377 return;
378
380 }
381
382 void JustDied(Unit* /*killer*/) OVERRIDE
383 {
385
386 //despawn copy
387 if (Demon)
388 {
389 if (Creature* pDemon = Unit::GetCreature(*me, Demon))
390 pDemon->DespawnOrUnsummon();
391 }
392 if (instance)
394 }
395
396 void EnterCombat(Unit* /*who*/) OVERRIDE
397 {
398 if (me->HasAura(AURA_BANISH))
399 return;
400
401 me->LoadEquipment();
402 }
403
405 {
406 //Return since we have no target
407 if (me->HasAura(AURA_BANISH) || !UpdateVictim())
408 {
409 if (BanishTimer <= diff)
410 {
411 CheckBanish();//no need to check every update tick
412 BanishTimer = 1000;
413 } else BanishTimer -= diff;
414 return;
415 }
416 if (me->HasAura(SPELL_WHIRLWIND))
417 {
418 if (Whirlwind_Timer <= diff)
419 {
420 Unit* newTarget = SelectTarget(SELECT_TARGET_RANDOM, 0);
421 if (newTarget)
422 {
424 me->GetMotionMaster()->Clear();
425 me->GetMotionMaster()->MovePoint(0, newTarget->GetPositionX(), newTarget->GetPositionY(), newTarget->GetPositionZ());
426 }
427 Whirlwind_Timer = 2000;
428 } else Whirlwind_Timer -= diff;
429 }
430
431 // reseting after changing forms and after ending whirlwind
432 if (NeedThreatReset && !me->HasAura(SPELL_WHIRLWIND))
433 {
434 // when changing forms seting timers (or when ending whirlwind - to avoid adding new variable i use Whirlwind_Timer to countdown 2s while whirlwinding)
435 if (DemonForm)
436 InnerDemons_Timer = 30000;
437 else
438 Whirlwind_Timer = 15000;
439
440 NeedThreatReset = false;
442 me->GetMotionMaster()->Clear();
443 me->GetMotionMaster()->MoveChase(me->GetVictim());
444 }
445
446 //Enrage_Timer (10 min)
447 if (Berserk_Timer < diff && !EnrageUsed)
448 {
449 me->InterruptNonMeleeSpells(false);
451 EnrageUsed = true;
452 } else Berserk_Timer -= diff;
453
454 if (!DemonForm)
455 {
456 //Whirldind Timer
457 if (!me->HasAura(SPELL_WHIRLWIND))
458 {
459 if (Whirlwind_Timer <= diff)
460 {
462 // while whirlwinding this variable is used to countdown target's change
463 Whirlwind_Timer = 2000;
464 NeedThreatReset = true;
465 } else Whirlwind_Timer -= diff;
466 }
467 //Switch_Timer
468
469 if (!IsFinalForm)
470 {
471 if (SwitchToDemon_Timer <= diff)
472 {
473 //switch to demon form
474 me->RemoveAurasDueToSpell(SPELL_WHIRLWIND, 0);
475 me->SetDisplayId(MODEL_DEMON);
477 me->SetUInt32Value(UNIT_FIELD_VIRTUAL_ITEM_ID , 0);
478 me->SetUInt32Value(UNIT_FIELD_VIRTUAL_ITEM_ID+1, 0);
479 DemonForm = true;
480 NeedThreatReset = true;
481 SwitchToDemon_Timer = 45000;
482 } else SwitchToDemon_Timer -= diff;
483 }
485 }
486 else
487 {
488 //ChaosBlast_Timer
489 if (!me->GetVictim())
490 return;
491 if (me->IsWithinDist(me->GetVictim(), 30))
492 me->StopMoving();
493 if (ChaosBlast_Timer <= diff)
494 {
495 // will cast only when in range of spell
496 if (me->IsWithinDist(me->GetVictim(), 30))
497 {
498 //DoCastVictim(SPELL_CHAOS_BLAST, true);
499 int damage = 100;
500 me->CastCustomSpell(me->GetVictim(), SPELL_CHAOS_BLAST, &damage, NULL, NULL, false, NULL, NULL, me->GetGUID());
501 }
502 ChaosBlast_Timer = 3000;
503 } else ChaosBlast_Timer -= diff;
504 //Summon Inner Demon
505 if (InnerDemons_Timer <= diff)
506 {
507 ThreatContainer::StorageType const & ThreatList = me->getThreatManager().getThreatList();
508 std::vector<Unit*> TargetList;
509 for (ThreatContainer::StorageType::const_iterator itr = ThreatList.begin(); itr != ThreatList.end(); ++itr)
510 {
511 Unit* tempTarget = Unit::GetUnit(*me, (*itr)->getUnitGuid());
512 if (tempTarget && tempTarget->GetTypeId() == TypeID::TYPEID_PLAYER && tempTarget->GetGUID() != me->GetVictim()->GetGUID() && TargetList.size()<5)
513 TargetList.push_back(tempTarget);
514 }
515 //SpellInfo* spell = GET_SPELL(SPELL_INSIDIOUS_WHISPER);
516 for (std::vector<Unit*>::const_iterator itr = TargetList.begin(); itr != TargetList.end(); ++itr)
517 {
518 if ((*itr) && (*itr)->IsAlive())
519 {
520 Creature* demon = me->SummonCreature(INNER_DEMON_ID, (*itr)->GetPositionX()+10, (*itr)->GetPositionY()+10, (*itr)->GetPositionZ(), 0, TempSummonType::TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
521 if (demon)
522 {
523 demon->AI()->AttackStart((*itr));
524 demon->AI()->SetGUID((*itr)->GetGUID(), INNER_DEMON_VICTIM);
525
526 (*itr)->AddAura(SPELL_INSIDIOUS_WHISPER, *itr);
527
528 if (InnerDemon_Count > 4)
530
531 //Safe storing of creatures
533
534 //Update demon count
536 }
537 }
538 }
540
541 InnerDemons_Timer = 999999;
542 } else InnerDemons_Timer -= diff;
543
544 //Switch_Timer
545 if (SwitchToHuman_Timer <= diff)
546 {
547 //switch to nightelf form
548 me->SetDisplayId(MODEL_NIGHTELF);
549 me->LoadEquipment();
550
552 DespawnDemon();
553
554 DemonForm = false;
555 NeedThreatReset = true;
556
557 SwitchToHuman_Timer = 60000;
558 } else SwitchToHuman_Timer -= diff;
559 }
560
561 if (!IsFinalForm && HealthBelowPct(15))
562 {
563 //at this point he divides himself in two parts
565 DespawnDemon();
566 Creature* Copy = NULL;
568 if (Copy)
569 {
570 Demon = Copy->GetGUID();
571 if (me->GetVictim())
572 Copy->AI()->AttackStart(me->GetVictim());
573 }
574 //set nightelf final form
575 IsFinalForm = true;
576 DemonForm = false;
577
579 me->SetDisplayId(MODEL_NIGHTELF);
580 me->LoadEquipment();
581 }
582 }
583 };
584};
585
586//Leotheras the Blind Demon Form AI
588{
589public:
590 boss_leotheras_the_blind_demonform() : CreatureScript("boss_leotheras_the_blind_demonform") { }
591
593 {
594 return new boss_leotheras_the_blind_demonformAI(creature);
595 }
596
598 {
600
603
605 {
606 ChaosBlast_Timer = 1000;
607 DealDamage = true;
608 }
609
611 {
612 Talk(SAY_FREE);
613 }
614
616 {
617 if (victim->GetTypeId() != TypeID::TYPEID_PLAYER)
618 return;
619
621 }
622
623 void JustDied(Unit* /*killer*/) OVERRIDE
624 {
625 //invisibility (blizzlike, at the end of the fight he doesn't die, he disappears)
626 DoCast(me, 8149, true);
627 }
628
629 void EnterCombat(Unit* /*who*/) OVERRIDE
630 {
631 StartEvent();
632 }
633
635 {
636 //Return since we have no target
637 if (!UpdateVictim())
638 return;
639 //ChaosBlast_Timer
640 if (me->IsWithinDist(me->GetVictim(), 30))
641 me->StopMoving();
642
643 if (ChaosBlast_Timer <= diff)
644 {
645 // will cast only when in range od spell
646 if (me->IsWithinDist(me->GetVictim(), 30))
647 {
648 //DoCastVictim(SPELL_CHAOS_BLAST, true);
649 int damage = 100;
650 me->CastCustomSpell(me->GetVictim(), SPELL_CHAOS_BLAST, &damage, NULL, NULL, false, NULL, NULL, me->GetGUID());
651 ChaosBlast_Timer = 3000;
652 }
653 } else ChaosBlast_Timer -= diff;
654
655 //Do NOT deal any melee damage to the target.
656 }
657 };
658};
659
661{
662public:
663 npc_greyheart_spellbinder() : CreatureScript("npc_greyheart_spellbinder") { }
664
666 {
667 return new npc_greyheart_spellbinderAI(creature);
668 }
669
671 {
673 {
674 instance = creature->GetInstanceScript();
675 leotherasGUID = 0;
676 AddedBanish = false;
677 }
678
680
682
685
687
689 {
690 Mindblast_Timer = std::rand() % 8000 + 3000;
691 Earthshock_Timer = std::rand() % 10000 + 5000;
692
693 if (instance)
694 {
697 if (leotheras && leotheras->IsAlive())
698 CAST_AI(boss_leotheras_the_blind::boss_leotheras_the_blindAI, leotheras->AI())->CheckChannelers(/*false*/);
699 }
700 }
701
703 {
704 me->InterruptNonMeleeSpells(false);
705 if (instance)
706 instance->SetData64(DATA_LEOTHERAS_EVENT_STARTER, who->GetGUID());
707 }
708
710 {
711 AddedBanish = false;
712 Reset();
713 }
714
716 {
717 if (!me->IsInCombat() && !me->GetCurrentSpell(CURRENT_CHANNELED_SPELL))
718 {
719 if (leotherasGUID)
720 {
722 if (leotheras && leotheras->IsAlive())
723 DoCast(leotheras, BANISH_BEAM);
724 }
725 }
726 }
727
729 {
730 if (instance)
731 {
732 if (!leotherasGUID)
734
735 if (!me->IsInCombat() && instance->GetData64(DATA_LEOTHERAS_EVENT_STARTER))
736 {
737 Unit* victim = NULL;
739 if (victim)
740 AttackStart(victim);
741 }
742 }
743
744 if (!UpdateVictim())
745 {
747 return;
748 }
749
751 {
753 return;
754 }
755
756 if (Mindblast_Timer <= diff)
757 {
758 Unit* target = NULL;
760
761 if (target)DoCast(target, SPELL_MINDBLAST);
762
763 Mindblast_Timer = std::rand() % 15000 + 10000;
764 } else Mindblast_Timer -= diff;
765
766 if (Earthshock_Timer <= diff)
767 {
768 Map* map = me->GetMap();
769 Map::PlayerList const &PlayerList = map->GetPlayers();
770 for (Map::PlayerList::const_iterator itr = PlayerList.begin(); itr != PlayerList.end(); ++itr)
771 {
772 if (Player* i_pl = itr->GetSource())
773 {
774 bool isCasting = false;
775 for (uint8 i = 0; i < CURRENT_MAX_SPELL; ++i)
776 if (i_pl->GetCurrentSpell(i))
777 isCasting = true;
778
779 if (isCasting)
780 {
782 break;
783 }
784 }
785 }
786 Earthshock_Timer = std::rand() % 15000 + 8000;
787 } else Earthshock_Timer -= diff;
789 }
790
791 void JustDied(Unit* /*killer*/) OVERRIDE { }
792 };
793};
794
#define M_PI
Definition Common.h:192
#define CREATURE_Z_ATTACK_RANGE
Definition Creature.h:422
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
@ TYPEID_PLAYER
Definition Object.h:55
@ TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT
Definition Object.h:71
@ TEMPSUMMON_DEAD_DESPAWN
Definition Object.h:74
#define CAST_AI(a, b)
@ IMMUNITY_MECHANIC
@ MECHANIC_BANISH
@ SPELL_SCHOOL_MASK_NORMAL
#define CURRENT_MAX_SPELL
Definition Unit.h:1115
@ CURRENT_CHANNELED_SPELL
Definition Unit.h:1110
@ MOVE_RUN
Definition Unit.h:556
@ DIRECT_DAMAGE
Definition Unit.h:614
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
@ UNIT_FIELD_VIRTUAL_ITEM_ID
@ SPELL_WHIRLWIND
@ SPELL_SHADOWBOLT
@ SPELL_DUAL_WIELD
#define SAY_DEATH
#define SAY_AGGRO
#define SPELL_BERSERK
@ SPELL_CONSUMING_MADNESS
@ SPELL_INSIDIOUS_WHISPER
void AddSC_boss_leotheras_the_blind()
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
virtual void EnterEvadeMode()
void DespawnOrUnsummon(uint32 msTimeToDespawn=0)
CreatureAI * AI() const
Definition Creature.h:483
CreatureScript(const char *name)
Definition Map.h:238
MapRefManager PlayerList
Definition Map.h:406
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
virtual uint64 GetGUID(int32=0) const
Definition UnitAI.h:130
virtual void SetGUID(uint64, int32=0)
Definition UnitAI.h:129
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
virtual void AttackStart(Unit *)
Definition UnitAI.cpp:16
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)
void RemoveAurasDueToSpell(uint32 spellId, uint64 casterGUID=0, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
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 isDead() const
Definition Unit.h:2040
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
@ DATA_LEOTHERAS
@ DATA_LEOTHERAS_EVENT_STARTER
@ DATA_LEOTHERASTHEBLINDEVENT
float GetPositionZ() const
Definition Object.h:330
float GetPositionX() const
Definition Object.h:328
void GetPosition(float &x, float &y) const
Definition Object.h:333
float GetPositionY() const
Definition Object.h:329
Creature * me
bool HealthBelowPct(uint32 pct) const
Creature * DoSpawnCreature(uint32 entry, float offsetX, float offsetY, float offsetZ, float angle, TempSummonType type, uint32 despawntime)
ScriptedAI(Creature *creature)
void DoModifyThreatPercent(Unit *unit, int32 pct)
void AttackStart(Unit *) 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 ==================
uint64 GetGUID(int32 id) const OVERRIDE
void SetGUID(uint64 guid, int32 id) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void DamageTaken(Unit *done_by, uint32 &damage) OVERRIDE