TrinityCore
Loading...
Searching...
No Matches
boss_krikthir_the_gatewatcher.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/*
19 * Comment: Find in the future best timers and the event is not implemented.
20 */
21
22#include "ScriptMgr.h"
23#include "azjol_nerub.h"
24#include "Containers.h"
25#include "InstanceScript.h"
26#include "PassiveAI.h"
27#include "ScriptedCreature.h"
28#include "SpellAuras.h"
29#include "SpellScript.h"
30#include "TemporarySummon.h"
31
33{
34 // Krik'thir the Gatewatcher
39
40 // Watchers - Shared
43
44 // Watcher Gashra
46 // Watcher Narjil
48 // Watcher Silthik
50
51 // Anubar Skirmisher
54
55 // Anubar Shadowcaster
58
59 // Anubar Warrior
62};
63
65{
66 // Krik'thir the Gatewatcher
68 SPELL_SWARM = 52440,
71 SPELL_FRENZY = 28747,
72
73 // Watchers - Shared
77
78 // Watcher Gashra
79 SPELL_ENRAGE = 52470,
80 // Watcher Narjil
82 // Watcher Silthik
84
85 // Anub'ar Warrior
86 SPELL_CLEAVE = 49806,
87 SPELL_STRIKE = 52532,
88
89 // Anub'ar Skirmisher
90 SPELL_CHARGE = 52538,
94
95 // Anub'ar Shadowcaster
98
99 // Skittering Infector
100 SPELL_ACID_SPLASH = 52446
102
104{
107
117
127
128struct boss_krik_thir : public BossAI
129{
131
133 {
135 return;
136
137 for (uint8 i = 1; i <= 3; ++i)
138 {
139 std::list<TempSummon*> adds;
140 me->SummonCreatureGroup(i, &adds);
141 for (TempSummon* add : adds)
142 add->AI()->SetData(DATA_PET_GROUP, i);
143 }
144 }
145
146 void Reset() override
147 {
149 _hadFrenzy = false;
150 _petsInCombat = false;
151 _watchersActive = 0;
153 }
154
155 void JustAppeared() override
156 {
158 SummonAdds();
159 }
160
161 void KilledUnit(Unit* victim) override
162 {
163 if (victim->GetTypeId() == TYPEID_PLAYER)
164 Talk(SAY_SLAY);
165 }
166
167 void JustDied(Unit* /*killer*/) override
168 {
169 summons.clear();
170 _JustDied();
172 }
173
186
187 void MoveInLineOfSight(Unit* who) override
188 {
190 {
192 return;
193 }
194
195 if (me->CanStartAttack(who, false) && me->IsWithinDistInMap(who, me->GetAttackDistance(who) + me->m_CombatDistance))
196 JustEngagedWith(who);
197 }
198
199 void EnterEvadeMode(EvadeReason /*why*/) override
200 {
203 }
204
205 void DoAction(int32 action) override
206 {
207 switch (action)
208 {
211 {
214 }
215 break;
219 if (!_watchersActive) // something is wrong
220 {
222 return;
223 }
224 if (!--_watchersActive) // if there are no watchers currently in combat...
225 events.RescheduleEvent(EVENT_SEND_GROUP, Seconds(5)); // ...send the next watcher after the targets sooner
226 break;
229 break;
231 if (_petsInCombat || me->IsInCombat())
232 break;
233 _petsInCombat = true;
236 break;
237 case ACTION_PET_EVADE:
239 break;
240 }
241 }
242
243 void UpdateAI(uint32 diff) override
244 {
245 if (!UpdateVictim() && !_petsInCombat)
246 return;
247
248 events.Update(diff);
249
251 return;
252
253 if (me->HealthBelowPct(10) && !_hadFrenzy)
254 {
255 _hadFrenzy = true;
257 }
258
259 while (uint32 eventId = events.ExecuteEvent())
260 {
261 switch (eventId)
262 {
263 case EVENT_SEND_GROUP:
265 events.Repeat(Seconds(70));
266 break;
267
268 case EVENT_SWARM:
271 break;
272
273 case EVENT_MIND_FLAY:
276 break;
277
278 case EVENT_FRENZY:
281 events.Repeat(Seconds(15));
282 break;
283 }
284
286 return;
287 }
288
290 }
291
292 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
293 {
294 if (spellInfo->Id == SPELL_SUBBOSS_AGGRO_TRIGGER)
296 }
297
298 void SpellHitTarget(WorldObject* /*target*/, SpellInfo const* spellInfo) override
299 {
300 if (spellInfo->Id == SPELL_SUBBOSS_AGGRO_TRIGGER)
302 }
303
304 private:
308};
309
311{
312 npc_gatewatcher_petAI(Creature* creature, bool isWatcher) : ScriptedAI(creature), _instance(creature->GetInstanceScript()), _petGroup(0), _isWatcher(isWatcher) { }
313
314 virtual void _JustEngagedWith() = 0;
315 void JustEngagedWith(Unit* who) override
316 {
317 if (_isWatcher)
318 {
319 _isWatcher = false;
320 if (TempSummon* meSummon = me->ToTempSummon())
321 if (Creature* summoner = meSummon->GetSummonerCreatureBase())
322 summoner->AI()->DoAction(ACTION_WATCHER_ENGAGED);
323 }
324
326 {
327 std::list<Creature*> others;
328 me->GetCreatureListWithEntryInGrid(others, 0, 40.0f);
329 for (Creature* other : others)
330 if (other->AI()->GetData(DATA_PET_GROUP) == _petGroup)
331 {
332 other->SetReactState(REACT_AGGRESSIVE);
333 other->AI()->AttackStart(who);
334 }
335
336 if (TempSummon* meSummon = me->ToTempSummon())
337 if (Creature* summoner = meSummon->GetSummonerCreatureBase())
338 summoner->AI()->DoAction(ACTION_PET_ENGAGED);
339 }
343 }
344
345 void SetData(uint32 data, uint32 value) override
346 {
347 if (data == DATA_PET_GROUP)
348 {
349 _petGroup = value;
351 }
352 }
353
354 uint32 GetData(uint32 data) const override
355 {
356 if (data == DATA_PET_GROUP)
357 return _petGroup;
358 return 0;
359 }
360
361 void MoveInLineOfSight(Unit* who) override
362 {
364 {
366 return;
367 }
368
369 if (me->CanStartAttack(who, false) && me->IsWithinDistInMap(who, me->GetAttackDistance(who) + me->m_CombatDistance))
370 JustEngagedWith(who);
371 }
372
373 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
374 {
375 if (spellInfo->Id == SPELL_SUBBOSS_AGGRO_TRIGGER)
377 }
378
379 void EnterEvadeMode(EvadeReason why) override
380 {
381 if (TempSummon* meSummon = me->ToTempSummon())
382 {
383 if (Creature* summoner = meSummon->GetSummonerCreatureBase())
384 summoner->AI()->DoAction(ACTION_PET_EVADE);
385 else
387 return;
388 }
390 }
391
396};
397
399{
400 npc_watcher_gashra(Creature* creature) : npc_gatewatcher_petAI(creature, true) { }
401
402 void Reset() override
403 {
404 _events.Reset();
405 }
406
413
414 void JustDied(Unit* /*killer*/) override
415 {
417 if (krikthir && krikthir->IsAlive())
418 krikthir->AI()->DoAction(ACTION_GASHRA_DIED);
419 }
420
421 void UpdateAI(uint32 diff) override
422 {
423 if (!UpdateVictim())
424 return;
425
426 _events.Update(diff);
427
429 return;
430
431 while (uint32 eventId = _events.ExecuteEvent())
432 {
433 switch (eventId)
434 {
435 case EVENT_ENRAGE:
438 break;
439 case EVENT_WEB_WRAP:
440 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f))
441 DoCast(target, SPELL_WEB_WRAP);
443 break;
447 break;
448 default:
449 break;
450 }
451
453 return;
454 }
455
457 }
458
459 private:
461};
462
464{
466 {
467 }
468
469 void Reset() override
470 {
471 _events.Reset();
472 }
473
480
481 void JustDied(Unit* /*killer*/) override
482 {
484 if (krikthir && krikthir->IsAlive())
485 krikthir->AI()->DoAction(ACTION_NARJIL_DIED);
486 }
487
488 void UpdateAI(uint32 diff) override
489 {
490 if (!UpdateVictim())
491 return;
492
493 _events.Update(diff);
494
496 return;
497
498 while (uint32 eventId = _events.ExecuteEvent())
499 {
500 switch (eventId)
501 {
505 break;
506 case EVENT_WEB_WRAP:
507 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
508 DoCast(target, SPELL_WEB_WRAP);
510 break;
514 break;
515 default:
516 break;
517 }
518
520 return;
521 }
522
524 }
525
526 private:
528};
529
531{
533 {
534 }
535
536 void Reset() override
537 {
538 _events.Reset();
539 }
540
547
548 void JustDied(Unit* /*killer*/) override
549 {
551 if (krikthir && krikthir->IsAlive())
552 krikthir->AI()->DoAction(ACTION_SILTHIK_DIED);
553 }
554
555 void UpdateAI(uint32 diff) override
556 {
557 if (!UpdateVictim())
558 return;
559
560 _events.Update(diff);
561
563 return;
564
565 while (uint32 eventId = _events.ExecuteEvent())
566 {
567 switch (eventId)
568 {
572 break;
573 case EVENT_WEB_WRAP:
574 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
575 DoCast(target, SPELL_WEB_WRAP);
577 break;
581 break;
582 default:
583 break;
584 }
585
587 return;
588 }
589
591 }
592
593 private:
595};
596
598{
599 npc_anub_ar_warrior(Creature* creature) : npc_gatewatcher_petAI(creature, false) { }
600
601 void Reset() override
602 {
603 _events.Reset();
604 }
605
611
612 void UpdateAI(uint32 diff) override
613 {
614 if (!UpdateVictim())
615 return;
616
617 _events.Update(diff);
618
620 return;
621
622 while (uint32 eventId = _events.ExecuteEvent())
623 {
624 switch (eventId)
625 {
626 case EVENT_CLEAVE:
629 break;
630 case EVENT_STRIKE:
633 break;
634 default:
635 break;
636 }
637
639 return;
640 }
641
643 }
644};
645
647{
648 npc_anub_ar_skirmisher(Creature* creature) : npc_gatewatcher_petAI(creature, false) { }
649
650 void Reset() override
651 {
652 _events.Reset();
653 }
654
660
661 void UpdateAI(uint32 diff) override
662 {
663 if (!UpdateVictim())
664 return;
665
666 _events.Update(diff);
667
669 return;
670
671 while (uint32 eventId = _events.ExecuteEvent())
672 {
673 switch (eventId)
674 {
676 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true))
677 DoCast(target, SPELL_CHARGE);
679 break;
680 case EVENT_BACKSTAB:
681 if (me->GetVictim() && me->GetVictim()->isInBack(me))
684 break;
685 default:
686 break;
687 }
688
690 return;
691 }
692
694 }
695
696 void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override
697 {
698 Unit* unitTarget = target->ToUnit();
699 if (!unitTarget)
700 return;
701
702 if (spellInfo->Id == SPELL_CHARGE)
703 DoCast(unitTarget, SPELL_FIXATE_TRIGGER);
704 }
705};
706
708{
710
711 void Reset() override
712 {
713 _events.Reset();
714 }
715
721
722 void UpdateAI(uint32 diff) override
723 {
724 if (!UpdateVictim())
725 return;
726
727 _events.Update(diff);
728
730 return;
731
732 while (uint32 eventId = _events.ExecuteEvent())
733 {
734 switch (eventId)
735 {
737 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true))
738 DoCast(target, SPELL_SHADOW_BOLT);
740 break;
744 break;
745 default:
746 break;
747 }
748
750 return;
751 }
752
754 }
755};
756
758{
759 npc_skittering_swarmer(Creature* creature) : ScriptedAI(creature) { }
760
761 void InitializeAI() override
762 {
764 if (Creature* gatewatcher = me->GetInstanceScript()->GetCreature(DATA_KRIKTHIR))
765 {
766 if (Unit* target = gatewatcher->getAttackerForHelper())
767 AttackStart(target);
768 gatewatcher->AI()->JustSummoned(me);
769 }
770 }
771};
772
774{
775 npc_skittering_infector(Creature* creature) : ScriptedAI(creature) { }
776
777 void InitializeAI() override
778 {
780 if (Creature* gatewatcher = me->GetInstanceScript()->GetCreature(DATA_KRIKTHIR))
781 {
782 if (Unit* target = gatewatcher->getAttackerForHelper())
783 AttackStart(target);
784 gatewatcher->AI()->JustSummoned(me);
785 }
786 }
787
788 void JustDied(Unit* killer) override
789 {
791 ScriptedAI::JustDied(killer);
792 }
793};
794
796{
798
799 void JustDied(Unit* /*killer*/) override
800 {
801 if (TempSummon* meSummon = me->ToTempSummon())
802 if (Unit* summoner = meSummon->GetSummonerUnit())
803 summoner->RemoveAurasDueToSpell(SPELL_WEB_WRAP_WRAPPED);
804 }
805};
806
807// 52343 - Krik'Thir Subboss Aggro Trigger
809{
811
812 void HandleTargets(std::list<WorldObject*>& targetList)
813 {
814 // Remove any Watchers that are already in combat
815 auto it = targetList.begin();
816 while (it != targetList.end())
817 {
818 if (Creature* creature = (*it)->ToCreature())
819 if (creature->IsAlive() && !creature->IsInCombat())
820 {
821 ++it;
822 continue;
823 }
824 it = targetList.erase(it);
825 }
826
827 // Default to Krik'thir himself if he isn't engaged
828 WorldObject* target = nullptr;
829 if (GetCaster() && !GetCaster()->IsInCombat())
830 target = GetCaster();
831 // Unless there are Watchers that aren't engaged yet
832 if (!targetList.empty())
833 {
834 // If there are, pick one of them at random
836 }
837 // And hit only that one
838 targetList.clear();
839 if (target)
840 targetList.push_back(target);
841 }
842
847};
848
849// 52536 - Fixate Trigger
851{
853
854 bool Validate(SpellInfo const* /*spell*/) override
855 {
857 }
858
859 void HandleScript(SpellEffIndex /*effIndex*/)
860 {
861 if (Unit* target = GetHitUnit())
862 target->CastSpell(GetCaster(), SPELL_FIXATE_TRIGGERED, true);
863 }
864
869};
870
871// 52086 - Web Wrap
873{
875
876 bool Validate(SpellInfo const* /*spell*/) override
877 {
879 }
880
881 void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
882 {
883 if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
884 return;
885
886 if (Unit* target = GetTarget())
887 target->CastSpell(target, SPELL_WEB_WRAP_WRAPPED, true);
888 }
889
894};
895
897{
898 public:
899 achievement_watch_him_die() : AchievementCriteriaScript("achievement_watch_him_die") { }
900
901 bool OnCheck(Player* /*player*/, Unit* target) override
902 {
903 if (!target)
904 return false;
905
906 InstanceScript* instance = target->GetInstanceScript();
907 if (!instance)
908 return false;
909
911 {
912 if (Creature* watcher = instance->GetCreature(watcherData))
913 if (watcher->IsAlive())
914 continue;
915 return false;
916 }
917
918 return true;
919 }
920};
921
Actions
uint8_t uint8
Definition Define.h:135
int32_t int32
Definition Define.h:129
uint32_t uint32
Definition Define.h:133
std::chrono::seconds Seconds
Seconds shorthand typedef.
Definition Duration.h:27
@ DONE
@ TYPEID_PLAYER
Definition ObjectGuid.h:39
Spells
Definition PlayerAI.cpp:32
Milliseconds randtime(Milliseconds min, Milliseconds max)
Definition Random.cpp:62
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1128
SpellEffIndex
@ EFFECT_0
@ SPELL_EFFECT_SCRIPT_EFFECT
@ TARGET_UNIT_SRC_AREA_ENTRY
@ AURA_REMOVE_BY_EXPIRE
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ SPELL_AURA_MOD_ROOT
#define SpellEffectFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
#define AuraEffectRemoveFn(F, I, N, M)
@ REACT_PASSIVE
@ REACT_AGGRESSIVE
@ UNIT_STATE_CASTING
Definition Unit.h:235
ANDataTypes
Definition azjol_nerub.h:29
@ DATA_KRIKTHIR
Definition azjol_nerub.h:31
@ DATA_GATEWATCHER_GREET
Definition azjol_nerub.h:41
@ DATA_WATCHER_SILTHIK
Definition azjol_nerub.h:38
@ DATA_WATCHER_GASHRA
Definition azjol_nerub.h:37
@ DATA_WATCHER_NARJIL
Definition azjol_nerub.h:36
#define RegisterAzjolNerubCreatureAI(ai_name)
Definition azjol_nerub.h:75
@ ACTION_GATEWATCHER_GREET
Definition azjol_nerub.h:58
void AddSC_boss_krik_thir()
Data
Yells
AuraApplication const * GetTargetApplication() const
Unit * GetTarget() const
HookList< EffectApplyHandler > OnEffectRemove
InstanceScript *const instance
void JustEngagedWith(Unit *who) override
void _DespawnAtEvade(Seconds delayToRespawn=30s, Creature *who=nullptr)
SummonList summons
EventMap events
void Reset() override
virtual void MoveInLineOfSight(Unit *)
virtual void JustEngagedWith(Unit *)
Definition CreatureAI.h:127
@ EVADE_REASON_OTHER
Definition CreatureAI.h:98
virtual void JustDied(Unit *)
Definition CreatureAI.h:130
void DoZoneInCombat(Creature *creature=nullptr)
virtual void JustAppeared()
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:82
virtual void EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
void SetCombatPulseDelay(uint32 delay)
Definition Creature.h:269
float GetAttackDistance(Unit const *player) const
bool HasReactState(ReactStates state) const
Definition Creature.h:121
void SetReactState(ReactStates st)
Definition Creature.h:119
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
float m_CombatDistance
Definition Creature.h:335
CreatureAI * AI() const
Definition Creature.h:154
bool CanStartAttack(Unit const *u, bool force) const
void Update(uint32 time)
Definition EventMap.h:67
void Repeat(Milliseconds time)
Definition EventMap.cpp:63
EventId ExecuteEvent()
Definition EventMap.cpp:73
void RescheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:52
void CancelEvent(EventId eventId)
Definition EventMap.cpp:151
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:36
void Reset()
Definition EventMap.cpp:21
Creature * GetCreature(uint32 type)
EncounterState GetBossState(uint32 id) const
static Creature * ToCreature(Object *o)
Definition Object.h:186
static Unit * ToUnit(Object *o)
Definition Object.h:192
TypeID GetTypeId() const
Definition Object.h:93
uint32 Id
Definition SpellInfo.h:289
Unit * GetCaster() const
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
void DoZoneInCombat(uint32 entry=0)
virtual void DoAction(int32)
Definition UnitAI.h:154
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:54
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:241
virtual void InitializeAI()
Definition UnitAI.cpp:36
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.cpp:166
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition UnitAI.cpp:96
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:243
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:106
Definition Unit.h:769
Unit * getAttackerForHelper() const
Definition Unit.cpp:5512
bool IsAlive() const
Definition Unit.h:1234
TempSummon * ToTempSummon()
Definition Unit.h:1794
bool HealthBelowPct(int32 pct) const
Definition Unit.h:917
Unit * GetVictim() const
Definition Unit.h:859
bool HasUnitState(const uint32 f) const
Definition Unit.h:876
bool IsInCombat() const
Definition Unit.h:1144
InstanceScript * GetInstanceScript() const
Definition Object.cpp:1087
void GetCreatureListWithEntryInGrid(Container &creatureContainer, uint32 entry, float maxSearchRange=250.0f) const
Definition Object.cpp:3153
bool isInBack(WorldObject const *target, float arc=float(M_PI)) const
Definition Object.cpp:1371
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition Object.cpp:1192
void SummonCreatureGroup(uint8 group, std::list< TempSummon * > *list=nullptr)
Definition Object.cpp:2082
virtual uint32 GetData(uint32) const
Definition ZoneScript.h:55
virtual void SetData(uint32, uint32)
Definition ZoneScript.h:56
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
bool OnCheck(Player *, Unit *target) override
bool Validate(SpellInfo const *) override
PrepareSpellScript(spell_anub_ar_skirmisher_fixate)
void HandleTargets(std::list< WorldObject * > &targetList)
PrepareSpellScript(spell_gatewatcher_subboss_trigger)
PrepareAuraScript(spell_gatewatcher_web_wrap)
bool Validate(SpellInfo const *) override
void HandleEffectRemove(AuraEffect const *, AuraEffectHandleModes)
auto SelectRandomContainerElement(C const &container) -> typename std::add_const< decltype(*std::begin(container))>::type &
Definition Containers.h:108
void AttackStart(Unit *) override
void EnterEvadeMode(EvadeReason) override
void MoveInLineOfSight(Unit *who) override
void UpdateAI(uint32 diff) override
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override
void KilledUnit(Unit *victim) override
void JustDied(Unit *) override
void JustEngagedWith(Unit *who) override
void SpellHitTarget(WorldObject *, SpellInfo const *spellInfo) override
void DoAction(int32 action) override
boss_krik_thir(Creature *creature)
void UpdateAI(uint32 diff) override
void SpellHitTarget(WorldObject *target, SpellInfo const *spellInfo) override
void UpdateAI(uint32 diff) override
void JustEngagedWith(Unit *who) override
void EnterEvadeMode(EvadeReason why) override
npc_gatewatcher_petAI(Creature *creature, bool isWatcher)
void SetData(uint32 data, uint32 value) override
virtual void _JustEngagedWith()=0
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override
void MoveInLineOfSight(Unit *who) override
uint32 GetData(uint32 data) const override
void JustDied(Unit *killer) override
void UpdateAI(uint32 diff) override
void UpdateAI(uint32 diff) override
void UpdateAI(uint32 diff) override