AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
MotionMaster Class Reference

#include "MotionMaster.h"

Public Member Functions

 MotionMaster (Unit *unit)
 
 ~MotionMaster ()
 
void Initialize ()
 
void InitDefault ()
 
bool empty () const
 
int size () const
 
_Ty top () const
 
_Ty GetMotionSlot (int slot) const
 
uint8 GetCleanFlags () const
 
void DirectDelete (_Ty curr)
 
void DelayedDelete (_Ty curr)
 
void UpdateMotion (uint32 diff)
 
void Clear (bool reset=true)
 
void MovementExpired (bool reset=true)
 
void MovementExpiredOnSlot (MovementSlot slot, bool reset=true)
 
void MoveIdle ()
 
void MoveTargetedHome (bool walk=false)
 The unit will return this initial position (owner for pets and summoned creatures). Doesn't work with UNIT_FLAG_DISABLE_MOVE.
 
void MoveRandom (float wanderDistance=0.0f)
 Enable a random movement in desired range around the unit. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
 
void MoveFollow (Unit *target, float dist, float angle, MovementSlot slot=MOTION_SLOT_ACTIVE, bool inheritWalkState=true, bool inheritSpeed=true)
 The unit will follow this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
 
void MoveChase (Unit *target, std::optional< ChaseRange > dist={}, std::optional< ChaseAngle > angle={})
 Force the unit to chase this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
 
void MoveChase (Unit *target, float dist, float angle)
 
void MoveChase (Unit *target, float dist)
 
void MoveCircleTarget (Unit *target)
 
void MoveBackwards (Unit *target, float dist)
 
void MoveForwards (Unit *target, float dist)
 
void MoveConfused ()
 Enable the confusion movement. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
 
void MoveFleeing (Unit *enemy, uint32 time=0)
 Enable the target's fleeing movement. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
 
void MovePoint (uint32 id, const Position &pos, ForcedMovement forcedMovement=FORCED_MOVEMENT_NONE, float speed=0.f, bool generatePath=true, bool forceDestination=true, std::optional< AnimTier > animTier=std::nullopt)
 
void MovePoint (uint32 id, float x, float y, float z, ForcedMovement forcedMovement=FORCED_MOVEMENT_NONE, float speed=0.f, float orientation=0.0f, bool generatePath=true, bool forceDestination=true, MovementSlot slot=MOTION_SLOT_ACTIVE, std::optional< AnimTier > animTier=std::nullopt)
 The unit will move to a specific point. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
 
void MoveSplinePath (Movement::PointsArray *path, ForcedMovement forcedMovement=FORCED_MOVEMENT_NONE)
 
void MovePath (uint32 path_id, ForcedMovement forcedMovement=FORCED_MOVEMENT_NONE, PathSource pathSource=PathSource::WAYPOINT_MGR)
 
void MoveLand (uint32 id, Position const &pos, float speed=0.0f)
 Use to move the unit from the air to the ground. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
 
void MoveLand (uint32 id, float x, float y, float z, float speed=0.0f)
 Use to move the unit from the air to the ground. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
 
void MoveTakeoff (uint32 id, Position const &pos, float speed=0.0f, bool skipAnimation=false)
 Use to move the unit from the ground to the air. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
 
void MoveTakeoff (uint32 id, float x, float y, float z, float speed=0.0f, bool skipAnimation=false)
 Use to move the unit from the air to the ground. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
 
void MoveCharge (float x, float y, float z, float speed=SPEED_CHARGE, uint32 id=EVENT_CHARGE, const Movement::PointsArray *path=nullptr, bool generatePath=false, float orientation=0.0f, ObjectGuid targetGUID=ObjectGuid::Empty)
 The unit will charge the target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
 
void MoveCharge (PathGenerator const &path, float speed=SPEED_CHARGE, ObjectGuid targetGUID=ObjectGuid::Empty)
 The unit will charge the target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
 
void MoveKnockbackFrom (float srcX, float srcY, float speedXY, float speedZ)
 
void MoveJumpTo (float angle, float speedXY, float speedZ)
 The unit will jump in a specific direction.
 
void MoveJump (Position const &pos, float speedXY, float speedZ, uint32 id=0)
 
void MoveJump (float x, float y, float z, float speedXY, float speedZ, uint32 id=0, Unit const *target=nullptr)
 The unit will jump to a specific point.
 
void MoveFall (uint32 id=0, bool addFlagForNPC=false)
 The unit will fall. Used when in the air. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
 
void MoveSeekAssistance (float x, float y, float z)
 
void MoveSeekAssistanceDistract (uint32 timer)
 
void MoveTaxiFlight (uint32 path, uint32 pathnode)
 
void MoveDistract (uint32 time)
 Enable the target's distract movement. Doesn't work with UNIT_FLAG_DISABLE_MOVE and if the unit has MOTION_SLOT_CONTROLLED (generaly apply when the unit is controlled).
 
void MoveWaypoint (uint32 path_id, bool repeatable, PathSource pathSource=PathSource::WAYPOINT_MGR)
 Move the unit following a specific path. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
 
void MoveRotate (uint32 time, RotateDirection direction)
 Rotate the unit. You can specify the time of the rotation.
 
MovementGeneratorType GetCurrentMovementGeneratorType () const
 
MovementGeneratorType GetMotionSlotType (int slot) const
 
bool HasMovementGeneratorType (MovementGeneratorType type) const
 
uint32 GetCurrentSplineId () const
 
void propagateSpeedChange ()
 
void ReinitializeMovement ()
 
bool GetDestination (float &x, float &y, float &z)
 
void DistanceYourself (float range)
 

Private Types

typedef MovementGenerator_Ty
 
typedef std::vector< _TyExpireList
 

Private Member Functions

void pop ()
 
bool needInitTop () const
 
void InitTop ()
 
void Mutate (MovementGenerator *m, MovementSlot slot)
 
void DirectClean (bool reset)
 
void DelayedClean ()
 
void DirectExpire (bool reset)
 
void DirectExpireSlot (MovementSlot slot, bool reset)
 
void DelayedExpire ()
 

Private Attributes

ExpireList_expList
 
_Ty Impl [MAX_MOTION_SLOT]
 
int _top
 
Unit_owner
 
bool _needInit [MAX_MOTION_SLOT]
 
uint8 _cleanFlag
 

Detailed Description

Member Typedef Documentation

◆ _Ty

◆ ExpireList

typedef std::vector<_Ty> MotionMaster::ExpireList
private

Constructor & Destructor Documentation

◆ MotionMaster()

MotionMaster::MotionMaster ( Unit unit)
inlineexplicit
160 : _expList(nullptr), _top(-1), _owner(unit), _cleanFlag(MMCF_NONE)
161 {
162 for (uint8 i = 0; i < MAX_MOTION_SLOT; ++i)
163 {
164 Impl[i] = nullptr;
165 _needInit[i] = true;
166 }
167 }
std::uint8_t uint8
Definition Define.h:109
@ MMCF_NONE
Definition MotionMaster.h:71
@ MAX_MOTION_SLOT
Definition MotionMaster.h:66
int _top
Definition MotionMaster.h:290
Unit * _owner
Definition MotionMaster.h:291
bool _needInit[MAX_MOTION_SLOT]
Definition MotionMaster.h:292
ExpireList * _expList
Definition MotionMaster.h:288
_Ty Impl[MAX_MOTION_SLOT]
Definition MotionMaster.h:289
uint8 _cleanFlag
Definition MotionMaster.h:293

References _needInit, Impl, and MAX_MOTION_SLOT.

◆ ~MotionMaster()

MotionMaster::~MotionMaster ( )
94{
95 // clear ALL movement generators (including default)
96 while (!empty())
97 {
98 MovementGenerator* curr = top();
99 pop();
100 if (curr && !isStatic(curr))
101 delete curr; // Skip finalizing on delete, it might launch new movement
102 }
103}
bool isStatic(MovementGenerator *movement)
Definition MotionMaster.cpp:69
_Ty top() const
Definition MotionMaster.h:175
void pop()
Definition MotionMaster.h:142
bool empty() const
Definition MotionMaster.h:173
Definition MovementGenerator.h:28

References empty(), isStatic(), pop(), and top().

Member Function Documentation

◆ Clear()

void MotionMaster::Clear ( bool  reset = true)
inline
193 {
195 {
196 if (reset)
198 else
199 _cleanFlag &= ~MMCF_RESET;
200 DelayedClean();
201 }
202 else
203 DirectClean(reset);
204 }
@ MMCF_RESET
Definition MotionMaster.h:73
@ MMCF_UPDATE
Definition MotionMaster.h:72
void DelayedClean()
Definition MotionMaster.cpp:165
void DirectClean(bool reset)
Definition MotionMaster.cpp:147

References _cleanFlag, DelayedClean(), DirectClean(), MMCF_RESET, and MMCF_UPDATE.

Referenced by PetAI::_stopAttack(), SmartAI::AttackStart(), Unit::CleanupBeforeRemoveFromMap(), boss_julianne::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), boss_illidan_stormrage::DoAction(), Spell::EffectSummonType(), npc_argent_captainAI::EnterEvadeMode(), CreatureAI::EnterEvadeMode(), npc_pet_gen_argent_pony_bridle::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), boss_halazzi::EnterPhase(), boss_zuljin::EnterPhase(), UtherBatteredHiltEvent::Execute(), npc_singularity::FindAndFollowTarget(), npc_hallows_end_soh::FinishEvent(), npc_pet_dk_ebon_gargoyle::FlyAway(), boss_nightbane::FlyToClosestPreFlyWayPoint(), spell_q6124_6129_apply_salve::HandleDummy(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_item_toxic_wasteling::HandleJump(), AuraEffect::HandleModPossessPet(), spell_item_enchanted_broom_periodic::HandlePeriodicTick(), WorldSession::HandlePetActionHelper(), PetAI::HandleReturnMovement(), spell_gen_ayamiss_swarmer_loop::HandleScript(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::HandleSpeedChangeIfNeeded(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), npc_zulian_prowler::npc_zulian_prowlerAI::JustEngagedWith(), boss_grandmaster_vorpil::JustEngagedWith(), boss_swamplord_muselek::JustEngagedWith(), boss_high_botanist_freywinn::JustEngagedWith(), boss_felmyst::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_mennu_the_betrayer::JustSummoned(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::MoveInLineOfSight(), PetAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), boss_four_horsemen::boss_four_horsemenAI::MovementInform(), npc_wild_wyrm::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), MoveTargetedHome(), boss_leotheras_the_blind::MoveToTargetIfOutOfRange(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), NPCStaveQuestAI::PrepareForEncounter(), boss_felblood_kaelthas::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_janalai::Reset(), npc_janalai_hatcher::Reset(), npc_batrider::Reset(), boss_archimonde::Reset(), boss_taldaram::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), boss_leotheras_the_blind::Reset(), boss_magtheridon::Reset(), npc_pet_gen_gnomish_flame_turret::Reset(), boss_magtheridon::ScheduleCombatEvents(), boss_felmyst::ScheduleGroundAbilities(), boss_nightbane::ScheduleLand(), boss_loken::ScheduleTasks(), boss_laj::ScheduleTasks(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), Unit::SetCharmedBy(), boss_grand_warlock_nethekurse::SetData(), Unit::setDeathState(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::SetGUID(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), FollowerAI::StartFollow(), SmartAI::StopFollow(), Spell::SummonGuardian(), Pet::Update(), boss_quartermaster_zigris::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_draenei_survivor::npc_draenei_survivorAI::UpdateAI(), boss_jedoga_shadowseeker::UpdateAI(), npc_twilight_volunteer::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_spark_of_ionar::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_skadi_grauf::boss_skadi_graufAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_commander_eligor_dawnbringer::npc_commander_eligor_dawnbringerAI::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), npc_pet_gen_toxic_wasteling::UpdateAI(), and PetAI::UpdateAI().

