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 "Player.h"
30#include "ScriptedCreature.h"
31#include "ScriptedGossip.h"
32#include "ScriptMgr.h"
33#include "Spell.h"
34#include "SpellAuraEffects.h"
35#include "SpellScript.h"
36#include "SpellInfo.h"
37#include "SpellMgr.h"
38#include "PassiveAI.h"
39
58
60{
61 // Horseman & Head
94
95 // Pumpkin
101
102 // Fire Bunny
105
106 // Sir Thomas
111
112 SPELL_HEADLESS_HORSEMAN_C_ENRAGED_VISUAL = 42438 // Not used, maybe a bersek mechanic?
114
127
140
156
159{
160 { 1765.00f, 1347.00f, 19.00f },
161 { 1784.00f, 1346.80f, 25.40f },
162 { 1803.30f, 1347.60f, 33.00f },
163 { 1824.00f, 1350.00f, 42.60f },
164 { 1838.80f, 1353.20f, 49.80f },
165 { 1852.00f, 1357.60f, 55.70f },
166 { 1861.30f, 1364.00f, 59.40f },
167 { 1866.30f, 1374.80f, 61.70f },
168 { 1864.00f, 1387.30f, 63.20f },
169 { 1854.80f, 1399.40f, 64.10f },
170 { 1844.00f, 1406.90f, 64.10f },
171 { 1824.30f, 1411.40f, 63.30f },
172 { 1801.00f, 1412.30f, 60.40f },
173 { 1782.00f, 1410.10f, 55.50f },
174 { 1770.50f, 1405.20f, 50.30f },
175 { 1765.20f, 1400.70f, 46.60f },
176 { 1761.40f, 1393.40f, 41.70f },
177 { 1759.10f, 1386.70f, 36.60f },
178 { 1757.80f, 1378.20f, 29.00f },
179 { 1758.00f, 1367.00f, 19.51f }
180};
181
183Position const GOPumpkinSpawnPosition = { 1776.27f, 1348.74f, 20.4116f, 6.27281f };
184QuaternionData const GOPumpkinSpawnQuat = QuaternionData(0.0f, 0.0f, 0.00518764f, -0.999987f);
185Position const GOSoilSpawnPosition = { 1765.28f, 1347.46f, 17.5514f, 0.100363f };
186QuaternionData const GOSoilSpawnQuat = QuaternionData(0.0f, 0.0f, 0.0501604f, -0.998741f);
187
189{
190 npc_headless_horseman_head(Creature* creature) : PassiveAI(creature), _instance(creature->GetInstanceScript()), _phase(PHASE_1)
191 {
193 }
194
195 void JustAppeared() override
196 {
198 }
199
207
208 void JustReachedHome() override
209 {
210 _events.Reset();
214 }
215
246
247 void SetGUID(ObjectGuid const& guid, int32 id) override
248 {
249 if (id != ACTION_HEAD_PLAYER_TEXT)
250 return;
251
252 if (Unit* target = ObjectAccessor::GetUnit(*me, guid))
254 }
255
283
290
291 void UpdateAI(uint32 diff) override
292 {
294 return;
295
296 _events.Update(diff);
297
299 return;
300
301 while (uint32 eventId = _events.ExecuteEvent())
302 {
303 switch (eventId)
304 {
307 break;
316 break;
322 me->RemoveGameObject(pumpkin, false);
324 me->RemoveGameObject(soil, false);
325 break;
326 default:
327 break;
328 }
329
331 return;
332 }
333 }
334
335private:
339};
340
342{
343 boss_headless_horseman(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()), _summons(me), _introDone(false) { }
344
345 void InitializeAI() override
346 {
347 me->SetDisableGravity(true);
348 me->SetHover(true);
350 }
351
357
358 void JustAppeared() override
359 {
361 }
362
363 void Reset() override
364 {
365 _events.Reset();
368 me->setActive(false);
369 if (_introDone)
370 me->SetImmuneToPC(false);
371 me->SetWalk(false);
372 }
373
380
381 void JustEngagedWith(Unit* /*who*/) override
382 {
384 me->setActive(true);
387
389 head->AI()->DoZoneInCombat();
390 }
391
392 void JustSummoned(Creature* summon) override
393 {
394 _summons.Summon(summon);
395 DoZoneInCombat(summon);
396 }
397
398 void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override
399 {
400 _summons.Despawn(summon);
401 }
402
403 void KilledUnit(Unit* victim) override
404 {
405 if (victim->GetTypeId() == TYPEID_PLAYER)
407 }
408
443
444 void JustDied(Unit* /*killer*/) override
445 {
450 // Credit LFG
451 if (me->GetMap()->HavePlayers())
452 {
453 Map* map = me->GetMap();
454 if (Group* group = map->GetPlayers().begin()->GetSource()->GetGroup())
455 if (group->isLFGGroup())
456 sLFGMgr->FinishDungeon(group->GetGUID(), LFG_DUNGEONID_THE_HEADLESS_HORSEMAN, map);
457 }
458 }
459
460 void DamageTaken(Unit* who, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
461 {
462 if (damage >= me->GetHealth() && who != me)
463 {
464 damage = 0;
465
468 else if (_events.IsInPhase(PHASE_2))
470 else if (_events.IsInPhase(PHASE_3))
472 }
473 }
474
502
508
514
515 void MovementInform(uint32 type, uint32 id) override
516 {
517 if (type != POINT_MOTION_TYPE && type != EFFECT_MOTION_TYPE)
518 return;
519
520 switch (id)
521 {
523 _introDone = true;
524 me->SetImmuneToPC(false);
525 me->SetDisableGravity(false);
526 me->SetHover(false);
531 break;
532 case POINT_HEAD:
533 me->SetWalk(false);
536 break;
537 default:
538 break;
539 }
540 }
541
542 void UpdateAI(uint32 diff) override
543 {
544 if (!UpdateVictim())
545 return;
546
547 _events.Update(diff);
548
550 return;
551
552 while (uint32 eventId = _events.ExecuteEvent())
553 {
554 switch (eventId)
555 {
558 _events.Repeat(6s, 12s);
559 break;
567 break;
572 {
575 }
576 else if (_events.IsInPhase(PHASE_3))
577 {
580 }
581
583 AttackStart(target);
584 break;
586 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 30.0f, true, false))
587 {
592 }
593 _events.Repeat(18s, 21s);
594 break;
597 _events.Repeat(30s);
598 break;
601 _events.Repeat(30s, 60s);
602 break;
603 default:
604 break;
605 }
606
608 return;
609 }
610
612 }
613
614private:
619};
620
622{
623 npc_pulsing_pumpkin(Creature* creature) : ScriptedAI(creature) { }
624
625 void InitializeAI() override
626 {
627 me->SetDisableGravity(true);
628 me->SetHover(true);
630 }
631
639
640 void DoAction(int32 id) override
641 {
643 return;
644
645 _scheduler.Schedule(1s, [this](TaskContext /*context*/)
646 {
648 me->SetDisableGravity(false);
649 me->SetHover(false);
651 me->UpdateEntry(NPC_PUMPKIN_FIEND, nullptr, false);
652 me->SetImmuneToNPC(true);
655 }).Schedule(11s, [this](TaskContext squashSoul)
656 {
658 squashSoul.Repeat(10s);
659 });
660 }
661
662 void UpdateAI(uint32 diff) override
663 {
664 if (!UpdateVictim())
665 return;
666
667 _scheduler.Update(diff);
668
670 }
671
672private:
674};
675
677{
678 npc_flame_bunny(Creature* creature) : PassiveAI(creature)
679 {
681 }
682
683 void Reset() override
684 {
685 _scheduler.Schedule(1s, [this](TaskContext /*context*/)
686 {
688 }).Schedule(3s, [this](TaskContext grow)
689 {
691 if (grow.GetRepeatCounter() < 2)
692 grow.Repeat(2s + 200ms);
693 });
694 }
695
696 void UpdateAI(uint32 diff) override
697 {
698 _scheduler.Update(diff);
699 }
700
701private:
703};
704
740
742{
743 go_loosely_turned_soil(GameObject* go) : GameObjectAI(go), _instance(go->GetInstanceScript()) { }
744
745 bool OnGossipHello(Player* player) override
746 {
748 return true;
749
751 return true;
752
753 return false;
754 }
755
756 void OnQuestReward(Player* player, Quest const* /*quest*/, uint32 /*opt*/) override
757 {
761 head->AI()->SetGUID(player->GetGUID(), ACTION_HEAD_PLAYER_TEXT);
762 }
763
764private:
766};
767
769{
770 go_headless_horseman_pumpkin(GameObject* go) : GameObjectAI(go), _instance(go->GetInstanceScript()) { }
771
772 bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 /*gossipListId*/) override
773 {
774 ClearGossipMenuFor(player);
775
777 {
778 CloseGossipMenuFor(player);
779 return true;
780 }
781
785 head->AI()->SetGUID(player->GetGUID(), ACTION_HEAD_PLAYER_TEXT);
786
787 CloseGossipMenuFor(player);
788 return true;
789 }
790
791private:
793};
794
795// 42432 - Headless Horseman Yell Timer
797{
799
800 void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
801 {
802 Creature* horseman = GetTarget()->ToCreature();
803 if (!horseman || !horseman->IsAIEnabled())
804 return;
805
806 horseman->AI()->Talk(SAY_HORSEMAN_ENTRANCE);
807 }
808
813};
814
815// 43893 - Headless Horseman - Maniacal Laugh, Maniacal, Delayed 8
830
831// 42410 - Headless Horseman Climax - Command, Head Repositions
847
848// 42399 - Headless Horseman Climax - Send Head
865
866// 42603 - Headless Horseman Climax, Head: Periodic
887
888// 43101 - Headless Horseman Climax - Command, Head Requests Body
905
906// 42401 - Headless Horseman Climax - Return Head
923
924// 52236 - Summon Pumpkin Burst Delay
940
941// 42428 - Headless Horseman Climax - Head Is Dead
943{
945
946 void HandleDummy(SpellEffIndex /*effIndex*/)
947 {
948 Creature* target = GetHitCreature();
949 if (!target || !target->IsAIEnabled())
950 return;
951
952 switch (target->GetEntry())
953 {
955 target->AI()->DoAction(ACTION_HEAD_IS_DEAD);
956 break;
959 target->KillSelf();
960 break;
961 default:
962 break;
963 }
964 }
965
970};
971
972// 42879 - Headless Horseman Climax - Summoning Rhyme Aura
974{
976
977 void PeriodicTick(AuraEffect const* aurEff)
978 {
979 if (!GetCaster())
980 return;
981
982 Creature* caster = GetCaster()->ToCreature();
983 Player* player = GetTarget()->ToPlayer();
984 if (!caster || !player)
985 return;
986
987 switch (aurEff->GetTickNumber())
988 {
989 case 1:
990 sCreatureTextMgr->SendChat(caster, SAY_PLAYER_RISE, nullptr, CHAT_MSG_SAY, LANG_UNIVERSAL, TEXT_RANGE_NORMAL, 0, TEAM_OTHER, false, player);
991 break;
992 case 3:
993 sCreatureTextMgr->SendChat(caster, SAY_PLAYER_TIME, nullptr, CHAT_MSG_SAY, LANG_UNIVERSAL, TEXT_RANGE_NORMAL, 0, TEAM_OTHER, false, player);
994 break;
995 case 5:
996 sCreatureTextMgr->SendChat(caster, SAY_PLAYER_DEATH, nullptr, CHAT_MSG_SAY, LANG_UNIVERSAL, TEXT_RANGE_NORMAL, 0, TEAM_OTHER, false, player);
998 break;
999 case 8:
1000 sCreatureTextMgr->SendChat(caster, SAY_PLAYER_DEMISE, nullptr, CHAT_MSG_SAY, LANG_UNIVERSAL, TEXT_RANGE_NORMAL, 0, TEAM_OTHER, false, player);
1002 Remove();
1003 break;
1004 default:
1005 break;
1006 }
1007 }
1008
1013};
1014
1015// 42281 - Sprouting
1032
1033// 42821 - Headless Horseman - Wisp Flight Missile
1034// 42818 - Headless Horseman - Wisp Flight Port
1049
#define sCreatureTextMgr
@ TEXT_RANGE_NORMAL
uint8_t uint8
Definition Define.h:135
int32_t int32
Definition Define.h:129
uint32_t uint32
Definition Define.h:133
@ DONE
@ NOT_STARTED
#define sLFGMgr
Definition LFGMgr.h:492
@ POINT_MOTION_TYPE
@ EFFECT_MOTION_TYPE
@ TYPEID_PLAYER
Definition ObjectGuid.h:39
@ QUEST_STATUS_COMPLETE
Definition QuestDef.h:105
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1128
void ClearGossipMenuFor(Player *player)
void CloseGossipMenuFor(Player *player)
SpellEffIndex
@ EFFECT_0
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ LANG_UNIVERSAL
@ TARGET_DEST_NEARBY_ENTRY
@ 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
@ UNIT_FLAG_UNINTERACTIBLE
@ UNIT_STATE_CASTING
Definition Unit.h:235
DamageEffectType
Definition Unit.h:352
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
void AddSC_boss_headless_horseman()
Position const GOPumpkinSpawnPosition
@ SAY_HORSEMAN_ENTRANCE
@ SAY_SPROUTING_PUMPKINS
Position const GOSoilSpawnPosition
Position const HeadlessHorsemanFlightPoints[HorsemanPathSize]
@ EVENT_HORSEMAN_CLEAVE
@ EVENT_STOP_HEAD_PHASE
@ EVENT_START_HEAD_DELAYED
@ EVENT_START_NEXT_PHASE_DELAYED
@ EVENT_START_NEXT_HEADLESS_PHASE
uint32 const HorsemanPathSize
@ 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
void Remove(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
virtual void JustReachedHome()
Definition CreatureAI.h:178
void DoZoneInCombat(Creature *creature=nullptr)
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:82
void SetCombatPulseDelay(uint32 delay)
Definition Creature.h:269
void SetHomePosition(float x, float y, float z, float o)
Definition Creature.h:293
void SetDisplayId(uint32 modelId) override
void SetImmuneToPC(bool apply) override
Definition Creature.h:129
void SetReactState(ReactStates st)
Definition Creature.h:119
bool UpdateEntry(uint32 entry, CreatureData const *data=nullptr, bool updateLevel=true)
Definition Creature.cpp:540
CreatureTemplate const * GetCreatureTemplate() const
Definition Creature.h:186
void SetImmuneToNPC(bool apply) override
Definition Creature.h:132
CreatureAI * AI() const
Definition Creature.h:154
void Update(uint32 time)
Definition EventMap.h:67
void Repeat(Milliseconds time)
Definition EventMap.cpp:63
EventId ExecuteEvent()
Definition EventMap.cpp:73
bool IsInPhase(PhaseIndex phase) const
Definition EventMap.h:236
void SetPhase(PhaseIndex phase)
Definition EventMap.cpp:28
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:36
void Reset()
Definition EventMap.cpp:21
Definition Group.h:165
Creature * GetCreature(uint32 type)
iterator begin()
Definition Map.h:281
bool HavePlayers() const
Definition Map.h:437
PlayerList const & GetPlayers() const
Definition Map.h:448
void MoveSmoothPath(uint32 pointId, Position const *pathPoints, size_t pathSize, bool walk)
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={})
void MoveRandom(float wanderDistance=0.0f)
static Creature * ToCreature(Object *o)
Definition Object.h:186
TypeID GetTypeId() const
Definition Object.h:93
uint32 GetEntry() const
Definition Object.h:81
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
static Player * ToPlayer(Object *o)
Definition Object.h:180
Group * GetGroup()
Definition Player.h:2171
void AreaExploredOrEventHappens(uint32 questId)
Definition Player.cpp:16008
QuestStatus GetQuestStatus(uint32 quest_id) const
Definition Player.cpp:15642
FROM * GetSource() const
Definition Reference.h:96
uint32 Id
Definition SpellInfo.h:289
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)
TaskContext & Repeat(std::chrono::duration< _Rep, _Period > const &duration)
TaskScheduler::repeated_t GetRepeatCounter() const
Returns the repeat counter which increases every time the task is repeated.
TaskScheduler & Schedule(std::chrono::duration< _Rep, _Period > const &time, task_handler_t const &task)
TaskScheduler & Update(success_t const &callback=EmptyCallback)
virtual void DoAction(int32)
Definition UnitAI.h:154
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:54
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:241
virtual void InitializeAI()
Definition UnitAI.cpp:36
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.cpp:166
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition UnitAI.cpp:96
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:243
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:106
Definition Unit.h:769
void RemoveGameObject(GameObject *gameObj, bool del)
Definition Unit.cpp:5111
void KillSelf(bool durabilityLoss=true)
Definition Unit.h:1023
MotionMaster * GetMotionMaster()
Definition Unit.h:1667
bool SetHover(bool enable, bool updateAnimTier=true)
Definition Unit.cpp:13503
void RemoveNpcFlag(NPCFlags flags)
Definition Unit.h:1098
UnitAI * GetAI() const
Definition Unit.h:800
bool SetDisableGravity(bool disable, bool updateAnimTier=true)
Definition Unit.cpp:13286
bool IsAIEnabled() const
Definition Unit.h:798
bool HealthBelowPct(int32 pct) const
Definition Unit.h:917
uint32 GetHealth() const
Definition Unit.h:913
void SetNpcFlag(NPCFlags flags)
Definition Unit.h:1097
bool SetWalk(bool enable)
Definition Unit.cpp:13268
void NearTeleportTo(Position const &pos, bool casting=false)
Definition Unit.cpp:12832
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3784
bool HasUnitState(const uint32 f) const
Definition Unit.h:876
void RemoveAllAttackers()
Definition Unit.cpp:5736
void SetUnitFlag(UnitFlags flags)
Definition Unit.h:954
bool AttackStop()
Definition Unit.cpp:5645
void RemoveUnitFlag(UnitFlags flags)
Definition Unit.h:955
Map * GetMap() const
Definition Object.h:449
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2832
TempSummon * SummonCreature(uint32 entry, Position const &pos, TempSummonType despawnType=TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime=0s, uint32 vehId=0, uint32 spellId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty)
Definition Object.cpp:1992
void setActive(bool isActiveObject)
Definition Object.cpp:991
GameObject * SummonGameObject(uint32 entry, Position const &pos, QuaternionData const &rot, Seconds respawnTime, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
Definition Object.cpp:2015
Position GetRandomNearPosition(float radius)
Definition Object.cpp:3264
void PlayDirectSound(uint32 soundId, Player *target=nullptr)
Definition Object.cpp:3433
virtual uint32 GetData(uint32) const
Definition ZoneScript.h:55
virtual void SetData(uint32, uint32)
Definition ZoneScript.h:56
PrepareSpellScript(spell_headless_horseman_command_head_request_body)
PrepareSpellScript(spell_headless_horseman_head_is_dead)
PrepareAuraScript(spell_headless_horseman_head_periodic)
PrepareSpellScript(spell_headless_horseman_head_reposition)
PrepareAuraScript(spell_headless_horseman_maniacal_laugh)
PrepareSpellScript(spell_headless_horseman_return_head)
PrepareSpellScript(spell_headless_horseman_send_head)
PrepareSpellScript(spell_headless_horseman_sprouting)
PrepareAuraScript(spell_headless_horseman_summoning_rhyme_aura)
PrepareSpellScript(spell_headless_horseman_wisp_teleport)
void OnApply(AuraEffect const *, AuraEffectHandleModes)
PrepareAuraScript(spell_headless_horseman_yell_timer)
PrepareAuraScript(spell_summon_pumpkin_burst_delay)
Position const EarthBunnySpawnPosition
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
auto SelectRandomContainerElement(C const &container) -> typename std::add_const< decltype(*std::begin(container))>::type &
Definition Containers.h:108
@ 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
void GetPosition(float &x, float &y) const
Definition Position.h:84
void AttackStart(Unit *) override
void DoPlaySoundToSet(WorldObject *source, uint32 soundId)
void Relocate(Position const &pos)
Definition Spell.cpp:99
void JustEngagedWith(Unit *) override
void JustSummoned(Creature *summon) 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 *, 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