TrinityCore
Loading...
Searching...
No Matches
boss_ymiron_the_fallen_king.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 "AreaTrigger.h"
19#include "AreaTriggerAI.h"
20#include "Containers.h"
21#include "CreatureAI.h"
22#include "CreatureAIImpl.h"
23#include "InstanceScript.h"
24#include "Map.h"
25#include "MotionMaster.h"
26#include "ObjectAccessor.h"
27#include "Player.h"
28#include "ScriptMgr.h"
29#include "ScriptedCreature.h"
30#include "SpellAuraEffects.h"
31#include "SpellAuras.h"
32#include "SpellScript.h"
33#include "SharedDefines.h"
34#include "TemporarySummon.h"
35#include "maw_of_souls.h"
36#include <queue>
37
39{
40 // Intro
44 SPELL_SUICIDE = 117624,
45
46 SPELL_POWER = 167922,
53 SPELL_BANE_DAMAGE = 193513, // only on triggering unit of Bane
54 SPELL_BANE_NOVA = 200194, // AoE on party when Bane orb is triggered
59
60 SPELL_VIGOR = 203816, // stacking every 6s
61};
62
71
80
82{
83 SAY_INTRO1 = 0, // Your souls will drift for eternity in the tides of the underworld!
84 SAY_INTRO2 = 1, // Another drop in the sea of souls!
85 SAY_AGGRO = 2, // Mortals... I fell to your wretched kind once before. It WILL NOT happen again!
86 SAY_SCREAMS_OF_THE_DEAD = 3, // COWER BEFORE ME!
87 SAY_WINDS_OF_NORTHREND = 4, // Know the bitter chill of death as I have!
88 SAY_BANE = 5, // The shadows of the underworld bend to me!
89 SAY_ARISE_FALLEN = 6, // The shadows of Helheim cut deeper than steel!
90 SAY_DEATH = 7, // Not... again... HARBARON! CAST THEIR SOULS INTO THE TIDES!
91};
92
97
103
104constexpr Position YmironIntroJumpPos = { 7401.39f, 7281.7f, 44.0207f };
105constexpr Position YmironRespawnPos = { 7398.374f, 7277.1206f, 43.792637f, 5.724679946899414062f };
106
107// 96756 - Ymiron, the Fallen King
109{
111
112 void JustAppeared() override
113 {
115
117
118 me->SetPower(me->GetPowerType(), 80);
119 }
120
121 void InitializeAI() override
122 {
125 }
126
127 void Reset() override
128 {
130 _firstScreamDone = false;
131 }
132
133 void JustDied(Unit* /*killer*/) override
134 {
135 _JustDied();
137 }
138
147
148 void JustEngagedWith(Unit* who) override
149 {
151
153
155
157
159
161
162 // should turn to highest threat target after standing up
164 {
167
168 scheduler.Schedule(1600ms, [this](TaskContext const& /*task*/)
169 {
171 });
172 }
173
178 }
179
180 void UpdateAI(uint32 diff) override
181 {
182 scheduler.Update(diff);
183
184 if (!UpdateVictim())
185 return;
186
187 events.Update(diff);
188
190 return;
191
192 if (uint32 eventId = events.ExecuteEvent())
193 {
194 switch (eventId)
195 {
197 {
198 if (me->GetPower(me->GetPowerType()) >= 100)
199 {
201 me->SetPower(me->GetPowerType(), 0);
202 }
203 events.Repeat(500ms);
204 break;
205 }
207 {
210 else
211 _firstScreamDone = true;
212
214 events.Repeat(31s);
215 break;
216 }
220 events.Repeat(29s);
221 break;
222 case EVENT_BANE:
223 {
224 Talk(SAY_BANE);
226 if (IsHeroicOrHigher())
228 events.Repeat(59s);
229 break;
230 }
235 break;
236 default:
237 break;
238 }
239 }
240 }
241
242 void DoAction(int32 param) override
243 {
244 if (param != ACTION_ACTIVATE)
245 return;
246
248 scheduler.Schedule(2s, [this](TaskContext const& /*task*/)
249 {
250 me->GetMotionMaster()->MoveJump(EVENT_JUMP, YmironIntroJumpPos, 24.0f, 2.0f);
251 });
252 }
253
254 void MovementInform(uint32 type, uint32 pointId) override
255 {
256 if (type != EFFECT_MOTION_TYPE)
257 return;
258
259 if (pointId != EVENT_JUMP)
260 return;
261
262 scheduler.Schedule(1500ms, [this](TaskContext const& /*task*/)
263 {
264 me->GetMotionMaster()->MovePath(PATH_INTRO_TOWARDS_SLAVES, false);
265 });
266 }
267
268 void OnChannelFinished(SpellInfo const* spell) override
269 {
270 if (spell->Id != SPELL_SOUL_SIPHON_CHANNEL)
271 return;
272
273 scheduler.Schedule(2s, [this](TaskContext& task)
274 {
276
277 task.Schedule(5s, [this](TaskContext const& /*task*/)
278 {
280 });
281 });
282 }
283
284 void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
285 {
286 if (me->IsInCombat())
287 return;
288
289 if (pathId == PATH_INTRO_TOWARDS_SLAVES)
290 {
291 scheduler.Schedule(2s, [this](TaskContext const& /*task*/)
292 {
295 });
296 }
297 else if (pathId == PATH_INTRO_AWAY_FROM_SLAVES)
298 {
300 }
301 }
302
303private:
305};
306
307// Maw of Souls - Ymiron Activation Trigger
309{
311
312 void OnUnitEnter(Unit* unit) override
313 {
314 Player* player = unit->ToPlayer();
315 if (!player)
316 return;
317
318 if (player->IsGameMaster())
319 return;
320
321 InstanceScript* instance = at->GetInstanceScript();
322 if (!instance)
323 return;
324
325 Creature* ymiron = instance->GetCreature(DATA_YMIRON);
326 if (!ymiron)
327 return;
328
329 ymiron->AI()->DoAction(ACTION_ACTIVATE);
330
331 at->Remove();
332 }
333};
334
336{
337public:
338 explicit YmironSoulSiphonVisual(ObjectGuid ymironGUID, Unit* runecarver, float travelSpeed) : _ymironGUID(ymironGUID), _runecarver(runecarver), _travelSpeed(travelSpeed) { }
339
340 bool Execute(uint64 /*time*/, uint32 /*diff*/) override
341 {
342 if (_runecarver->isDead())
343 return true;
344
346 if (!ymiron)
347 return true;
348
350
352 return false;
353 }
354
355private:
359};
360
361// 243029 - Soul Siphon
363{
364 void OnAfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
365 {
366 Unit* caster = GetCaster();
367 if (!caster)
368 return;
369
370 float travelSpeed = 15 + 0.180f * caster->GetDistance(GetTarget());
371 GetTarget()->m_Events.AddEventAtOffset(new YmironSoulSiphonVisual(caster->GetGUID(), GetTarget(), travelSpeed), 1s);
372 }
373
375 {
376 Creature* targetCreature = GetTarget()->ToCreature();
377 if (!targetCreature)
378 return;
379
380 targetCreature->CastSpell(nullptr, SPELL_SUICIDE, true);
381 targetCreature->DespawnOrUnsummon(20s);
382 }
383
384 void OnPeriodic(AuraEffect const* /*aurEff*/)
385 {
386 if (!roll_chance(10))
387 return;
388
390 }
391
392 void OnAfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
393 {
394 if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
395 return;
396
398 }
399
406};
407
408// 167922 - Power
410{
411 void OnPeriodic(AuraEffect const* aurEff)
412 {
413 int32 newPower = GetTarget()->GetPower(POWER_ENERGY) + (((aurEff->GetTickNumber() + 1) % 3 == 0) ? 6 : 7);
414 GetTarget()->SetPower(POWER_ENERGY, newPower);
415 }
416
421};
422
424{
425public:
426 explicit YmironBanePrecastVisual(Unit* caster, int8 remainingVisualsToSpawn) : _caster(caster), _remainingVisualsToSpawn(remainingVisualsToSpawn) { }
427
428 static constexpr int8 BANE_VISUAL_NUM = 11;
429 static constexpr float BANE_VISUAL_TIME_OFFSET = 0.204545438289642f;
430 static constexpr float BANE_VISUAL_TIME_BASE = 0.75f;
431
432 bool Execute(uint64 /*time*/, uint32 /*diff*/) override
433 {
434 float dist = frand(10.0f, 35.0f);
435 float angle = frand(0.0f, 2.0f * float(M_PI));
436 Position dest(_caster->GetPositionX() + dist * std::cos(angle), _caster->GetPositionY() + dist * std::sin(angle), _caster->GetPositionZ());
438
439 _caster->SendPlaySpellVisual(dest, SPELL_VISUAL_BANE_PRECAST, 0, 0, travelSpeed, true);
440
442
444 {
445 _caster->m_Events.AddEventAtOffset(this, 200ms);
446 return false;
447 }
448 return true;
449 }
450
451private:
454};
455
456// 193460 - Bane
466
467// 193460 - Bane
469{
470 static constexpr float BANE_MISSILE_DIST_OFFSET = 2.272f;
471 static constexpr float BANE_MISSILE_DIST_BASE = 10.0f;
472 static constexpr float BANE_MISSILE_ANGLE_OFFSET = 0.75f;
473
474 static constexpr std::size_t BANE_MAX_TOTAL_TICKS = 4 + 4 + 14;
475
476 void CalcPeriodic(AuraEffect const* /*aurEff*/, bool& /*isPeriodic*/, int32& amplitude)
477 {
478 Unit* caster = GetCaster();
479 if (!caster)
480 return;
481
482 if (caster->GetMap()->IsMythic() || caster->GetMap()->IsMythicPlus())
483 amplitude = 1 * IN_MILLISECONDS;
484
485 // defaults to 2000 for Normal and Heroic via. db2 data
486 }
487
488 void SpawnBaneOrb(int8 tickNumber)
489 {
490 float dist = _distances[tickNumber - 1];
491 float angle = _angles[tickNumber - 1];
492 Position dest = { GetTarget()->GetPositionX() + dist * std::cos(angle), GetTarget()->GetPositionY() + dist * std::sin(angle), GetTarget()->GetPositionZ(), angle};
493 GetTarget()->CastSpell(dest, SPELL_BANE_MISSILE, true);
494 }
495
496 void OnAfterApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
497 {
498 for (std::size_t i = 0; i < BANE_MAX_TOTAL_TICKS; i++)
499 {
500 float angle = Position::NormalizeOrientation(GetCaster()->GetOrientation() + (i * BANE_MISSILE_ANGLE_OFFSET));
501 _angles[2 * i + 0] = angle;
502 _angles[2 * i + 1] = angle;
503
505 _distances[2 * i + 0] = dist;
506 _distances[2 * i + 1] = dist;
507 }
510 }
511
512 void OnPeriodic(AuraEffect const* aurEff)
513 {
514 if (aurEff->GetTickNumber() == 1 || (aurEff->GetTickNumber() == 2 && (GetTarget()->GetMap()->IsMythic() || GetTarget()->GetMap()->IsMythicPlus())))
515 {
516 for (int8 i = 0; i < 4; i++)
517 SpawnBaneOrb(aurEff->GetTickNumber() + i);
518 }
519 else
520 SpawnBaneOrb(aurEff->GetTickNumber() + 8);
521 }
522
523 void OnAfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
524 {
526 }
527
535
536private:
537 std::array<float, BANE_MAX_TOTAL_TICKS * 2> _angles = { };
538 std::array<float, BANE_MAX_TOTAL_TICKS * 2> _distances = { };
539};
540
542{
544
545 void OnInitialize() override
546 {
547 Unit* caster = at->GetCaster();
548 if (!caster)
549 return;
550
551 float radius = at->GetExactDist(caster);
552 float angle = at->GetOrientation();
553
554 AreaTriggerOrbitInfo orbitInfo;
555 orbitInfo.CounterClockwise = false;
556 orbitInfo.CanLoop = true;
557 orbitInfo.ExtraTimeForBlending = 0;
558 orbitInfo.Radius = radius;
559 orbitInfo.BlendFromRadius = radius;
560 orbitInfo.InitialAngle = angle;
561 orbitInfo.PathTarget = caster->GetGUID();
562 at->InitOrbit(orbitInfo);
563 }
564
565 void OnUnitEnter(Unit* unit) override
566 {
567 Player* player = unit->ToPlayer();
568 if (!player)
569 return;
570
571 Unit* caster = at->GetCaster();
572 if (!caster)
573 return;
574
575 caster->CastSpell(player, SPELL_BANE_DAMAGE, true);
576 caster->CastSpell(nullptr, SPELL_BANE_NOVA, true);
577
578 at->Remove();
579 }
580};
581
583{
584public:
585 explicit YmironAriseFallenVisual(Unit* caster, Position dest) : _caster(caster), _dest(dest) { }
586
587 static constexpr int8 BANE_VISUAL_NUM = 11;
588 static constexpr float BANE_VISUAL_TIME_OFFSET = 0.204545438289642f;
589 static constexpr float BANE_VISUAL_TIME_BASE = 0.75f;
590
591 bool Execute(uint64 /*time*/, uint32 /*diff*/) override
592 {
594 return true;
595 }
596
597private:
600};
601
602// 193566 - Arise, Fallen
604{
605 static constexpr float SPAWN_DIST_TO_TARGET = 3.5f;
606
607 void HandleHit(SpellEffIndex /*effIndex*/)
608 {
610
611 std::vector<AreaTrigger*> atList = GetCaster()->GetAreaTriggers(SPELL_BANE_AT_NHC_HEROIC);
613
614 for (AreaTrigger* at : atList)
615 {
616 _baneATGUIDs.push(at->GetGUID());
617 }
618
621 }
622
623 void FilterTargets(std::list<WorldObject*>& targets)
624 {
625 targets.remove_if([](WorldObject* target) -> bool
626 {
627 return !target->IsPlayer();
628 });
629 }
630
632 {
633 uint8 atNum = _atsPerTarget;
634 if (_remainingBaneATs > 0)
635 {
636 atNum++;
638 }
639
640 for (uint8 i = 0; i < atNum; i++)
641 {
643 _baneATGUIDs.pop();
644
645 if (!at)
646 return;
647
649
650 float travelSpeed = frand(1.50f, 2.50f);
651 at->SendPlayOrphanSpellVisual(dest, SPELL_VISUAL_ARISE_FALLEN, travelSpeed, true);
652
653 uint32 travelSpeedInMs = (uint32)(travelSpeed * 1000);
655 at->Remove();
656 }
657 }
658
665
666private:
667 std::queue<ObjectGuid> _baneATGUIDs;
670};
671
672// 98246 - Risen Warrior
674{
676
677 void JustAppeared() override
678 {
680
682 _scheduler.Schedule(2s, [this](TaskContext const& /*task*/)
683 {
685 });
686
688
689 _scheduler.Schedule(6s, [this](TaskContext& task)
690 {
691 DoCastSelf(SPELL_VIGOR, true);
692 task.Repeat(6s);
693 });
694 }
695
696 void UpdateAI(uint32 diff) override
697 {
698 _scheduler.Update(diff);
699
700 UpdateVictim();
701 }
702
703private:
705};
706
@ IN_MILLISECONDS
Definition Common.h:38
#define M_PI
Definition Common.h:118
uint8_t uint8
Definition Define.h:156
int8_t int8
Definition Define.h:152
int32_t int32
Definition Define.h:150
uint64_t uint64
Definition Define.h:153
uint32_t uint32
Definition Define.h:154
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition Duration.h:24
@ NOT_STARTED
@ ENCOUNTER_FRAME_DISENGAGE
@ ENCOUNTER_FRAME_ENGAGE
@ EFFECT_MOTION_TYPE
float frand(float min, float max)
Definition Random.cpp:55
bool roll_chance(T chance)
Definition Random.h:55
#define RegisterSpellAndAuraScriptPair(script_1, script_2)
Definition ScriptMgr.h:1381
#define RegisterAreaTriggerAI(ai_name)
Definition ScriptMgr.h:1428
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1383
SpellEffIndex
@ EFFECT_0
@ TARGET_UNIT_SRC_AREA_ENEMY
@ EVENT_JUMP
@ SPELL_EFFECT_DUMMY
@ POWER_ENERGY
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ AURA_REMOVE_BY_EXPIRE
@ SPELL_AURA_PERIODIC_DUMMY
#define SpellEffectFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define AuraEffectCalcPeriodicFn(F, I, N)
#define AuraEffectApplyFn(F, I, N, M)
#define AuraEffectRemoveFn(F, I, N, M)
EvadeReason
@ REACT_PASSIVE
@ REACT_AGGRESSIVE
@ UNIT_STATE_CASTING
Definition Unit.h:276
void AddSC_boss_ymiron_the_fallen_king()
constexpr Position YmironIntroJumpPos
constexpr Position YmironRespawnPos
@ SPELL_VISUAL_KIT_ARISE_FALLEN
AreaTrigger *const at
void InitOrbit(AreaTriggerOrbitInfo const &orbit, Optional< float > overrideSpeed={}, Optional< bool > speedIsTimeInSeconds={})
Unit * GetCaster() const
uint32 GetTickNumber() const
HookList< EffectCalcPeriodicHandler > DoEffectCalcPeriodic
AuraApplication const * GetTargetApplication() const
HookList< EffectApplyHandler > AfterEffectRemove
HookList< EffectPeriodicHandler > OnEffectPeriodic
HookList< EffectApplyHandler > AfterEffectApply
Unit * GetCaster() const
Unit * GetTarget() const
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
bool IsPlayer() const
Definition BaseEntity.h:173
InstanceScript *const instance
void JustEngagedWith(Unit *who) override
void _DespawnAtEvade(Seconds delayToRespawn=30s, Creature *who=nullptr)
TaskScheduler scheduler
SummonList summons
EventMap events
void Reset() override
void DoZoneInCombat()
Definition CreatureAI.h:169
bool _EnterEvadeMode(EvadeReason why=EvadeReason::Other)
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:63
void SetReactState(ReactStates st)
Definition Creature.h:174
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
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
void AddEventAtOffset(BasicEvent *event, Milliseconds offset)
Creature * GetCreature(uint32 type)
EncounterState GetBossState(uint32 id) const
void SendEncounterUnit(EncounterFrameType type, Unit const *unit, Optional< int32 > param1={}, Optional< int32 > param2={})
bool IsMythicPlus() const
Definition Map.cpp:3339
bool IsMythic() const
Definition Map.cpp:3332
Player * ToPlayer()
Definition Object.h:126
Creature * ToCreature()
Definition Object.h:121
bool IsGameMaster() const
Definition Player.h:1309
uint32 const Id
Definition SpellInfo.h:328
Unit * GetCaster() const
HookList< EffectHandler > OnEffectHit
int64 GetUnitTargetCountForEffect(SpellEffIndex effect) const
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
TaskContext & Schedule(TaskScheduler::duration_t time, TaskScheduler::task_handler_t task)
TaskContext & Repeat(TaskScheduler::duration_t duration)
TaskScheduler & CancelAll()
TaskScheduler & Schedule(duration_t time, task_handler_t task)
TaskScheduler & ClearValidator()
Clears the validator which is asked if tasks are allowed to be executed.
TaskScheduler & Update()
Update the scheduler to the current time.
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:160
virtual void DoAction(int32 param)
Definition UnitAI.h:73
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.cpp:180
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:162
Definition Unit.h:635
void SendPlaySpellVisual(Unit *target, uint32 spellVisualId, uint8 missReason, uint8 reflectStatus, float travelSpeed, bool speedAsTime=false, float launchDelay=0.0f)
Definition Unit.cpp:12305
void SetPower(Powers power, int32 val, bool withPowerUpdate=true)
Definition Unit.cpp:10046
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition Unit.cpp:3231
MotionMaster * GetMotionMaster()
Definition Unit.h:1723
Powers GetPowerType() const
Definition Unit.h:811
int32 GetPower(Powers power) const
Definition Unit.cpp:10028
bool HasUnitState(const uint32 f) const
Definition Unit.h:743
void SendPlaySpellVisualKit(uint32 id, uint32 type, uint32 duration) const
Definition Unit.cpp:12342
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4804
std::vector< AreaTrigger * > GetAreaTriggers(uint32 spellId) const
Definition Unit.cpp:5475
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3974
bool IsInCombat() const
Definition Unit.h:1058
bool isDead() const
Definition Unit.h:1187
Map * GetMap() const
Definition Object.h:411
InstanceScript * GetInstanceScript() const
Definition Object.cpp:396
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2217
void SendPlayOrphanSpellVisual(Position const &sourceLocation, ObjectGuid const &target, uint32 spellVisualId, float travelSpeed, bool speedAsTime=false, bool withSourceOrientation=false)
Definition Object.cpp:2256
EventProcessor m_Events
Definition Object.h:561
float GetDistance(WorldObject const *obj) const
Definition Object.cpp:432
Position GetFirstCollisionPosition(float dist, float angle)
Definition Object.cpp:2762
static constexpr float BANE_VISUAL_TIME_OFFSET
bool Execute(uint64, uint32) override
YmironAriseFallenVisual(Unit *caster, Position dest)
static constexpr float BANE_VISUAL_TIME_BASE
bool Execute(uint64, uint32) override
static constexpr float BANE_VISUAL_TIME_OFFSET
YmironBanePrecastVisual(Unit *caster, int8 remainingVisualsToSpawn)
static constexpr float BANE_VISUAL_TIME_BASE
YmironSoulSiphonVisual(ObjectGuid ymironGUID, Unit *runecarver, float travelSpeed)
bool Execute(uint64, uint32) override
void OnAfterRemove(AuraEffect const *, AuraEffectHandleModes)
void CalcPeriodic(AuraEffect const *, bool &, int32 &amplitude)
void OnAfterApply(AuraEffect const *, AuraEffectHandleModes)
void OnAfterApply(AuraEffect const *, AuraEffectHandleModes)
void OnAfterRemove(AuraEffect const *, AuraEffectHandleModes)
#define RegisterMawOfSoulsCreatureAI(ai_name)
@ DATA_YMIRON
TC_GAME_API AreaTrigger * GetAreaTrigger(WorldObject const &u, ObjectGuid const &guid)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
void RandomShuffle(Iterator begin, Iterator end)
Reorder the elements of the iterator range randomly.
Definition Containers.h:171
Optional< ObjectGuid > PathTarget
constexpr float GetPositionX() const
Definition Position.h:87
constexpr float GetPositionY() const
Definition Position.h:88
static float NormalizeOrientation(float o)
Definition Position.cpp:207
float GetExactDist(float x, float y, float z) const
Definition Position.h:129
constexpr void GetPosition(float &x, float &y) const
Definition Position.h:92
constexpr void Relocate(float x, float y)
Definition Position.h:74
constexpr float GetOrientation() const
Definition Position.h:90
constexpr float GetPositionZ() const
Definition Position.h:89
bool IsHeroicOrHigher() const
at_ymiron_the_fallen_king_activation(AreaTrigger *areatrigger)
at_ymiron_the_fallen_king_bane(AreaTrigger *areatrigger)
void EnterEvadeMode(EvadeReason) override
void MovementInform(uint32 type, uint32 pointId) override
void WaypointPathEnded(uint32, uint32 pathId) override
void OnChannelFinished(SpellInfo const *spell) override