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<Creature> const* pointMovement = dynamic_cast<PointMovementGenerator<Creature> 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
281 }
282
283 void MovementInform(uint32 type, uint32 id) override
284 {
286 return;
287
288 // lock movement
289 me->GetMotionMaster()->MoveIdle();
290 }
291
293 {
294 return &_coldflameLastPos;
295 }
296
297 ObjectGuid GetGUID(int32 type /*= 0 */) const override
298 {
299 switch (type)
300 {
302 return _coldflameTarget;
303 case DATA_SPIKE_IMMUNE + 0:
304 case DATA_SPIKE_IMMUNE + 1:
305 case DATA_SPIKE_IMMUNE + 2:
306 {
307 uint32 index = uint32(type - DATA_SPIKE_IMMUNE);
308 if (index < _boneSpikeImmune.size())
309 return _boneSpikeImmune[index];
310
311 break;
312 }
313 }
314
315 return ObjectGuid::Empty;
316 }
317
318 void SetGUID(ObjectGuid const& guid, int32 id) override
319 {
320 switch (id)
321 {
323 _coldflameTarget = guid;
324 break;
326 _boneSpikeImmune.push_back(guid);
327 break;
328 }
329 }
330
331 void DoAction(int32 action) override
332 {
333 switch (action)
334 {
336 _boneSpikeImmune.clear();
337 break;
339 if (me->IsAlive())
341 break;
342 default:
343 break;
344 }
345 }
346
347private:
354};
355
357
358// 36672 - Coldflame
360{
361 npc_coldflame(Creature* creature) : ScriptedAI(creature) { }
362
363 void IsSummonedBy(WorldObject* ownerWO) override
364 {
365 Creature* owner = ownerWO->ToCreature();
366 if (!owner)
367 return;
368
369 Position pos;
370 if (MarrowgarAI* marrowgarAI = CAST_AI(MarrowgarAI, owner->GetAI()))
371 pos.Relocate(marrowgarAI->GetLastColdflamePosition());
372 else
373 pos.Relocate(owner);
374
375 if (owner->HasAura(SPELL_BONE_STORM))
376 {
377 float ang = pos.GetAbsoluteAngle(me);
378 me->SetOrientation(ang);
379 owner->GetNearPoint2D(nullptr, pos.m_positionX, pos.m_positionY, 5.0f - owner->GetCombatReach(), ang);
380 }
381 else
382 {
384 if (!target)
385 {
387 return;
388 }
389
390 float ang = pos.GetAbsoluteAngle(target);
391 me->SetOrientation(ang);
392 owner->GetNearPoint2D(nullptr, pos.m_positionX, pos.m_positionY, 15.0f - owner->GetCombatReach(), ang);
393 }
394
398 }
399
400 void UpdateAI(uint32 diff) override
401 {
402 _events.Update(diff);
403
405 {
406 Position newPos = me->GetNearPosition(5.0f, 0.0f);
410 }
411 }
412
413private:
415};
416
417// 36619, 38711, 38712 - Bone Spike
419{
420 npc_bone_spike(Creature* creature) : ScriptedAI(creature), _hasTrappedUnit(false)
421 {
422 ASSERT(creature->GetVehicleKit());
423
424 SetCombatMovement(false);
425 }
426
427 void JustDied(Unit* /*killer*/) override
428 {
429 if (TempSummon* summ = me->ToTempSummon())
430 if (Unit* trapped = summ->GetSummonerUnit())
431 trapped->RemoveAurasDueToSpell(SPELL_IMPALED);
432
434 }
435
436 void KilledUnit(Unit* victim) override
437 {
440 }
441
442 void IsSummonedBy(WorldObject* summonerWO) override
443 {
444 Unit* summoner = summonerWO->ToUnit();
445 if (!summoner)
446 return;
447 DoCast(summoner, SPELL_IMPALED);
448 summoner->CastSpell(me, SPELL_RIDE_VEHICLE, true);
450 _hasTrappedUnit = true;
451 }
452
453 void PassengerBoarded(Unit* passenger, int8 /*seat*/, bool apply) override
454 {
455 if (!apply)
456 return;
457
461 std::function<void(Movement::MoveSplineInit&)> initializer = [](Movement::MoveSplineInit& init)
462 {
463 init.DisableTransportPathTransformations();
464 init.MoveTo(-0.02206125f, -0.02132235f, 5.514783f, false);
465 };
466 passenger->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), EVENT_VEHICLE_BOARD, MOTION_PRIORITY_HIGHEST);
467 }
468
469 void UpdateAI(uint32 diff) override
470 {
471 if (!_hasTrappedUnit)
472 return;
473
474 _events.Update(diff);
475
477 if (InstanceScript* instance = me->GetInstanceScript())
478 instance->SetData(DATA_BONED_ACHIEVEMENT, uint32(false));
479 }
480
481private:
484};
485
486// 69140 - Coldflame
488{
490
491 void SelectTarget(std::list<WorldObject*>& targets)
492 {
493 targets.clear();
494 // select any unit but not the tank
495 Unit* target = GetCaster()->GetAI()->SelectTarget(SelectTargetMethod::Random, 0, -GetCaster()->GetCombatReach(), true, false, -SPELL_IMPALED);
496 if (!target)
497 target = GetCaster()->GetAI()->SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true); // or the tank if its solo
498 if (!target)
499 return;
500
502 targets.push_back(target);
503 }
504
506 {
507 PreventHitDefaultEffect(effIndex);
509 }
510
516};
517
518// 72705 - Coldflame (Bonestorm)
535
536// 69146, 70823, 70824, 70825 - Coldflame (Damage)
538{
540
541 bool CanBeAppliedOn(Unit* target)
542 {
543 if (target->HasAura(SPELL_IMPALED))
544 return false;
545
546 if (target->GetExactDist2d(GetOwner()) > GetEffectInfo(EFFECT_0).CalcRadius())
547 return false;
548
549 if (Aura* aur = target->GetAura(GetId()))
550 if (aur->GetOwner() != GetOwner())
551 return false;
552
553 return true;
554 }
555
560};
561
562// 69057, 70826, 72088, 72089 - Bone Spike Graveyard
564{
566
567 bool Validate(SpellInfo const* /*spell*/) override
568 {
570 }
571
572 bool Load() override
573 {
574 return GetCaster()->GetTypeId() == TYPEID_UNIT && GetCaster()->IsAIEnabled();
575 }
576
581
583 {
584 PreventHitDefaultEffect(effIndex);
585 if (Creature* marrowgar = GetCaster()->ToCreature())
586 {
587 CreatureAI* marrowgarAI = marrowgar->AI();
588 uint8 boneSpikeCount = uint8(GetCaster()->GetMap()->GetSpawnMode() & 1 ? 3 : 1);
589
590 std::list<Unit*> targets;
591 marrowgarAI->SelectTargetList(targets, boneSpikeCount, SelectTargetMethod::Random, 1, BoneSpikeTargetSelector(marrowgarAI));
592 if (targets.empty())
593 return;
594
595 uint32 i = 0;
596 for (std::list<Unit*>::const_iterator itr = targets.begin(); itr != targets.end(); ++itr, ++i)
597 {
598 Unit* target = *itr;
599 target->CastSpell(target, BoneSpikeSummonId[i], true);
600 if (!target->IsAlive()) // make sure we don't get any stuck spikes on dead targets
601 {
602 if (Aura* aura = target->GetAura(SPELL_IMPALED))
603 {
604 if (Creature* spike = ObjectAccessor::GetCreature(*target, aura->GetCasterGUID()))
605 spike->DespawnOrUnsummon();
606 aura->Remove();
607 }
608 }
609 }
610
611 marrowgarAI->Talk(SAY_BONESPIKE);
612 }
613 }
614
620};
621
622// 69075, 70834, 70835, 70836 - Bone Storm
624{
626
628 {
629 SetHitDamage(int32(GetHitDamage() / std::max(std::sqrt(GetHitUnit()->GetExactDist2d(GetCaster())), 1.0f)));
630 }
631
636};
637
638// 69055, 70814 - Bone Slice
640{
642
643public:
648
649private:
654
655 void CountTargets(std::list<WorldObject*>& targets)
656 {
657 _targetCount = std::min<uint32>(targets.size(), GetSpellInfo()->MaxAffectedTargets);
658 }
659
661 {
662 // Mark the unit as hit, even if the spell missed or was dodged/parried
664
665 if (!_targetCount)
666 return; // This spell can miss all targets
667
669 }
670
677
679};
680
682{
683 public:
684 at_lord_marrowgar_entrance() : OnlyOnceAreaTriggerScript("at_lord_marrowgar_entrance") { }
685
686 bool TryHandleOnce(Player* player, AreaTriggerEntry const* /*areaTrigger*/) override
687 {
688 if (InstanceScript* instance = player->GetInstanceScript())
689 if (Creature* lordMarrowgar = ObjectAccessor::GetCreature(*player, instance->GetGuidData(DATA_LORD_MARROWGAR)))
690 lordMarrowgar->AI()->DoAction(ACTION_TALK_ENTER_ZONE);
691
692 return true;
693 }
694
695};
696
uint8_t uint8
Definition Define.h:135
int8_t int8
Definition Define.h:131
int32_t int32
Definition Define.h:129
uint32_t uint32
Definition Define.h:133
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition Duration.h:24
#define ASSERT
Definition Errors.h:68
@ IN_PROGRESS
@ FAIL
@ MOTION_PRIORITY_HIGHEST
@ POINT_MOTION_TYPE
@ TYPEID_UNIT
Definition ObjectGuid.h:38
@ TYPEID_PLAYER
Definition ObjectGuid.h:39
std::vector< ObjectGuid > GuidVector
Definition ObjectGuid.h:262
@ SPELL_BERSERK
Definition PlayerAI.cpp:371
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1128
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
#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:27
@ MOVE_RUN
@ CURRENT_MELEE_SPELL
Definition Unit.h:606
@ UNIT_STATE_CASTING
Definition Unit.h:235
@ 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
bool operator()(Unit *unit) const
InstanceScript *const instance
void _JustReachedHome()
EventMap events
void DoZoneInCombat(Creature *creature=nullptr)
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:82
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
void Update(uint32 time)
Definition EventMap.h:67
void DelayEvents(Milliseconds delay)
Definition EventMap.cpp:95
EventId ExecuteEvent()
Definition EventMap.cpp:73
void RescheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:52
void CancelEvent(EventId eventId)
Definition EventMap.cpp:151
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:36
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)
void MoveChase(Unit *target, Optional< ChaseRange > dist={}, Optional< ChaseAngle > angle={})
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={})
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:140
void Clear()
Definition ObjectGuid.h:150
static Creature * ToCreature(Object *o)
Definition Object.h:186
static Unit * ToUnit(Object *o)
Definition Object.h:192
TypeID GetTypeId() const
Definition Object.h:93
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
HookList< CheckCastHandler > OnCheckCast
int32 GetHitDamage() const
Unit * GetCaster() const
HookList< HitHandler > OnHit
void PreventHitDefaultEffect(SpellEffIndex effIndex)
Unit * GetHitUnit() const
int32 GetEffectValue() const
HookList< EffectHandler > OnEffectHitTarget
HookList< CastHandler > BeforeCast
void SetHitDamage(int32 damage)
SpellInfo const * GetSpellInfo() const
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
virtual void DoAction(int32)
Definition UnitAI.h:154
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:54
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.cpp:166
virtual ObjectGuid GetGUID(int32=0) const
Definition UnitAI.h:158
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:101
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition UnitAI.cpp:96
virtual void SetGUID(ObjectGuid const &, int32=0)
Definition UnitAI.h:157
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:243
SpellCastResult DoCast(uint32 spellId)
Definition UnitAI.cpp:106
Definition Unit.h:769
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:4439
MotionMaster * GetMotionMaster()
Definition Unit.h:1667
bool IsAlive() const
Definition Unit.h:1234
float GetCombatReach() const override
Definition Unit.h:839
TempSummon * ToTempSummon()
Definition Unit.h:1794
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:4535
UnitAI * GetAI() const
Definition Unit.h:800
bool IsAIEnabled() const
Definition Unit.h:798
void NearTeleportTo(Position const &pos, bool casting=false)
Definition Unit.cpp:12832
float GetSpeedRate(UnitMoveType mtype) const
Definition Unit.h:1654
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3784
Unit * GetVictim() const
Definition Unit.h:859
void SetSpeedRate(UnitMoveType mtype, float rate)
Definition Unit.cpp:8678
bool HasUnitState(const uint32 f) const
Definition Unit.h:876
void FinishSpell(CurrentSpellTypes spellType, bool ok=true)
Definition Unit.cpp:3051
Vehicle * GetVehicleKit() const
Definition Unit.h:1735
Spell * GetCurrentSpell(CurrentSpellTypes spellType) const
Definition Unit.h:1476
InstanceScript * GetInstanceScript() const
Definition Object.cpp:1087
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2832
void setActive(bool isActiveObject)
Definition Object.cpp:991
Position GetNearPosition(float dist, float angle)
Definition Object.cpp:3250
void GetNearPoint2D(WorldObject const *searcher, float &x, float &y, float distance, float absAngle) const
Definition Object.cpp:3180
virtual void SetData(uint32, uint32)
Definition ZoneScript.h:56
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
bool TryHandleOnce(Player *player, AreaTriggerEntry const *) override
void CountTargets(std::list< WorldObject * > &targets)
PrepareSpellScript(spell_marrowgar_bone_slice)
void HandleSpikes(SpellEffIndex effIndex)
PrepareSpellScript(spell_marrowgar_bone_spike_graveyard)
bool Validate(SpellInfo const *) override
PrepareSpellScript(spell_marrowgar_bone_storm)
PrepareSpellScript(spell_marrowgar_coldflame_bonestorm)
void HandleScriptEffect(SpellEffIndex effIndex)
PrepareAuraScript(spell_marrowgar_coldflame_damage)
PrepareSpellScript(spell_marrowgar_coldflame)
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)
float GetExactDist2d(const float x, const float y) const
Definition Position.h:109
float m_positionX
Definition Position.h:56
float GetPositionZ() const
Definition Position.h:81
float m_positionY
Definition Position.h:57
float GetOrientation() const
Definition Position.h:82
float GetAbsoluteAngle(float x, float y) const
Definition Position.h:128
void SetOrientation(float orientation)
Definition Position.h:74
float GetPositionX() const
Definition Position.h:79
float GetPositionY() const
Definition Position.h:80
void Relocate(float x, float y)
Definition Position.h:66
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