TrinityCore
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 "InstanceScript.h"
21#include "Map.h"
22#include "MotionMaster.h"
23#include "ObjectAccessor.h"
24#include "PassiveAI.h"
25#include "Player.h"
26#include "ScriptedCreature.h"
27#include "ScriptedGossip.h"
28#include "SpellAuraEffects.h"
29#include "SpellScript.h"
30#include "TemporarySummon.h"
31
32enum Says
33{
34 // Akama
40 // Ashtongue Broken
43};
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
83{
87};
88
90{
98};
99
101{
102 // Akama
115 // Shade of Akama
119 // Creature spawner
123 // Ashtongue Defender
128 // Ashtongue Rogue
131 // Ashtongue Elementalist
134 // Ashtongue Spiritbinder
139
141{
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
202{
204 {
205 Initialize();
206 }
207
209 {
210 _spawners.clear();
211 _isInPhaseOne = true;
212 }
213
214 void Reset() override
215 {
216 _Reset();
217 Initialize();
218 me->SetImmuneToPC(true);
219 me->SetUninteractible(true);
221 me->SetWalk(true);
224 }
225
226 void EnterEvadeMode(EvadeReason /*why*/) override
227 {
228 events.Reset();
230
231 for (ObjectGuid spawnerGuid : _spawners)
232 if (Creature* spawner = ObjectAccessor::GetCreature(*me, spawnerGuid))
233 spawner->AI()->DoAction(ACTION_DESPAWN_ALL_SPAWNS);
234
236 }
237
238 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
239 {
240 if (spellInfo->Id == SPELL_AKAMA_SOUL_CHANNEL)
241 {
246 AttackStart(akama);
247 }
248
249 if (spellInfo->Id == SPELL_AKAMA_SOUL_RETRIEVE)
251 }
252
253 void MovementInform(uint32 motionType, uint32 /*pointId*/) override
254 {
255 if (_isInPhaseOne && motionType == CHASE_MOTION_TYPE)
256 {
257 _isInPhaseOne = false;
258 me->SetUninteractible(false);
259 me->SetImmuneToPC(false);
260 me->SetWalk(false);
262
263 for (ObjectGuid spawnerGuid : _spawners)
264 if (Creature* spawner = ObjectAccessor::GetCreature(*me, spawnerGuid))
265 spawner->AI()->DoAction(ACTION_STOP_SPAWNING);
266 }
267 }
268
269 void JustDied(Unit* /*killer*/) override
270 {
272
274 akama->AI()->DoAction(ACTION_SHADE_OF_AKAMA_DEAD);
275
276 for (ObjectGuid spawnerGuid : _spawners)
277 if (Creature* spawner = ObjectAccessor::GetCreature(*me, spawnerGuid))
278 spawner->AI()->DoAction(ACTION_DESPAWN_ALL_SPAWNS);
279
280 events.Reset();
283 }
284
286 {
287 Map::PlayerList const& players = me->GetMap()->GetPlayers();
288 for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i)
289 if (Player* player = i->GetSource())
290 if (player->IsAlive() && !player->IsGameMaster() && IsInBoundary(player))
291 return;
292
294 }
295
296 void UpdateAI(uint32 diff) override
297 {
298 events.Update(diff);
299
300 if (!UpdateVictim())
301 return;
302
303 while (uint32 eventId = events.ExecuteEvent())
304 {
305 switch (eventId)
306 {
308 {
309 std::list<Creature*> SpawnerList;
311 for (Creature* spawner : SpawnerList)
312 _spawners.push_back(spawner->GetGUID());
313
314 break;
315 }
317 {
318 for (ObjectGuid summonGuid : summons)
319 if (Creature* channeler = ObjectAccessor::GetCreature(*me, summonGuid))
320 channeler->SetUninteractible(false);
321
322 for (ObjectGuid spawnerGuid : _spawners)
323 if (Creature* spawner = ObjectAccessor::GetCreature(*me, spawnerGuid))
324 spawner->AI()->DoAction(ACTION_START_SPAWNING);
325
326 break;
327 }
328 case EVENT_ADD_THREAT:
331 break;
334 events.Repeat(Seconds(10));
335 break;
336 default:
337 break;
338 }
339 }
340 }
341
342private:
345};
346
348{
350 {
351 Initialize();
352 _instance = creature->GetInstanceScript();
353 }
354
356 {
357 _isInCombat = false;
358 _hasYelledOnce = false;
359 _chosen.Clear();
361 _events.Reset();
362 }
363
364 void Reset() override
365 {
366 Initialize();
369
372 }
373
374 void JustSummoned(Creature* summon) override
375 {
376 _summons.Summon(summon);
377 }
378
379 void EnterEvadeMode(EvadeReason /*why*/) override { }
380
381 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
382 {
383 if (spellInfo->Id == SPELL_THREAT && !_isInCombat)
384 {
385 _isInCombat = true;
386 me->SetWalk(false);
389 {
390 shade->RemoveAurasDueToSpell(SPELL_AKAMA_SOUL_CHANNEL);
391 AttackStart(shade);
394 }
395 }
396 }
397
398 void DamageTaken(Unit* /*who*/, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
399 {
400 if (me->HealthBelowPct(20) && !_hasYelledOnce)
401 {
402 _hasYelledOnce = true;
404 }
405 }
406
407 void DoAction(int32 actionId) override
408 {
409 if (actionId == ACTION_SHADE_OF_AKAMA_DEAD)
410 {
411 _isInCombat = false;
412 me->CombatStop(true);
414 me->SetWalk(true);
415 _events.Reset();
417 }
418 }
419
420 void MovementInform(uint32 motionType, uint32 pointId) override
421 {
422 if (motionType != POINT_MOTION_TYPE)
423 return;
424
425 if (pointId == AKAMA_CHANNEL_WAYPOINT)
427
428 else if (pointId == AKAMA_INTRO_WAYPOINT)
429 {
430 me->SetWalk(false);
432 }
433 }
434
436 {
437 for (uint8 i = 0; i < 18; i++)
438 {
440 {
441 summoned->SetWalk(true);
442 summoned->GetMotionMaster()->MovePoint(0, BrokenWP[i]);
443 if (i == 9) //On Sniffs, npc that Yell "Special" is the tenth to be created
444 _chosen = summoned->GetGUID();
445 }
446 }
447 }
448
449 void UpdateAI(uint32 diff) override
450 {
451 _events.Update(diff);
452
453 while (uint32 eventId = _events.ExecuteEvent())
454 {
455 switch (eventId)
456 {
461 me->SetWalk(true);
463 break;
469 break;
470 case EVENT_FIXATE:
472 break;
475 _events.Repeat(Seconds(8), Seconds(15));
476 break;
480 break;
485 break;
491 break;
495 break;
499 break;
502 special->AI()->Talk(SAY_BROKEN_SPECIAL);
503
506 break;
509 break;
510 default:
511 break;
512 }
513 }
514
516 {
517 if (!UpdateVictim())
518 return;
519 }
520 }
521
522 void JustDied(Unit* /*killer*/) override
523 {
525 Talk(SAY_DEAD);
527 if (shade->IsAlive())
528 shade->AI()->EnterEvadeMode(EvadeReason::Other);
529 }
530
531 bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
532 {
533 if (gossipListId == 0)
534 {
535 CloseGossipMenuFor(player);
537 }
538 return false;
539 }
540
541private:
546 ObjectGuid _chosen; //Creature that should yell the speech special.
549};
550
552{
554 {
555 _instance = creature->GetInstanceScript();
556 }
557
558 void Reset() override
559 {
560 _scheduler.Schedule(Seconds(2), [this](TaskContext channel)
561 {
563 {
564 if (shade->IsUninteractible())
565 DoCastSelf(SPELL_SHADE_SOUL_CHANNEL);
566
567 else
568 me->DespawnOrUnsummon(Seconds(3));
569 }
570
571 channel.Repeat(Seconds(2));
572 });
573 me->SetUninteractible(true);
574 }
575
576 void UpdateAI(uint32 diff) override
577 {
578 _scheduler.Update(diff);
579 }
580
581private:
584};
585
587{
589 {
590 Initialize();
591 }
592
594 {
595 _leftSide = false;
596 _events.Reset();
598 }
599
600 void Reset() override
601 {
602 Initialize();
603
605 _leftSide = true;
606 }
607
608 void JustSummoned(Creature* summon) override
609 {
610 _summons.Summon(summon);
611 }
612
613 void DoAction(int32 actionId) override
614 {
615 switch (actionId)
616 {
618 if (_leftSide)
619 {
622 }
623 else
624 {
627 }
628 break;
630 _events.Reset();
631 break;
633 _events.Reset();
635 break;
636 default:
637 break;
638 }
639 }
640
641 void UpdateAI(uint32 diff) override
642 {
643 _events.Update(diff);
644
645 while (uint32 eventId = _events.ExecuteEvent())
646 {
647 switch (eventId)
648 {
651 _events.Repeat(Seconds(50), Seconds(60));
652 break;
655 _events.Repeat(Seconds(30), Seconds(35));
656 break;
659 _events.Repeat(Seconds(30), Seconds(40));
660 break;
661 default:
662 break;
663 }
664 }
665 }
666
667private:
671};
672
674{
676 {
677 Initialize();
678 _instance = creature->GetInstanceScript();
679 }
680
682 {
683 _switchToCombat = false;
684 _inBanish = false;
685 }
686
687 void Reset() override
688 {
690 {
691 if (shade->IsUninteractible())
692 me->GetMotionMaster()->MovePoint(0, shade->GetPosition());
693
695 AttackStart(akama);
696 }
697 Initialize();
698 }
699
700 void JustDied(Unit* /*killer*/) override
701 {
703 }
704
705 void EnterEvadeMode(EvadeReason /*why*/) override { }
706 void JustEngagedWith(Unit* /*who*/) override { }
707
708 void AttackStart(Unit* who) override
709 {
710 if (!_switchToCombat)
711 return;
712
714 }
715
716 void MoveInLineOfSight(Unit* who) override
717 {
718 if (!_inBanish && who->GetGUID() == _instance->GetGuidData(DATA_SHADE_OF_AKAMA) && me->IsWithinDist(who, 20.0f, false))
719 {
720 _inBanish = true;
721 me->StopMoving();
723 me->GetMotionMaster()->MovePoint(1, me->GetPositionX() + frand(-8.0f, 8.0f), me->GetPositionY() + frand(-8.0f, 8.0f), me->GetPositionZ());
724
725 _scheduler.Schedule(Seconds(1) + Milliseconds(500), [this](TaskContext sorcer_channel)
726 {
728 {
729 if (shade->IsUninteractible())
730 {
731 me->SetFacingToObject(shade);
732 DoCastSelf(SPELL_SHADE_SOUL_CHANNEL);
733 sorcer_channel.Repeat(Seconds(2));
734 }
735 else
736 {
737 me->InterruptSpell(CURRENT_CHANNELED_SPELL);
738 _switchToCombat = true;
739 if (Creature* akama = _instance->GetCreature(DATA_AKAMA_SHADE))
740 AttackStart(akama);
741 }
742 }
743 });
744 }
745 }
746
747 void UpdateAI(uint32 diff) override
748 {
749 _scheduler.Update(diff);
750
751 if (me->HasUnitState(UNIT_STATE_CASTING))
752 return;
753
754 if (!UpdateVictim())
755 return;
756 }
757
758private:
763};
764
766{
768 {
769 _instance = creature->GetInstanceScript();
770 }
771
772 void Reset() override
773 {
775 AttackStart(akama);
776 }
777
778 void JustDied(Unit* /*killer*/) override
779 {
781 }
782
783 void JustEngagedWith(Unit* /*who*/) override
784 {
789 }
790
791 void UpdateAI(uint32 diff) override
792 {
793 if (!UpdateVictim())
794 return;
795
796 _events.Update(diff);
797
798 while (uint32 eventId = _events.ExecuteEvent())
799 {
800 switch (eventId)
801 {
804 _events.Repeat(Seconds(20), Seconds(25));
805 break;
808 _events.Repeat(Seconds(5), Seconds(15));
809 break;
812 _events.Repeat(Seconds(10), Seconds(20));
813 break;
814 case EVENT_WINDFURY:
817 break;
818 default:
819 break;
820 }
821 }
822 }
823
824private:
827};
828
830{
832 {
833 _instance = creature->GetInstanceScript();
834 }
835
836 void Reset() override
837 {
839 AttackStart(akama);
840 }
841
842 void JustDied(Unit* /*killer*/) override
843 {
845 }
846
847 void JustEngagedWith(Unit* /*who*/) override
848 {
851 }
852
853 void EnterEvadeMode(EvadeReason /*why*/) override { }
854
855 void UpdateAI(uint32 diff) override
856 {
857 if (!UpdateVictim())
858 return;
859
860 _events.Update(diff);
861
862 while (uint32 eventId = _events.ExecuteEvent())
863 {
864 switch (eventId)
865 {
868 _events.Repeat(Seconds(15), Seconds(20));
869 break;
870 case EVENT_EVISCERATE:
872 _events.Repeat(Seconds(12), Seconds(20));
873 break;
874 default:
875 break;
876 }
877 }
878 }
879
880private:
883};
884
886{
888 {
889 _instance = creature->GetInstanceScript();
890 }
891
892 void Reset() override
893 {
895 AttackStart(akama);
896 }
897
898 void JustDied(Unit* /*killer*/) override
899 {
901 }
902
903 void JustEngagedWith(Unit* /*who*/) override
904 {
907 }
908
909 void EnterEvadeMode(EvadeReason /*why*/) override { }
910
911 void UpdateAI(uint32 diff) override
912 {
913 if (!UpdateVictim())
914 return;
915
916 _events.Update(diff);
917
918 while (uint32 eventId = _events.ExecuteEvent())
919 {
920 switch (eventId)
921 {
924 _events.Repeat(Seconds(15), Seconds(20));
925 break;
928 _events.Repeat(Seconds(8), Seconds(15));
929 break;
930 default:
931 break;
932 }
933 }
934 }
935
936private:
939};
940
942{
944 {
945 Initialize();
946 _instance = creature->GetInstanceScript();
947 }
948
950 {
951 _spiritMend = false;
952 _chainHeal = false;
953 }
954
955 void Reset() override
956 {
957 Initialize();
958
960 AttackStart(akama);
961 }
962
963 void JustDied(Unit* /*killer*/) override
964 {
966 }
967
968 void JustEngagedWith(Unit* /*who*/) override
969 {
971 }
972
973 void DamageTaken(Unit* /*who*/, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
974 {
975 if (!_spiritMend)
976 if (HealthBelowPct(30))
977 {
979 _spiritMend = true;
981 }
982
983 if (!_chainHeal)
984 if (HealthBelowPct(50))
985 {
987 _chainHeal = true;
989 }
990
991 }
992
993 void EnterEvadeMode(EvadeReason /*why*/) override { }
994
995 void UpdateAI(uint32 diff) override
996 {
997 _events.Update(diff);
998
999 while (uint32 eventId = _events.ExecuteEvent())
1000 {
1001 switch (eventId)
1002 {
1003 case EVENT_SPIRIT_HEAL:
1005 _events.Repeat(Seconds(13), Seconds(16));
1006 break;
1008 _spiritMend = false;
1009 break;
1011 _chainHeal = false;
1012 break;
1013 default:
1014 break;
1015 }
1016 }
1017
1018 if (!UpdateVictim())
1019 return;
1020 }
1021
1022private:
1027};
1028
1030{
1032 {
1034 }
1035
1036 void MovementInform(uint32 motionType, uint32 /*pointId*/) override
1037 {
1038 if (motionType != POINT_MOTION_TYPE)
1039 return;
1040
1042 me->SetFacingToObject(akama);
1043 }
1044
1045 void DoAction(int32 actionId) override
1046 {
1047 switch (actionId)
1048 {
1051 break;
1052 case ACTION_BROKEN_HAIL:
1055 break;
1058 break;
1059 default:
1060 break;
1061 }
1062 }
1063
1064private:
1066};
1067
1068// 40401 - Shade Soul Channel (serverside spell)
1070{
1071 bool Validate(SpellInfo const* /*spell*/) override
1072 {
1074 }
1075
1076 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1077 {
1079 }
1080
1081 void Register() override
1082 {
1084 }
1085};
1086
1087// 40520 - Shade Soul Channel
1089{
1090 void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
1091 {
1092 int32 const maxSlowEff = -99;
1093 if (aurEff->GetAmount() < maxSlowEff)
1094 if (AuraEffect* slowEff = GetEffect(EFFECT_0))
1095 slowEff->ChangeAmount(maxSlowEff);
1096 }
1097
1098 void Register() override
1099 {
1101 }
1102};
1103
1105{
1118}
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
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition: Duration.h:29
@ IN_PROGRESS
@ DONE
@ CHASE_MOTION_TYPE
@ POINT_MOTION_TYPE
std::vector< ObjectGuid > GuidVector
Definition: ObjectGuid.h:395
Spells
Definition: PlayerAI.cpp:32
float frand(float min, float max)
Definition: Random.cpp:55
#define RegisterSpellScript(spell_script)
Definition: ScriptMgr.h:1369
void CloseGossipMenuFor(Player *player)
@ EFFECT_0
Definition: SharedDefines.h:30
@ 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)
Definition: SpellScript.h:2029
#define AuraEffectRemoveFn(F, I, N, M)
Definition: SpellScript.h:2040
EvadeReason
Definition: UnitAICommon.h:30
@ UNIT_STAND_STATE_KNEEL
Definition: UnitDefines.h:50
@ UNIT_NPC_FLAG_GOSSIP
Definition: UnitDefines.h:297
DamageEffectType
Definition: UnitDefines.h:131
@ UNIT_STATE_CASTING
Definition: Unit.h:270
#define RegisterBlackTempleCreatureAI(ai_name)
Definition: black_temple.h:149
@ DATA_AKAMA_SHADE
Definition: black_temple.h:42
@ DATA_SHADE_OF_AKAMA
Definition: black_temple.h:33
Says
static float const MIDDLE_OF_ROOM
static float const FACE_THE_DOOR
@ SAY_BROKEN_SPECIAL
@ SAY_LOW_HEALTH
@ SAY_BROKEN_HAIL
@ SAY_BROKEN_FREE_0
@ SAY_BROKEN_FREE_1
@ SAY_BROKEN_FREE_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
@ SUMMON_GROUP_RESET
@ AKAMA_INTRO_WAYPOINT
@ AKAMA_CHANNEL_WAYPOINT
Position const AkamaWP[2]
@ SPELL_WINDFURY
@ SPELL_SHIELD_BASH
@ SPELL_SUMMON_ASHTONGUE_DEFENDER
@ SPELL_SUMMON_ASHTONGUE_SORCERER
@ SPELL_EVISCERATE
@ SPELL_FIXATE
@ 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_THREAT
@ SPELL_DEBILITATING_STRIKE
@ SPELL_AKAMA_SOUL_EXPEL_CHANNEL
@ SPELL_AKAMA_SOUL_RETRIEVE
@ SPELL_AKAMA_SOUL_CHANNEL
@ SPELL_SPIRITBINDER_SPIRIT_HEAL
static float const FACE_THE_PLATFORM
void AddSC_boss_shade_of_akama()
Position const BrokenWP[18]
Position const BrokenPos[18]
@ 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_WINDFURY
@ 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_FIXATE
@ EVENT_BROKEN_FREE_3
@ EVENT_SUMMON_ASHTONGUE_SORCERER
@ EVENT_DEBILITATING_STRIKE
@ EVENT_START_CHANNELERS_AND_SPAWNERS
int32 GetAmount() const
HookList< EffectApplyHandler > AfterEffectRemove
Definition: SpellScript.h:2039
HookList< EffectApplyHandler > AfterEffectApply
Definition: SpellScript.h:2028
AuraEffect * GetEffect(uint8 effIndex) const
Unit * GetTarget() const
InstanceScript *const instance
void _DespawnAtEvade(Seconds delayToRespawn=30s, Creature *who=nullptr)
SummonList summons
EventMap events
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
Definition: CreatureAI.cpp:56
bool IsInBoundary(Position const *who=nullptr) const
Definition: CreatureAI.cpp:426
bool UpdateVictim()
Definition: CreatureAI.cpp:245
Creature *const me
Definition: CreatureAI.h:61
void SetImmuneToPC(bool apply) override
Definition: Creature.h:170
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
Definition: Creature.cpp:2415
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 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()
Definition: MapRefManager.h:35
iterator begin()
Definition: MapRefManager.h:34
PlayerList const & GetPlayers() const
Definition: Map.h:367
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< float > closeEnoughDistance={})
void Clear()
Definition: ObjectGuid.h:286
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
uint32 const Id
Definition: SpellInfo.h:325
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Definition: SpellScript.h:162
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 > duration)
TaskScheduler & Schedule(std::chrono::duration< Rep, Period > time, task_handler_t task)
TaskScheduler & Update(success_t const &callback=nullptr)
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.h:159
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.cpp:180
SpellCastResult DoCast(uint32 spellId)
Definition: UnitAI.cpp:89
Definition: Unit.h:627
void CombatStop(bool includingCast=false, bool mutualPvP=true, bool(*unitFilter)(Unit const *otherUnit)=nullptr)
Definition: Unit.cpp:5827
void SetStandState(UnitStandStateType state, uint32 animKitID=0)
Definition: Unit.cpp:10100
void SetFaction(uint32 faction) override
Definition: Unit.h:859
MotionMaster * GetMotionMaster()
Definition: Unit.h:1652
void SetFacingToObject(WorldObject const *object, bool force=true)
Definition: Unit.cpp:12671
void StopMoving()
Definition: Unit.cpp:10049
void RemoveNpcFlag(NPCFlags flags)
Definition: Unit.h:983
void SetUninteractible(bool apply)
Definition: Unit.cpp:8147
void SetEmoteState(Emote emote)
Definition: Unit.h:852
bool HealthBelowPct(int32 pct) const
Definition: Unit.h:780
uint32 GetFaction() const override
Definition: Unit.h:858
void SetNpcFlag(NPCFlags flags)
Definition: Unit.h:982
bool SetWalk(bool enable)
Definition: Unit.cpp:12707
void RemoveAuraFromStack(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT, uint16 num=1)
Definition: Unit.cpp:3847
void SetFacingTo(float const ori, bool force=true)
Definition: Unit.cpp:12653
void HandleEmoteCommand(Emote emoteId, Player *target=nullptr, Trinity::IteratorPair< int32 const * > spellVisualKitIds={}, int32 sequenceVariation=0)
Definition: Unit.cpp:1598
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3831
Map * GetMap() const
Definition: Object.h:624
InstanceScript * GetInstanceScript() const
Definition: Object.cpp:1042
void GetCreatureListWithEntryInGrid(Container &creatureContainer, uint32 entry, float maxSearchRange=250.0f) const
Definition: Object.cpp:3312
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:2025
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition: Object.cpp:1142
void SummonCreatureGroup(uint8 group, std::list< TempSummon * > *list=nullptr)
Definition: Object.cpp:2131
bool Validate(SpellInfo const *) override
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
void OnApply(AuraEffect const *aurEff, AuraEffectHandleModes)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
constexpr float GetPositionX() const
Definition: Position.h:76
constexpr float GetPositionY() const
Definition: Position.h:77
constexpr float GetPositionZ() const
Definition: Position.h:78
void AttackStart(Unit *) override
== Triggered Actions Requested ==================
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 Reset() 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 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
InstanceScript * _instance
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
== Triggered Actions Requested ==================
void JustEngagedWith(Unit *) override
void EnterEvadeMode(EvadeReason) override
void DamageTaken(Unit *, uint32 &, DamageEffectType, SpellInfo const *) override
void JustDied(Unit *) 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