◆ DelayedClean()

void MotionMaster::DelayedClean ( )
private
166{
167 while (size() > 1)
168 {
169 MovementGenerator* curr = top();
170 pop();
171 if (curr) DelayedDelete(curr);
172 }
173}
int size() const
Definition MotionMaster.h:174
void DelayedDelete(_Ty curr)
Definition MotionMaster.cpp:1002

References DelayedDelete(), pop(), size(), and top().

Referenced by Clear().

◆ DelayedDelete()

void MotionMaster::DelayedDelete ( _Ty  curr)
1003{
1004 LOG_DEBUG("movement.motionmaster", "Unit (Entry {}) is trying to delete its updating MG (Type {})!", _owner->GetEntry(), curr->GetMovementGeneratorType());
1005 if (isStatic(curr))
1006 return;
1007 if (!_expList)
1008 _expList = new ExpireList();
1009 _expList->push_back(curr);
1010}
#define LOG_DEBUG(filterType__,...)
Definition Log.h:170
std::vector< _Ty > ExpireList
Definition MotionMaster.h:287
uint32 GetEntry() const
Definition Object.h:116

References _expList, _owner, Object::GetEntry(), MovementGenerator::GetMovementGeneratorType(), isStatic(), and LOG_DEBUG.

Referenced by DelayedClean(), DelayedExpire(), and Mutate().

◆ DelayedExpire()

void MotionMaster::DelayedExpire ( )
private
196{
197 if (size() > 1)
198 {
199 MovementGenerator* curr = top();
200 pop();
201 if (curr) DelayedDelete(curr);
202 }
203
204 while (!empty() && !top())
205 --_top;
206}

References _top, DelayedDelete(), empty(), pop(), size(), and top().

Referenced by MovementExpired().

◆ DirectClean()

void MotionMaster::DirectClean ( bool  reset)
private
148{
149 while (size() > 1)
150 {
151 MovementGenerator* curr = top();
152 pop();
153 if (curr) DirectDelete(curr);
154 }
155
156 if (empty())
157 return;
158
159 if (needInitTop())
160 InitTop();
161 else if (reset)
162 top()->Reset(_owner);
163}
void InitTop()
Definition MotionMaster.cpp:988
void DirectDelete(_Ty curr)
Definition MotionMaster.cpp:994
bool needInitTop() const
Definition MotionMaster.h:152
virtual void Reset(Unit *)=0

References _owner, DirectDelete(), empty(), InitTop(), needInitTop(), pop(), MovementGenerator::Reset(), size(), and top().

Referenced by Clear().

◆ DirectDelete()

void MotionMaster::DirectDelete ( _Ty  curr)
995{
996 if (isStatic(curr))
997 return;
998 curr->Finalize(_owner);
999 delete curr;
1000}

References _owner, MovementGenerator::Finalize(), and isStatic().

Referenced by DirectClean(), DirectExpire(), DirectExpireSlot(), Initialize(), Mutate(), and UpdateMotion().

◆ DirectExpire()

void MotionMaster::DirectExpire ( bool  reset)
private
176{
177 if (size() > 1)
178 {
179 MovementGenerator* curr = top();
180 pop();
181 if (curr) DirectDelete(curr);
182 }
183
184 while (!empty() && !top())
185 --_top;
186
187 if (empty())
188 Initialize();
189 else if (needInitTop())
190 InitTop();
191 else if (reset)
192 top()->Reset(_owner);
193}
void Initialize()
Definition MotionMaster.cpp:74

References _owner, _top, DirectDelete(), empty(), Initialize(), InitTop(), needInitTop(), pop(), MovementGenerator::Reset(), size(), and top().

Referenced by MovementExpired().

◆ DirectExpireSlot()

void MotionMaster::DirectExpireSlot ( MovementSlot  slot,
bool  reset 
)
private
209{
210 if (size() > 1)
211 {
212 MovementGenerator* curr = Impl[slot];
213
214 // pussywizard: clear slot AND decrease top immediately to avoid crashes when referencing null top in DirectDelete
215 Impl[slot] = nullptr;
216 while (!empty() && !top())
217 --_top;
218
219 if (curr) DirectDelete(curr);
220 }
221
222 while (!empty() && !top())
223 --_top;
224
225 if (empty())
226 Initialize();
227 else if (needInitTop())
228 InitTop();
229 else if (reset)
230 top()->Reset(_owner);
231}

References _owner, _top, DirectDelete(), empty(), Impl, Initialize(), InitTop(), needInitTop(), MovementGenerator::Reset(), size(), and top().

Referenced by MovementExpiredOnSlot().

◆ DistanceYourself()

void MotionMaster::DistanceYourself ( float  range)
353{
355 {
356 if (_owner->IsPlayer())
357 {
359 gen->DistanceYourself((Player*)_owner, dist);
360 }
361 else
362 {
364 gen->DistanceYourself((Creature*)_owner, dist);
365 }
366 return;
367 }
368}
@ CHASE_MOTION_TYPE
Definition MotionMaster.h:45
Definition TargetedMovementGenerator.h:47
void DistanceYourself(T *owner, float distance)
Definition TargetedMovementGenerator.cpp:81
Definition Creature.h:47
MovementGeneratorType GetCurrentMovementGeneratorType() const
Definition MotionMaster.cpp:949
bool IsPlayer() const
Definition Object.h:200
Definition Player.h:1071

References _owner, CHASE_MOTION_TYPE, ChaseMovementGenerator< T >::DistanceYourself(), GetCurrentMovementGeneratorType(), Object::IsPlayer(), and top().

Referenced by SmartAI::DistanceYourself().

◆ empty()

◆ GetCleanFlags()

uint8 MotionMaster::GetCleanFlags ( ) const
inline
186{ return _cleanFlag; }

References _cleanFlag.

◆ GetCurrentMovementGeneratorType()

MovementGeneratorType MotionMaster::GetCurrentMovementGeneratorType ( ) const
950{
951 if (empty())
952 return IDLE_MOTION_TYPE;
953
954 return top()->GetMovementGeneratorType();
955}
@ IDLE_MOTION_TYPE
Definition MotionMaster.h:39
virtual MovementGeneratorType GetMovementGeneratorType()=0

References empty(), MovementGenerator::GetMovementGeneratorType(), IDLE_MOTION_TYPE, and top().

