TrinityCore
Loading...
Searching...
No Matches
boss_shade_of_akama.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#include "ScriptMgr.h"
19#include "black_temple.h"
20#include "GridNotifiers.h"
21#include "InstanceScript.h"
22#include "Map.h"
23#include "MotionMaster.h"
24#include "ObjectAccessor.h"
25#include "PassiveAI.h"
26#include "ScriptedCreature.h"
27#include "ScriptedGossip.h"
28#include "SpellAuraEffects.h"
29#include "SpellScript.h"
30#include "TemporarySummon.h"
31
44
46{
47 // Akama
50 SPELL_FIXATE = 40607,
54 // Shade
55 SPELL_THREAT = 41602,
58 // Ashtongue Channeler
61 // Creature Spawner
65 // Ashtongue Defender
70 // Ashtongue Rogue
73 // Ashtongue Elementalist
76 // Ashtongue Spiritbinder
80};
81
88
99
139
146
148{
149 { 517.4877f, 400.7993f, 112.7837f },
150 { 468.4435f, 401.1062f, 118.5379f }
151};
152
154{
155 { 495.5628f, 462.7089f, 112.8169f, 4.1808090f },
156 { 498.3421f, 463.8384f, 112.8673f, 4.5634810f },
157 { 501.6708f, 463.8806f, 112.8673f, 3.7157850f },
158 { 532.4264f, 448.4718f, 112.8563f, 3.9813020f },
159 { 532.9113f, 451.6227f, 112.8671f, 4.6479530f },
160 { 532.8243f, 453.9475f, 112.8671f, 4.7032810f },
161 { 521.5317f, 402.3790f, 112.8671f, 3.1138120f },
162 { 521.9184f, 404.6848f, 112.8671f, 4.0787760f },
163 { 522.4290f, 406.5160f, 112.8671f, 3.3869470f },
164 { 521.0833f, 393.1852f, 112.8611f, 3.0750830f },
165 { 521.9014f, 395.6381f, 112.8671f, 4.0157140f },
166 { 522.2610f, 397.7423f, 112.8671f, 3.4417790f },
167 { 532.4565f, 345.3987f, 112.8585f, 1.7232640f },
168 { 532.5565f, 346.8792f, 112.8671f, 1.8325960f },
169 { 532.5491f, 348.6840f, 112.8671f, 0.2054047f },
170 { 501.4669f, 338.5967f, 112.8504f, 1.7038430f },
171 { 499.0937f, 337.9894f, 112.8673f, 1.8586250f },
172 { 496.8722f, 338.0152f, 112.8673f, 0.5428222f }
173};
174
176{
177 { 479.1884f, 434.8635f, 112.7838f },
178 { 479.7349f, 435.9843f, 112.7838f },
179 { 480.5328f, 436.8310f, 112.7838f },
180 { 493.1714f, 420.1136f, 112.7838f },
181 { 494.7830f, 417.4830f, 112.7838f },
182 { 492.9280f, 423.1891f, 112.7838f },
183 { 491.8618f, 403.2035f, 112.7838f },
184 { 491.7784f, 400.2046f, 112.7838f },
185 { 491.9451f, 406.2023f, 112.7838f },
186 { 488.3535f, 395.3652f, 112.7838f },
187 { 488.8324f, 392.3267f, 112.7838f },
188 { 489.2300f, 398.3135f, 112.7838f },
189 { 491.9286f, 383.0433f, 112.7838f },
190 { 491.1526f, 380.0966f, 112.7839f },
191 { 493.6747f, 385.5407f, 112.7838f },
192 { 476.2499f, 369.0865f, 112.7839f },
193 { 473.7637f, 367.8766f, 112.7839f },
194 { 478.8986f, 370.1895f, 112.7839f }
195};
196
197static float const MIDDLE_OF_ROOM = 400.0f;
198static float const FACE_THE_DOOR = 0.08726646f;
199static float const FACE_THE_PLATFORM = 3.118662f;
200
201// 22841 - Shade of Akama
203{
205 {
206 Initialize();
207 }
208
210 {
211 _spawners.clear();
212 _isInPhaseOne = true;
213 }
214
226
227 void EnterEvadeMode(EvadeReason /*why*/) override
228 {
229 events.Reset();
231
232 for (ObjectGuid spawnerGuid : _spawners)
233 if (Creature* spawner = ObjectAccessor::GetCreature(*me, spawnerGuid))
234 spawner->AI()->DoAction(ACTION_DESPAWN_ALL_SPAWNS);
235
237 }
238
239 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
240 {
241 if (spellInfo->Id == SPELL_AKAMA_SOUL_CHANNEL)
242 {
247 AttackStart(akama);
248 }
249
250 if (spellInfo->Id == SPELL_AKAMA_SOUL_RETRIEVE)
252 }
253
254 void MovementInform(uint32 motionType, uint32 /*pointId*/) override
255 {
256 if (_isInPhaseOne && motionType == CHASE_MOTION_TYPE)
257 {
258 _isInPhaseOne = false;
260 me->SetImmuneToPC(false);
261 me->SetWalk(false);
263
264 for (ObjectGuid spawnerGuid : _spawners)
265 if (Creature* spawner = ObjectAccessor::GetCreature(*me, spawnerGuid))
266 spawner->AI()->DoAction(ACTION_STOP_SPAWNING);
267 }
268 }
269
270 void JustDied(Unit* /*killer*/) override
271 {
273
275 akama->AI()->DoAction(ACTION_SHADE_OF_AKAMA_DEAD);
276
277 for (ObjectGuid spawnerGuid : _spawners)
278 if (Creature* spawner = ObjectAccessor::GetCreature(*me, spawnerGuid))
279 spawner->AI()->DoAction(ACTION_DESPAWN_ALL_SPAWNS);
280
281 events.Reset();
284 }
285
287 {
288 Map::PlayerList const& players = me->GetMap()->GetPlayers();
289 for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i)
290 if (Player* player = i->GetSource())
291 if (player->IsAlive() && !player->IsGameMaster() && IsInBoundary(player))
292 return;
293
295 }
296
297 void UpdateAI(uint32 diff) override
298 {
299 events.Update(diff);
300
301 if (!UpdateVictim())
302 return;
303
304 while (uint32 eventId = events.ExecuteEvent())
305 {
306 switch (eventId)
307 {
309 {
310 std::list<Creature*> SpawnerList;
312 for (Creature* spawner : SpawnerList)
313 _spawners.push_back(spawner->GetGUID());
314
315 break;
316 }
318 {
319 for (ObjectGuid summonGuid : summons)
320 if (Creature* channeler = ObjectAccessor::GetCreature(*me, summonGuid))
321 channeler->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
322
323 for (ObjectGuid spawnerGuid : _spawners)
324 if (Creature* spawner = ObjectAccessor::GetCreature(*me, spawnerGuid))
325 spawner->AI()->DoAction(ACTION_START_SPAWNING);
326
327 break;
328 }
329 case EVENT_ADD_THREAT:
331 events.Repeat(3s + 500ms);
332 break;
335 events.Repeat(10s);
336 break;
337 default:
338 break;
339 }
340 }
341
343 }
344
345private:
348};
349
350// 23191 - Akama
352{
354 {
355 Initialize();
356 _instance = creature->GetInstanceScript();
357 }
358
360 {
361 _isInCombat = false;
362 _hasYelledOnce = false;
363 _chosen.Clear();
365 _events.Reset();
366 }
367
377
378 void JustSummoned(Creature* summon) override
379 {
380 _summons.Summon(summon);
381 }
382
383 void EnterEvadeMode(EvadeReason /*why*/) override { }
384
385 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
386 {
387 if (spellInfo->Id == SPELL_THREAT && !_isInCombat)
388 {
389 _isInCombat = true;
390 me->SetWalk(false);
393 {
394 shade->RemoveAurasDueToSpell(SPELL_AKAMA_SOUL_CHANNEL);
395 AttackStart(shade);
398 }
399 }
400 }
401
402 void DamageTaken(Unit* /*who*/, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
403 {
404 if (me->HealthBelowPct(20) && !_hasYelledOnce)
405 {
406 _hasYelledOnce = true;
408 }
409 }
410
411 void DoAction(int32 actionId) override
412 {
413 if (actionId == ACTION_SHADE_OF_AKAMA_DEAD)
414 {
415 _isInCombat = false;
416 me->CombatStop(true);
418 me->SetWalk(true);
419 _events.Reset();
421 }
422 }
423
424 void MovementInform(uint32 motionType, uint32 pointId) override
425 {
426 if (motionType != POINT_MOTION_TYPE)
427 return;
428
429 if (pointId == AKAMA_CHANNEL_WAYPOINT)
431
432 else if (pointId == AKAMA_INTRO_WAYPOINT)
433 {
434 me->SetWalk(false);
436 }
437 }
438
440 {
441 for (uint8 i = 0; i < 18; i++)
442 {
444 {
445 summoned->SetWalk(true);
446 summoned->GetMotionMaster()->MovePoint(0, BrokenWP[i]);
447 if (i == 9) //On Sniffs, npc that Yell "Special" is the tenth to be created
448 _chosen = summoned->GetGUID();
449 }
450 }
451 }
452
453 void UpdateAI(uint32 diff) override
454 {
455 _events.Update(diff);
456
457 while (uint32 eventId = _events.ExecuteEvent())
458 {
459 switch (eventId)
460 {
465 me->SetWalk(true);
467 break;
473 break;
474 case EVENT_FIXATE:
476 break;
479 _events.Repeat(8s, 15s);
480 break;
483 _events.Repeat(3s, 7s);
484 break;
489 break;
495 break;
499 break;
503 break;
506 special->AI()->Talk(SAY_BROKEN_SPECIAL);
507
510 break;
513 break;
514 default:
515 break;
516 }
517 }
518
520 {
521 if (!UpdateVictim())
522 return;
523
525 }
526 }
527
528 void JustDied(Unit* /*killer*/) override
529 {
531 Talk(SAY_DEAD);
533 if (shade->IsAlive())
534 shade->AI()->EnterEvadeMode(EVADE_REASON_OTHER);
535 }
536
537 bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
538 {
539 if (gossipListId == 0)
540 {
541 CloseGossipMenuFor(player);
543 }
544 return false;
545 }
546
547private:
552 ObjectGuid _chosen; //Creature that should yell the speech special.
555};
556
557// 23421 - Ashtongue Channeler
559{
561 {
562 _instance = creature->GetInstanceScript();
563 }
564
565 void Reset() override
566 {
567 _scheduler.Schedule(2s, [this](TaskContext channel)
568 {
570 {
571 if (shade->HasUnitFlag(UNIT_FLAG_UNINTERACTIBLE))
572 DoCastSelf(SPELL_SHADE_SOUL_CHANNEL);
573
574 else
575 me->DespawnOrUnsummon(3s);
576 }
577
578 channel.Repeat(2s);
579 });
581 }
582
583 void UpdateAI(uint32 diff) override
584 {
585 _scheduler.Update(diff);
586 }
587
588private:
591};
592
593// 23210 - Creature Generator (Akama)
595{
597 {
598 Initialize();
599 }
600
602 {
603 _leftSide = false;
604 _events.Reset();
606 }
607
608 void Reset() override
609 {
610 Initialize();
611
613 _leftSide = true;
614 }
615
616 void JustSummoned(Creature* summon) override
617 {
618 _summons.Summon(summon);
619 }
620
621 void DoAction(int32 actionId) override
622 {
623 switch (actionId)
624 {
626 if (_leftSide)
627 {
630 }
631 else
632 {
635 }
636 break;
638 _events.Reset();
639 break;
641 _events.Reset();
643 break;
644 default:
645 break;
646 }
647 }
648
649 void UpdateAI(uint32 diff) override
650 {
651 _events.Update(diff);
652
653 while (uint32 eventId = _events.ExecuteEvent())
654 {
655 switch (eventId)
656 {
659 _events.Repeat(50s, 60s);
660 break;
663 _events.Repeat(30s, 35s);
664 break;
667 _events.Repeat(30s, 40s);
668 break;
669 default:
670 break;
671 }
672 }
673 }
674
675private:
679};
680
681// 23215 - Ashtongue Sorcerer
683{
685 {
686 Initialize();
687 _instance = creature->GetInstanceScript();
688 }
689
691 {
692 _switchToCombat = false;
693 _inBanish = false;
694 }
695
696 void Reset() override
697 {
699 {
700 if (shade->HasUnitFlag(UNIT_FLAG_UNINTERACTIBLE))
701 me->GetMotionMaster()->MovePoint(0, shade->GetPosition());
702
704 AttackStart(akama);
705 }
706 Initialize();
707 }
708
709 void JustDied(Unit* /*killer*/) override
710 {
712 }
713
714 void EnterEvadeMode(EvadeReason /*why*/) override { }
715 void JustEngagedWith(Unit* /*who*/) override { }
716
717 void AttackStart(Unit* who) override
718 {
719 if (!_switchToCombat)
720 return;
721
723 }
724
725 void MoveInLineOfSight(Unit* who) override
726 {
727 if (!_inBanish && who->GetGUID() == _instance->GetGuidData(DATA_SHADE_OF_AKAMA) && me->IsWithinDist(who, 20.0f, false))
728 {
729 _inBanish = true;
730 me->StopMoving();
732 me->GetMotionMaster()->MovePoint(1, me->GetPositionX() + frand(-8.0f, 8.0f), me->GetPositionY() + frand(-8.0f, 8.0f), me->GetPositionZ());
733
734 _scheduler.Schedule(1s + 500ms, [this](TaskContext sorcer_channel)
735 {
737 {
738 if (shade->HasUnitFlag(UNIT_FLAG_UNINTERACTIBLE))
739 {
740 me->SetFacingToObject(shade);
741 DoCastSelf(SPELL_SHADE_SOUL_CHANNEL);
742 sorcer_channel.Repeat(2s);
743 }
744 else
745 {
746 me->InterruptSpell(CURRENT_CHANNELED_SPELL);
747 _switchToCombat = true;
748 if (Creature* akama = _instance->GetCreature(DATA_AKAMA_SHADE))
749 AttackStart(akama);
750 }
751 }
752 });
753 }
754 }
755
756 void UpdateAI(uint32 diff) override
757 {
758 _scheduler.Update(diff);
759
760 if (me->HasUnitState(UNIT_STATE_CASTING))
761 return;
762
763 if (!UpdateVictim())
764 return;
765
766 DoMeleeAttackIfReady();
767 }
768
769private:
774};
775
776// 23216 - Ashtongue Defender
778{
780 {
781 _instance = creature->GetInstanceScript();
782 }
783
784 void Reset() override
785 {
787 AttackStart(akama);
788 }
789
790 void JustDied(Unit* /*killer*/) override
791 {
793 }
794
802
803 void UpdateAI(uint32 diff) override
804 {
805 if (!UpdateVictim())
806 return;
807
808 _events.Update(diff);
809
810 while (uint32 eventId = _events.ExecuteEvent())
811 {
812 switch (eventId)
813 {
816 _events.Repeat(20s, 25s);
817 break;
820 _events.Repeat(5s, 15s);
821 break;
824 _events.Repeat(10s, 20s);
825 break;
826 case EVENT_WINDFURY:
828 _events.Repeat(6s, 8s);
829 break;
830 default:
831 break;
832 }
833 }
834
836 }
837
838private:
841};
842
843// 23318 - Ashtongue Rogue
845{
847 {
848 _instance = creature->GetInstanceScript();
849 }
850
851 void Reset() override
852 {
854 AttackStart(akama);
855 }
856
857 void JustDied(Unit* /*killer*/) override
858 {
860 }
861
862 void JustEngagedWith(Unit* /*who*/) override
863 {
866 }
867
868 void EnterEvadeMode(EvadeReason /*why*/) override { }
869
870 void UpdateAI(uint32 diff) override
871 {
872 if (!UpdateVictim())
873 return;
874
875 _events.Update(diff);
876
877 while (uint32 eventId = _events.ExecuteEvent())
878 {
879 switch (eventId)
880 {
883 _events.Repeat(15s, 20s);
884 break;
885 case EVENT_EVISCERATE:
887 _events.Repeat(12s, 20s);
888 break;
889 default:
890 break;
891 }
892 }
893
895 }
896
897private:
900};
901
902// 23523 - Ashtongue Elementalist
904{
906 {
907 _instance = creature->GetInstanceScript();
908 }
909
910 void Reset() override
911 {
913 AttackStart(akama);
914 }
915
916 void JustDied(Unit* /*killer*/) override
917 {
919 }
920
926
927 void EnterEvadeMode(EvadeReason /*why*/) override { }
928
929 void UpdateAI(uint32 diff) override
930 {
931 if (!UpdateVictim())
932 return;
933
934 _events.Update(diff);
935
936 while (uint32 eventId = _events.ExecuteEvent())
937 {
938 switch (eventId)
939 {
942 _events.Repeat(15s, 20s);
943 break;
946 _events.Repeat(8s, 15s);
947 break;
948 default:
949 break;
950 }
951 }
952
954 }
955
956private:
959};
960
961// 23524 - Ashtongue Spiritbinder
963{
965 {
966 Initialize();
967 _instance = creature->GetInstanceScript();
968 }
969
971 {
972 _spiritMend = false;
973 _chainHeal = false;
974 }
975
976 void Reset() override
977 {
978 Initialize();
979
981 AttackStart(akama);
982 }
983
984 void JustDied(Unit* /*killer*/) override
985 {
987 }
988
989 void JustEngagedWith(Unit* /*who*/) override
990 {
992 }
993
994 void DamageTaken(Unit* /*who*/, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
995 {
996 if (!_spiritMend)
997 if (HealthBelowPct(30))
998 {
1000 _spiritMend = true;
1002 }
1003
1004 if (!_chainHeal)
1005 if (HealthBelowPct(50))
1006 {
1008 _chainHeal = true;
1010 }
1011
1012 }
1013
1014 void EnterEvadeMode(EvadeReason /*why*/) override { }
1015
1016 void UpdateAI(uint32 diff) override
1017 {
1018 _events.Update(diff);
1019
1020 while (uint32 eventId = _events.ExecuteEvent())
1021 {
1022 switch (eventId)
1023 {
1024 case EVENT_SPIRIT_HEAL:
1026 _events.Repeat(13s, 16s);
1027 break;
1029 _spiritMend = false;
1030 break;
1032 _chainHeal = false;
1033 break;
1034 default:
1035 break;
1036 }
1037 }
1038
1039 if (!UpdateVictim())
1040 return;
1041
1043 }
1044
1045private:
1050};
1051
1052// 23319 - Ashtongue Broken
1054{
1056 {
1058 }
1059
1060 void MovementInform(uint32 motionType, uint32 /*pointId*/) override
1061 {
1062 if (motionType != POINT_MOTION_TYPE)
1063 return;
1064
1066 me->SetFacingToObject(akama);
1067 }
1068
1069 void DoAction(int32 actionId) override
1070 {
1071 switch (actionId)
1072 {
1075 break;
1076 case ACTION_BROKEN_HAIL:
1079 break;
1082 break;
1083 default:
1084 break;
1085 }
1086 }
1087
1088private:
1090};
1091
1092// 40401 - Shade Soul Channel (serverside spell)
1112
1113// 40520 - Shade Soul Channel
1115{
1117
1118 void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
1119 {
1120 int32 const maxSlowEff = -99;
1121 if (aurEff->GetAmount() < maxSlowEff)
1122 if (AuraEffect* slowEff = GetEffect(EFFECT_0))
1123 slowEff->ChangeAmount(maxSlowEff);
1124 }
1125
1130};
1131
uint8_t uint8
Definition Define.h:135
int32_t int32
Definition Define.h:129
uint32_t uint32
Definition Define.h:133
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition Duration.h:24
@ IN_PROGRESS
@ DONE
@ CHASE_MOTION_TYPE
@ POINT_MOTION_TYPE
std::vector< ObjectGuid > GuidVector
Definition ObjectGuid.h:262
float frand(float min, float max)
Definition Random.cpp:55
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1128
void CloseGossipMenuFor(Player *player)
@ EFFECT_0
@ EMOTE_ONESHOT_ROAR
@ EMOTE_STATE_STUN
@ EMOTE_STATE_NONE
@ FACTION_MONSTER_SPAR_BUDDY
@ FACTION_ASHTONGUE_DEATHSWORN
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK
@ AURA_EFFECT_HANDLE_REAL
@ SPELL_AURA_DUMMY
@ SPELL_AURA_MOD_DECREASE_SPEED
#define AuraEffectApplyFn(F, I, N, M)
#define AuraEffectRemoveFn(F, I, N, M)
@ UNIT_STAND_STATE_KNEEL
Definition UnitDefines.h:42
@ UNIT_NPC_FLAG_GOSSIP
@ UNIT_FLAG_UNINTERACTIBLE
@ UNIT_STATE_CASTING
Definition Unit.h:235
DamageEffectType
Definition Unit.h:352
#define RegisterBlackTempleCreatureAI(ai_name)
@ DATA_AKAMA_SHADE
@ DATA_SHADE_OF_AKAMA
static float const MIDDLE_OF_ROOM
static float const FACE_THE_DOOR
Position const AkamaWP[2]
@ ACTION_BROKEN_EMOTE
@ ACTION_SHADE_OF_AKAMA_DEAD
@ ACTION_STOP_SPAWNING
@ ACTION_START_SPAWNING
@ ACTION_BROKEN_SPECIAL
@ ACTION_BROKEN_HAIL
@ ACTION_DESPAWN_ALL_SPAWNS
@ NPC_ASHTONGUE_BROKEN
@ NPC_ASHTONGUE_CHANNELER
@ NPC_CREATURE_SPAWNER_AKAMA
@ SAY_BROKEN_SPECIAL
@ SAY_LOW_HEALTH
@ SAY_BROKEN_HAIL
@ SAY_BROKEN_FREE_0
@ SAY_BROKEN_FREE_1
@ SAY_BROKEN_FREE_2
@ SUMMON_GROUP_RESET
@ AKAMA_INTRO_WAYPOINT
@ AKAMA_CHANNEL_WAYPOINT
static float const FACE_THE_PLATFORM
@ SPELL_WINDFURY
@ SPELL_SHIELD_BASH
@ SPELL_SUMMON_ASHTONGUE_DEFENDER
@ SPELL_SUMMON_ASHTONGUE_SORCERER
@ SPELL_EVISCERATE
@ SPELL_SHADE_SOUL_CHANNEL
@ SPELL_CHAIN_HEAL
@ SPELL_RAIN_OF_FIRE
@ SPELL_ASHTONGUE_WAVE_B
@ SPELL_DEBILITATING_POISON
@ SPELL_LIGHTNING_BOLT
@ SPELL_HEROIC_STRIKE
@ SPELL_SHADE_OF_AKAMA_TRIGGER
@ SPELL_STEALTH
@ SPELL_SPIRIT_MEND
@ SPELL_SHADE_SOUL_CHANNEL_2
@ SPELL_CHAIN_LIGHTNING
@ SPELL_DESTRUCTIVE_POISON
@ SPELL_DEBILITATING_STRIKE
@ SPELL_AKAMA_SOUL_EXPEL_CHANNEL
@ SPELL_AKAMA_SOUL_RETRIEVE
@ SPELL_AKAMA_SOUL_CHANNEL
@ SPELL_SPIRITBINDER_SPIRIT_HEAL
void AddSC_boss_shade_of_akama()
@ EVENT_CHAIN_LIGHTNING
@ EVENT_SHADE_START
@ EVENT_SPAWN_WAVE_B
@ EVENT_SHIELD_BASH
@ EVENT_SPIRIT_MEND_RESET
@ EVENT_ADD_THREAT
@ EVENT_START_SOUL_RETRIEVE
@ EVENT_SHADE_CHANNEL
@ EVENT_SUMMON_ASHTONGUE_DEFENDER
@ EVENT_EVISCERATE
@ EVENT_EVADE_CHECK
@ EVENT_SPIRIT_HEAL
@ EVENT_BROKEN_FREE_2
@ EVENT_BROKEN_FREE_1
@ EVENT_RAIN_OF_FIRE
@ EVENT_LIGHTNING_BOLT
@ EVENT_START_BROKEN_FREE
@ EVENT_DESTRUCTIVE_POISON
@ EVENT_INITIALIZE_SPAWNERS
@ EVENT_CHAIN_HEAL_RESET
@ EVENT_BROKEN_FREE_4
@ EVENT_HEROIC_STRIKE
@ EVENT_DEBILITATING_POISON
@ EVENT_BROKEN_FREE_3
@ EVENT_SUMMON_ASHTONGUE_SORCERER
@ EVENT_DEBILITATING_STRIKE
@ EVENT_START_CHANNELERS_AND_SPAWNERS
Position const BrokenWP[18]
Position const BrokenPos[18]
int32 GetAmount() const
HookList< EffectApplyHandler > AfterEffectRemove
HookList< EffectApplyHandler > AfterEffectApply
AuraEffect * GetEffect(uint8 effIndex) const
Unit * GetTarget() const
InstanceScript *const instance
void _DespawnAtEvade(Seconds delayToRespawn=30s, Creature *who=nullptr)
SummonList summons
EventMap events
@ EVADE_REASON_OTHER
Definition CreatureAI.h:98
@ EVADE_REASON_NO_HOSTILES
Definition CreatureAI.h:94
bool IsInBoundary(Position const *who=nullptr) const
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:82
void SetImmuneToPC(bool apply) override
Definition Creature.h:129
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
void Update(uint32 time)
Definition EventMap.h:67
void Repeat(Milliseconds time)
Definition EventMap.cpp:63
EventId ExecuteEvent()
Definition EventMap.cpp:73
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:36
void Reset()
Definition EventMap.cpp:21
virtual bool SetBossState(uint32 id, EncounterState state)
Creature * GetCreature(uint32 type)
virtual ObjectGuid GetGuidData(uint32 type) const override
EncounterState GetBossState(uint32 id) const
iterator end()
iterator begin()
PlayerList const & GetPlayers() const
Definition Map.h:448
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={})
void Clear()
Definition ObjectGuid.h:150
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
uint32 Id
Definition SpellInfo.h:289
void DespawnEntry(uint32 entry)
void Summon(Creature const *summon)
void DoAction(int32 info, Predicate &&predicate, uint16 max=0)
TaskContext & Repeat(std::chrono::duration< _Rep, _Period > const &duration)
TaskScheduler & Schedule(std::chrono::duration< _Rep, _Period > const &time, task_handler_t const &task)
TaskScheduler & Update(success_t const &callback=EmptyCallback)
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:54
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:241
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.cpp:166
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:106
Definition Unit.h:769
void SetFaction(uint32 faction) override
Definition Unit.h:974
void StopMoving(bool force=false)
Definition Unit.cpp:10312
MotionMaster * GetMotionMaster()
Definition Unit.h:1667
void RemoveNpcFlag(NPCFlags flags)
Definition Unit.h:1098
void SetFacingToObject(WorldObject const *object, bool force=true, uint32 movementId=EVENT_FACE)
Definition Unit.cpp:13259
void SetEmoteState(Emote emote)
Definition Unit.h:967
bool HealthBelowPct(int32 pct) const
Definition Unit.h:917
uint32 GetFaction() const override
Definition Unit.h:973
void RemoveAuraFromStack(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3800
void SetNpcFlag(NPCFlags flags)
Definition Unit.h:1097
bool SetWalk(bool enable)
Definition Unit.cpp:13268
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3784
void HandleEmoteCommand(Emote emoteId)
Definition Unit.cpp:1568
void SetFacingTo(float ori, bool force=true, uint32 movementId=EVENT_FACE)
Definition Unit.cpp:13250
void SetStandState(UnitStandStateType state)
Definition Unit.cpp:10363
void CombatStop(bool includingCast=false, bool mutualPvP=true)
Definition Unit.cpp:5691
void SetUnitFlag(UnitFlags flags)
Definition Unit.h:954
void RemoveUnitFlag(UnitFlags flags)
Definition Unit.h:955
Map * GetMap() const
Definition Object.h:449
InstanceScript * GetInstanceScript() const
Definition Object.cpp:1087
void GetCreatureListWithEntryInGrid(Container &creatureContainer, uint32 entry, float maxSearchRange=250.0f) const
Definition Object.cpp:3153
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 IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true) const
Definition Object.cpp:1187
void SummonCreatureGroup(uint8 group, std::list< TempSummon * > *list=nullptr)
Definition Object.cpp:2082
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
bool Validate(SpellInfo const *) override
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
PrepareAuraScript(spell_shade_soul_channel_serverside)
PrepareAuraScript(spell_shade_soul_channel)
void OnApply(AuraEffect const *aurEff, AuraEffectHandleModes)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
float GetPositionZ() const
Definition Position.h:81
float GetPositionX() const
Definition Position.h:79
float GetPositionY() const
Definition Position.h:80
void AttackStart(Unit *) override
bool HealthBelowPct(uint32 pct) const
void UpdateAI(uint32 diff) override
boss_shade_of_akama(Creature *creature)
void EnterEvadeMode(EvadeReason) override
void MovementInform(uint32 motionType, uint32) override
void JustDied(Unit *) override
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override
void JustDied(Unit *) override
InstanceScript * _instance
void MovementInform(uint32 motionType, uint32 pointId) override
void JustSummoned(Creature *summon) override
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override
bool OnGossipSelect(Player *player, uint32, uint32 gossipListId) override
npc_akama_shade(Creature *creature)
void DamageTaken(Unit *, uint32 &, DamageEffectType, SpellInfo const *) override
void DoAction(int32 actionId) override
void EnterEvadeMode(EvadeReason) override
DummyEntryCheckPredicate _pred
void UpdateAI(uint32 diff) override
void DoAction(int32 actionId) override
void MovementInform(uint32 motionType, uint32) override
npc_ashtongue_broken(Creature *creature)
npc_ashtongue_channeler(Creature *creature)
void UpdateAI(uint32 diff) override
npc_ashtongue_defender(Creature *creature)
void JustEngagedWith(Unit *) override
void UpdateAI(uint32 diff) override
void JustDied(Unit *) override
void JustEngagedWith(Unit *) override
void UpdateAI(uint32 diff) override
npc_ashtongue_elementalist(Creature *creature)
void EnterEvadeMode(EvadeReason) override
void JustEngagedWith(Unit *) override
void JustDied(Unit *) override
npc_ashtongue_rogue(Creature *creature)
void UpdateAI(uint32 diff) override
void EnterEvadeMode(EvadeReason) override
npc_ashtongue_sorcerer(Creature *creature)
void UpdateAI(uint32 diff) override
void JustDied(Unit *) override
void MoveInLineOfSight(Unit *who) override
void AttackStart(Unit *who) override
void JustEngagedWith(Unit *) override
void EnterEvadeMode(EvadeReason) override
void DamageTaken(Unit *, uint32 &, DamageEffectType, SpellInfo const *) override
void JustEngagedWith(Unit *) override
void UpdateAI(uint32 diff) override
npc_ashtongue_spiritbinder(Creature *creature)
void EnterEvadeMode(EvadeReason) override
void UpdateAI(uint32 diff) override
npc_creature_generator_akama(Creature *creature)
void DoAction(int32 actionId) override
void JustSummoned(Creature *summon) override