TrinityCore
Loading...
Searching...
No Matches
boss_ahune.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 * Some details may be missing
20 * SPELL_IS_DEAD_CHECK is NYI, what it does is unknown
21 * Trash from instance start to first boss should not spawn if players entered instance by LFG (gameobjects like veins and herbs are spawned)
22 * Verify if Synch Health has correct script effect
23 * SPELL_AHUNE_RESURFACES doesn't work, caster is friendly to players?
24 */
25
26#include "ScriptMgr.h"
27#include "Containers.h"
28#include "DB2Stores.h"
29#include "GameObject.h"
30#include "GameObjectAI.h"
31#include "Group.h"
32#include "InstanceScript.h"
33#include "LFGMgr.h"
34#include "Map.h"
35#include "MotionMaster.h"
36#include "ObjectMgr.h"
37#include "Player.h"
38#include "ScriptedCreature.h"
39#include "ScriptedGossip.h"
40#include "SpellAuraEffects.h"
41#include "SpellInfo.h"
42#include "SpellScript.h"
43#include "the_slave_pens.h"
44
46{
47 // Ahune Summon Loc Bunny
49
50 // Ahune (sender is guessed)
52
53 // Earthen Ring Flamecaller
56
57 // Player
58 TEXT_INTRO_1 = 24895,
59 TEXT_INTRO_2 = 24893,
60 TEXT_INTRO_3 = 24894
61};
62
64{
65 // Ahune - Combat - Initial
67 SPELL_STAND = 37752,
70
71 // Ahune - Combat
74
75 // Ahune - Combat - Submerge
79
80 // Ahune - Combat - Death
82
83 // Frozen Core
88
89 // Earthen Ring Flamecaller
92
93 // Shaman Bonfire Bunny
96
97 // Ahune Summon Loc Bunny
105
106 // Ahune Ice Spear Bunny
110
111 // Ice Stone
113
114 // Scripts
130
150
164
171
179
180static const Position AhuneSpawnPosition = { -99.10210f, -233.75261f, -1.2229697f, 1.567972064018249511f };
181static const Position CoreSpawnPosition = { -98.01508f, -230.45549f, -1.2108916f, 1.797689080238342285f };
182
183// 25740 - Ahune
184struct boss_ahune : public BossAI
185{
186 boss_ahune(Creature* creature) : BossAI(creature, DATA_AHUNE), _summonCount(0) { }
187
188 void InitializeAI() override
189 {
190 me->SetCorpseDelay(20, true);
192 }
193
202
210
211 void JustSummoned(Creature* summon) override
212 {
213 if (summon->GetEntry() == NPC_FROZEN_CORE)
214 return;
215
216 DoZoneInCombat(summon);
217 summons.Summon(summon);
218 }
219
247
248 void SetData(uint32 type, uint32 value) override
249 {
250 if (type == DATA_SUMMON_COUNT)
251 _summonCount = value;
252 }
253
254 uint32 GetData(uint32 type) const override
255 {
256 if (type == DATA_SUMMON_COUNT)
257 return _summonCount;
258
259 return 0;
260 }
261
262 void EnterEvadeMode(EvadeReason /*why*/) override
263 {
265
267 bunny->AI()->DoAction(ACTION_STOP_EVENT_WIPE);
268
269 if (Creature* frozenCore = instance->GetCreature(DATA_FROZEN_CORE))
270 frozenCore->DespawnOrUnsummon();
271
273
275 }
276
277 void JustDied(Unit* /*killer*/) override
278 {
280
282 bunny->AI()->DoAction(ACTION_STOP_EVENT_WIN);
283
284 Map::PlayerList const& players = me->GetMap()->GetPlayers();
285 if (!players.empty())
286 {
287 if (Group* group = players.begin()->GetSource()->GetGroup())
288 if (group->isLFGGroup())
289 sLFGMgr->FinishDungeon(group->GetGUID(), LFG_DUNGEON_ID_AHUNE, me->GetMap());
290 }
291
292 _JustDied();
293 }
294
295 void ExecuteEvent(uint32 eventId) override
296 {
297 switch (eventId)
298 {
301 break;
303 if (Creature* frozenCore = instance->GetCreature(DATA_FROZEN_CORE))
304 DoCast(frozenCore, SPELL_SYNCH_HEALTH, true);
305 events.Repeat(2s);
306 break;
307 case EVENT_SUICIDE:
308 if (Creature* frozenCore = instance->GetCreature(DATA_FROZEN_CORE))
309 if (!frozenCore->IsAlive())
311 events.Repeat(2s);
312 break;
313 default:
314 break;
315 }
316 }
317
318private:
320};
321
322// 25865 - Frozen Core
324{
325 npc_frozen_core(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
326
327 void InitializeAI() override
328 {
329 me->SetCorpseDelay(5, true);
331 me->SetRegenerateHealth(false);
333 }
334
343
344 void Reset() override
345 {
346 _events.Reset();
347 }
348
349 void DoAction(int32 action) override
350 {
351 if (action == ACTION_ACTIVATE_CORE)
352 {
353 // Not correct, aura is not removed. It stops working for a while but starts working again before phase end,
354 // making it impossible to simply check in aura script if core is uninteractible
356 me->SetUninteractible(false);
357 me->SetImmuneToPC(false);
358 }
359 else if (action == ACTION_DEACTIVATE_CORE)
360 {
362 me->SetUninteractible(true);
363 me->SetImmuneToPC(true);
364 }
365 }
366
367 void JustDied(Unit* /*killer*/) override
368 {
371 }
372
373 void UpdateAI(uint32 diff) override
374 {
375 UpdateVictim();
376
377 _events.Update(diff);
378
379 while (uint32 eventId = _events.ExecuteEvent())
380 {
381 switch (eventId)
382 {
385 DoCast(ahune, SPELL_SYNCH_HEALTH, true);
386 _events.Repeat(2s);
387 break;
388 case EVENT_SUICIDE:
390 if (!ahune->IsAlive())
392 _events.Repeat(2s);
393 break;
394 default:
395 break;
396 }
397 }
398 }
399
400private:
403};
404
405// 25745 - [PH] Ahune Summon Loc Bunny
407{
408 npc_ahune_bunny(Creature* creature) : ScriptedAI(creature), _summons(me), _instance(creature->GetInstanceScript()) { }
409
410 void JustSummoned(Creature* summon) override
411 {
412 if (summon->GetEntry() == NPC_AHUNE)
413 return;
414
415 DoZoneInCombat(summon);
416 _summons.Summon(summon);
417 }
418
420 {
421 std::vector<Creature*> creatures;
426 for (Creature* creature : creatures)
427 creature->AI()->DoAction(ACTION_RESET_CREATURES);
428
429 std::vector<Creature*> beams;
433 for (Creature* beam : beams)
434 beam->RemoveAurasDueToSpell(SPELL_FIND_OPENING_BEAM_END);
435 }
436
437 void DoAction(int32 action) override
438 {
439 switch (action)
440 {
444 break;
448 _events.Reset();
449
450 me->SummonGameObject(GO_ICE_STONE, -69.90455f, -162.2449f, -2.366563f, 2.426008f, QuaternionData(0.0f, 0.0f, 0.9366722f, 0.3502074f), 0s);
451 break;
455 _events.Reset();
456 break;
457 default:
458 break;
459 }
460 }
461
462 void UpdateAI(uint32 diff) override
463 {
464 _events.Update(diff);
465
466 while (uint32 eventId = _events.ExecuteEvent())
467 {
468 switch (eventId)
469 {
470 case EVENT_INTRO_1:
473 break;
474 case EVENT_INTRO_2:
478 break;
479 case EVENT_INTRO_3:
481 break;
482
487 break;
488
489 case EVENT_SUBMERGE:
490 if (Creature* flamecaller = me->FindNearestCreatureWithOptions(200.0f, { .StringId = "EarthenRingFlamecaller3" }))
491 flamecaller->AI()->DoAction(ACTION_RETREAT_EMOTE);
492
494 DoCast(ahune, SPELL_FOUND_OPENING, true);
495
497 break;
499 {
500 std::vector<Creature*> bonfires;
504 for (Creature* bonfire : bonfires)
505 bonfire->AI()->DoAction(ACTION_STOP_VISUALS);
506
507 std::vector<Creature*> beams;
511 for (Creature* beam : beams)
512 beam->DespawnOrUnsummon();
514 break;
515 }
519
520 if (Creature* flamecaller = me->FindNearestCreatureWithOptions(200.0f, { .StringId = "EarthenRingFlamecaller3" }))
521 flamecaller->AI()->DoAction(ACTION_RESURFACE_EMOTE);
522
524 break;
526 {
529
530 std::vector<Creature*> creatures;
532 for (Creature* creature : creatures)
533 creature->AI()->DoAction(ACTION_START_VISUALS);
534
536 core->AI()->DoAction(ACTION_DEACTIVATE_CORE);
537
540 break;
541 }
542 default:
543 break;
544 }
545 }
546 }
547
548private:
552};
553
554// 25754 - Earthen Ring Flamecaller
556{
557 npc_earthen_ring_flamecaller(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
558
559 void JustAppeared() override
560 {
562 }
563
564 void DoAction(int32 action) override
565 {
566 switch (action)
567 {
570
571 if (me->HasStringId("EarthenRingFlamecaller1"))
573 else if (me->HasStringId("EarthenRingFlamecaller2"))
575 else if (me->HasStringId("EarthenRingFlamecaller3"))
577 break;
580 break;
583 break;
587
588 if (me->HasStringId("EarthenRingFlamecaller1"))
589 {
590 _scheduler.Schedule(45s, 55s, [this](TaskContext const& /*task*/)
591 {
593
595 DoCast(bonfireBunny, SPELL_FIND_OPENING_VISUAL_TRIGGER, true);
596 });
597 }
598 else if (me->HasStringId("EarthenRingFlamecaller2"))
599 {
600 _scheduler.Schedule(75s, 80s, [this](TaskContext const& /*task*/)
601 {
603
605 DoCast(bonfireBunny, SPELL_FIND_OPENING_VISUAL_TRIGGER, true);
606 });
607 }
608 else if (me->HasStringId("EarthenRingFlamecaller3"))
609 {
610 _scheduler.Schedule(20s, 25s, [this](TaskContext const& /*task*/)
611 {
613
615 DoCast(bonfireBunny, SPELL_FIND_OPENING_VISUAL_TRIGGER, true);
616 });
617 }
618 break;
623 break;
624 default:
625 break;
626 }
627 }
628
629 void MovementInform(uint32 type, uint32 pointId) override
630 {
631 if (type != POINT_MOTION_TYPE)
632 return;
633
634 if (pointId == POINT_HOME)
636 }
637
638 void WaypointPathEnded(uint32/* waypointId*/, uint32 pathId) override
639 {
640 switch (pathId)
641 {
644 me->SetFacingToObject(bonfireBunny);
645
647
648 _scheduler.Schedule(45s, 55s, [this](TaskContext const& /*task*/)
649 {
651
653 DoCast(bonfireBunny, SPELL_FIND_OPENING_VISUAL_TRIGGER, true);
654 });
655 break;
658 me->SetFacingToObject(bonfireBunny);
659
661
662 _scheduler.Schedule(75s, 80s, [this](TaskContext const& /*task*/)
663 {
665
667 DoCast(bonfireBunny, SPELL_FIND_OPENING_VISUAL_TRIGGER, true);
668 });
669 break;
672 me->SetFacingToObject(bonfireBunny);
673
675
676 _scheduler.Schedule(20s, 25s, [this](TaskContext const& /*task*/)
677 {
679
681 DoCast(bonfireBunny, SPELL_FIND_OPENING_VISUAL_TRIGGER, true);
682 });
683 break;
684 default:
685 break;
686 }
687 }
688
689 void UpdateAI(uint32 diff) override
690 {
691 _scheduler.Update(diff);
692 }
693
694private:
698};
699
700// 25971 - Shaman Bonfire Bunny 000
701// 25972 - Shaman Bonfire Bunny 001
702// 25973 - Shaman Bonfire Bunny 002
704{
705 npc_shaman_bonfire_bunny(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
706
707 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
708 {
709 switch (spellInfo->Id)
710 {
713 break;
715 switch (me->GetEntry())
716 {
720 break;
724 break;
728 break;
729 default:
730 break;
731 }
732 break;
733 default:
734 break;
735 }
736 }
737
738 void DoAction(int32 action) override
739 {
740 if (action == ACTION_RESET_CREATURES)
741 {
744 }
745 else if (action == ACTION_STOP_VISUALS)
746 {
748 }
749 }
750
751private:
753};
754
755// 25985 - Ahune Ice Spear Bunny
757{
759
760 void JustAppeared() override
761 {
764
765 _scheduler.Schedule(2500ms, [this](TaskContext const& /*task*/)
766 {
768 me->DespawnOrUnsummon(3500ms);
769 });
770 }
771
772 void UpdateAI(uint32 diff) override
773 {
774 _scheduler.Update(diff);
775 }
776
777private:
779};
780
781// 188077 - Ice Spear
783{
785
786 void Reset() override
787 {
788 _scheduler.Schedule(2500ms, [this](TaskContext const& /*task*/)
789 {
791 me->DespawnOrUnsummon(3500ms);
792 });
793 }
794
795 void UpdateAI(uint32 diff) override
796 {
797 _scheduler.Update(diff);
798 }
799
800private:
802};
803
804// 187882 - Ice Stone
806{
808
809 bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
810 {
811 ClearGossipMenuFor(player);
812 CloseGossipMenuFor(player);
815 return true;
816 }
817};
818
819// 45926 - Summoning Rhyme Aura
821{
827
828 void AfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
829 {
830 Unit* target = GetTarget();
831
832 if (InstanceScript* instance = target->GetInstanceScript())
833 {
834 if (Creature* bunny = instance->GetCreature(DATA_AHUNE_BUNNY))
835 bunny->AI()->DoAction(ACTION_START_EVENT);
836
837 std::vector<Creature*> flamecallers;
839 for (Creature* flamecaller : flamecallers)
840 flamecaller->AI()->DoAction(ACTION_START_EVENT);
841
842 // Luma should cast 45926 on player before despawn, NYI
843 if (Creature* luma = instance->GetCreature(DATA_LUMA_SKYMOTHER))
844 luma->DespawnOrUnsummon();
845 }
846
848 target->Unit::Say(TEXT_INTRO_1);
850 }
851
852 void OnPeriodic(AuraEffect const* aurEff)
853 {
854 Unit* target = GetTarget();
855
856 switch (aurEff->GetTickNumber())
857 {
858 case 1:
859 target->CastSpell(nullptr, SPELL_SUMMONING_RHYME_BONFIRE, true);
860 target->Unit::Say(TEXT_INTRO_2);
861 break;
862 case 2:
863 target->Unit::Say(TEXT_INTRO_3);
864 Remove();
865 break;
866 default:
867 break;
868 }
869 }
870
876};
877
878// 45954 - Ahune's Shield
880{
881 bool Validate(SpellInfo const* /*spellInfo*/) override
882 {
884 }
885
886 void OnPeriodic(AuraEffect const* /*aurEff*/)
887 {
888 GetTarget()->CastSpell(nullptr, SPELL_SUMMON_COLDWEAVE, true);
889 GetTarget()->CastSpell(nullptr, SPELL_SUMMON_COLDWEAVE, true);
890
891 if (Creature* creature = GetTarget()->ToCreature())
892 {
893 // This value was verified by two sniffs
894 if (creature->AI()->GetData(DATA_SUMMON_COUNT) < 14)
895 creature->AI()->SetData(DATA_SUMMON_COUNT, creature->AI()->GetData(DATA_SUMMON_COUNT) + 1);
896 else
897 creature->CastSpell(nullptr, SPELL_SUMMON_FROSTWIND, true);
898 }
899 }
900
905};
906
907// 46430 - Synch Health
920
921// 46878 - Summon Ice Spear Delayer
923{
924 bool Validate(SpellInfo const* /*spellInfo*/) override
925 {
927 }
928
929 void OnPeriodic(AuraEffect const* /*aurEff*/)
930 {
932 Remove();
933 }
934
939};
940
941// 46371 - Ice Spear Control Aura
943{
944 bool Validate(SpellInfo const* /*spellInfo*/) override
945 {
947 }
948
949 void OnPeriodic(AuraEffect const* /*aurEff*/)
950 {
952 }
953
958};
959
960// 46372 - Ice Spear Target Picker
962{
963 bool Validate(SpellInfo const* /*spellInfo*/) override
964 {
966 }
967
968 void FilterTargets(std::list<WorldObject*>& targets)
969 {
970 // This is wrong, full list of targets is sent to client
972 }
973
974 void HandleDummy(SpellEffIndex /*effIndex*/)
975 {
977 }
978
984};
985
986// 46320 - Slippery Floor Ambient Periodic
988{
989 bool Validate(SpellInfo const* /*spellInfo*/) override
990 {
992 }
993
994 void HandleScript(SpellEffIndex /*effIndex*/)
995 {
996 Unit* target = GetHitUnit();
997 if (target->isMoving())
998 {
999 target->CastSpell(target, SPELL_SLIPPERY_FLOOR_SLIP, true);
1000 target->CastSpell(target, SPELL_SLIPPERY_FLOOR_YOU_SLIPPED, true);
1001 }
1002 }
1003
1008};
1009
1010// 46146 - Ahune Spanky Hands
1012{
1013 bool Validate(SpellInfo const* /*spellInfo*/) override
1014 {
1016 }
1017
1018 void HandleProc(AuraEffect* /*aurEff*/, ProcEventInfo& eventInfo)
1019 {
1020 eventInfo.GetActor()->CastSpell(eventInfo.GetActionTarget(), SPELL_COLD_SLAP, true);
1021 }
1022
1027};
1028
1029// 46843 - Minion Despawner
1031{
1032 void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1033 {
1034 if (Creature* creature = GetTarget()->ToCreature())
1035 creature->DespawnOrUnsummon();
1036 }
1037
1042};
1043
1044// 46398 - Ice Bombardment Dest Picker
1046{
1047 bool Validate(SpellInfo const* /*spellInfo*/) override
1048 {
1050 }
1051
1052 void HandleDummy(SpellEffIndex /*effIndex*/)
1053 {
1054 GetCaster()->CastSpell(GetHitDest()->GetPosition(), SPELL_ICE_BOMBARDMENT, true);
1055 }
1056
1061};
1062
1063// 45964 - Find Opening Visual
1065{
1066 bool Validate(SpellInfo const* /*spellInfo*/) override
1067 {
1069 }
1070
1071 void HandleScript(SpellEffIndex /*effIndex*/)
1072 {
1074 }
1075
1080};
1081
1082// 46333 - Find Opening Beam End
1084{
1085 bool Validate(SpellInfo const* /*spellInfo*/) override
1086 {
1088 }
1089
1090 void OnPeriodic(AuraEffect const* /*aurEff*/)
1091 {
1093 }
1094
1099};
1100
1101// 46735 - Spank - Force Bunny To Knock You To
1119
1120// 46809 - Make Ahune's Ghost Burst
1122{
1123 bool Validate(SpellInfo const* /*spellInfo*/) override
1124 {
1125 return sObjectMgr->GetCreatureTemplate(NPC_GHOST_OF_AHUNE);
1126 }
1127
1131 {
1132 if (Creature* creature = GetCaster()->FindNearestCreature(NPC_GHOST_OF_AHUNE, 200.0f))
1133 creature->AI()->SetData(DATA_GHOST_OF_AHUNE, DATA_GHOST_OF_AHUNE);
1134 }
1135
1140};
1141
DB2Storage< BroadcastTextEntry > sBroadcastTextStore("BroadcastText.db2", &BroadcastTextLoadInfo::Instance)
int32_t int32
Definition Define.h:150
uint32_t uint32
Definition Define.h:154
#define sLFGMgr
Definition LFGMgr.h:515
@ POINT_MOTION_TYPE
@ TEMPSUMMON_MANUAL_DESPAWN
#define sObjectMgr
Definition ObjectMgr.h:1873
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1383
void GetCreatureListWithEntryInGrid(Container &container, WorldObject *source, uint32 entry, float maxSearchRange)
void ClearGossipMenuFor(Player *player)
void CloseGossipMenuFor(Player *player)
SpellEffIndex
@ EFFECT_0
@ EFFECT_2
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ TARGET_UNIT_SRC_AREA_ENTRY
@ EMOTE_ONESHOT_SHOUT
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ SPELL_AURA_PROC_TRIGGER_SPELL
@ SPELL_AURA_DUMMY
@ SPELL_AURA_PERIODIC_DUMMY
#define AuraEffectProcFn(F, I, N)
#define SpellEffectFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define SpellCastFn(F)
#define AuraEffectApplyFn(F, I, N, M)
#define AuraEffectRemoveFn(F, I, N, M)
EvadeReason
@ REACT_PASSIVE
@ UNIT_STAND_STATE_SUBMERGED
Definition UnitDefines.h:51
@ UNIT_STAND_STATE_STAND
Definition UnitDefines.h:42
@ UNIT_STAND_STATE_SIT
Definition UnitDefines.h:43
static const Position CoreSpawnPosition
AhuneSpells
@ SPELL_SUMMONING_RHYME_AURA
@ SPELL_SUMMON_LOOT_MISSILE
@ SPELL_FIND_OPENING_BEAM_END
@ SPELL_BONFIRE_DISGUISE
@ SPELL_ICE_SPEAR_CONTROL_AURA
@ SPELL_FROZEN_CORE_GETS_HIT
@ SPELL_AHUNES_SHIELD
@ SPELL_AHUNE_SELF_STUN
@ SPELL_SUBMERGED
@ SPELL_COLD_SLAP
@ SPELL_FIND_OPENING_VISUAL_TRIGGER
@ SPELL_BEAM_ATTACK_AGAINST_AHUNE
@ SPELL_SLIPPERY_FLOOR_YOU_SLIPPED
@ SPELL_FORCE_WHISP_FLIGHT_MISSILE
@ SPELL_IS_DEAD_CHECK
@ SPELL_MINION_DESPAWNER
@ SPELL_ICE_SPEAR_VISUAL
@ SPELL_FIND_OPENING_VISUAL
@ SPELL_SUMMONING_VISUAL_1
@ SPELL_ICE_SPEAR_TARGET_PICKER
@ SPELL_SUMMON_ICE_SPEAR_GO
@ SPELL_SUMMON_ICE_SPEAR_BUNNY
@ SPELL_ICE_BOMBARD
@ SPELL_STAY_SUBMERGED
@ SPELL_FIND_OPENING_CHANNEL
@ SPELL_ICE_SPEAR_KNOCKBACK
@ SPELL_SLIPPERY_FLOOR_SLIP
@ SPELL_STAND
@ SPELL_ICE_BOMBARDMENT
@ SPELL_FOUND_OPENING
@ SPELL_AHUNE_RESURFACES
@ SPELL_SUMMONING_RHYME_BONFIRE
@ SPELL_SUICIDE
@ SPELL_SYNCH_HEALTH
@ SPELL_SHAMANS_LOOK_FOR_OPENING
@ SPELL_SUMMON_FROSTWIND
@ SPELL_ICE_SPEAR_DELAY
@ SPELL_AHUNE_SPANKY_HANDS
@ SPELL_AHUNE_DIES_ACHIEVEMENT
@ SPELL_SPANK_KNOCK_TO
@ SPELL_SUMMON_COLDWEAVE
@ SPELL_SUMMON_HAILSTONE
@ SPELL_CLOSE_OPENING_VISUAL
void AddSC_boss_ahune()
AhuneMisc
@ POINT_HOME
@ DATA_SUMMON_COUNT
@ LFG_DUNGEON_ID_AHUNE
@ DATA_GHOST_OF_AHUNE
AhuneTexts
@ TEXT_INTRO_1
@ EMOTE_EARTHEN_ASSAULT
@ EMOTE_WON
@ EMOTE_RETREAT
@ TEXT_INTRO_3
@ EMOTE_RESURFACE
@ TEXT_INTRO_2
AhunePaths
@ PATH_FLAMECALLER_2
@ PATH_FLAMECALLER_1
@ PATH_FLAMECALLER_3
static const Position AhuneSpawnPosition
AhuneEvents
@ EVENT_INTRO_1
@ EVENT_RESURFACE_3
@ EVENT_RESURFACE_1
@ EVENT_INTRO_2
@ EVENT_SUMMON_HAILSTONE
@ EVENT_SUICIDE
@ EVENT_SUBMERGE
@ EVENT_SUMMON_FROZEN_CORE
@ EVENT_RESURFACE_2
@ EVENT_INTRO_3
@ EVENT_SYNCH_HEALTH
AhuneActions
@ ACTION_START_VISUALS
@ ACTION_STOP_EVENT_WIN
@ ACTION_START_EVENT
@ ACTION_RESURFACE_EMOTE
@ ACTION_RETREAT_EMOTE
@ ACTION_STOP_EVENT_WIPE
@ ACTION_STOP_VISUALS
@ ACTION_ACTIVATE_CORE
@ ACTION_RESET_CREATURES
@ ACTION_DEACTIVATE_CORE
uint32 GetTickNumber() const
HookList< EffectApplyHandler > AfterEffectRemove
HookList< EffectPeriodicHandler > OnEffectPeriodic
HookList< EffectApplyHandler > AfterEffectApply
Unit * GetTarget() const
HookList< EffectProcHandler > OnEffectProc
InstanceScript *const instance
void JustEngagedWith(Unit *who) override
SummonList summons
EventMap events
void DoZoneInCombat()
Definition CreatureAI.h:169
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:63
void SetImmuneToPC(bool apply) override
Definition Creature.h:190
void GetHomePosition(float &x, float &y, float &z, float &ori) const
Definition Creature.h:396
void SetReactState(ReactStates st)
Definition Creature.h:180
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
bool HasStringId(std::string_view id) const
void SetRegenerateHealth(bool value)
Definition Creature.h:381
void SetCorpseDelay(uint32 delay, bool ignoreCorpseDecayRatio=false)
Definition Creature.h:118
void Update(uint32 time)
Definition EventMap.h:77
void Repeat(Milliseconds time)
Definition EventMap.cpp:67
EventId ExecuteEvent()
Definition EventMap.cpp:77
void CancelEvent(EventId eventId)
Definition EventMap.cpp:156
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:40
void Reset()
Definition EventMap.cpp:25
GameObject *const me
GameObjectAI(GameObject *go, uint32 scriptId={}) noexcept
void UseDoorOrButton(uint32 time_to_restore=0, bool alternative=false, Unit *user=nullptr)
void DespawnOrUnsummon(Milliseconds delay=0ms, Seconds forceRespawnTime=0s)
Definition Group.h:209
void DoCastSpellOnPlayers(uint32 spell, bool includePets=false, bool includeControlled=false)
Creature * GetCreature(uint32 type)
bool empty() const
Definition LinkedList.h:107
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 MovePath(uint32 pathId, bool repeatable, Optional< Milliseconds > duration={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< std::pair< Milliseconds, Milliseconds > > waitTimeRangeAtPathEnd={}, Optional< float > wanderDistanceAtPathEnds={}, Optional< bool > followPathBackwardsFromEndToStart={}, Optional< bool > exactSplinePath={}, bool generatePath=true, Optional< MovementFadeObject > fadeObject={}, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
uint32 GetEntry() const
Definition Object.h:89
Unit * GetActionTarget() const
Definition Unit.h:514
Unit * GetActor() const
Definition Unit.h:513
iterator begin()
Definition RefManager.h:35
uint32 const Id
Definition SpellInfo.h:328
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
HookList< CastHandler > AfterCast
WorldLocation * GetHitDest() const
Unit * GetCaster() const
HookList< EffectHandler > OnEffectHit
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
void Summon(Creature const *summon)
TaskScheduler & CancelAll()
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
virtual void InitializeAI()
Definition UnitAI.cpp:35
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:81
Definition Unit.h:647
void SetHealth(uint64 val)
Definition Unit.cpp:10041
void SetStandState(UnitStandStateType state, uint32 animKitID=0)
Definition Unit.cpp:10804
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition Unit.cpp:3253
MotionMaster * GetMotionMaster()
Definition Unit.h:1750
void SetUninteractible(bool apply)
Definition Unit.cpp:8583
void SetFacingToObject(WorldObject const *object, bool force=true, uint32 movementId=EVENT_FACE)
Definition Unit.cpp:13394
bool isMoving() const
Definition Unit.h:1820
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
Creature * FindNearestCreatureWithOptions(float range, FindCreatureOptions const &options) const
Definition Object.cpp:1531
InstanceScript * GetInstanceScript() const
Definition Object.cpp:394
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2222
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
GameObject * SummonGameObject(uint32 entry, Position const &pos, QuaternionData const &rot, Seconds respawnTime, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
Definition Object.cpp:1446
void OnPeriodic(AuraEffect const *)
bool Validate(SpellInfo const *) override
void OnPeriodic(AuraEffect const *)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleScript(SpellEffIndex)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void OnPeriodic(AuraEffect const *)
bool Validate(SpellInfo const *) override
void FilterTargets(std::list< WorldObject * > &targets)
bool Validate(SpellInfo const *) override
void AfterRemove(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect *, ProcEventInfo &eventInfo)
void OnPeriodic(AuraEffect const *)
bool Validate(SpellInfo const *) override
void OnPeriodic(AuraEffect const *aurEff)
void AfterApply(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
void Register() override
void HandleScript(SpellEffIndex)
void RandomResize(C &container, std::size_t requestedSize)
Definition Containers.h:67
ScriptedAI(Creature *creature, uint32 scriptId=0) noexcept
uint32 GetData(uint32 type) const override
void SetData(uint32 type, uint32 value) override
void EnterEvadeMode(EvadeReason) override
void ExecuteEvent(uint32 eventId) override
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override
void JustSummoned(Creature *summon) override
void JustAppeared() override
boss_ahune(Creature *creature)
void JustEngagedWith(Unit *who) override
uint32 _summonCount
void JustDied(Unit *) override
void InitializeAI() override
TaskScheduler _scheduler
void Reset() override
void UpdateAI(uint32 diff) override
bool OnGossipSelect(Player *player, uint32, uint32) override
void JustSummoned(Creature *summon) override
void DoResetCreatures()
SummonList _summons
InstanceScript * _instance
void UpdateAI(uint32 diff) override
void DoAction(int32 action) override
npc_ahune_bunny(Creature *creature)
void UpdateAI(uint32 diff) override
void JustAppeared() override
void WaypointPathEnded(uint32, uint32 pathId) override
void DoAction(int32 action) override
void MovementInform(uint32 type, uint32 pointId) override
void UpdateAI(uint32 diff) override
npc_earthen_ring_flamecaller(Creature *creature)
void Reset() override
void JustDied(Unit *) override
void DoAction(int32 action) override
void JustAppeared() override
InstanceScript * _instance
void InitializeAI() override
npc_frozen_core(Creature *creature)
void UpdateAI(uint32 diff) override
InstanceScript * _instance
npc_shaman_bonfire_bunny(Creature *creature)
void DoAction(int32 action) override
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override
@ GO_ICE_STONE
@ NPC_SHAMAN_BONFIRE_BUNNY_001
@ NPC_SHAMAN_BEAM_BUNNY_001
@ NPC_SHAMAN_BEAM_BUNNY_000
@ NPC_FROZEN_CORE
@ NPC_AHUNE
@ NPC_EARTHEN_RING_FLAMECALLER
@ NPC_GHOST_OF_AHUNE
@ NPC_SHAMAN_BONFIRE_BUNNY_002
@ NPC_SHAMAN_BONFIRE_BUNNY_000
@ NPC_SHAMAN_BEAM_BUNNY_002
#define RegisterSlavePensGameObjectAI(ai_name)
@ DATA_BONFIRE_BUNNY_000
@ DATA_BEAM_BUNNY_002
@ DATA_AHUNE_BUNNY
@ DATA_FROZEN_CORE
@ DATA_AHUNE
@ DATA_BEAM_BUNNY_001
@ DATA_BONFIRE_BUNNY_001
@ DATA_LUMA_SKYMOTHER
@ DATA_BEAM_BUNNY_000
@ DATA_BONFIRE_BUNNY_002
#define RegisterSlavePensCreatureAI(ai_name)