TrinityCore
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
109{
117
119{
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
174 void JustEngagedWith(Unit* who) override
175 {
176 _petsInCombat = false;
179
183
185 }
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 }
289
290 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
291 {
292 if (spellInfo->Id == SPELL_SUBBOSS_AGGRO_TRIGGER)
294 }
295
296 void SpellHitTarget(WorldObject* /*target*/, SpellInfo const* spellInfo) override
297 {
298 if (spellInfo->Id == SPELL_SUBBOSS_AGGRO_TRIGGER)
300 }
301
302 private:
306};
307
309{
310 npc_gatewatcher_petAI(Creature* creature, bool isWatcher) : ScriptedAI(creature), _instance(creature->GetInstanceScript()), _petGroup(0), _isWatcher(isWatcher) { }
311
312 virtual void _JustEngagedWith() = 0;
313 void JustEngagedWith(Unit* who) override
314 {
315 if (_isWatcher)
316 {
317 _isWatcher = false;
318 if (TempSummon* meSummon = me->ToTempSummon())
319 if (Creature* summoner = meSummon->GetSummonerCreatureBase())
320 summoner->AI()->DoAction(ACTION_WATCHER_ENGAGED);
321 }
322
324 {
325 std::list<Creature*> others;
326 me->GetCreatureListWithEntryInGrid(others, 0, 40.0f);
327 for (Creature* other : others)
328 if (other->AI()->GetData(DATA_PET_GROUP) == _petGroup)
329 {
330 other->SetReactState(REACT_AGGRESSIVE);
331 other->AI()->AttackStart(who);
332 }
333
334 if (TempSummon* meSummon = me->ToTempSummon())
335 if (Creature* summoner = meSummon->GetSummonerCreatureBase())
336 summoner->AI()->DoAction(ACTION_PET_ENGAGED);
337 }
341 }
342
343 void SetData(uint32 data, uint32 value) override
344 {
345 if (data == DATA_PET_GROUP)
346 {
347 _petGroup = value;
349 }
350 }
351
352 uint32 GetData(uint32 data) const override
353 {
354 if (data == DATA_PET_GROUP)
355 return _petGroup;
356 return 0;
357 }
358
359 void MoveInLineOfSight(Unit* who) override
360 {
362 {
364 return;
365 }
366
367 if (me->CanStartAttack(who, false) && me->IsWithinDistInMap(who, me->GetAttackDistance(who) + me->m_CombatDistance))
368 JustEngagedWith(who);
369 }
370
371 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
372 {
373 if (spellInfo->Id == SPELL_SUBBOSS_AGGRO_TRIGGER)
375 }
376
377 void EnterEvadeMode(EvadeReason why) override
378 {
379 if (TempSummon* meSummon = me->ToTempSummon())
380 {
381 if (Creature* summoner = meSummon->GetSummonerCreatureBase())
382 summoner->AI()->DoAction(ACTION_PET_EVADE);
383 else
385 return;
386 }
388 }
389
394};
395
397{
398 npc_watcher_gashra(Creature* creature) : npc_gatewatcher_petAI(creature, true) { }
399
400 void Reset() override
401 {
402 _events.Reset();
403 }
404
405 void _JustEngagedWith() override
406 {
410 }
411
412 void JustDied(Unit* /*killer*/) override
413 {
415 if (krikthir && krikthir->IsAlive())
416 krikthir->AI()->DoAction(ACTION_GASHRA_DIED);
417 }
418
419 void UpdateAI(uint32 diff) override
420 {
421 if (!UpdateVictim())
422 return;
423
424 _events.Update(diff);
425
427 return;
428
429 while (uint32 eventId = _events.ExecuteEvent())
430 {
431 switch (eventId)
432 {
433 case EVENT_ENRAGE:
436 break;
437 case EVENT_WEB_WRAP:
438 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f))
439 DoCast(target, SPELL_WEB_WRAP);
441 break;
445 break;
446 default:
447 break;
448 }
449
451 return;
452 }
453 }
454
455 private:
457};
458
460{
462 {
463 }
464
465 void Reset() override
466 {
467 _events.Reset();
468 }
469
470 void _JustEngagedWith() override
471 {
475 }
476
477 void JustDied(Unit* /*killer*/) override
478 {
480 if (krikthir && krikthir->IsAlive())
481 krikthir->AI()->DoAction(ACTION_NARJIL_DIED);
482 }
483
484 void UpdateAI(uint32 diff) override
485 {
486 if (!UpdateVictim())
487 return;
488
489 _events.Update(diff);
490
492 return;
493
494 while (uint32 eventId = _events.ExecuteEvent())
495 {
496 switch (eventId)
497 {
501 break;
502 case EVENT_WEB_WRAP:
503 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
504 DoCast(target, SPELL_WEB_WRAP);
506 break;
510 break;
511 default:
512 break;
513 }
514
516 return;
517 }
518 }
519
520 private:
522};
523
525{
527 {
528 }
529
530 void Reset() override
531 {
532 _events.Reset();
533 }
534
535 void _JustEngagedWith() override
536 {
540 }
541
542 void JustDied(Unit* /*killer*/) override
543 {
545 if (krikthir && krikthir->IsAlive())
546 krikthir->AI()->DoAction(ACTION_SILTHIK_DIED);
547 }
548
549 void UpdateAI(uint32 diff) override
550 {
551 if (!UpdateVictim())
552 return;
553
554 _events.Update(diff);
555
557 return;
558
559 while (uint32 eventId = _events.ExecuteEvent())
560 {
561 switch (eventId)
562 {
566 break;
567 case EVENT_WEB_WRAP:
568 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true))
569 DoCast(target, SPELL_WEB_WRAP);
571 break;
575 break;
576 default:
577 break;
578 }
579
581 return;
582 }
583 }
584
585 private:
587};
588
590{
591 npc_anub_ar_warrior(Creature* creature) : npc_gatewatcher_petAI(creature, false) { }
592
593 void Reset() override
594 {
595 _events.Reset();
596 }
597
598 void _JustEngagedWith() override
599 {
602 }
603
604 void UpdateAI(uint32 diff) override
605 {
606 if (!UpdateVictim())
607 return;
608
609 _events.Update(diff);
610
612 return;
613
614 while (uint32 eventId = _events.ExecuteEvent())
615 {
616 switch (eventId)
617 {
618 case EVENT_CLEAVE:
621 break;
622 case EVENT_STRIKE:
625 break;
626 default:
627 break;
628 }
629
631 return;
632 }
633 }
634};
635
637{
638 npc_anub_ar_skirmisher(Creature* creature) : npc_gatewatcher_petAI(creature, false) { }
639
640 void Reset() override
641 {
642 _events.Reset();
643 }
644
645 void _JustEngagedWith() override
646 {
649 }
650
651 void UpdateAI(uint32 diff) override
652 {
653 if (!UpdateVictim())
654 return;
655
656 _events.Update(diff);
657
659 return;
660
661 while (uint32 eventId = _events.ExecuteEvent())
662 {
663 switch (eventId)
664 {
666 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true))
667 DoCast(target, SPELL_CHARGE);
669 break;
670 case EVENT_BACKSTAB:
671 if (me->GetVictim() && me->GetVictim()->isInBack(me))
674 break;
675 default:
676 break;
677 }
678
680 return;
681 }
682 }
683
684 void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override
685 {
686 Unit* unitTarget = target->ToUnit();
687 if (!unitTarget)
688 return;
689
690 if (spellInfo->Id == SPELL_CHARGE)
691 DoCast(unitTarget, SPELL_FIXATE_TRIGGER);
692 }
693};
694
696{
698
699 void Reset() override
700 {
701 _events.Reset();
702 }
703
704 void _JustEngagedWith() override
705 {
708 }
709
710 void UpdateAI(uint32 diff) override
711 {
712 if (!UpdateVictim())
713 return;
714
715 _events.Update(diff);
716
718 return;
719
720 while (uint32 eventId = _events.ExecuteEvent())
721 {
722 switch (eventId)
723 {
725 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true))
726 DoCast(target, SPELL_SHADOW_BOLT);
728 break;
732 break;
733 default:
734 break;
735 }
736
738 return;
739 }
740 }
741};
742
744{
745 npc_skittering_swarmer(Creature* creature) : ScriptedAI(creature) { }
746
747 void InitializeAI() override
748 {
750 if (Creature* gatewatcher = me->GetInstanceScript()->GetCreature(DATA_KRIKTHIR))
751 {
752 if (Unit* target = gatewatcher->getAttackerForHelper())
753 AttackStart(target);
754 gatewatcher->AI()->JustSummoned(me);
755 }
756 }
757};
758
760{
761 npc_skittering_infector(Creature* creature) : ScriptedAI(creature) { }
762
763 void InitializeAI() override
764 {
766 if (Creature* gatewatcher = me->GetInstanceScript()->GetCreature(DATA_KRIKTHIR))
767 {
768 if (Unit* target = gatewatcher->getAttackerForHelper())
769 AttackStart(target);
770 gatewatcher->AI()->JustSummoned(me);
771 }
772 }
773
774 void JustDied(Unit* killer) override
775 {
777 ScriptedAI::JustDied(killer);
778 }
779};
780
782{
784
785 void JustDied(Unit* /*killer*/) override
786 {
787 if (TempSummon* meSummon = me->ToTempSummon())
788 if (Unit* summoner = meSummon->GetSummonerUnit())
789 summoner->RemoveAurasDueToSpell(SPELL_WEB_WRAP_WRAPPED);
790 }
791};
792
793// 52343 - Krik'Thir Subboss Aggro Trigger
795{
796 void HandleTargets(std::list<WorldObject*>& targetList)
797 {
798 // Remove any Watchers that are already in combat
799 auto it = targetList.begin();
800 while (it != targetList.end())
801 {
802 if (Creature* creature = (*it)->ToCreature())
803 if (creature->IsAlive() && !creature->IsInCombat())
804 {
805 ++it;
806 continue;
807 }
808 it = targetList.erase(it);
809 }
810
811 // Default to Krik'thir himself if he isn't engaged
812 WorldObject* target = nullptr;
813 if (GetCaster() && !GetCaster()->IsInCombat())
814 target = GetCaster();
815 // Unless there are Watchers that aren't engaged yet
816 if (!targetList.empty())
817 {
818 // If there are, pick one of them at random
820 }
821 // And hit only that one
822 targetList.clear();
823 if (target)
824 targetList.push_back(target);
825 }
826
827 void Register() override
828 {
830 }
831};
832
833// 52536 - Fixate Trigger
835{
836 bool Validate(SpellInfo const* /*spell*/) override
837 {
839 }
840
841 void HandleScript(SpellEffIndex /*effIndex*/)
842 {
843 if (Unit* target = GetHitUnit())
844 target->CastSpell(GetCaster(), SPELL_FIXATE_TRIGGERED, true);
845 }
846
847 void Register() override
848 {
850 }
851};
852
853// 52086 - Web Wrap
855{
856 bool Validate(SpellInfo const* /*spell*/) override
857 {
859 }
860
861 void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
862 {
863 if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
864 return;
865
866 if (Unit* target = GetTarget())
867 target->CastSpell(target, SPELL_WEB_WRAP_WRAPPED, true);
868 }
869
870 void Register() override
871 {
873 }
874};
875
877{
878 public:
879 achievement_watch_him_die() : AchievementCriteriaScript("achievement_watch_him_die") { }
880
881 bool OnCheck(Player* /*player*/, Unit* target) override
882 {
883 if (!target)
884 return false;
885
886 InstanceScript* instance = target->GetInstanceScript();
887 if (!instance)
888 return false;
889
891 {
892 if (Creature* watcher = instance->GetCreature(watcherData))
893 if (watcher->IsAlive())
894 continue;
895 return false;
896 }
897
898 return true;
899 }
900};
901
903{
905
909
913
917
921
923}
Actions
uint8_t uint8
Definition: Define.h:144
int32_t int32
Definition: Define.h:138
uint32_t uint32
Definition: Define.h:142
std::chrono::seconds Seconds
Seconds shorthand typedef.
Definition: Duration.h:32
@ DONE
@ TYPEID_PLAYER
Definition: ObjectGuid.h:41
Spells
Definition: PlayerAI.cpp:32
Milliseconds randtime(Milliseconds min, Milliseconds max)
Definition: Random.cpp:62
#define RegisterSpellScript(spell_script)
Definition: ScriptMgr.h:1369
SpellEffIndex
Definition: SharedDefines.h:29
@ EFFECT_0
Definition: SharedDefines.h:30
@ TARGET_UNIT_SRC_AREA_ENTRY
@ SPELL_EFFECT_SCRIPT_EFFECT
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ AURA_REMOVE_BY_EXPIRE
@ SPELL_AURA_MOD_ROOT
#define SpellEffectFn(F, I, N)
Definition: SpellScript.h:842
#define SpellObjectAreaTargetSelectFn(F, I, N)
Definition: SpellScript.h:864
#define AuraEffectRemoveFn(F, I, N, M)
Definition: SpellScript.h:2040
EvadeReason
Definition: UnitAICommon.h:30
@ REACT_PASSIVE
Definition: UnitDefines.h:506
@ REACT_AGGRESSIVE
Definition: UnitDefines.h:508
@ UNIT_STATE_CASTING
Definition: Unit.h:270
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:66
void AddSC_boss_krik_thir()
Yells
AuraApplication const * GetTargetApplication() const
Unit * GetTarget() const
HookList< EffectApplyHandler > OnEffectRemove
Definition: SpellScript.h:2035
InstanceScript *const instance
void JustEngagedWith(Unit *who) override
void _DespawnAtEvade(Seconds delayToRespawn=30s, Creature *who=nullptr)
SummonList summons
EventMap events
void Reset() override
void _JustDied()
virtual void MoveInLineOfSight(Unit *)
Definition: CreatureAI.cpp:122
virtual void JustEngagedWith(Unit *)
Definition: CreatureAI.h:99
void DoZoneInCombat()
Definition: CreatureAI.h:161
virtual void JustDied(Unit *)
Definition: CreatureAI.h:105
virtual void EnterEvadeMode(EvadeReason why=EvadeReason::Other)
Definition: CreatureAI.cpp:219
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
Definition: CreatureAI.cpp:56
virtual void JustAppeared()
Definition: CreatureAI.cpp:194
bool UpdateVictim()
Definition: CreatureAI.cpp:245
Creature *const me
Definition: CreatureAI.h:61
void SetCombatPulseDelay(uint32 delay)
Definition: Creature.h:345
float GetAttackDistance(Unit const *player) const
Definition: Creature.cpp:2153
bool HasReactState(ReactStates state) const
Definition: Creature.h:162
void SetReactState(ReactStates st)
Definition: Creature.h:160
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
Definition: Creature.cpp:2415
float m_CombatDistance
Definition: Creature.h:412
CreatureAI * AI() const
Definition: Creature.h:214
bool CanStartAttack(Unit const *u, bool force) const
Definition: Creature.cpp:2099
uint32 ExecuteEvent()
Definition: EventMap.cpp:73
void Update(uint32 time)
Definition: EventMap.h:56
void Repeat(Milliseconds time)
Definition: EventMap.cpp:63
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition: EventMap.cpp:36
void CancelEvent(uint32 eventId)
Definition: EventMap.cpp:131
void RescheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition: EventMap.cpp:52
void Reset()
Definition: EventMap.cpp:21
Creature * GetCreature(uint32 type)
EncounterState GetBossState(uint32 id) const
static Creature * ToCreature(Object *o)
Definition: Object.h:219
static Unit * ToUnit(Object *o)
Definition: Object.h:225
TypeID GetTypeId() const
Definition: Object.h:173
uint32 const Id
Definition: SpellInfo.h:325
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Definition: SpellScript.h:162
Unit * GetCaster() const
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
Definition: SpellScript.h:840
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
Definition: SpellScript.h:863
void DoZoneInCombat(uint32 entry=0)
virtual void DoAction(int32)
Definition: UnitAI.h:72
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.h:159
virtual void InitializeAI()
Definition: UnitAI.cpp:43
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.cpp:180
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition: UnitAI.cpp:79
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.h:161
SpellCastResult DoCast(uint32 spellId)
Definition: UnitAI.cpp:89
Definition: Unit.h:627
Unit * getAttackerForHelper() const
Definition: Unit.cpp:5647
bool IsAlive() const
Definition: Unit.h:1164
TempSummon * ToTempSummon()
Definition: Unit.h:1756
bool HealthBelowPct(int32 pct) const
Definition: Unit.h:780
Unit * GetVictim() const
Definition: Unit.h:715
bool HasUnitState(const uint32 f) const
Definition: Unit.h:732
bool IsInCombat() const
Definition: Unit.h:1043
InstanceScript * GetInstanceScript() const
Definition: Object.cpp:1042
void GetCreatureListWithEntryInGrid(Container &creatureContainer, uint32 entry, float maxSearchRange=250.0f) const
Definition: Object.cpp:3312
bool isInBack(WorldObject const *target, float arc=float(M_PI)) const
Definition: Object.cpp:1326
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition: Object.cpp:1147
void SummonCreatureGroup(uint8 group, std::list< TempSummon * > *list=nullptr)
Definition: Object.cpp:2131
virtual uint32 GetData(uint32) const
Definition: ZoneScript.h:91
virtual void SetData(uint32, uint32)
Definition: ZoneScript.h:92
bool OnCheck(Player *, Unit *target) override
bool Validate(SpellInfo const *) override
void HandleTargets(std::list< WorldObject * > &targetList)
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:109
void AttackStart(Unit *) override
== Triggered Actions Requested ==================
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
npc_watcher_gashra(Creature *creature)
npc_watcher_narjil(Creature *creature)
void UpdateAI(uint32 diff) override
void UpdateAI(uint32 diff) override