TrinityCore
Loading...
Searching...
No Matches
boss_headless_horseman.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 "scarlet_monastery.h"
19#include "Containers.h"
20#include "CreatureTextMgr.h"
21#include "GameObject.h"
22#include "GameObjectAI.h"
23#include "Group.h"
24#include "InstanceScript.h"
25#include "LFGMgr.h"
26#include "Map.h"
27#include "MotionMaster.h"
28#include "ObjectAccessor.h"
29#include "PassiveAI.h"
30#include "Player.h"
31#include "ScriptedCreature.h"
32#include "ScriptedGossip.h"
33#include "ScriptMgr.h"
34#include "SpellAuraEffects.h"
35#include "SpellScript.h"
36#include "SpellInfo.h"
37#include "WaypointDefines.h"
38
57
59{
60 // Horseman & Head
93
94 // Pumpkin
100
101 // Fire Bunny
104
105 // Sir Thomas
110
111 SPELL_HEADLESS_HORSEMAN_C_ENRAGED_VISUAL = 42438 // Not used, maybe a bersek mechanic?
113
126
139
155
157{
159 {
160 { 0, 1765.00f, 1347.00f, 19.00f },
161 { 1, 1784.00f, 1346.80f, 25.40f },
162 { 2, 1803.30f, 1347.60f, 33.00f },
163 { 3, 1824.00f, 1350.00f, 42.60f },
164 { 4, 1838.80f, 1353.20f, 49.80f },
165 { 5, 1852.00f, 1357.60f, 55.70f },
166 { 6, 1861.30f, 1364.00f, 59.40f },
167 { 7, 1866.30f, 1374.80f, 61.70f },
168 { 8, 1864.00f, 1387.30f, 63.20f },
169 { 9, 1854.80f, 1399.40f, 64.10f },
170 { 10, 1844.00f, 1406.90f, 64.10f },
171 { 11, 1824.30f, 1411.40f, 63.30f },
172 { 12, 1801.00f, 1412.30f, 60.40f },
173 { 13, 1782.00f, 1410.10f, 55.50f },
174 { 14, 1770.50f, 1405.20f, 50.30f },
175 { 15, 1765.20f, 1400.70f, 46.60f },
176 { 16, 1761.40f, 1393.40f, 41.70f },
177 { 17, 1759.10f, 1386.70f, 36.60f },
178 { 18, 1757.80f, 1378.20f, 29.00f },
179 { 19, 1758.00f, 1367.00f, 19.51f }
180 },
183};
184
186Position const GOPumpkinSpawnPosition = { 1776.27f, 1348.74f, 20.4116f, 6.27281f };
187QuaternionData const GOPumpkinSpawnQuat = QuaternionData(0.0f, 0.0f, 0.00518764f, -0.999987f);
188Position const GOSoilSpawnPosition = { 1765.28f, 1347.46f, 17.5514f, 0.100363f };
189QuaternionData const GOSoilSpawnQuat = QuaternionData(0.0f, 0.0f, 0.0501604f, -0.998741f);
190
192{
193 npc_headless_horseman_head(Creature* creature) : PassiveAI(creature), _instance(creature->GetInstanceScript()), _phase(PHASE_1)
194 {
195 creature->SetDisplayFromModel(0);
196 }
197
198 void JustAppeared() override
199 {
201 }
202
210
211 void JustReachedHome() override
212 {
213 _events.Reset();
217 }
218
249
250 void SetGUID(ObjectGuid const& guid, int32 id) override
251 {
252 if (id != ACTION_HEAD_PLAYER_TEXT)
253 return;
254
255 if (Unit* target = ObjectAccessor::GetUnit(*me, guid))
257 }
258
286
293
294 void UpdateAI(uint32 diff) override
295 {
297 return;
298
299 _events.Update(diff);
300
302 return;
303
304 while (uint32 eventId = _events.ExecuteEvent())
305 {
306 switch (eventId)
307 {
310 break;
318 me->SetUninteractible(true);
319 break;
322 me->SetUninteractible(true);
325 me->RemoveGameObject(pumpkin, false);
327 me->RemoveGameObject(soil, false);
328 break;
329 default:
330 break;
331 }
332
334 return;
335 }
336 }
337
338private:
342};
343
345{
346 boss_headless_horseman(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()), _summons(me), _introDone(false) { }
347
348 void InitializeAI() override
349 {
350 me->SetDisableGravity(true);
351 me->SetHover(true);
353 }
354
360
361 void JustAppeared() override
362 {
364 }
365
366 void Reset() override
367 {
368 _events.Reset();
371 me->setActive(false);
372 if (_introDone)
373 me->SetImmuneToPC(false);
374 me->SetWalk(false);
375 }
376
383
384 void JustEngagedWith(Unit* /*who*/) override
385 {
386 me->setActive(true);
389
391 head->AI()->DoZoneInCombat();
392 }
393
394 void JustSummoned(Creature* summon) override
395 {
396 _summons.Summon(summon);
397 DoZoneInCombat(summon);
398 }
399
400 void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override
401 {
402 _summons.Despawn(summon);
403 }
404
405 void KilledUnit(Unit* victim) override
406 {
407 if (victim->GetTypeId() == TYPEID_PLAYER)
409 }
410
445
446 void JustDied(Unit* /*killer*/) override
447 {
452 // Credit LFG
453 if (me->GetMap()->HavePlayers())
454 {
455 Map* map = me->GetMap();
456 if (Group* group = map->GetPlayers().begin()->GetSource()->GetGroup())
457 if (group->isLFGGroup())
458 sLFGMgr->FinishDungeon(group->GetGUID(), LFG_DUNGEONID_THE_HEADLESS_HORSEMAN, map);
459 }
460 }
461
462 void DamageTaken(Unit* who, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
463 {
464 if (damage >= me->GetHealth() && who != me)
465 {
466 damage = 0;
467
470 else if (_events.IsInPhase(PHASE_2))
472 else if (_events.IsInPhase(PHASE_3))
474 }
475 }
476
504
510
516
517 void MovementInform(uint32 type, uint32 id) override
518 {
519 if (type != POINT_MOTION_TYPE)
520 return;
521
522 switch (id)
523 {
524 case POINT_HEAD:
525 me->SetWalk(false);
528 break;
529 default:
530 break;
531 }
532 }
533
534 void WaypointPathEnded(uint32 /*waypointId*/, uint32 pathId) override
535 {
536 if (pathId != POINT_HORSEMAN_FINISH_PATH)
537 return;
538
539 _introDone = true;
540 me->SetImmuneToPC(false);
541 me->SetDisableGravity(false);
542 me->SetHover(false);
547 }
548
549 void UpdateAI(uint32 diff) override
550 {
551 if (!UpdateVictim())
552 return;
553
554 _events.Update(diff);
555
557 return;
558
559 while (uint32 eventId = _events.ExecuteEvent())
560 {
561 switch (eventId)
562 {
565 _events.Repeat(6s, 12s);
566 break;
574 break;
579 {
582 }
583 else if (_events.IsInPhase(PHASE_3))
584 {
587 }
588
590 AttackStart(target);
591 break;
593 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true, false))
594 {
599 }
600 _events.Repeat(18s, 21s);
601 break;
604 _events.Repeat(30s);
605 break;
608 _events.Repeat(30s, 60s);
609 break;
610 default:
611 break;
612 }
613
615 return;
616 }
617 }
618
619private:
624};
625
627{
628 npc_pulsing_pumpkin(Creature* creature) : ScriptedAI(creature) { }
629
630 void InitializeAI() override
631 {
632 me->SetDisableGravity(true);
633 me->SetHover(true);
635 }
636
644
645 void DoAction(int32 id) override
646 {
648 return;
649
650 _scheduler.Schedule(1s, [this](TaskContext const& /*context*/)
651 {
653 me->SetDisableGravity(false);
654 me->SetHover(false);
656 me->UpdateEntry(NPC_PUMPKIN_FIEND, nullptr, false);
657 me->SetImmuneToNPC(true);
660 }).Schedule(11s, [this](TaskContext& squashSoul)
661 {
663 squashSoul.Repeat(10s);
664 });
665 }
666
667 void UpdateAI(uint32 diff) override
668 {
669 if (!UpdateVictim())
670 return;
671
672 _scheduler.Update(diff);
673 }
674
675private:
677};
678
680{
681 npc_flame_bunny(Creature* creature) : PassiveAI(creature)
682 {
683 creature->SetDisplayFromModel(1);
684 }
685
686 void Reset() override
687 {
688 _scheduler.Schedule(1s, [this](TaskContext const& /*context*/)
689 {
691 }).Schedule(3s, [this](TaskContext& grow)
692 {
694 if (grow.GetRepeatCounter() < 2)
695 grow.Repeat(2s + 200ms);
696 });
697 }
698
699 void UpdateAI(uint32 diff) override
700 {
701 _scheduler.Update(diff);
702 }
703
704private:
706};
707
709{
710 npc_sir_thomas(Creature* creature) : PassiveAI(creature) { }
711
723
734
735 void UpdateAI(uint32 diff) override
736 {
737 _scheduler.Update(diff);
738 }
739
740private:
742};
743
745{
746 go_loosely_turned_soil(GameObject* go) : GameObjectAI(go), _instance(go->GetInstanceScript()) { }
747
748 bool OnGossipHello(Player* player) override
749 {
751 return true;
752
754 return true;
755
756 return false;
757 }
758
759 void OnQuestReward(Player* player, Quest const* /*quest*/, LootItemType /*type*/, uint32 /*opt*/) override
760 {
764 head->AI()->SetGUID(player->GetGUID(), ACTION_HEAD_PLAYER_TEXT);
765 }
766
767private:
769};
770
772{
773 go_headless_horseman_pumpkin(GameObject* go) : GameObjectAI(go), _instance(go->GetInstanceScript()) { }
774
775 bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
776 {
777 ClearGossipMenuFor(player);
778
780 {
781 CloseGossipMenuFor(player);
782 return true;
783 }
784
788 head->AI()->SetGUID(player->GetGUID(), ACTION_HEAD_PLAYER_TEXT);
789
790 CloseGossipMenuFor(player);
791 return true;
792 }
793
794private:
796};
797
798// 42432 - Headless Horseman Yell Timer
800{
801 void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
802 {
803 Creature* horseman = GetTarget()->ToCreature();
804 if (!horseman || !horseman->IsAIEnabled())
805 return;
806
807 horseman->AI()->Talk(SAY_HORSEMAN_ENTRANCE);
808 }
809
814};
815
816// 43893 - Headless Horseman - Maniacal Laugh, Maniacal, Delayed 8
829
830// 42410 - Headless Horseman Climax - Command, Head Repositions
844
845// 42399 - Headless Horseman Climax - Send Head
860
861// 42603 - Headless Horseman Climax, Head: Periodic
863{
864 void HandleHPCheck(AuraEffect const* /*aurEff*/)
865 {
866 Unit* target = GetTarget();
867
868 if (target->HealthBelowPct(34))
869 target->GetAI()->DoAction(ACTION_HEAD_HP_34);
870 else if (target->HealthBelowPct(67))
871 target->GetAI()->DoAction(ACTION_HEAD_HP_67);
872
873 }
874
879};
880
881// 43101 - Headless Horseman Climax - Command, Head Requests Body
896
897// 42401 - Headless Horseman Climax - Return Head
912
913// 52236 - Summon Pumpkin Burst Delay
915{
916 void HandleText(AuraEffect const* /*aurEff*/)
917 {
918 if (Creature* horseman = GetTarget()->ToCreature())
919 horseman->AI()->Talk(SAY_SPROUTING_PUMPKINS);
920 }
921
926};
927
928// 42428 - Headless Horseman Climax - Head Is Dead
930{
931 void HandleDummy(SpellEffIndex /*effIndex*/)
932 {
933 Creature* target = GetHitCreature();
934 if (!target || !target->IsAIEnabled())
935 return;
936
937 switch (target->GetEntry())
938 {
940 target->AI()->DoAction(ACTION_HEAD_IS_DEAD);
941 break;
944 target->KillSelf();
945 break;
946 default:
947 break;
948 }
949 }
950
955};
956
957// 42879 - Headless Horseman Climax - Summoning Rhyme Aura
959{
960 void PeriodicTick(AuraEffect const* aurEff)
961 {
962 if (!GetCaster())
963 return;
964
965 Creature* caster = GetCaster()->ToCreature();
966 Player* player = GetTarget()->ToPlayer();
967 if (!caster || !player)
968 return;
969
970 switch (aurEff->GetTickNumber())
971 {
972 case 1:
974 break;
975 case 3:
977 break;
978 case 5:
981 break;
982 case 8:
985 Remove();
986 break;
987 default:
988 break;
989 }
990 }
991
996};
997
998// 42281 - Sprouting
1013
1014// 42821 - Headless Horseman - Wisp Flight Missile
1015// 42818 - Headless Horseman - Wisp Flight Port
1028
#define sCreatureTextMgr
@ TEXT_RANGE_NORMAL
uint8_t uint8
Definition Define.h:156
int32_t int32
Definition Define.h:150
uint32_t uint32
Definition Define.h:154
@ DONE
@ NOT_STARTED
#define sLFGMgr
Definition LFGMgr.h:515
LootItemType
@ POINT_MOTION_TYPE
@ TYPEID_PLAYER
Definition ObjectGuid.h:44
@ QUEST_STATUS_COMPLETE
Definition QuestDef.h:148
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1383
void ClearGossipMenuFor(Player *player)
void CloseGossipMenuFor(Player *player)
SpellEffIndex
@ EFFECT_0
@ LANG_UNIVERSAL
@ TARGET_DEST_NEARBY_ENTRY
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ TEAM_OTHER
@ CHAT_MSG_SAY
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ SPELL_AURA_DUMMY
@ SPELL_AURA_PERIODIC_DUMMY
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
#define SpellEffectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define SpellDestinationTargetSelectFn(F, I, N)
#define AuraEffectRemoveFn(F, I, N, M)
@ REACT_PASSIVE
@ REACT_AGGRESSIVE
@ UNIT_NPC_FLAG_QUESTGIVER
DamageEffectType
@ UNIT_STATE_CASTING
Definition Unit.h:276
QuaternionData const GOSoilSpawnQuat
@ ACTION_PUMPKIN_SPROUTING_FINISHED
@ ACTION_HEAD_PLAYER_TEXT
@ ACTION_HEAD_RETURN_TO_BODY
@ ACTION_OTHER_OBJECT_ACTIVE
@ ACTION_HEAD_START_HEAD_PHASE
@ ACTION_HORSEMAN_REQUEST_BODY
std::vector< uint32 > HeadlessHorsemanRandomLaughSound
QuaternionData const GOPumpkinSpawnQuat
WaypointPath const HeadlessHorsemanFlightPoints
void AddSC_boss_headless_horseman()
Position const GOPumpkinSpawnPosition
@ SAY_HORSEMAN_ENTRANCE
@ SAY_SPROUTING_PUMPKINS
Position const GOSoilSpawnPosition
@ EVENT_HORSEMAN_CLEAVE
@ EVENT_STOP_HEAD_PHASE
@ EVENT_START_HEAD_DELAYED
@ EVENT_START_NEXT_PHASE_DELAYED
@ EVENT_START_NEXT_HEADLESS_PHASE
@ SPELL_HEADLESS_HORSEMAN_C_HEAD_STUN
@ SPELL_SUMMON_PUMPKIN_BURST_DELAY
@ SPELL_HEADLESS_HORSEMAN_SPEAKS
@ SPELL_HEADLESS_HORSEMAN_C_COMMAND_HEAD_REPOSITIONS
@ SPELL_HORSEMANS_CONFLAGRATION_SOUND_THROTTLE
@ SPELL_RAIN_OF_TREATS
@ SPELL_HEADLESS_HORSEMAN_C_BODY_DEATH
@ SPELL_HEADLESS_HORSEMAN_C_SUMMONING_RHYME_AURA
@ SPELL_HEADLESS_HORSEMAN_WISP_FLIGHT_PORT
@ SPELL_HEADLESS_HORSEMAN_PUMPKIN_AURA
@ SPELL_HEADLESS_HORSEMAN_C_BODY_REGEN_CONFUSE
@ SPELL_HEADLESS_HORSEMAN_C_GHOST_VISUAL
@ SPELL_HEADLESS_HORSEMAN_C_SEND_HEAD
@ SPELL_CONFLAGRATION
@ SPELL_PUMPKIN_LIFE_CYCLE
@ SPELL_HORSEMANS_CONFLAGRATION_SOUND
@ SPELL_HEADLESS_HORSEMAN_C_BODY_STAGE_1
@ SPELL_HEADLESS_HORSEMAN_C_RETURN_HEAD
@ SPELL_HEADLESS_HORSEMAN_BURNING_COSMETIC
@ SPELL_HEADLESS_HORSEMAN_C_HEAL_BODY
@ SPELL_HEADLESS_HORSEMAN_ONKILL_PROC
@ SPELL_HEADLESS_HORSEMAN_BURNING_COSMETIC_BASE
@ SPELL_HEADLESS_HORSEMAN_WISP_INVIS
@ SPELL_HEADLESS_HORSEMAN_C_HEAD_PAUSE
@ SPELL_HEADLESS_HORSEMAN_C_BODY_REGEN_IMMUNE
@ SPELL_HEADLESS_HORSEMAN_C_ENRAGED_VISUAL
@ SPELL_HEADLESS_HORSEMAN_MANIACAL_LAUGH
@ SPELL_HEADLESS_HORSEMAN_CLEAVE
@ SPELL_HEADLESS_HORSEMAN_C_BODY_REGEN_TRANSFORM
@ SPELL_HEADLESS_HORSEMAN_C_SUMMONING_RHYME_SHAKE_SMALL
@ SPELL_HEADLESS_HORSEMAN_C_BODY_STAGE_2
@ SPELL_HEADLESS_HORSEMAN_C_SUMMONING_RHYME_SHAKE_MEDIUM
@ SPELL_HEADLESS_HORSEMAN_YELL_TIMER
@ SPELL_HEADLESS_HORSEMAN_FIRE_SIZE_BIG
@ SPELL_HEADLESS_HORSEMAN_WISP_FLIGHT_MISSILE
@ SPELL_HEADLESS_HORSEMAN_C_HEAD_IS_DEAD
@ SPELL_HEADLESS_HORSEMAN_C_HEAD_VISUAL
@ SPELL_HEADLESS_HORSEMAN_C_COMMAND_REQUEST_BODY
@ SPELL_HEADLESS_HORSEMAN_C_BODY_STAGE_3
@ SPELL_HEADLESS_HORSEMAN_C_HEAD_PERIODIC
@ SPELL_HEADLESS_HORSEMAN_C_HORSEMANS_WHIRLWIND
@ QUEST_CALL_THE_HEADLESS_HORSEMAN
@ POINT_HORSEMAN_FINISH_PATH
@ SOUNDID_MANIACAL_LAUGH
@ SOUNDID_MANIACAL_LAUGH_2
@ SOUNDID_MANIACAL_LAUGH_3
@ LFG_DUNGEONID_THE_HEADLESS_HORSEMAN
uint32 GetTickNumber() const
HookList< EffectApplyHandler > AfterEffectRemove
HookList< EffectPeriodicHandler > OnEffectPeriodic
Unit * GetCaster() const
Unit * GetTarget() const
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
TypeID GetTypeId() const
Definition BaseEntity.h:166
void DoZoneInCombat()
Definition CreatureAI.h:169
virtual void JustReachedHome()
Definition CreatureAI.h:167
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:63
void SetHomePosition(float x, float y, float z, float o)
Definition Creature.h:386
void SetImmuneToPC(bool apply) override
Definition Creature.h:184
void SetDisplayFromModel(uint32 modelIdx)
void SetReactState(ReactStates st)
Definition Creature.h:174
bool UpdateEntry(uint32 entry, CreatureData const *data=nullptr, bool updateLevel=true)
Definition Creature.cpp:593
void SetImmuneToNPC(bool apply) override
Definition Creature.h:187
CreatureAI * AI() const
Definition Creature.h:228
uint32 ExecuteEvent()
Definition EventMap.cpp:77
void Update(uint32 time)
Definition EventMap.h:61
void Repeat(Milliseconds time)
Definition EventMap.cpp:67
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition EventMap.cpp:40
bool IsInPhase(uint8 phase) const
Definition EventMap.h:222
void SetPhase(uint8 phase)
Definition EventMap.cpp:32
void Reset()
Definition EventMap.cpp:25
Definition Group.h:205
Creature * GetCreature(uint32 type)
Definition Map.h:225
bool HavePlayers() const
Definition Map.h:393
PlayerList const & GetPlayers() const
Definition Map.h:403
void MoveRandom(float wanderDistance=0.0f, Optional< Milliseconds > duration={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::ForceWalk, MovementSlot slot=MOTION_SLOT_DEFAULT, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
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={})
Player * ToPlayer()
Definition Object.h:126
uint32 GetEntry() const
Definition Object.h:89
Creature * ToCreature()
Definition Object.h:121
void AreaExploredOrEventHappens(uint32 questId)
Definition Player.cpp:16552
QuestStatus GetQuestStatus(uint32 quest_id) const
Definition Player.cpp:15962
iterator begin()
Definition RefManager.h:35
uint32 const Id
Definition SpellInfo.h:328
Creature * GetHitCreature() const
Unit * GetCaster() const
HookList< DestinationTargetSelectHandler > OnDestinationTargetSelect
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
void Despawn(Creature const *summon)
void Summon(Creature const *summon)
TaskScheduler::repeated_t GetRepeatCounter() const
Returns the repeat counter which increases every time the task is repeated.
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
virtual void InitializeAI()
Definition UnitAI.cpp:43
virtual void DoAction(int32 param)
Definition UnitAI.h:73
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.cpp:180
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition UnitAI.cpp:79
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:162
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:89
Definition Unit.h:635
void RemoveGameObject(GameObject *gameObj, bool del)
Definition Unit.cpp:5378
MotionMaster * GetMotionMaster()
Definition Unit.h:1723
bool SetHover(bool enable, bool updateAnimTier=true)
Definition Unit.cpp:13577
void RemoveNpcFlag(NPCFlags flags)
Definition Unit.h:998
UnitAI * GetAI() const
Definition Unit.h:668
bool SetDisableGravity(bool disable, bool updateAnimTier=true)
Definition Unit.cpp:13361
void SetUninteractible(bool apply)
Definition Unit.cpp:8564
bool IsAIEnabled() const
Definition Unit.h:666
uint64 GetHealth() const
Definition Unit.h:788
void SetNpcFlag(NPCFlags flags)
Definition Unit.h:997
bool SetWalk(bool enable)
Definition Unit.cpp:13343
bool HealthBelowPct(float pct) const
Definition Unit.h:792
void NearTeleportTo(TeleportLocation const &target, bool casting=false)
Definition Unit.cpp:12958
bool HasUnitState(const uint32 f) const
Definition Unit.h:743
void RemoveAllAttackers()
Definition Unit.cpp:6066
void KillSelf(bool durabilityLoss=true, bool skipSettingDeathState=false)
Definition Unit.h:936
bool AttackStop()
Definition Unit.cpp:5965
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3974
void PlayDirectSound(uint32 soundId, Player const *target=nullptr, uint32 broadcastTextId=0) const
Definition Object.cpp:2938
Map * GetMap() const
Definition Object.h:411
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2217
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:1398
void setActive(bool isActiveObject)
Definition Object.cpp:276
GameObject * SummonGameObject(uint32 entry, Position const &pos, QuaternionData const &rot, Seconds respawnTime, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
Definition Object.cpp:1441
Position GetRandomNearPosition(float radius)
Definition Object.cpp:2769
virtual uint32 GetData(uint32) const
Definition ZoneScript.h:99
virtual void SetData(uint32, uint32)
Definition ZoneScript.h:100
void OnApply(AuraEffect const *, AuraEffectHandleModes)
Position const EarthBunnySpawnPosition
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
auto SelectRandomContainerElement(C const &container) -> std::add_const_t< decltype(*std::ranges::begin(container))> &
Definition Containers.h:110
@ ACTION_HORSEMAN_EVENT_START
@ GO_LOOSELY_TURNED_SOIL
@ GO_PUMPKIN_SHRINE
@ DATA_PREPARE_RESET
@ DATA_HORSEMAN_HEAD
@ DATA_HEADLESS_HORSEMAN
@ DATA_HORSEMAN_EVENT_STATE
@ DATA_START_HORSEMAN_EVENT
#define RegisterScarletMonasteryGameObjectAI(ai)
#define RegisterScarletMonasteryCreatureAI(ai)
@ NPC_HEADLESS_HORSEMAN
@ NPC_PULSING_PUMPKIN
@ NPC_SIR_THOMAS
@ NPC_PUMPKIN_FIEND
constexpr void GetPosition(float &x, float &y) const
Definition Position.h:92
void AttackStart(Unit *) override
== Triggered Actions Requested ==================
void DoPlaySoundToSet(WorldObject *source, uint32 soundId)
void Relocate(Position const &pos)
Definition Spell.cpp:82
void JustEngagedWith(Unit *) override
void JustSummoned(Creature *summon) override
void WaypointPathEnded(uint32, uint32 pathId) override
void SummonedCreatureDies(Creature *summon, Unit *) override
boss_headless_horseman(Creature *creature)
void MovementInform(uint32 type, uint32 id) override
void DoAction(int32 id) override
void StartPhase(uint8 nextPhase)
void DamageTaken(Unit *who, uint32 &damage, DamageEffectType, SpellInfo const *) override
void UpdateAI(uint32 diff) override
void KilledUnit(Unit *victim) override
bool OnGossipSelect(Player *player, uint32, uint32) override
bool OnGossipHello(Player *player) override
void OnQuestReward(Player *player, Quest const *, LootItemType, uint32) override
void UpdateAI(uint32 diff) override
npc_flame_bunny(Creature *creature)
void SetGUID(ObjectGuid const &guid, int32 id) override
npc_headless_horseman_head(Creature *creature)
void UpdateAI(uint32 diff) override
npc_pulsing_pumpkin(Creature *creature)
void UpdateAI(uint32 diff) override
void DoAction(int32 id) override
npc_sir_thomas(Creature *creature)
void UpdateAI(uint32 diff) override
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override