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 "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
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;
259 me->SetUninteractible(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->SetUninteractible(false);
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 }
342
343private:
346};
347
348// 23191 - Akama
350{
352 {
353 Initialize();
354 _instance = creature->GetInstanceScript();
355 }
356
358 {
359 _isInCombat = false;
360 _hasYelledOnce = false;
361 _chosen.Clear();
363 _events.Reset();
364 }
365
375
376 void JustSummoned(Creature* summon) override
377 {
378 _summons.Summon(summon);
379 }
380
381 void EnterEvadeMode(EvadeReason /*why*/) override { }
382
383 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
384 {
385 if (spellInfo->Id == SPELL_THREAT && !_isInCombat)
386 {
387 _isInCombat = true;
388 me->SetWalk(false);
391 {
392 shade->RemoveAurasDueToSpell(SPELL_AKAMA_SOUL_CHANNEL);
393 AttackStart(shade);
396 }
397 }
398 }
399
400 void DamageTaken(Unit* /*who*/, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
401 {
402 if (me->HealthBelowPct(20) && !_hasYelledOnce)
403 {
404 _hasYelledOnce = true;
406 }
407 }
408
409 void DoAction(int32 actionId) override
410 {
411 if (actionId == ACTION_SHADE_OF_AKAMA_DEAD)
412 {
413 _isInCombat = false;
414 me->CombatStop(true);
416 me->SetWalk(true);
417 _events.Reset();
419 }
420 }
421
422 void MovementInform(uint32 motionType, uint32 pointId) override
423 {
424 if (motionType != POINT_MOTION_TYPE)
425 return;
426
427 if (pointId == AKAMA_CHANNEL_WAYPOINT)
429
430 else if (pointId == AKAMA_INTRO_WAYPOINT)
431 {
432 me->SetWalk(false);
434 }
435 }
436
438 {
439 for (uint8 i = 0; i < 18; i++)
440 {
442 {
443 summoned->SetWalk(true);
444 summoned->GetMotionMaster()->MovePoint(0, BrokenWP[i]);
445 if (i == 9) //On Sniffs, npc that Yell "Special" is the tenth to be created
446 _chosen = summoned->GetGUID();
447 }
448 }
449 }
450
451 void UpdateAI(uint32 diff) override
452 {
453 _events.Update(diff);
454
455 while (uint32 eventId = _events.ExecuteEvent())
456 {
457 switch (eventId)
458 {
463 me->SetWalk(true);
465 break;
471 break;
472 case EVENT_FIXATE:
474 break;
477 _events.Repeat(8s, 15s);
478 break;
481 _events.Repeat(3s, 7s);
482 break;
487 break;
493 break;
497 break;
501 break;
504 special->AI()->Talk(SAY_BROKEN_SPECIAL);
505
508 break;
511 break;
512 default:
513 break;
514 }
515 }
516
518 {
519 if (!UpdateVictim())
520 return;
521 }
522 }
523
524 void JustDied(Unit* /*killer*/) override
525 {
527 Talk(SAY_DEAD);
529 if (shade->IsAlive())
530 shade->AI()->EnterEvadeMode(EvadeReason::Other);
531 }
532
533 bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override
534 {
535 if (gossipListId == 0)
536 {
537 CloseGossipMenuFor(player);
539 }
540 return false;
541 }
542
543private:
548 ObjectGuid _chosen; //Creature that should yell the speech special.
551};
552
553// 23421 - Ashtongue Channeler
555{
557 {
558 _instance = creature->GetInstanceScript();
559 }
560
561 void Reset() override
562 {
563 _scheduler.Schedule(2s, [this](TaskContext& channel)
564 {
566 {
567 if (shade->IsUninteractible())
568 DoCastSelf(SPELL_SHADE_SOUL_CHANNEL);
569
570 else
571 me->DespawnOrUnsummon(3s);
572 }
573
574 channel.Repeat(2s);
575 });
576 me->SetUninteractible(true);
577 }
578
579 void UpdateAI(uint32 diff) override
580 {
581 _scheduler.Update(diff);
582 }
583
584private:
587};
588
589// 23210 - Creature Generator (Akama)
591{
593 {
594 Initialize();
595 }
596
598 {
599 _leftSide = false;
600 _events.Reset();
602 }
603
604 void Reset() override
605 {
606 Initialize();
607
609 _leftSide = true;
610 }
611
612 void JustSummoned(Creature* summon) override
613 {
614 _summons.Summon(summon);
615 }
616
617 void DoAction(int32 actionId) override
618 {
619 switch (actionId)
620 {
622 if (_leftSide)
623 {
626 }
627 else
628 {
631 }
632 break;
634 _events.Reset();
635 break;
637 _events.Reset();
639 break;
640 default:
641 break;
642 }
643 }
644
645 void UpdateAI(uint32 diff) override
646 {
647 _events.Update(diff);
648
649 while (uint32 eventId = _events.ExecuteEvent())
650 {
651 switch (eventId)
652 {
655 _events.Repeat(50s, 60s);
656 break;
659 _events.Repeat(30s, 35s);
660 break;
663 _events.Repeat(30s, 40s);
664 break;
665 default:
666 break;
667 }
668 }
669 }
670
671private:
675};
676
677// 23215 - Ashtongue Sorcerer
679{
681 {
682 Initialize();
683 _instance = creature->GetInstanceScript();
684 }
685
687 {
688 _switchToCombat = false;
689 _inBanish = false;
690 }
691
692 void Reset() override
693 {
695 {
696 if (shade->IsUninteractible())
697 me->GetMotionMaster()->MovePoint(0, shade->GetPosition());
698
700 AttackStart(akama);
701 }
702 Initialize();
703 }
704
705 void JustDied(Unit* /*killer*/) override
706 {
708 }
709
710 void EnterEvadeMode(EvadeReason /*why*/) override { }
711 void JustEngagedWith(Unit* /*who*/) override { }
712
713 void AttackStart(Unit* who) override
714 {
715 if (!_switchToCombat)
716 return;
717
719 }
720
721 void MoveInLineOfSight(Unit* who) override
722 {
723 if (!_inBanish && who->GetGUID() == _instance->GetGuidData(DATA_SHADE_OF_AKAMA) && me->IsWithinDist(who, 20.0f, false))
724 {
725 _inBanish = true;
726 me->StopMoving();
728 me->GetMotionMaster()->MovePoint(1, me->GetPositionX() + frand(-8.0f, 8.0f), me->GetPositionY() + frand(-8.0f, 8.0f), me->GetPositionZ());
729
730 _scheduler.Schedule(1s + 500ms, [this](TaskContext& sorcer_channel)
731 {
733 {
734 if (shade->IsUninteractible())
735 {
736 me->SetFacingToObject(shade);
737 DoCastSelf(SPELL_SHADE_SOUL_CHANNEL);
738 sorcer_channel.Repeat(2s);
739 }
740 else
741 {
742 me->InterruptSpell(CURRENT_CHANNELED_SPELL);
743 _switchToCombat = true;
744 if (Creature* akama = _instance->GetCreature(DATA_AKAMA_SHADE))
745 AttackStart(akama);
746 }
747 }
748 });
749 }
750 }
751
752 void UpdateAI(uint32 diff) override
753 {
754 _scheduler.Update(diff);
755
756 if (me->HasUnitState(UNIT_STATE_CASTING))
757 return;
758
759 if (!UpdateVictim())
760 return;
761 }
762
763private:
768};
769
770// 23216 - Ashtongue Defender
772{
774 {
775 _instance = creature->GetInstanceScript();
776 }
777
778 void Reset() override
779 {
781 AttackStart(akama);
782 }
783
784 void JustDied(Unit* /*killer*/) override
785 {
787 }
788
796
797 void UpdateAI(uint32 diff) override
798 {
799 if (!UpdateVictim())
800 return;
801
802 _events.Update(diff);
803
804 while (uint32 eventId = _events.ExecuteEvent())
805 {
806 switch (eventId)
807 {
810 _events.Repeat(20s, 25s);
811 break;
814 _events.Repeat(5s, 15s);
815 break;
818 _events.Repeat(10s, 20s);
819 break;
820 case EVENT_WINDFURY:
822 _events.Repeat(6s, 8s);
823 break;
824 default:
825 break;
826 }
827 }
828 }
829
830private:
833};
834
835// 23318 - Ashtongue Rogue
837{
839 {
840 _instance = creature->GetInstanceScript();
841 }
842
843 void Reset() override
844 {
846 AttackStart(akama);
847 }
848
849 void JustDied(Unit* /*killer*/) override
850 {
852 }
853
854 void JustEngagedWith(Unit* /*who*/) override
855 {
858 }
859
860 void EnterEvadeMode(EvadeReason /*why*/) override { }
861
862 void UpdateAI(uint32 diff) override
863 {
864 if (!UpdateVictim())
865 return;
866
867 _events.Update(diff);
868
869 while (uint32 eventId = _events.ExecuteEvent())
870 {
871 switch (eventId)
872 {
875 _events.Repeat(15s, 20s);
876 break;
877 case EVENT_EVISCERATE:
879 _events.Repeat(12s, 20s);
880 break;
881 default:
882 break;
883 }
884 }
885 }
886
887private:
890};
891
892// 23523 - Ashtongue Elementalist
894{
896 {
897 _instance = creature->GetInstanceScript();
898 }
899
900 void Reset() override
901 {
903 AttackStart(akama);
904 }
905
906 void JustDied(Unit* /*killer*/) override
907 {
909 }
910
916
917 void EnterEvadeMode(EvadeReason /*why*/) override { }
918
919 void UpdateAI(uint32 diff) override
920 {
921 if (!UpdateVictim())
922 return;
923
924 _events.Update(diff);
925
926 while (uint32 eventId = _events.ExecuteEvent())
927 {
928 switch (eventId)
929 {
932 _events.Repeat(15s, 20s);
933 break;
936 _events.Repeat(8s, 15s);
937 break;
938 default:
939 break;
940 }
941 }
942 }
943
944private:
947};
948
949// 23524 - Ashtongue Spiritbinder
951{
953 {
954 Initialize();
955 _instance = creature->GetInstanceScript();
956 }
957
959 {
960 _spiritMend = false;
961 _chainHeal = false;
962 }
963
964 void Reset() override
965 {
966 Initialize();
967
969 AttackStart(akama);
970 }
971
972 void JustDied(Unit* /*killer*/) override
973 {
975 }
976
977 void JustEngagedWith(Unit* /*who*/) override
978 {
980 }
981
982 void DamageTaken(Unit* /*who*/, uint32& /*damage*/, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
983 {
984 if (!_spiritMend)
985 if (HealthBelowPct(30))
986 {
988 _spiritMend = true;
990 }
991
992 if (!_chainHeal)
993 if (HealthBelowPct(50))
994 {
996 _chainHeal = true;
998 }
999
1000 }
1001
1002 void EnterEvadeMode(EvadeReason /*why*/) override { }
1003
1004 void UpdateAI(uint32 diff) override
1005 {
1006 _events.Update(diff);
1007
1008 while (uint32 eventId = _events.ExecuteEvent())
1009 {
1010 switch (eventId)
1011 {
1012 case EVENT_SPIRIT_HEAL:
1014 _events.Repeat(13s, 16s);
1015 break;
1017 _spiritMend = false;
1018 break;
1020 _chainHeal = false;
1021 break;
1022 default:
1023 break;
1024 }
1025 }
1026
1027 if (!UpdateVictim())
1028 return;
1029 }
1030
1031private:
1036};
1037
1038// 23319 - Ashtongue Broken
1040{
1042 {
1044 }
1045
1046 void MovementInform(uint32 motionType, uint32 /*pointId*/) override
1047 {
1048 if (motionType != POINT_MOTION_TYPE)
1049 return;
1050
1052 me->SetFacingToObject(akama);
1053 }
1054
1055 void DoAction(int32 actionId) override
1056 {
1057 switch (actionId)
1058 {
1061 break;
1062 case ACTION_BROKEN_HAIL:
1065 break;
1068 break;
1069 default:
1070 break;
1071 }
1072 }
1073
1074private:
1076};
1077
1078// 40401 - Shade Soul Channel (serverside spell)
1096
1097// 40520 - Shade Soul Channel
1099{
1100 void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/)
1101 {
1102 constexpr SpellEffectValue maxSlowEff = -99;
1103 if (aurEff->GetAmount() < maxSlowEff)
1104 if (AuraEffect* slowEff = GetEffect(EFFECT_0))
1105 slowEff->ChangeAmount(maxSlowEff);
1106 }
1107
1112};
1113
uint8_t uint8
Definition Define.h:156
int32_t int32
Definition Define.h:150
uint32_t uint32
Definition Define.h:154
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:434
float frand(float min, float max)
Definition Random.cpp:56
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1383
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
double SpellEffectValue
This is a double instead of float to be able to store full range of int32.
#define AuraEffectApplyFn(F, I, N, M)
#define AuraEffectRemoveFn(F, I, N, M)
EvadeReason
@ UNIT_STAND_STATE_KNEEL
Definition UnitDefines.h:50
@ UNIT_NPC_FLAG_GOSSIP
DamageEffectType
@ UNIT_STATE_CASTING
Definition Unit.h:290
#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]
SpellEffectValue GetAmount() const
HookList< EffectApplyHandler > AfterEffectRemove
HookList< EffectApplyHandler > AfterEffectApply
AuraEffect * GetEffect(uint8 effIndex) const
Unit * GetTarget() const
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
InstanceScript *const instance
void _DespawnAtEvade(Seconds delayToRespawn=30s, Creature *who=nullptr)
SummonList summons
EventMap events
bool IsInBoundary(Position const *who=nullptr) const
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:63
void SetImmuneToPC(bool apply) override
Definition Creature.h:190
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
void Update(uint32 time)
Definition EventMap.h:77
void Repeat(Milliseconds time)
Definition EventMap.cpp:67
EventId ExecuteEvent()
Definition EventMap.cpp:77
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:40
void Reset()
Definition EventMap.cpp:25
virtual bool SetBossState(uint32 id, EncounterState state)
Creature * GetCreature(uint32 type)
virtual ObjectGuid GetGuidData(uint32 type) const override
EncounterState GetBossState(uint32 id) const
PlayerList const & GetPlayers() const
Definition Map.h:408
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< float > closeEnoughDistance={}, Optional< MovementFadeObject > fadeObject={}, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
void Clear()
Definition ObjectGuid.h:329
iterator end()
Definition RefManager.h:36
iterator begin()
Definition RefManager.h:35
uint32 const Id
Definition SpellInfo.h:328
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
void DespawnEntry(uint32 entry)
void Summon(Creature const *summon)
void DoAction(int32 info, Predicate &&predicate, uint16 max=0)
TaskContext & Repeat(TaskScheduler::duration_t duration)
TaskScheduler & Schedule(duration_t time, task_handler_t task)
TaskScheduler & Update()
Update the scheduler to the current time.
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:160
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.cpp:172
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:81
Definition Unit.h:647
void CombatStop(bool includingCast=false, bool mutualPvP=true, bool(*unitFilter)(Unit const *otherUnit)=nullptr)
Definition Unit.cpp:6031
void SetStandState(UnitStandStateType state, uint32 animKitID=0)
Definition Unit.cpp:10804
void SetFaction(uint32 faction) override
Definition Unit.h:887
void StopMoving(bool force=false)
Definition Unit.cpp:10753
MotionMaster * GetMotionMaster()
Definition Unit.h:1750
void RemoveNpcFlag(NPCFlags flags)
Definition Unit.h:1013
void SetUninteractible(bool apply)
Definition Unit.cpp:8583
void SetFacingToObject(WorldObject const *object, bool force=true, uint32 movementId=EVENT_FACE)
Definition Unit.cpp:13394
void SetEmoteState(Emote emote)
Definition Unit.h:880
uint32 GetFaction() const override
Definition Unit.h:886
void SetNpcFlag(NPCFlags flags)
Definition Unit.h:1012
bool SetWalk(bool enable)
Definition Unit.cpp:13422
void RemoveAuraFromStack(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT, uint16 num=1)
Definition Unit.cpp:4008
bool HealthBelowPct(float pct) const
Definition Unit.h:804
void SetFacingTo(float ori, bool force=true, uint32 movementId=EVENT_FACE)
Definition Unit.cpp:13385
void HandleEmoteCommand(Emote emoteId, Player *target=nullptr, Trinity::IteratorPair< int32 const * > spellVisualKitIds={}, int32 sequenceVariation=0)
Definition Unit.cpp:1662
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3992
Map * GetMap() const
Definition Object.h:411
InstanceScript * GetInstanceScript() const
Definition Object.cpp:394
void GetCreatureListWithEntryInGrid(Container &creatureContainer, uint32 entry, float maxSearchRange=250.0f) const
Definition Object.cpp:2663
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:1403
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition Object.cpp:494
void SummonCreatureGroup(uint8 group, std::list< TempSummon * > *list=nullptr)
Definition Object.cpp:1512
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:87
constexpr float GetPositionY() const
Definition Position.h:88
constexpr float GetPositionZ() const
Definition Position.h:89
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 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
== Triggered Actions Requested ==================
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