Referenced by DistanceYourself(), GuardAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), boss_volkhan::GoToAnvil(), npc_commandscript::HandleNpcUnFollowCommand(), WorldSession::HandleSetRaidDifficultyOpcode(), IsMutualChase(), SmartAI::JustReachedHome(), MoveChase(), SmartAI::MovepointReached(), SplineHandler::operator()(), SmartAI::SetCombatMovement(), Unit::SetSpeed(), npc_escortAI::Start(), FollowerAI::StartFollow(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_fel_guard_hound::npc_fel_guard_houndAI::UpdateAI(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::UpdateAI(), npc_concentrated_ball::npc_concentrated_ballAI::UpdateAI(), and Player::UpdateCharmedAI().

◆ GetCurrentSplineId()

uint32 MotionMaster::GetCurrentSplineId ( ) const
981{
982 if (empty())
983 return 0;
984
985 return top()->GetSplineId();
986}
virtual uint32 GetSplineId() const
Definition MovementGenerator.h:41

References empty(), MovementGenerator::GetSplineId(), and top().

Referenced by SplineHandler::operator()().

◆ GetDestination()

bool MotionMaster::GetDestination ( float &  x,
float &  y,
float &  z 
)
1013{
1014 if (_owner->movespline->Finalized())
1015 return false;
1016
1017 G3D::Vector3 const& dest = _owner->movespline->FinalDestination();
1018 x = dest.x;
1019 y = dest.y;
1020 z = dest.z;
1021 return true;
1022}
bool Finalized() const
Definition MoveSpline.h:116
Vector3 FinalDestination() const
Definition MoveSpline.h:121
Movement::MoveSpline * movespline
Definition Unit.h:2096

References _owner, Movement::MoveSpline::FinalDestination(), Movement::MoveSpline::Finalized(), and Unit::movespline.

Referenced by misc_commandscript::HandleMovegensCommand().

◆ GetMotionSlot()

_Ty MotionMaster::GetMotionSlot ( int  slot) const
inline
181 {
182 ASSERT(slot >= 0);
183 return Impl[slot];
184 }
#define ASSERT
Definition Errors.h:68

References ASSERT, and Impl.

Referenced by HomeMovementGenerator< Creature >::_setTargetLocation(), and misc_commandscript::HandleMovegensCommand().

◆ GetMotionSlotType()

◆ HasMovementGeneratorType()

bool MotionMaster::HasMovementGeneratorType ( MovementGeneratorType  type) const
966{
967 if (empty() && type == IDLE_MOTION_TYPE)
968 return true;
969
970 for (int i = _top; i >= 0; --i)
971 {
972 if (Impl[i] && Impl[i]->GetMovementGeneratorType() == type)
973 return true;
974 }
975
976 return false;
977}

References _top, empty(), IDLE_MOTION_TYPE, and Impl.

◆ InitDefault()

void MotionMaster::InitDefault ( )
89{
91}
@ MOTION_SLOT_IDLE
Definition MotionMaster.h:63
void Mutate(MovementGenerator *m, MovementSlot slot)
Definition MotionMaster.cpp:868
MovementGenerator * SelectMovementGenerator(Unit *unit)
Definition CreatureAISelector.cpp:91

References _owner, MOTION_SLOT_IDLE, Mutate(), and FactorySelector::SelectMovementGenerator().

Referenced by Initialize(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::JustReachedHome(), Unit::RemoveCharmedBy(), and Creature::Respawn().

◆ Initialize()

◆ InitTop()

void MotionMaster::InitTop ( )
private
989{
991 _needInit[_top] = false;
992}
virtual void Initialize(Unit *)=0

References _needInit, _owner, _top, MovementGenerator::Initialize(), and top().

Referenced by DirectClean(), DirectExpire(), DirectExpireSlot(), and UpdateMotion().

◆ MoveBackwards()

void MotionMaster::MoveBackwards ( Unit target,
float  dist 
)
371{
372 if (!target)
373 {
374 return;
375 }
376
377 Position const& pos = target->GetPosition();
378 float angle = target->GetAngle(_owner);
379 G3D::Vector3 point;
380 point.x = pos.m_positionX + dist * cosf(angle);
381 point.y = pos.m_positionY + dist * sinf(angle);
382 point.z = pos.m_positionZ;
383
384 if (!_owner->GetMap()->CanReachPositionAndGetValidCoords(_owner, point.x, point.y, point.z, true, true))
385 {
386 return;
387 }
388
390 init.MoveTo(point.x, point.y, point.z, false);
391 init.SetWalk(true);
392 init.SetFacing(target);
393 init.SetOrientationInversed();
394 init.Launch();
395}
bool CanReachPositionAndGetValidCoords(WorldObject const *source, PathGenerator *path, float &destX, float &destY, float &destZ, bool failOnCollision=true, bool failOnSlopes=true) const
Check if a given source can reach a specific point following a path and normalize the coords....
Definition Map.cpp:2928
Definition MoveSplineInit.h:63
Map * GetMap() const
Definition Object.h:620
Definition Position.h:27
float m_positionZ
Definition Position.h:57
float m_positionX
Definition Position.h:55
float m_positionY
Definition Position.h:56
void GetPosition(float &x, float &y) const
Definition Position.h:126
float GetAngle(const Position *pos) const
Definition Position.cpp:85

References _owner, Map::CanReachPositionAndGetValidCoords(), Position::GetAngle(), WorldObject::GetMap(), Position::GetPosition(), Movement::MoveSplineInit::Launch(), Position::m_positionX, Position::m_positionY, Position::m_positionZ, Movement::MoveSplineInit::MoveTo(), Movement::MoveSplineInit::SetFacing(), Movement::MoveSplineInit::SetOrientationInversed(), and Movement::MoveSplineInit::SetWalk().

Referenced by CreatureAI::MoveBackwardsChecks().

◆ MoveCharge() [1/2]

void MotionMaster::MoveCharge ( float  x,
float  y,
float  z,
float  speed = SPEED_CHARGE,
uint32  id = EVENT_CHARGE,
const Movement::PointsArray path = nullptr,
bool  generatePath = false,
float  orientation = 0.0f,
ObjectGuid  targetGUID = ObjectGuid::Empty 
)

The unit will charge the target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.

720{
722 return;
723
724 if (Impl[MOTION_SLOT_CONTROLLED] && Impl[MOTION_SLOT_CONTROLLED]->GetMovementGeneratorType() != DISTRACT_MOTION_TYPE)
725 return;
726
727 if (_owner->IsPlayer())
728 {
729 LOG_DEBUG("movement.motionmaster", "Player ({}) charge point (X: {} Y: {} Z: {})", _owner->GetGUID().ToString(), x, y, z);
730 Mutate(new PointMovementGenerator<Player>(id, x, y, z, FORCED_MOVEMENT_NONE, speed, orientation, path, generatePath, generatePath, std::nullopt, targetGUID), MOTION_SLOT_CONTROLLED);
731 }
732 else
733 {
734 LOG_DEBUG("movement.motionmaster", "Creature ({}) charge point (X: {} Y: {} Z: {})", _owner->GetGUID().ToString(), x, y, z);
735 Mutate(new PointMovementGenerator<Creature>(id, x, y, z, FORCED_MOVEMENT_NONE, speed, orientation, path, generatePath, generatePath, std::nullopt, targetGUID), MOTION_SLOT_CONTROLLED);
736 }
737}
@ MOTION_SLOT_CONTROLLED
Definition MotionMaster.h:65
@ DISTRACT_MOTION_TYPE
Definition MotionMaster.h:50
@ FORCED_MOVEMENT_NONE
Definition MotionMaster.h:85
@ UNIT_FLAG_DISABLE_MOVE
Definition UnitDefines.h:256
std::string ToString() const
Definition ObjectGuid.cpp:47
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:113
Definition PointMovementGenerator.h:28
bool HasUnitFlag(UnitFlags flags) const
Definition Unit.h:737

References _owner, DISTRACT_MOTION_TYPE, FORCED_MOVEMENT_NONE, Object::GetGUID(), Unit::HasUnitFlag(), Impl, Object::IsPlayer(), LOG_DEBUG, MOTION_SLOT_CONTROLLED, Mutate(), ObjectGuid::ToString(), and UNIT_FLAG_DISABLE_MOVE.

Referenced by boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), npc_saurfang_event::npc_saurfang_eventAI::DoAction(), boss_professor_putricide::boss_professor_putricideAI::DoAction(), npc_living_mojo::npc_living_mojoAI::DoAction(), Spell::EffectCharge(), Spell::EffectChargeDest(), boss_professor_putricide::boss_professor_putricideAI::EnterEvadeMode(), npc_pet_dk_ebon_gargoyle::FlyAway(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), spell_the_lich_king_valkyr_target_search::HandleScript(), npc_pet_dk_ebon_gargoyle::InitializeAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), MoveCharge(), npc_vortex_ride::npc_vortex_rideAI::PassengerBoarded(), npc_kinetic_bomb::npc_kinetic_bombAI::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::UpdateAI(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), and npc_iron_watcher::npc_iron_watcherAI::UpdateAI().

◆ MoveCharge() [2/2]

void MotionMaster::MoveCharge ( PathGenerator const &  path,
float  speed = SPEED_CHARGE,
ObjectGuid  targetGUID = ObjectGuid::Empty 
)

The unit will charge the target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.

743{
744 G3D::Vector3 dest = path.GetActualEndPosition();
745
746 MoveCharge(dest.x, dest.y, dest.z, speed, EVENT_CHARGE_PREPATH, nullptr, false, 0.0f, targetGUID);
747
748 // Charge movement is not started when using EVENT_CHARGE_PREPATH
750 init.MovebyPath(path.GetPath());
751 init.SetVelocity(speed);
752 init.Launch();
753}
#define EVENT_CHARGE_PREPATH
Definition boss_icecrown_gunship_battle.cpp:108
void MoveCharge(float x, float y, float z, float speed=SPEED_CHARGE, uint32 id=EVENT_CHARGE, const Movement::PointsArray *path=nullptr, bool generatePath=false, float orientation=0.0f, ObjectGuid targetGUID=ObjectGuid::Empty)
The unit will charge the target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:719

References _owner, EVENT_CHARGE_PREPATH, PathGenerator::GetActualEndPosition(), PathGenerator::GetPath(), Movement::MoveSplineInit::Launch(), Movement::MoveSplineInit::MovebyPath(), MoveCharge(), and Movement::MoveSplineInit::SetVelocity().

◆ MoveChase() [1/3]

void MotionMaster::MoveChase ( Unit target,
float  dist 
)
inline
232{ MoveChase(target, ChaseRange(dist)); }
void MoveChase(Unit *target, std::optional< ChaseRange > dist={}, std::optional< ChaseAngle > angle={})
Force the unit to chase this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:314
Definition MotionMaster.h:109

References MoveChase().

Referenced by MoveChase().

◆ MoveChase() [2/3]

void MotionMaster::MoveChase ( Unit target,
float  dist,
float  angle 
)
inline
231{ MoveChase(target, ChaseRange(dist), ChaseAngle(angle)); }
Definition MotionMaster.h:122

References MoveChase().

Referenced by MoveChase().

◆ MoveChase() [3/3]

void MotionMaster::MoveChase ( Unit target,
std::optional< ChaseRange dist = {},
std::optional< ChaseAngle angle = {} 
)

Force the unit to chase this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.

315{
316 // ignore movement request if target not exist
317 if (!target || target == _owner || _owner->HasUnitFlag(UNIT_FLAG_DISABLE_MOVE))
318 return;
319
321 {
322 if (_owner->IsPlayer())
323 {
325 gen->SetOffsetAndAngle(dist, angle);
326 gen->SetNewTarget(target);
327 }
328 else
329 {
331 gen->SetOffsetAndAngle(dist, angle);
332 gen->SetNewTarget(target);
333 }
334 return;
335 }
336
337 //_owner->ClearUnitState(UNIT_STATE_FOLLOW);
338 if (_owner->IsPlayer())
339 {
340 LOG_DEBUG("movement.motionmaster", "Player ({}) chase to {} ({})",
341 _owner->GetGUID().ToString(), target->IsPlayer() ? "player" : "creature", target->GetGUID().ToString());
343 }
344 else
345 {
346 LOG_DEBUG("movement.motionmaster", "Creature ({}) chase to {} ({})",
347 _owner->GetGUID().ToString(), target->IsPlayer() ? "player" : "creature", target->GetGUID().ToString());
349 }
350}
@ MOTION_SLOT_ACTIVE
Definition MotionMaster.h:64
void SetNewTarget(Unit *target)
Definition TargetedMovementGenerator.cpp:74
void SetOffsetAndAngle(std::optional< ChaseRange > dist, std::optional< ChaseAngle > angle)
Definition TargetedMovementGenerator.cpp:66
std::string ToString(Type &&val, Params &&... params)
Definition StringConvert.h:250

References _owner, CHASE_MOTION_TYPE, GetCurrentMovementGeneratorType(), Object::GetGUID(), Unit::HasUnitFlag(), Object::IsPlayer(), LOG_DEBUG, MOTION_SLOT_ACTIVE, Mutate(), ChaseMovementGenerator< T >::SetNewTarget(), ChaseMovementGenerator< T >::SetOffsetAndAngle(), top(), ObjectGuid::ToString(), and UNIT_FLAG_DISABLE_MOVE.

Referenced by UnitAI::AttackStart(), FollowerAI::AttackStart(), boss_priestess_lackey_commonAI::AttackStart(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::AttackStart(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::AttackStart(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::AttackStart(), boss_malygos::boss_malygosAI::AttackStart(), boss_swamplord_muselek::AttackStart(), ArcherAI::AttackStart(), npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_shade_of_aran::AttackStart(), npc_hyjal_ground_trash::AttackStart(), npc_hyjal_gargoyle::AttackStart(), npc_hyjal_frost_wyrm::AttackStart(), boss_magus_telestra::AttackStart(), boss_razorscale::boss_razorscaleAI::AttackStart(), boss_lady_malande::AttackStart(), boss_olm_the_summoner::AttackStart(), boss_kiggler_the_crazed::AttackStart(), boss_krosh_firehand::AttackStart(), npc_millhouse_manastorm::npc_millhouse_manastormAI::AttackStart(), boss_high_astromancer_solarian::AttackStart(), npc_capernian::AttackStart(), UnitAI::AttackStartCaster(), boss_thorim::boss_thorimAI::DamageTaken(), PetAI::DoAttack(), ScriptedAI::DoStartMovement(), RestoreAttack::Execute(), boss_kologarn_eyebeam::boss_kologarn_eyebeamAI::IsSummonedBy(), npc_pet_dk_ghoul::IsSummonedBy(), boss_shade_of_aran::JustEngagedWith(), boss_swamplord_muselek::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), npc_daphne_stilwell::npc_daphne_stilwellAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_lady_vashj::MovementInform(), boss_nazan::MovementInform(), boss_kaelthas::MovementInform(), boss_leotheras_the_blind::MoveToTargetIfOutOfRange(), Unit::PetSpellFail(), Unit::RemoveCharmedBy(), boss_magtheridon::Reset(), Creature::ResumeChasingVictim(), boss_high_botanist_freywinn::ResumeEncounter(), Resurrect(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), SmartAI::SetCombatMovement(), SmartAI::SetCurrentRangeMode(), boss_volkhan::SpellHitTarget(), npc_nerubian_burrower::npc_nerubian_burrowerAI::SpellHitTarget(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_quartermaster_zigris::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), npc_pet_dk_ebon_gargoyle::UpdateAI(), and Player::UpdateCharmedAI().

◆ MoveCircleTarget()

void MotionMaster::MoveCircleTarget ( Unit target)
424{
425 if (!target)
426 {
427 return;
428 }
429
430 Position pos;
431 if (!target->GetMeleeAttackPoint(_owner, pos))
432 {
433 return;
434 }
435
437 init.MoveTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), false);
438 init.SetWalk(true);
439 init.SetFacing(target);
440 init.Launch();
441}
bool GetMeleeAttackPoint(Unit *attacker, Position &pos)
Definition Unit.cpp:2707
float GetPositionZ() const
Definition Position.h:123
float GetPositionX() const
Definition Position.h:121
float GetPositionY() const
Definition Position.h:122

References _owner, Unit::GetMeleeAttackPoint(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Movement::MoveSplineInit::Launch(), Movement::MoveSplineInit::MoveTo(), Movement::MoveSplineInit::SetFacing(), and Movement::MoveSplineInit::SetWalk().

Referenced by CreatureAI::MoveCircleChecks().

◆ MoveConfused()

void MotionMaster::MoveConfused ( )

Enable the confusion movement. Doesn't work with UNIT_FLAG_DISABLE_MOVE.

294{
295 // Xinef: do not allow to move with UNIT_FLAG_DISABLE_MOVE
297 return;
298
299 if (_owner->IsPlayer())
300 {
301 LOG_DEBUG("movement.motionmaster", "Player ({}) move confused", _owner->GetGUID().ToString());
303 }
304 else
305 {
306 LOG_DEBUG("movement.motionmaster", "Creature ({}) move confused", _owner->GetGUID().ToString());
308 }
309}
Definition ConfusedMovementGenerator.h:28

References _owner, Object::GetGUID(), Unit::HasUnitFlag(), Object::IsPlayer(), LOG_DEBUG, MOTION_SLOT_CONTROLLED, Mutate(), ObjectGuid::ToString(), and UNIT_FLAG_DISABLE_MOVE.

Referenced by Unit::SetConfused().

◆ MoveDistract()

void MotionMaster::MoveDistract ( uint32  time)

Enable the target's distract movement. Doesn't work with UNIT_FLAG_DISABLE_MOVE and if the unit has MOTION_SLOT_CONTROLLED (generaly apply when the unit is controlled).

848{
850 return;
851
853 return;
854
855 /*if (_owner->IsPlayer())
856 {
857 LOG_DEBUG("movement.motionmaster", "Player ({}) distracted (timer: {})", _owner->GetGUID().ToString(), timer);
858 }
859 else
860 {
861 LOG_DEBUG("movement.motionmaster", "Creature ({}) (timer: {})", _owner->GetGUID().ToString(), timer);
862 }*/
863
866}
Definition IdleMovementGenerator.h:50

References _owner, Unit::HasUnitFlag(), Impl, MOTION_SLOT_CONTROLLED, Mutate(), and UNIT_FLAG_DISABLE_MOVE.

Referenced by Spell::EffectDistract(), and CreatureAI::TriggerAlert().

◆ MoveFall()

void MotionMaster::MoveFall ( uint32  id = 0,
bool  addFlagForNPC = false 
)

The unit will fall. Used when in the air. Doesn't work with UNIT_FLAG_DISABLE_MOVE.

677{
679 return;
680
681 // use larger distance for vmap height search than in most other cases
683 if (tz <= INVALID_HEIGHT)
684 {
685 LOG_DEBUG("movement.motionmaster", "MotionMaster::MoveFall: unable retrive a proper height at map {} (x: {}, y: {}, z: {}).",
687 return;
688 }
689
690 // Abort too if the ground is very near
691 if (std::fabs(_owner->GetPositionZ() - tz) < 0.1f)
692 return;
693
694 if (_owner->IsPlayer())
695 {
699 }
700 else if (_owner->IsCreature() && addFlagForNPC) // pussywizard
701 {
707 }
708
710 init.MoveTo(_owner->GetPositionX(), _owner->GetPositionY(), tz + _owner->GetHoverHeight());
711 init.SetFall();
712
714}
#define MAX_FALL_DISTANCE
Definition GridTerrainData.h:28
#define INVALID_HEIGHT
Definition GridTerrainData.h:27
@ MOVEMENTFLAG_MASK_MOVING
Definition UnitDefines.h:402
@ MOVEMENTFLAG_FLYING
Definition UnitDefines.h:394
@ MOVEMENTFLAG_CAN_FLY
Definition UnitDefines.h:393
@ MOVEMENTFLAG_FALLING
Definition UnitDefines.h:381
Definition PointMovementGenerator.h:79
uint32 GetId() const
Definition Map.h:229
Player * ToPlayer()
Definition Object.h:201
bool IsCreature() const
Definition Object.h:204
void SetFallInformation(uint32 time, float z)
Definition Player.h:2350
float GetHoverHeight() const
Definition Unit.h:1697
void AddUnitMovementFlag(uint32 f)
Definition Unit.h:762
void SendMovementFlagUpdate(bool self=false)
Definition Unit.cpp:16920
void RemoveUnitMovementFlag(uint32 f)
Definition Unit.h:763
float GetMapHeight(float x, float y, float z, bool vmap=true, float distanceToSearch=50.0f) const
Definition Object.cpp:3030
MovementInfo m_movementInfo
Definition Object.h:692
Seconds GetGameTime()
Definition GameTime.cpp:38
void SetFallTime(uint32 newFallTime)
Definition Object.h:351

References _owner, Unit::AddUnitMovementFlag(), GameTime::GetGameTime(), Unit::GetHoverHeight(), Map::GetId(), WorldObject::GetMap(), WorldObject::GetMapHeight(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Unit::HasUnitFlag(), INVALID_HEIGHT, Object::IsCreature(), Object::IsPlayer(), LOG_DEBUG, WorldObject::m_movementInfo, MAX_FALL_DISTANCE, MOTION_SLOT_CONTROLLED, MOVEMENTFLAG_CAN_FLY, MOVEMENTFLAG_FALLING, MOVEMENTFLAG_FLYING, MOVEMENTFLAG_MASK_MOVING, Movement::MoveSplineInit::MoveTo(), Mutate(), Unit::RemoveUnitMovementFlag(), Unit::SendMovementFlagUpdate(), Movement::MoveSplineInit::SetFall(), Player::SetFallInformation(), MovementInfo::SetFallTime(), Object::ToPlayer(), and UNIT_FLAG_DISABLE_MOVE.

Referenced by Unit::_ExitVehicle(), npc_wild_wyrm::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), Totem::InitSummon(), boss_ayamiss::JustDied(), Player::KillPlayer(), spell_chapter5_light_of_dawn_aura::OnRemove(), Creature::setDeathState(), boss_krick::boss_krickAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), and npc_pet_gen_wind_rider_cub::UpdateAI().

◆ MoveFleeing()

void MotionMaster::MoveFleeing ( Unit enemy,
uint32  time = 0 
)

Enable the target's fleeing movement. Doesn't work with UNIT_FLAG_DISABLE_MOVE.

796{
797 if (!enemy)
798 return;
799
801 return;
802
803 if (_owner->IsPlayer())
804 {
805 LOG_DEBUG("movement.motionmaster", "Player ({}) flee from {} ({})",
806 _owner->GetGUID().ToString(), enemy->IsPlayer() ? "player" : "creature", enemy->GetGUID().ToString());
808 }
809 else
810 {
811 LOG_DEBUG("movement.motionmaster", "Creature ({}) flee from {} ({}) {}",
812 _owner->GetGUID().ToString(), enemy->IsPlayer() ? "player" : "creature", enemy->GetGUID().ToString(), time ? " for a limited time" : "");
813 if (time)
815 else
817 }
818}
Definition FleeingMovementGenerator.h:27
Definition FleeingMovementGenerator.h:50

References _owner, Object::GetGUID(), Unit::HasUnitFlag(), Object::IsPlayer(), LOG_DEBUG, MOTION_SLOT_CONTROLLED, Mutate(), ObjectGuid::ToString(), and UNIT_FLAG_DISABLE_MOVE.

Referenced by Unit::SetFeared(), and boss_headless_horseman_head::SpellHit().

◆ MoveFollow()

void MotionMaster::MoveFollow ( Unit target,
float  dist,
float  angle,
MovementSlot  slot = MOTION_SLOT_ACTIVE,
bool  inheritWalkState = true,
bool  inheritSpeed = true 
)

The unit will follow this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.

447{
448 // ignore movement request if target not exist
449 if (!target || target == _owner || _owner->HasUnitFlag(UNIT_FLAG_DISABLE_MOVE))
450 {
451 return;
452 }
453
454 //_owner->AddUnitState(UNIT_STATE_FOLLOW);
455 if (_owner->IsPlayer())
456 {
457 LOG_DEBUG("movement.motionmaster", "Player ({}) follow to {} ({})",
458 _owner->GetGUID().ToString(), target->IsPlayer() ? "player" : "creature", target->GetGUID().ToString());
459 Mutate(new FollowMovementGenerator<Player>(target, dist, angle, inheritWalkState, inheritSpeed), slot);
460 }
461 else
462 {
463 LOG_DEBUG("movement.motionmaster", "Creature ({}) follow to {} ({})",
464 _owner->GetGUID().ToString(), target->IsPlayer() ? "player" : "creature", target->GetGUID().ToString());
465 Mutate(new FollowMovementGenerator<Creature>(target, dist, angle, inheritWalkState, inheritSpeed), slot);
466 }
467}
Definition TargetedMovementGenerator.h:91

References _owner, Object::GetGUID(), Unit::HasUnitFlag(), Object::IsPlayer(), LOG_DEBUG, Mutate(), ObjectGuid::ToString(), and UNIT_FLAG_DISABLE_MOVE.

Referenced by npc_argent_captainAI::DoAction(), Spell::EffectSummonType(), npc_argent_captainAI::EnterEvadeMode(), CreatureAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), npc_burning_spirit::npc_burning_spiritAI::EnterEvadeMode(), npc_mrfloppy::npc_mrfloppyAI::EnterEvadeMode(), npc_pet_gen_argent_pony_bridle::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), boss_halazzi::EnterPhase(), npc_singularity::FindAndFollowTarget(), npc_dark_iron_guzzler::FindNextKeg(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), AuraEffect::HandleModPossessPet(), npc_commandscript::HandleNpcFollowCommand(), spell_item_enchanted_broom_periodic::HandlePeriodicTick(), WorldSession::HandlePetActionHelper(), PetAI::HandleReturnMovement(), spell_item_draenic_pale_ale::HandleSummon(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), npc_pet_dk_dancing_rune_weapon::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), npc_burning_spirit::npc_burning_spiritAI::IsSummonedBy(), npc_spirit_shade::npc_spirit_shadeAI::IsSummonedBy(), npc_sunblade_scout::JustEngagedWith(), npc_amanishi_scout::JustEngagedWith(), boss_warlord_kalithresh::JustEngagedWith(), boss_auriaya::boss_auriayaAI::JustSummoned(), npc_frosthound::JustSummoned(), boss_mekgineer_steamrigger::JustSummoned(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_xevozz::boss_xevozzAI::JustSummoned(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::JustSummoned(), boss_vexallus::JustSummoned(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::JustSummoned(), boss_lady_vashj::JustSummoned(), npc_fel_guard_hound::npc_fel_guard_houndAI::MovementInform(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), npc_kernobee::OnQuestAccept(), Unit::PetSpellFail(), npc_jungle_punch_target::npc_jungle_punch_targetAI::proceedCwEvent(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_assembly_lightning::npc_assembly_lightningAI::Reset(), npc_voidtraveler::Reset(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), Unit::SetCharmedBy(), SmartAI::SetFollow(), FollowerAI::SetFollowPaused(), boss_attumen::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), FollowerAI::StartFollow(), Spell::SummonGuardian(), Pet::Update(), SimpleCharmedAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_snowfall_glade_playmate::UpdateAI(), npc_the_biggest_tree::UpdateAI(), npc_high_oracle_soo_roo::UpdateAI(), npc_elder_kekek::UpdateAI(), npc_the_etymidian::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), npc_spark_of_ionar::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_gen_toxic_wasteling::UpdateAI(), FollowerAI::UpdateAI(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::UpdateAI(), npc_xt002_boombot::npc_xt002_boombotAI::UpdateAI(), and Player::UpdateCharmedAI().

◆ MoveForwards()

void MotionMaster::MoveForwards ( Unit target,
float  dist 
)
398{
399 //like movebackwards, but without the inversion
400 if (!target)
401 {
402 return;
403 }
404
405 Position const& pos = target->GetPosition();
406 float angle = target->GetAngle(_owner);
407 G3D::Vector3 point;
408 point.x = pos.m_positionX + dist * cosf(angle);
409 point.y = pos.m_positionY + dist * sinf(angle);
410 point.z = pos.m_positionZ;
411
412 if (!_owner->GetMap()->CanReachPositionAndGetValidCoords(_owner, point.x, point.y, point.z, true, true))
413 {
414 return;
415 }
416
418 init.MoveTo(point.x, point.y, point.z, false);
419 init.SetFacing(target);
420 init.Launch();
421}

References _owner, Map::CanReachPositionAndGetValidCoords(), Position::GetAngle(), WorldObject::GetMap(), Position::GetPosition(), Movement::MoveSplineInit::Launch(), Position::m_positionX, Position::m_positionY, Position::m_positionZ, Movement::MoveSplineInit::MoveTo(), and Movement::MoveSplineInit::SetFacing().

◆ MoveIdle()

void MotionMaster::MoveIdle ( )

Should be preceded by MovementExpired or Clear if there's an overlying movementgenerator active

234{
236 if (empty() || !isStatic(top()))
238}
MovementGenerator * GetIdleMovementGenerator()
Definition MotionMaster.cpp:37

References empty(), GetIdleMovementGenerator(), isStatic(), MOTION_SLOT_IDLE, Mutate(), and top().

Referenced by PetAI::_stopAttack(), npc_nexus_lord::npc_nexus_lordAI::AttackStart(), boss_swamplord_muselek::AttackStart(), ArcherAI::AttackStart(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_twilight_volunteer::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), npc_anubarak_spike::npc_anubarak_spikeAI::DoAction(), npc_power_spark::npc_power_sparkAI::DoAction(), npc_spark_of_ionar::DoAction(), PetAI::DoAttack(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ScriptedAI::DoStartNoMovement(), GuardAI::EnterEvadeMode(), npc_hallows_end_soh::FinishEvent(), CreatureGroup::FormationReset(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), spell_chapter2_persuasive_strike::HandleHit(), spell_item_toxic_wasteling::HandleJump(), WorldSession::HandlePetActionHelper(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_high_botanist_freywinn::JustEngagedWith(), Creature::Motion_Initialize(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::MoveInLineOfSight(), PetAI::MovementInform(), boss_bug_trio::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), boss_four_horsemen::boss_four_horsemenAI::MovementInform(), boss_felmyst::MovementInform(), npc_escortAI::MovementInform(), SmartAI::MovepointReached(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), boss_nefarian::PathEndReached(), SmartAI::PausePath(), NPCStaveQuestAI::PrepareForEncounter(), PretendToDie(), boss_alar::PretendToDie(), SmartScript::ProcessAction(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), boss_felblood_kaelthas::Reset(), boss_archimonde::Reset(), boss_felmyst::ScheduleGroundAbilities(), boss_loken::ScheduleTasks(), Unit::SetCharmedBy(), boss_grand_warlock_nethekurse::SetData(), Unit::setDeathState(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_forest_frog::SpellHit(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), npc_escortAI::Start(), FollowerAI::StartFollow(), SmartAI::StopFollow(), SmartAI::StopPath(), boss_jedoga_shadowseeker::SummonedCreatureDies(), Pet::Update(), boss_headless_horseman::UpdateAI(), boss_onyxia::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), and npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::UpdateAI().

◆ MoveJump() [1/2]

void MotionMaster::MoveJump ( float  x,
float  y,
float  z,
float  speedXY,
float  speedZ,
uint32  id = 0,
Unit const *  target = nullptr 
)

The unit will jump to a specific point.

654{
655 LOG_DEBUG("movement.motionmaster", "Unit ({}) jump to point (X: {} Y: {} Z: {})", _owner->GetGUID().ToString(), x, y, z);
656
657 if (speedXY <= 0.1f)
658 return;
659
660 float moveTimeHalf = speedZ / Movement::gravity;
661 float max_height = -Movement::computeFallElevation(moveTimeHalf, false, -speedZ);
662
664 init.MoveTo(x, y, z);
665 init.SetParabolic(max_height, 0);
666 init.SetVelocity(speedXY);
667 if (target)
668 init.SetFacing(target);
669
671}
double gravity
Definition MovementUtil.cpp:24
float computeFallElevation(float t_passed, bool isSafeFall, float start_velocity=0.0f)
Definition MovementUtil.cpp:60

References _owner, Movement::computeFallElevation(), Object::GetGUID(), Movement::gravity, LOG_DEBUG, MOTION_SLOT_CONTROLLED, Movement::MoveSplineInit::MoveTo(), Mutate(), Movement::MoveSplineInit::SetFacing(), Movement::MoveSplineInit::SetParabolic(), Movement::MoveSplineInit::SetVelocity(), and ObjectGuid::ToString().

◆ MoveJump() [2/2]

◆ MoveJumpTo()

void MotionMaster::MoveJumpTo ( float  angle,
float  speedXY,
float  speedZ 
)

The unit will jump in a specific direction.

637{
638 //this function may make players fall below map
639 if (_owner->IsPlayer())
640 return;
641
642 float x, y, z;
643
644 float moveTimeHalf = speedZ / Movement::gravity;
645 float dist = 2 * moveTimeHalf * speedXY;
646 _owner->GetClosePoint(x, y, z, _owner->GetObjectSize(), dist, angle);
647 MoveJump(x, y, z, speedXY, speedZ);
648}
bool GetClosePoint(float &x, float &y, float &z, float size, float distance2d=0, float angle=0, WorldObject const *forWho=nullptr, bool force=false) const
Definition Object.cpp:2710
float GetObjectSize() const
Definition Object.cpp:2782

References _owner, WorldObject::GetClosePoint(), WorldObject::GetObjectSize(), Movement::gravity, Object::IsPlayer(), and MoveJump().

Referenced by Unit::JumpTo(), and npc_engineer_helice::OnQuestAccept().

◆ MoveKnockbackFrom()

void MotionMaster::MoveKnockbackFrom ( float  srcX,
float  srcY,
float  speedXY,
float  speedZ 
)
608{
609 //this function may make players fall below map
610 if (_owner->IsPlayer())
611 return;
612
613 if (speedXY <= 0.1f)
614 return;
615
616 Position dest = _owner->GetPosition();
617 float moveTimeHalf = speedZ / Movement::gravity;
618 float dist = 2 * moveTimeHalf * speedXY;
619 float max_height = -Movement::computeFallElevation(moveTimeHalf, false, -speedZ);
620
621 // Use a mmap raycast to get a valid destination.
622 _owner->MovePositionToFirstCollision(dest, dist, _owner->GetRelativeAngle(srcX, srcY) + float(M_PI));
623
625 init.MoveTo(dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ());
626 init.SetParabolic(max_height, 0);
627 init.SetOrientationFixed(true);
628 init.SetVelocity(speedXY);
629
631}
void MovePositionToFirstCollision(Position &pos, float dist, float angle)
Definition Object.cpp:2869
float GetRelativeAngle(const Position *pos) const
Definition Position.h:201

References _owner, Movement::computeFallElevation(), Position::GetPosition(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Position::GetRelativeAngle(), Movement::gravity, Object::IsPlayer(), MOTION_SLOT_CONTROLLED, WorldObject::MovePositionToFirstCollision(), Movement::MoveSplineInit::MoveTo(), Mutate(), Movement::MoveSplineInit::SetOrientationFixed(), Movement::MoveSplineInit::SetParabolic(), and Movement::MoveSplineInit::SetVelocity().

Referenced by Unit::KnockbackFrom().

◆ MoveLand() [1/2]

void MotionMaster::MoveLand ( uint32  id,
float  x,
float  y,
float  z,
float  speed = 0.0f 
)

Use to move the unit from the air to the ground. Doesn't work with UNIT_FLAG_DISABLE_MOVE.

568{
569 Position pos = {x, y, z, 0.0f};
570 MoveLand(id, pos, speed);
571}
void MoveLand(uint32 id, Position const &pos, float speed=0.0f)
Use to move the unit from the air to the ground. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:541

References MoveLand().

◆ MoveLand() [2/2]

void MotionMaster::MoveLand ( uint32  id,
Position const &  pos,
float  speed = 0.0f 
)

◆ MovementExpired()

void MotionMaster::MovementExpired ( bool  reset = true)
inline
206 {
208 {
209 if (reset)
211 else
212 _cleanFlag &= ~MMCF_RESET;
214 }
215 else
216 DirectExpire(reset);
217 }
void DirectExpire(bool reset)
Definition MotionMaster.cpp:175
void DelayedExpire()
Definition MotionMaster.cpp:195

References _cleanFlag, DelayedExpire(), DirectExpire(), MMCF_RESET, and MMCF_UPDATE.

Referenced by npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), go_commandscript::DoTeleport(), boss_volkhan::GoToAnvil(), misc_commandscript::HandleAppearCommand(), go_commandscript::HandleGoGraveyardCommand(), go_commandscript::HandleGoGridCommand(), go_commandscript::HandleGoTicketCommand(), go_commandscript::HandleGoZoneXYCommand(), misc_commandscript::HandleGroupSummonCommand(), WorldSession::HandleMoveWorldportAck(), npc_commandscript::HandleNpcUnFollowCommand(), tele_commandscript::HandleTeleCommand(), tele_commandscript::HandleTeleGroupCommand(), Player::LeaveBattleground(), npc_escortAI::MovementInform(), SmartAI::MovepointReached(), SmartAI::PausePath(), PretendToDie(), boss_alar::PretendToDie(), Unit::RemoveCharmedBy(), WorldSession::SendDoFlight(), Unit::SetConfused(), Unit::SetFeared(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), npc_escortAI::Start(), SmartAI::StopPath(), Player::TeleportTo(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::UpdateAI(), npc_pet_gen_toxic_wasteling::UpdateAI(), and UpdateMotion().

◆ MovementExpiredOnSlot()

void MotionMaster::MovementExpiredOnSlot ( MovementSlot  slot,
bool  reset = true 
)
inline
220 {
221 // xinef: cannot be used during motion update!
222 if (!(_cleanFlag & MMCF_UPDATE))
223 DirectExpireSlot(slot, reset);
224 }
void DirectExpireSlot(MovementSlot slot, bool reset)
Definition MotionMaster.cpp:208

References _cleanFlag, DirectExpireSlot(), and MMCF_UPDATE.

Referenced by PetAI::DoAttack(), and Unit::RemoveCharmedBy().

◆ MovePath()

void MotionMaster::MovePath ( uint32  path_id,
ForcedMovement  forcedMovement = FORCED_MOVEMENT_NONE,
PathSource  pathSource = PathSource::WAYPOINT_MGR 
)
508{
509 WaypointPath const* path;
510 switch (pathSource)
511 {
512 default:
514 path = sWaypointMgr->GetPath(path_id);
515 break;
517 path = sSmartWaypointMgr->GetPath(path_id);
518 break;
519 }
520
521 if (path == nullptr)
522 {
523 LOG_ERROR("sql.sql", "WaypointMovementGenerator::LoadPath: creature {} ({}) doesn't have waypoint path id: {} pathSource: {}",
524 _owner->GetName(), _owner->GetGUID().ToString(), path_id, pathSource);
525 return;
526 }
527
529 for (auto& point : *path)
530 {
531 points.push_back(G3D::Vector3(point.second.x, point.second.y, point.second.z));
532 }
533
534 // pass the new PointsArray* to the appropriate MoveSplinePath function
535 MoveSplinePath(&points, forcedMovement);
536}
#define LOG_ERROR(filterType__,...)
Definition Log.h:158
@ SMART_WAYPOINT_MGR
#define sSmartWaypointMgr
Definition SmartScriptMgr.h:2239
#define sWaypointMgr
Definition WaypointMgr.h:79
std::map< uint32, WaypointData > WaypointPath
Definition WaypointMgr.h:48
void MoveSplinePath(Movement::PointsArray *path, ForcedMovement forcedMovement=FORCED_MOVEMENT_NONE)
Definition MotionMaster.cpp:491
std::string const & GetName() const
Definition Object.h:524
std::vector< Vector3 > PointsArray
Definition MoveSplineInitArgs.h:28

References _owner, Object::GetGUID(), WorldObject::GetName(), LOG_ERROR, MoveSplinePath(), SMART_WAYPOINT_MGR, sSmartWaypointMgr, sWaypointMgr, ObjectGuid::ToString(), and WAYPOINT_MGR.

Referenced by boss_alar::ConstructWaypointsAndMove(), npc_batrider::npc_batrider(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::PassengerBoarded(), npc_preparations_for_war_vehicle::PassengerBoarded(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), and npc_batrider::UpdateAI().

◆ MovePoint() [1/2]

void MotionMaster::MovePoint ( uint32  id,
const Position pos,
ForcedMovement  forcedMovement = FORCED_MOVEMENT_NONE,
float  speed = 0.f,
bool  generatePath = true,
bool  forceDestination = true,
std::optional< AnimTier animTier = std::nullopt 
)
inline
239 { MovePoint(id, pos.m_positionX, pos.m_positionY, pos.m_positionZ, forcedMovement, speed, pos.GetOrientation(), generatePath, forceDestination, MOTION_SLOT_ACTIVE, animTier); }
void MovePoint(uint32 id, const Position &pos, ForcedMovement forcedMovement=FORCED_MOVEMENT_NONE, float speed=0.f, bool generatePath=true, bool forceDestination=true, std::optional< AnimTier > animTier=std::nullopt)
Definition MotionMaster.h:238
float GetOrientation() const
Definition Position.h:124

References Position::GetOrientation(), Position::m_positionX, Position::m_positionY, Position::m_positionZ, MOTION_SLOT_ACTIVE, and MovePoint().

Referenced by npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::AttackStart(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::AttackStart(), boss_isalien::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), npc_apothecary_genericAI::DoAction(), npc_chained_spirit::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), npc_icc_spire_frostwyrm::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::DoAction(), npc_ahune_bunny::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), npc_power_spark::npc_power_sparkAI::DoAction(), npc_hover_disk::npc_hover_diskAI::DoAction(), boss_skadi_grauf::boss_skadi_graufAI::DoAction(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::DoAction(), npc_maiev_illidan::DoAction(), npc_akama_shade::DoAction(), boss_nazan::DoAction(), FollowerAI::EnterEvadeMode(), VehicleDespawnEvent::Execute(), OrcMoveEvent::Execute(), UtherBatteredHiltEvent::Execute(), SlaveRunEvent::Execute(), DelayedMovementEvent::Execute(), DaranavanMoveEvent::Execute(), npc_hallows_end_soh::FinishEvent(), boss_nightbane::FlyToClosestPreFlyWayPoint(), boss_volkhan::GoToAnvil(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), spell_apothecary_lingering_fumes::HandleAfterCast(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), misc_commandscript::HandleComeToMeCommand(), spell_q12589_shoot_rjr::HandleDummy(), spell_q11520_discovering_your_roots::HandleDummy(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), PetAI::HandleReturnMovement(), boss_eck::boss_eckAI::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), npc_wintergarde_gryphon::IsSummonedBy(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::IsSummonedBy(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), boss_ayamiss::JustEngagedWith(), boss_alar::JustEngagedWith(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), npc_daphne_stilwell::npc_daphne_stilwellAI::JustSummoned(), npc_hor_lich_king::npc_hor_lich_kingAI::JustSummoned(), boss_ingvar_the_plunderer::JustSummoned(), npc_kalecgos_kj::JustSummoned(), boss_janalai::JustSummoned(), boss_captain_skarloc::JustSummoned(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::JustSummoned(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::JustSummoned(), boss_novos::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_overlord_drakuru_betrayal::JustSummoned(), npc_akama_shade::JustSummoned(), npc_creature_generator_akama::JustSummoned(), boss_lady_vashj::JustSummoned(), npc_rinji::npc_rinjiAI::JustSummoned(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::JustSummoned(), npc_maghar_captive::npc_maghar_captiveAI::JustSummoned(), boss_ayamiss::JustSummoned(), CreatureGroup::LeaderMoveTo(), boss_volkhan::MovementInform(), npc_akama_illidan::MovementInform(), boss_felmyst::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), MovePoint(), npc_cameron::MoveTheChildren(), boss_four_horsemen::boss_four_horsemenAI::MoveToCorner(), npc_concentrated_ball::npc_concentrated_ballAI::MoveToNextPoint(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_omen::npc_omenAI::npc_omenAI(), npc_pos_after_first_boss::npc_pos_after_first_bossAI::npc_pos_after_first_bossAI(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_oculus_drake::npc_oculus_drakeAI::PassengerBoarded(), boss_nightbane::PathEndReached(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::PickNewLocation(), npc_jungle_punch_target::npc_jungle_punch_targetAI::proceedCwEvent(), SmartScript::ProcessAction(), npc_janalai_hatcher::Reset(), npc_zulian_prowler::npc_zulian_prowlerAI::Reset(), boss_jedoga_shadowseeker::Reset(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::Reset(), npc_xt002_boombot::npc_xt002_boombotAI::Reset(), npc_released_offspring_harkoa::npc_released_offspring_harkoaAI::Reset(), boss_lady_vashj::Reset(), SmartAI::ReturnToLastOOCPos(), npc_escortAI::ReturnToLastPoint(), boss_illidan_stormrage::ScheduleAbilities(), boss_felmyst::ScheduleGroundAbilities(), boss_nightbane::ScheduleLand(), Map::ScriptsProcess(), boss_sartharion::boss_sartharionAI::SendLavaWaves(), gunship_npc_AI::SetData(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::SetData(), npc_tirion_fordring_tft::npc_tirion_fordringAI::sGossipSelect(), npc_akama_illidan::sGossipSelect(), npc_akama_shade::sGossipSelect(), npc_varian_wrynn::npc_varian_wrynnAI::SpawnWave(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::SpellHit(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::SpellHit(), npc_saurfang_event::npc_saurfang_eventAI::SpellHit(), npc_forest_frog::SpellHit(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), npc_enslaved_netherwing_drake::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::SpellHit(), npc_wild_wyrm::SpellHit(), boss_quartermaster_zigris::SpellHitTarget(), npc_chesspiece::SpellHitTarget(), npc_pet_gen_fetch_ball::SpellHitTarget(), instance_violet_hold::instance_violet_hold_InstanceMapScript::StartBossEncounter(), npc_stillpine_capitive::npc_stillpine_capitiveAI::StartMoving(), boss_vazruden_the_herald::SummonedCreatureDies(), boss_jedoga_shadowseeker::SummonedCreatureDies(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::SummonNextWave(), npc_escortAI::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), npc_acherus_necromancer::npc_acherus_necromancerAI::UpdateAI(), npc_gothik_the_harvester::npc_gothik_the_harvesterAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_grand_magister_rommath::npc_grand_magister_rommathAI::UpdateAI(), npc_highborne_lamenter::npc_highborne_lamenterAI::UpdateAI(), npc_akilzon_eagle::UpdateAI(), npc_forest_frog::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_snowfall_glade_playmate::UpdateAI(), npc_the_biggest_tree::UpdateAI(), npc_high_oracle_soo_roo::UpdateAI(), npc_elder_kekek::UpdateAI(), npc_the_etymidian::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_onyxia::UpdateAI(), npc_draenei_survivor::npc_draenei_survivorAI::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), boss_jedoga_shadowseeker::UpdateAI(), npc_twilight_volunteer::UpdateAI(), npc_taldaram_flamesphere::UpdateAI(), npc_xerestrasza::npc_xerestraszaAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_pos_after_first_boss::npc_pos_after_first_bossAI::UpdateAI(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::UpdateAI(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::UpdateAI(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), npc_ulduar_emergency_fire_bot::npc_ulduar_emergency_fire_botAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), boss_skadi_grauf::boss_skadi_graufAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_preparations_for_war_vehicle::UpdateAI(), npc_shandy_dalaran::npc_shandy_dalaranAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), npc_wintergarde_gryphon::UpdateAI(), npc_commander_eligor_dawnbringer::npc_commander_eligor_dawnbringerAI::UpdateAI(), npc_venture_co_straggler::npc_venture_co_stragglerAI::UpdateAI(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_fel_guard_hound::npc_fel_guard_houndAI::UpdateAI(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), npc_tooga::npc_toogaAI::UpdateFollowerAI(), npc_jenny::UpdateFollowerAI(), npc_emily::npc_emilyAI::WaypointReached(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ MovePoint() [2/2]

void MotionMaster::MovePoint ( uint32  id,
float  x,
float  y,
float  z,
ForcedMovement  forcedMovement = FORCED_MOVEMENT_NONE,
float  speed = 0.f,
float  orientation = 0.0f,
bool  generatePath = true,
bool  forceDestination = true,
MovementSlot  slot = MOTION_SLOT_ACTIVE,
std::optional< AnimTier animTier = std::nullopt 
)

The unit will move to a specific point. Doesn't work with UNIT_FLAG_DISABLE_MOVE.

For transition movement between the ground and the air, use MoveLand or MoveTakeoff instead.

475{
477 return;
478
479 if (_owner->IsPlayer())
480 {
481 LOG_DEBUG("movement.motionmaster", "Player ({}) targeted point (Id: {} X: {} Y: {} Z: {})", _owner->GetGUID().ToString(), id, x, y, z);
482 Mutate(new PointMovementGenerator<Player>(id, x, y, z, forcedMovement, speed, orientation, nullptr, generatePath, forceDestination, animTier), slot);
483 }
484 else
485 {
486 LOG_DEBUG("movement.motionmaster", "Creature ({}) targeted point (ID: {} X: {} Y: {} Z: {})", _owner->GetGUID().ToString(), id, x, y, z);
487 Mutate(new PointMovementGenerator<Creature>(id, x, y, z, forcedMovement, speed, orientation, nullptr, generatePath, forceDestination, animTier), slot);
488 }
489}

References _owner, Object::GetGUID(), Unit::HasUnitFlag(), Object::IsPlayer(), LOG_DEBUG, Mutate(), ObjectGuid::ToString(), and UNIT_FLAG_DISABLE_MOVE.

◆ MoveRandom()

void MotionMaster::MoveRandom ( float  wanderDistance = 0.0f)

Enable a random movement in desired range around the unit. Doesn't work with UNIT_FLAG_DISABLE_MOVE.

244{
246 return;
247
248 if (_owner->IsCreature())
249 {
250 LOG_DEBUG("movement.motionmaster", "Creature ({}) start moving random", _owner->GetGUID().ToString());
252 }
253}
Definition RandomMovementGenerator.h:33

References _owner, Object::GetGUID(), Unit::HasUnitFlag(), Object::IsCreature(), LOG_DEBUG, MOTION_SLOT_IDLE, Mutate(), ObjectGuid::ToString(), and UNIT_FLAG_DISABLE_MOVE.

Referenced by SACActivateEvent::Execute(), spell_item_enchanted_broom_periodic::HandlePeriodicTick(), boss_ghazan::JustReachedHome(), boss_kelthuzad::boss_kelthuzadAI::JustSummoned(), boss_sartharion::boss_sartharionAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_lady_vashj::JustSummoned(), boss_kaelthas::JustSummoned(), boss_mechano_lord_capacitus::JustSummoned(), boss_ebonroc::boss_ebonrocAI::MovementInform(), npc_collapsing_star::npc_collapsing_starAI::npc_collapsing_starAI(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_ulduar_saronite_vapors::npc_ulduar_saronite_vaporsAI::npc_ulduar_saronite_vaporsAI(), instance_serpent_shrine::instance_serpentshrine_cavern_InstanceMapScript::OnCreatureCreate(), SmartScript::ProcessAction(), npc_brew_bubble::Reset(), npc_infernal_attacker::npc_infernal_attackerAI::Reset(), npc_captured_rageclaw::npc_captured_rageclawAI::SpellHit(), npc_cameron::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::UpdateAI(), and npc_minigob_manabonk::UpdateAI().

◆ MoveRotate()

void MotionMaster::MoveRotate ( uint32  time,
RotateDirection  direction 
)

Rotate the unit. You can specify the time of the rotation.

919{
920 if (!time)
921 return;
922
924}
Definition IdleMovementGenerator.h:34

References MOTION_SLOT_ACTIVE, and Mutate().

◆ MoveSeekAssistance()

void MotionMaster::MoveSeekAssistance ( float  x,
float  y,
float  z 
)
756{
757 // Xinef: do not allow to move with UNIT_FLAG_DISABLE_MOVE
759 return;
760
761 if (_owner->IsPlayer())
762 {
763 LOG_ERROR("movement.motionmaster", "Player ({}) attempt to seek assistance", _owner->GetGUID().ToString());
764 }
765 else
766 {
767 LOG_DEBUG("movement.motionmaster", "Creature ({}) seek assistance (X: {} Y: {} Z: {})", _owner->GetGUID().ToString(), x, y, z);
769 _owner->CastStop(0, false);
772 }
773}
@ REACT_PASSIVE
Definition Unit.h:555
Definition PointMovementGenerator.h:68
void SetReactState(ReactStates state)
A creature can have 3 ReactStates : Agressive, Passive, Neutral.
Definition Creature.h:99
Creature * ToCreature()
Definition Object.h:205
void CastStop(uint32 except_spellid=0, bool withInstant=true)
Interrupt the unit cast for all the current spells.
Definition Unit.cpp:1187
bool AttackStop()
Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell...
Definition Unit.cpp:10607

References _owner, Unit::AttackStop(), Unit::CastStop(), Object::GetGUID(), Unit::HasUnitFlag(), Object::IsPlayer(), LOG_DEBUG, LOG_ERROR, MOTION_SLOT_ACTIVE, Mutate(), REACT_PASSIVE, Creature::SetReactState(), Object::ToCreature(), ObjectGuid::ToString(), and UNIT_FLAG_DISABLE_MOVE.

Referenced by Creature::DoFleeToGetAssistance().

◆ MoveSeekAssistanceDistract()

void MotionMaster::MoveSeekAssistanceDistract ( uint32  timer)
776{
777 // Xinef: do not allow to move with UNIT_FLAG_DISABLE_MOVE
779 return;
780
781 if (_owner->IsPlayer())
782 {
783 LOG_ERROR("movement.motionmaster", "Player ({}) attempt to call distract after assistance", _owner->GetGUID().ToString());
784 }
785 else
786 {
787 LOG_DEBUG("movement.motionmaster", "Creature ({}) is distracted after assistance call (Time: {})", _owner->GetGUID().ToString(), time);
789 }
790}
Definition IdleMovementGenerator.h:65

References _owner, Object::GetGUID(), Unit::HasUnitFlag(), Object::IsPlayer(), LOG_DEBUG, LOG_ERROR, MOTION_SLOT_ACTIVE, Mutate(), ObjectGuid::ToString(), and UNIT_FLAG_DISABLE_MOVE.

Referenced by AssistanceMovementGenerator::Finalize().

◆ MoveSplinePath()

◆ MoveTakeoff() [1/2]

void MotionMaster::MoveTakeoff ( uint32  id,
float  x,
float  y,
float  z,
float  speed = 0.0f,
bool  skipAnimation = false 
)

Use to move the unit from the air to the ground. Doesn't work with UNIT_FLAG_DISABLE_MOVE.

602{
603 Position pos = {x, y, z, 0.0f};
604 MoveTakeoff(id, pos, speed, skipAnimation);
605}
void MoveTakeoff(uint32 id, Position const &pos, float speed=0.0f, bool skipAnimation=false)
Use to move the unit from the ground to the air. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:576

References MoveTakeoff().

◆ MoveTakeoff() [2/2]

void MotionMaster::MoveTakeoff ( uint32  id,
Position const &  pos,
float  speed = 0.0f,
bool  skipAnimation = false 
)

◆ MoveTargetedHome()

void MotionMaster::MoveTargetedHome ( bool  walk = false)

The unit will return this initial position (owner for pets and summoned creatures). Doesn't work with UNIT_FLAG_DISABLE_MOVE.

Parameters
walkThe unit will run by default, but you can set it to walk
261{
262 Clear(false);
263
265 {
266 LOG_DEBUG("movement.motionmaster", "Creature ({}) targeted home", _owner->GetGUID().ToString());
268 }
270 {
272
274 return;
275
276 LOG_DEBUG("movement.motionmaster", "Pet or controlled creature ({}) targeting home", _owner->GetGUID().ToString());
277 Unit* target = _owner->ToCreature()->GetCharmerOrOwner();
278 if (target)
279 {
280 LOG_DEBUG("movement.motionmaster", "Following {} ({})", target->IsPlayer() ? "player" : "creature", target->GetGUID().ToString());
282 }
283 }
284 else
285 {
286 LOG_ERROR("movement.motionmaster", "Player ({}) attempt targeted home", _owner->GetGUID().ToString());
287 }
288}
constexpr float PET_FOLLOW_DIST
Definition PetDefines.h:206
@ UNIT_STATE_EVADE
Definition UnitDefines.h:191
Definition HomeMovementGenerator.h:26
void Clear(bool reset=true)
Definition MotionMaster.h:192
Definition Unit.h:655
void ClearUnitState(uint32 f)
Definition Unit.h:727
Unit * GetCharmerOrOwner() const
Definition Unit.h:1271
virtual float GetFollowAngle() const
Definition Unit.h:1875
ObjectGuid GetCharmerOrOwnerGUID() const
Definition Unit.h:1280

References _owner, Clear(), Unit::ClearUnitState(), Unit::GetCharmerOrOwner(), Unit::GetCharmerOrOwnerGUID(), Unit::GetFollowAngle(), Object::GetGUID(), Unit::HasUnitFlag(), Object::IsCreature(), Object::IsPlayer(), LOG_DEBUG, LOG_ERROR, MOTION_SLOT_ACTIVE, Mutate(), PET_FOLLOW_DIST, Object::ToCreature(), ObjectGuid::ToString(), UNIT_FLAG_DISABLE_MOVE, and UNIT_STATE_EVADE.

Referenced by npc_spark_of_ionar::DoAction(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::EndBattle(), npc_black_morass_summoned_add::EnterEvadeMode(), npc_argent_captainAI::EnterEvadeMode(), CreatureAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), NpcRunToHome::Execute(), wp_commandscript::HandleWpUnLoadCommand(), boss_aeonus::IsSummonedBy(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::MovementInform(), boss_arlokk::boss_arlokkAI::Reset(), boss_kologarn::boss_kologarnAI::Reset(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::SetData(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), npc_shandy_dalaran::npc_shandy_dalaranAI::UpdateAI(), and npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::UpdateAI().

◆ MoveTaxiFlight()

void MotionMaster::MoveTaxiFlight ( uint32  path,
uint32  pathnode 
)
821{
822 if (_owner->IsPlayer())
823 {
824 if (path < sTaxiPathNodesByPath.size())
825 {
826 LOG_DEBUG("movement.motionmaster", "{} taxi to (Path {} node {})", _owner->GetName(), path, pathnode);
828 mgen->LoadPath(_owner->ToPlayer());
830 }
831 else
832 {
833 LOG_ERROR("movement.motionmaster", "{} attempt taxi to (not existed Path {} node {})",
834 _owner->GetName(), path, pathnode);
835 }
836 }
837 else
838 {
839 LOG_ERROR("movement.motionmaster", "Creature ({}) attempt taxi to (Path {} node {})", _owner->GetGUID().ToString(), path, pathnode);
840 }
841}
TaxiPathNodesByPath sTaxiPathNodesByPath
Definition DBCStores.cpp:187
Definition WaypointMovementGenerator.h:107
void LoadPath(Player *player)
Definition WaypointMovementGenerator.cpp:335

References _owner, Object::GetGUID(), WorldObject::GetName(), Object::IsPlayer(), FlightPathMovementGenerator::LoadPath(), LOG_DEBUG, LOG_ERROR, MOTION_SLOT_CONTROLLED, Mutate(), sTaxiPathNodesByPath, Object::ToPlayer(), and ObjectGuid::ToString().

Referenced by WorldSession::SendDoFlight().

◆ MoveWaypoint()

void MotionMaster::MoveWaypoint ( uint32  path_id,
bool  repeatable,
PathSource  pathSource = PathSource::WAYPOINT_MGR 
)

Move the unit following a specific path. Doesn't work with UNIT_FLAG_DISABLE_MOVE.

902{
903 if (!path_id)
904 return;
905
907 return;
908
909 Mutate(new WaypointMovementGenerator<Creature>(path_id, pathSource, repeatable), MOTION_SLOT_IDLE);
910
911 LOG_DEBUG("movement.motionmaster", "{} ({}) start moving over path(Id:{}, repeatable: {})",
912 _owner->IsPlayer() ? "Player" : "Creature", _owner->GetGUID().ToString(), path_id, repeatable ? "YES" : "NO");
913}
Definition WaypointMovementGenerator.h:50

References _owner, Object::GetGUID(), Unit::HasUnitFlag(), Object::IsPlayer(), LOG_DEBUG, MOTION_SLOT_IDLE, Mutate(), ObjectGuid::ToString(), and UNIT_FLAG_DISABLE_MOVE.

Referenced by boss_nightbane::DoAction(), npc_amanishi_lookout::DoAction(), boss_anetheron::DoAction(), boss_azgalor::DoAction(), boss_kazrogal::DoAction(), boss_rage_winterchill::DoAction(), npc_hyjal_ground_trash::DoAction(), npc_hyjal_gargoyle::DoAction(), npc_hyjal_frost_wyrm::DoAction(), boss_ambassador_hellmaw::DoAction(), npc_akama_illidan::DoAction(), boss_ghazan::DoAction(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::HandleExtraEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::HandleExtraEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::HandleExtraEvent(), spell_gen_ayamiss_swarmer_loop::HandleScript(), boss_felmyst::InitializeAI(), boss_lieutenant_drake::InitializeAI(), boss_ambassador_hellmaw::InitializeAI(), boss_gahzranka::IsSummonedBy(), boss_jeklik::JustEngagedWith(), SmartAI::JustReachedHome(), npc_akama_illidan::JustReachedHome(), boss_hadronox::boss_hadronoxAI::JustSummoned(), boss_hydross_the_unstable::JustSummoned(), boss_nalorakk::MoveInLineOfSight(), npc_shattered_hand_scout::MoveInLineOfSight(), npc_harrison_jones::MovementInform(), npc_hyjal_jaina::OnGossipSelect(), npc_akama_illidan::PathEndReached(), boss_the_beast::boss_thebeastAI::Reset(), npc_acherus_necromancer::npc_acherus_necromancerAI::Reset(), npc_gothik_the_harvester::npc_gothik_the_harvesterAI::Reset(), boss_bug_trio::Reset(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::Reset(), boss_the_beast::boss_thebeastAI::SetData(), npc_eastvale_peasent::SetData(), npc_thassarian2::npc_thassarian2AI::sGossipSelect(), npc_akama_illidan::sGossipSelect(), npc_varian_wrynn::npc_varian_wrynnAI::SpawnWave(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), boss_felmyst::StartIntro(), boss_gyth::boss_gythAI::UpdateAI(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_cameron::UpdateAI(), npc_eastvale_peasent::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_grand_magister_rommath::npc_grand_magister_rommathAI::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_lieutenant_drake::UpdateAI(), npc_pos_leader_second::npc_pos_leader_secondAI::UpdateAI(), and npc_wounded_skirmisher::UpdateAI().

◆ Mutate()

void MotionMaster::Mutate ( MovementGenerator m,
MovementSlot  slot 
)
private
869{
870 while (MovementGenerator* curr = Impl[slot])
871 {
872 bool delayed = (_top == slot && (_cleanFlag & MMCF_UPDATE));
873
874 // clear slot AND decrease top immediately to avoid crashes when referencing null top in DirectDelete
875 Impl[slot] = nullptr;
876 while (!empty() && !top())
877 --_top;
878
879 if (delayed)
880 DelayedDelete(curr);
881 else
882 DirectDelete(curr);
883 }
884
885 if (_top < slot)
886 _top = slot;
887
888 Impl[slot] = m;
889 if (_top > slot)
890 _needInit[slot] = true;
891 else
892 {
893 _needInit[slot] = false;
894 m->Initialize(_owner);
895 }
896}

References _cleanFlag, _needInit, _owner, _top, DelayedDelete(), DirectDelete(), empty(), Impl, MovementGenerator::Initialize(), MMCF_UPDATE, and top().

Referenced by InitDefault(), MoveCharge(), MoveChase(), MoveConfused(), MoveDistract(), MoveFall(), MoveFleeing(), MoveFollow(), MoveIdle(), MoveJump(), MoveKnockbackFrom(), MoveLand(), MovePoint(), MoveRandom(), MoveRotate(), MoveSeekAssistance(), MoveSeekAssistanceDistract(), MoveSplinePath(), MoveTakeoff(), MoveTargetedHome(), MoveTaxiFlight(), and MoveWaypoint().

◆ needInitTop()

bool MotionMaster::needInitTop ( ) const
inlineprivate
153 {
154 if (empty())
155 return false;
156 return _needInit[_top];
157 }

References _needInit, _top, and empty().

Referenced by DirectClean(), DirectExpire(), DirectExpireSlot(), and UpdateMotion().

◆ pop()

void MotionMaster::pop ( )
inlineprivate
143 {
144 if (empty())
145 return;
146
147 Impl[_top] = nullptr;
148 while (!empty() && !top())
149 --_top;
150 }

References _top, empty(), Impl, and top().

Referenced by DelayedClean(), DelayedExpire(), DirectClean(), DirectExpire(), Initialize(), and ~MotionMaster().

◆ propagateSpeedChange()

void MotionMaster::propagateSpeedChange ( )
927{
928 /*Impl::container_type::iterator it = Impl::c.begin();
929 for (; it != end(); ++it)
930 {
931 (*it)->unitSpeedChanged();
932 }*/
933 for (int i = 0; i <= _top; ++i)
934 {
935 if (Impl[i])
937 }
938}
virtual void unitSpeedChanged()
Definition MovementGenerator.h:43

References _top, Impl, and MovementGenerator::unitSpeedChanged().

Referenced by Unit::propagateSpeedChange(), and npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI().

◆ ReinitializeMovement()

void MotionMaster::ReinitializeMovement ( )
941{
942 for (int i = 0; i <= _top; ++i)
943 {
944 if (Impl[i])
945 Impl[i]->Reset(_owner);
946 }
947}

References _owner, _top, Impl, and MovementGenerator::Reset().

Referenced by WorldSession::HandleMoveTeleportAck(), and Unit::NearTeleportTo().

◆ size()

int MotionMaster::size ( ) const
inline
174{ return _top + 1; }

References _top.

Referenced by DelayedClean(), DelayedExpire(), DirectClean(), DirectExpire(), and DirectExpireSlot().

◆ top()

◆ UpdateMotion()

void MotionMaster::UpdateMotion ( uint32  diff)
106{
107 if (!_owner)
108 return;
109
110 ASSERT(!empty());
111
113
115 if (!top()->Update(_owner, diff))
116 {
117 _cleanFlag &= ~MMCF_UPDATE;
119 }
120 else
121 _cleanFlag &= ~MMCF_UPDATE;
122
123 if (_expList)
124 {
125 for (std::size_t i = 0; i < _expList->size(); ++i)
126 {
127 MovementGenerator* mg = (*_expList)[i];
128 DirectDelete(mg);
129 }
130
131 delete _expList;
132 _expList = nullptr;
133
134 if (empty())
135 Initialize();
136 else if (needInitTop())
137 InitTop();
138 else if (_cleanFlag & MMCF_RESET)
139 top()->Reset(_owner);
140
141 _cleanFlag &= ~MMCF_RESET;
142 }
143
144 _cleanFlag &= ~MMCF_INUSE;
145}
@ MMCF_INUSE
Definition MotionMaster.h:74
void MovementExpired(bool reset=true)
Definition MotionMaster.h:205

References _cleanFlag, _expList, _owner, ASSERT, DirectDelete(), empty(), Initialize(), InitTop(), MMCF_INUSE, MMCF_RESET, MMCF_UPDATE, MovementExpired(), needInitTop(), MovementGenerator::Reset(), and top().

Referenced by Unit::Update().

Member Data Documentation

◆ _cleanFlag

uint8 MotionMaster::_cleanFlag
private

◆ _expList

ExpireList* MotionMaster::_expList
private

Referenced by DelayedDelete(), and UpdateMotion().

◆ _needInit

bool MotionMaster::_needInit[MAX_MOTION_SLOT]
private

◆ _owner

◆ _top

◆ Impl


The documentation for this class was generated from the following files: