TrinityCore
Loading...
Searching...
No Matches
boss_lord_marrowgar.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 "icecrown_citadel.h"
19#include "InstanceScript.h"
20#include "Map.h"
21#include "MotionMaster.h"
22#include "MoveSplineInit.h"
23#include "ObjectAccessor.h"
24#include "Player.h"
26#include "ScriptedCreature.h"
27#include "ScriptMgr.h"
28#include "SpellAuras.h"
29#include "SpellScript.h"
30#include "TemporarySummon.h"
31
43
45{
46 // Lord Marrowgar
52
53 // Bone Spike
56
57 // Coldflame
60};
61
62uint32 const BoneSpikeSummonId[3] = {69062, 72669, 72670};
63
80
86
88{
90
91 // Manual marking for targets hit by Bone Slice as no aura exists for this purpose
92 // These units are the tanks in this encounter
93 // and should be immune to Bone Spike Graveyard
95 //DATA_SPIKE_IMMUNE_1, = 2, // Reserved & used
96 //DATA_SPIKE_IMMUNE_2, = 3, // Reserved & used
97
99};
100
106
108{
109 public:
111
112 bool operator()(Unit* unit) const
113 {
114 if (unit->GetTypeId() != TYPEID_PLAYER)
115 return false;
116
117 if (unit->HasAura(SPELL_IMPALED))
118 return false;
119
120 // Check if it is one of the tanks soaking Bone Slice
121 for (uint32 i = 0; i < MAX_BONE_SPIKE_IMMUNE; ++i)
122 if (unit->GetGUID() == _ai->GetGUID(DATA_SPIKE_IMMUNE + i))
123 return false;
124
125 return true;
126 }
127
128 private:
130};
131
132// 36612 - Lord Marrowgar
134{
136 {
137 _boneStormDuration = RAID_MODE(20s, 30s, 20s, 30s);
138 _baseSpeed = creature->GetSpeedRate(MOVE_RUN);
139 _coldflameLastPos.Relocate(creature);
140 _boneSlice = false;
141 }
142
157
158 void JustEngagedWith(Unit* /*who*/) override
159 {
161
162 me->setActive(true);
165 }
166
167 void JustDied(Unit* /*killer*/) override
168 {
170
171 _JustDied();
172 }
173
180
181 void KilledUnit(Unit* victim) override
182 {
183 if (victim->GetTypeId() == TYPEID_PLAYER)
184 Talk(SAY_KILL);
185 }
186
187 void UpdateAI(uint32 diff) override
188 {
189 if (!UpdateVictim())
190 return;
191
192 events.Update(diff);
193
195 return;
196
197 while (uint32 eventId = events.ExecuteEvent())
198 {
199 switch (eventId)
200 {
205 break;
206 case EVENT_COLDFLAME:
211 else
214 break;
216 _boneSlice = false;
223 break;
225 if (Aura* pStorm = me->GetAura(SPELL_BONE_STORM))
226 pStorm->SetDuration(int32(_boneStormDuration.count()));
230 [[fallthrough]];
232 {
235 if (!unit)
236 unit = SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true);
237 if (unit)
239 break;
240 }
242 if (MovementGenerator* movement = me->GetMotionMaster()->GetMovementGenerator([](MovementGenerator const* a) -> bool
243 {
244 if (a->GetMovementGeneratorType() == POINT_MOTION_TYPE)
245 {
246 PointMovementGenerator const* pointMovement = dynamic_cast<PointMovementGenerator const*>(a);
247 return pointMovement && pointMovement->GetId() == POINT_TARGET_BONESTORM_PLAYER;
248 }
249 return false;
250 }))
251 me->GetMotionMaster()->Remove(movement);
256 if (!IsHeroic())
258 break;
260 _boneSlice = true;
261 break;
262 case EVENT_ENRAGE:
263 DoCast(me, SPELL_BERSERK, true);
265 break;
266 }
267
269 return;
270 }
271
272 // We should not melee attack when storming
274 return;
275
276 // 10 seconds since encounter start Bone Slice replaces melee attacks
279 }
280
281 void MovementInform(uint32 type, uint32 id) override
282 {
284 return;
285
286 // lock movement
287 me->GetMotionMaster()->MoveIdle();
288 }
289
291 {
292 return &_coldflameLastPos;
293 }
294
295 ObjectGuid GetGUID(int32 type) const override
296 {
297 switch (type)
298 {
300 return _coldflameTarget;
301 case DATA_SPIKE_IMMUNE + 0:
302 case DATA_SPIKE_IMMUNE + 1:
303 case DATA_SPIKE_IMMUNE + 2:
304 {
305 uint32 index = uint32(type - DATA_SPIKE_IMMUNE);
306 if (index < _boneSpikeImmune.size())
307 return _boneSpikeImmune[index];
308
309 break;
310 }
311 }
312
313 return ObjectGuid::Empty;
314 }
315
316 void SetGUID(ObjectGuid const& guid, int32 id) override
317 {
318 switch (id)
319 {
321 _coldflameTarget = guid;
322 break;
324 _boneSpikeImmune.push_back(guid);
325 break;
326 }
327 }
328
329 void DoAction(int32 action) override
330 {
331 switch (action)
332 {
334 _boneSpikeImmune.clear();
335 break;
337 if (me->IsAlive())
339 break;
340 default:
341 break;
342 }
343 }
344
345private:
352};
353
355
356// 36672 - Coldflame
358{
359 npc_coldflame(Creature* creature) : ScriptedAI(creature) { }
360
361 void IsSummonedBy(WorldObject* ownerWO) override
362 {
363 Creature* owner = ownerWO->ToCreature();
364 if (!owner)
365 return;
366
367 Position pos;
368 if (MarrowgarAI* marrowgarAI = CAST_AI(MarrowgarAI, owner->GetAI()))
369 pos.Relocate(marrowgarAI->GetLastColdflamePosition());
370 else
371 pos.Relocate(owner);
372
373 if (owner->HasAura(SPELL_BONE_STORM))
374 {
375 float ang = pos.GetAbsoluteAngle(me);
376 me->SetOrientation(ang);
377 owner->GetNearPoint2D(nullptr, pos.m_positionX, pos.m_positionY, 5.0f - owner->GetCombatReach(), ang);
378 }
379 else
380 {
382 if (!target)
383 {
385 return;
386 }
387
388 float ang = pos.GetAbsoluteAngle(target);
389 me->SetOrientation(ang);
390 owner->GetNearPoint2D(nullptr, pos.m_positionX, pos.m_positionY, 15.0f - owner->GetCombatReach(), ang);
391 }
392
396 }
397
398 void UpdateAI(uint32 diff) override
399 {
400 _events.Update(diff);
401
403 {
404 Position newPos = me->GetNearPosition(5.0f, 0.0f);
408 }
409 }
410
411private:
413};
414
415// 36619, 38711, 38712 - Bone Spike
417{
418 npc_bone_spike(Creature* creature) : ScriptedAI(creature), _hasTrappedUnit(false)
419 {
420 ASSERT(creature->GetVehicleKit());
421
422 SetCombatMovement(false);
423 }
424
425 void JustDied(Unit* /*killer*/) override
426 {
427 if (TempSummon* summ = me->ToTempSummon())
428 if (Unit* trapped = summ->GetSummonerUnit())
429 trapped->RemoveAurasDueToSpell(SPELL_IMPALED);
430
432 }
433
434 void KilledUnit(Unit* victim) override
435 {
438 }
439
440 void IsSummonedBy(WorldObject* summonerWO) override
441 {
442 Unit* summoner = summonerWO->ToUnit();
443 if (!summoner)
444 return;
445 DoCast(summoner, SPELL_IMPALED);
446 summoner->CastSpell(me, SPELL_RIDE_VEHICLE, true);
448 _hasTrappedUnit = true;
449 }
450
451 void PassengerBoarded(Unit* passenger, int8 /*seat*/, bool apply) override
452 {
453 if (!apply)
454 return;
455
459 std::function<void(Movement::MoveSplineInit&)> initializer = [](Movement::MoveSplineInit& init)
460 {
461 init.DisableTransportPathTransformations();
462 init.MoveTo(-0.02206125f, -0.02132235f, 5.514783f, false);
463 };
464 passenger->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), EVENT_VEHICLE_BOARD, MOTION_PRIORITY_HIGHEST);
465 }
466
467 void UpdateAI(uint32 diff) override
468 {
469 if (!_hasTrappedUnit)
470 return;
471
472 _events.Update(diff);
473
475 if (InstanceScript* instance = me->GetInstanceScript())
476 instance->SetData(DATA_BONED_ACHIEVEMENT, uint32(false));
477 }
478
479private:
482};
483
484// 69140 - Coldflame
486{
487 void SelectTarget(std::list<WorldObject*>& targets)
488 {
489 targets.clear();
490 // select any unit but not the tank
491 Unit* target = GetCaster()->GetAI()->SelectTarget(SelectTargetMethod::Random, 0, -GetCaster()->GetCombatReach(), true, false, -SPELL_IMPALED);
492 if (!target)
493 target = GetCaster()->GetAI()->SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true); // or the tank if its solo
494 if (!target)
495 return;
496
498 targets.push_back(target);
499 }
500
506
512};
513
514// 72705 - Coldflame (Bonestorm)
529
530// 69146, 70823, 70824, 70825 - Coldflame (Damage)
532{
533 bool CanBeAppliedOn(Unit* target)
534 {
535 if (target->HasAura(SPELL_IMPALED))
536 return false;
537
538 if (target->GetExactDist2d(GetOwner()) > GetEffectInfo(EFFECT_0).CalcRadius().Max)
539 return false;
540
541 if (Aura* aur = target->GetAura(GetId()))
542 if (aur->GetOwner() != GetOwner())
543 return false;
544
545 return true;
546 }
547
552};
553
554// 69057, 70826, 72088, 72089 - Bone Spike Graveyard
556{
557 bool Validate(SpellInfo const* /*spell*/) override
558 {
560 }
561
562 bool Load() override
563 {
564 return GetCaster()->GetTypeId() == TYPEID_UNIT && GetCaster()->IsAIEnabled();
565 }
566
571
573 {
574 PreventHitDefaultEffect(effIndex);
575 if (Creature* marrowgar = GetCaster()->ToCreature())
576 {
577 CreatureAI* marrowgarAI = marrowgar->AI();
578 uint8 boneSpikeCount = uint8(GetCaster()->GetMap()->Is25ManRaid() ? 3 : 1);
579
580 std::list<Unit*> targets;
581 marrowgarAI->SelectTargetList(targets, boneSpikeCount, SelectTargetMethod::Random, 1, BoneSpikeTargetSelector(marrowgarAI));
582 if (targets.empty())
583 return;
584
585 uint32 i = 0;
586 for (std::list<Unit*>::const_iterator itr = targets.begin(); itr != targets.end(); ++itr, ++i)
587 {
588 Unit* target = *itr;
589 target->CastSpell(target, BoneSpikeSummonId[i], true);
590 if (!target->IsAlive()) // make sure we don't get any stuck spikes on dead targets
591 {
592 if (Aura* aura = target->GetAura(SPELL_IMPALED))
593 {
594 if (Creature* spike = ObjectAccessor::GetCreature(*target, aura->GetCasterGUID()))
595 spike->DespawnOrUnsummon();
596 aura->Remove();
597 }
598 }
599 }
600
601 marrowgarAI->Talk(SAY_BONESPIKE);
602 }
603 }
604
610};
611
612// 69075, 70834, 70835, 70836 - Bone Storm
614{
616 {
617 SetHitDamage(int32(GetHitDamage() / std::max(std::sqrt(GetHitUnit()->GetExactDist2d(GetCaster())), 1.0f)));
618 }
619
624};
625
626// 69055, 70814 - Bone Slice
628{
629public:
634
635private:
640
641 void CountTargets(std::list<WorldObject*>& targets)
642 {
643 _targetCount = std::min<uint32>(targets.size(), GetSpellInfo()->MaxAffectedTargets);
644 }
645
647 {
648 // Mark the unit as hit, even if the spell missed or was dodged/parried
650
651 if (!_targetCount)
652 return; // This spell can miss all targets
653
655 }
656
663
665};
666
668{
669 public:
670 at_lord_marrowgar_entrance() : OnlyOnceAreaTriggerScript("at_lord_marrowgar_entrance") { }
671
672 bool TryHandleOnce(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
673 {
674 if (InstanceScript* instance = player->GetInstanceScript())
675 if (Creature* lordMarrowgar = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_LORD_MARROWGAR)))
676 lordMarrowgar->AI()->DoAction(ACTION_TALK_ENTER_ZONE);
677
678 return true;
679 }
680
681};
682
uint8_t uint8
Definition Define.h:156
int8_t int8
Definition Define.h:152
int32_t int32
Definition Define.h:150
uint32_t uint32
Definition Define.h:154
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition Duration.h:24
#define ASSERT
Definition Errors.h:72
@ IN_PROGRESS
@ FAIL
@ MOTION_PRIORITY_HIGHEST
@ POINT_MOTION_TYPE
@ TYPEID_UNIT
Definition ObjectGuid.h:43
@ TYPEID_PLAYER
Definition ObjectGuid.h:44
std::vector< ObjectGuid > GuidVector
Definition ObjectGuid.h:434
@ SPELL_BERSERK
Definition PlayerAI.cpp:371
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1383
SpellEffIndex
@ EFFECT_1
@ EFFECT_0
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_APPLY_AURA
@ TARGET_UNIT_DEST_AREA_ENEMY
@ EVENT_VEHICLE_BOARD
SpellCastResult
@ SPELL_CAST_OK
@ SPELL_FAILED_NO_VALID_TARGETS
@ SPELL_FAILED_INTERRUPTED
#define SpellCheckCastFn(F)
#define SpellEffectFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
#define SpellCastFn(F)
#define SpellHitFn(F)
#define AuraCheckAreaTargetFn(F)
#define CAST_AI(a, b)
Definition UnitAI.h:29
@ MOVE_RUN
@ CURRENT_MELEE_SPELL
Definition Unit.h:609
@ UNIT_STATE_CASTING
Definition Unit.h:290
@ SPELL_COLDFLAME_BONE_STORM
@ SPELL_RIDE_VEHICLE
@ SPELL_COLDFLAME_SUMMON
@ SPELL_COLDFLAME_PASSIVE
@ SPELL_COLDFLAME_NORMAL
@ SPELL_BONE_SPIKE_GRAVEYARD
@ SPELL_IMPALED
@ SPELL_BONE_STORM
@ SPELL_BONE_SLICE
boss_lord_marrowgar MarrowgarAI
@ POINT_TARGET_BONESTORM_PLAYER
@ POINT_TARGET_COLDFLAME
void AddSC_boss_lord_marrowgar()
@ EVENT_COLDFLAME_TRIGGER
@ EVENT_FAIL_BONED
@ EVENT_WARN_BONE_STORM
@ EVENT_GROUP_SPECIAL
@ EVENT_BONE_STORM_END
@ EVENT_BONE_STORM_MOVE
@ EVENT_COLDFLAME
@ EVENT_BONE_SPIKE_GRAVEYARD
@ EVENT_BONE_STORM_BEGIN
@ EVENT_ENABLE_BONE_SLICE
uint32 const BoneSpikeSummonId[3]
@ MAX_BONE_SPIKE_IMMUNE
@ DATA_COLDFLAME_GUID
@ DATA_SPIKE_IMMUNE
@ ACTION_CLEAR_SPIKE_IMMUNITIES
@ ACTION_TALK_ENTER_ZONE
@ SAY_ENTER_ZONE
@ SAY_BONESPIKE
@ SAY_BONE_STORM
@ EMOTE_BONE_STORM
WorldObject * GetOwner() const
SpellEffectInfo const & GetEffectInfo(SpellEffIndex effIndex) const
HookList< CheckAreaTargetHandler > DoCheckAreaTarget
uint32 GetId() const
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
TypeID GetTypeId() const
Definition BaseEntity.h:166
bool operator()(Unit *unit) const
InstanceScript *const instance
void _JustReachedHome()
EventMap events
void DoZoneInCombat()
Definition CreatureAI.h:169
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:63
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
void Update(uint32 time)
Definition EventMap.h:77
void DelayEvents(Milliseconds delay)
Definition EventMap.cpp:100
EventId ExecuteEvent()
Definition EventMap.cpp:77
void RescheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:56
void CancelEvent(EventId eventId)
Definition EventMap.cpp:156
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:40
virtual bool SetBossState(uint32 id, EncounterState state)
void LaunchMoveSpline(std::function< void(Movement::MoveSplineInit &init)> &&initializer, uint32 id=0, MovementGeneratorPriority priority=MOTION_PRIORITY_NORMAL, MovementGeneratorType type=EFFECT_MOTION_TYPE, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
void MoveChase(Unit *target, Optional< ChaseRange > dist={}, Optional< ChaseAngle > angle={})
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={})
MovementGenerator * GetMovementGenerator(std::function< bool(MovementGenerator const *)> const &filter, MovementSlot slot=MOTION_SLOT_ACTIVE) const
void Remove(MovementGenerator *movement, MovementSlot slot=MOTION_SLOT_ACTIVE)
static ObjectGuid const Empty
Definition ObjectGuid.h:314
void Clear()
Definition ObjectGuid.h:329
Creature * ToCreature()
Definition Object.h:121
Unit * ToUnit()
Definition Object.h:116
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
HookList< CheckCastHandler > OnCheckCast
int32 GetHitDamage() const
Unit * GetCaster() const
int32 GetEffectValueAsInt() const
HookList< HitHandler > OnHit
void PreventHitDefaultEffect(SpellEffIndex effIndex)
Unit * GetHitUnit() const
HookList< EffectHandler > OnEffectHitTarget
HookList< CastHandler > BeforeCast
void SetHitDamage(int32 damage)
SpellInfo const * GetSpellInfo() const
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
virtual void SetGUID(ObjectGuid const &guid, int32 id)
Definition UnitAI.h:76
virtual void DoAction(int32 param)
Definition UnitAI.h:73
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.cpp:172
void SelectTargetList(std::list< Unit * > &targetList, uint32 num, SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition UnitAI.cpp:76
virtual ObjectGuid GetGUID(int32 id) const
Definition UnitAI.h:77
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition UnitAI.cpp:71
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:162
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:81
Definition Unit.h:647
void FinishSpell(CurrentSpellTypes spellType, SpellCastResult result=SPELL_CAST_OK)
Definition Unit.cpp:3189
MotionMaster * GetMotionMaster()
Definition Unit.h:1750
bool IsAlive() const
Definition Unit.h:1205
float GetCombatReach() const override
Definition Unit.h:717
TempSummon * ToTempSummon()
Definition Unit.h:1844
UnitAI * GetAI() const
Definition Unit.h:680
bool IsAIEnabled() const
Definition Unit.h:678
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4718
float GetSpeedRate(UnitMoveType mtype) const
Definition Unit.h:1734
Unit * GetVictim() const
Definition Unit.h:738
void SetSpeedRate(UnitMoveType mtype, float rate)
Definition Unit.cpp:8961
void NearTeleportTo(TeleportLocation const &target, bool casting=false)
Definition Unit.cpp:13054
bool HasUnitState(const uint32 f) const
Definition Unit.h:755
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4822
Vehicle * GetVehicleKit() const
Definition Unit.h:1798
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3992
Spell * GetCurrentSpell(CurrentSpellTypes spellType) const
Definition Unit.h:1490
InstanceScript * GetInstanceScript() const
Definition Object.cpp:394
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2222
void setActive(bool isActiveObject)
Definition Object.cpp:274
Position GetNearPosition(float dist, float angle)
Definition Object.cpp:2760
void GetNearPoint2D(WorldObject const *searcher, float &x, float &y, float distance, float absAngle) const
Definition Object.cpp:2690
virtual void SetData(uint32, uint32)
Definition ZoneScript.h:100
bool TryHandleOnce(Player *player, AreaTriggerEntry const *) override
void CountTargets(std::list< WorldObject * > &targets)
void HandleSpikes(SpellEffIndex effIndex)
bool Validate(SpellInfo const *) override
void HandleScriptEffect(SpellEffIndex effIndex)
void HandleScriptEffect(SpellEffIndex effIndex)
void SelectTarget(std::list< WorldObject * > &targets)
#define RegisterIcecrownCitadelCreatureAI(ai_name)
@ DATA_LORD_MARROWGAR
@ DATA_BONED_ACHIEVEMENT
TC_GAME_API Player * GetPlayer(Map const *, ObjectGuid const &guid)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
constexpr void SetOrientation(float orientation)
Definition Position.h:82
constexpr float GetPositionX() const
Definition Position.h:87
constexpr float GetPositionY() const
Definition Position.h:88
float GetExactDist2d(const float x, const float y) const
Definition Position.h:117
float m_positionX
Definition Position.h:64
float m_positionY
Definition Position.h:65
float GetAbsoluteAngle(float x, float y) const
Definition Position.h:136
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 IsHeroic() const
void SetCombatMovement(bool allowMovement)
T const & RAID_MODE(T const &normal10, T const &normal25) const
void SetGUID(ObjectGuid const &guid, int32 id) override
void JustEngagedWith(Unit *) override
Position const * GetLastColdflamePosition() const
void JustDied(Unit *) override
ObjectGuid GetGUID(int32 type) const override
void UpdateAI(uint32 diff) override
boss_lord_marrowgar(Creature *creature)
void MovementInform(uint32 type, uint32 id) override
void JustReachedHome() override
void DoAction(int32 action) override
void KilledUnit(Unit *victim) override
void JustDied(Unit *) override
npc_bone_spike(Creature *creature)
void UpdateAI(uint32 diff) override
void KilledUnit(Unit *victim) override
void IsSummonedBy(WorldObject *summonerWO) override
void PassengerBoarded(Unit *passenger, int8, bool apply) override
== Fields =======================================
void IsSummonedBy(WorldObject *ownerWO) override
npc_coldflame(Creature *creature)
void UpdateAI(uint32 diff) override