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 MoveFormation (Unit *leader, float dist, float angle, uint32 point1, uint32 point2)
 
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
161 : _expList(nullptr), _top(-1), _owner(unit), _cleanFlag(MMCF_NONE)
162 {
163 for (uint8 i = 0; i < MAX_MOTION_SLOT; ++i)
164 {
165 Impl[i] = nullptr;
166 _needInit[i] = true;
167 }
168 }
std::uint8_t uint8
Definition Define.h:109
@ MMCF_NONE
Definition MotionMaster.h:72
@ MAX_MOTION_SLOT
Definition MotionMaster.h:67
int _top
Definition MotionMaster.h:292
Unit * _owner
Definition MotionMaster.h:293
bool _needInit[MAX_MOTION_SLOT]
Definition MotionMaster.h:294
ExpireList * _expList
Definition MotionMaster.h:290
_Ty Impl[MAX_MOTION_SLOT]
Definition MotionMaster.h:291
uint8 _cleanFlag
Definition MotionMaster.h:295

References _needInit, Impl, and MAX_MOTION_SLOT.

◆ ~MotionMaster()

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

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

Member Function Documentation

◆ Clear()

void MotionMaster::Clear ( bool  reset = true)
inline
194 {
196 {
197 if (reset)
199 else
200 _cleanFlag &= ~MMCF_RESET;
201 DelayedClean();
202 }
203 else
204 DirectClean(reset);
205 }
@ MMCF_RESET
Definition MotionMaster.h:74
@ MMCF_UPDATE
Definition MotionMaster.h:73
void DelayedClean()
Definition MotionMaster.cpp:166
void DirectClean(bool reset)
Definition MotionMaster.cpp:148

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::DamageTaken(), boss_hodir::DamageTaken(), npc_ulduar_leviathan_mkii::DamageTaken(), npc_ulduar_aerial_command_unit::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_skadi_grauf::boss_skadi_graufAI::DoAction(), boss_illidan_stormrage::DoAction(), Spell::EffectSummonType(), npc_argent_captainAI::EnterEvadeMode(), CreatureAI::EnterEvadeMode(), npc_pet_dk_ebon_gargoyle::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(), boss_sartharion_dragonAI::HandleExtraEvent(), 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::JustSummoned(), boss_mennu_the_betrayer::JustSummoned(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), npc_aged_dying_ancient_kodo::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::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_hadronox::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::UpdateAI(), npc_spark_of_ionar::UpdateAI(), boss_mimiron::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
167{
168 while (size() > 1)
169 {
170 MovementGenerator* curr = top();
171 pop();
172 if (curr) DelayedDelete(curr);
173 }
174}
int size() const
Definition MotionMaster.h:175
void DelayedDelete(_Ty curr)
Definition MotionMaster.cpp:1014

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

Referenced by Clear().

◆ DelayedDelete()

void MotionMaster::DelayedDelete ( _Ty  curr)
1015{
1016 LOG_DEBUG("movement.motionmaster", "Unit (Entry {}) is trying to delete its updating MG (Type {})!", _owner->GetEntry(), curr->GetMovementGeneratorType());
1017 if (isStatic(curr))
1018 return;
1019 if (!_expList)
1020 _expList = new ExpireList();
1021 _expList->push_back(curr);
1022}
#define LOG_DEBUG(filterType__,...)
Definition Log.h:170
std::vector< _Ty > ExpireList
Definition MotionMaster.h:289
uint32 GetEntry() const
Definition Object.h:117

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

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

◆ DelayedExpire()

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

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

Referenced by MovementExpired().

◆ DirectClean()

void MotionMaster::DirectClean ( bool  reset)
private
149{
150 while (size() > 1)
151 {
152 MovementGenerator* curr = top();
153 pop();
154 if (curr) DirectDelete(curr);
155 }
156
157 if (empty())
158 return;
159
160 if (needInitTop())
161 InitTop();
162 else if (reset)
163 top()->Reset(_owner);
164}
void InitTop()
Definition MotionMaster.cpp:1000
void DirectDelete(_Ty curr)
Definition MotionMaster.cpp:1006
bool needInitTop() const
Definition MotionMaster.h:153
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)
1007{
1008 if (isStatic(curr))
1009 return;
1010 curr->Finalize(_owner);
1011 delete curr;
1012}

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

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

◆ DirectExpire()

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

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

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

Referenced by MovementExpiredOnSlot().

◆ DistanceYourself()

void MotionMaster::DistanceYourself ( float  range)
354{
356 {
357 if (_owner->IsPlayer())
358 {
360 gen->DistanceYourself((Player*)_owner, dist);
361 }
362 else
363 {
365 gen->DistanceYourself((Creature*)_owner, dist);
366 }
367 return;
368 }
369}
@ CHASE_MOTION_TYPE
Definition MotionMaster.h:45
Definition TargetedMovementGenerator.h:38
void DistanceYourself(T *owner, float distance)
Definition TargetedMovementGenerator.cpp:81
Definition Creature.h:47
MovementGeneratorType GetCurrentMovementGeneratorType() const
Definition MotionMaster.cpp:961
bool IsPlayer() const
Definition Object.h:201
Definition Player.h:1084

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

Referenced by SmartAI::DistanceYourself().

◆ empty()

◆ GetCleanFlags()

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

References _cleanFlag.

◆ GetCurrentMovementGeneratorType()

MovementGeneratorType MotionMaster::GetCurrentMovementGeneratorType ( ) const
962{
963 if (empty())
964 return IDLE_MOTION_TYPE;
965
966 return top()->GetMovementGeneratorType();
967}
@ IDLE_MOTION_TYPE
Definition MotionMaster.h:39
virtual MovementGeneratorType GetMovementGeneratorType()=0

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

Referenced by Creature::AtEngage(), DistanceYourself(), GuardAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), boss_volkhan::GoToAnvil(), WorldSession::HandleGossipHelloOpcode(), npc_commandscript::HandleNpcUnFollowCommand(), WorldSession::HandleQuestgiverHelloOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), IsMutualChase(), SmartAI::JustReachedHome(), MoveChase(), SmartAI::MovepointReached(), SplineHandler::operator()(), WorldSession::SendListInventory(), SmartAI::SetCombatMovement(), Unit::SetSpeed(), npc_escortAI::Start(), FollowerAI::StartFollow(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::UpdateAI(), boss_hadronox::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(), boss_flame_leviathan_safety_container::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
993{
994 if (empty())
995 return 0;
996
997 return top()->GetSplineId();
998}
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 
)
1025{
1026 if (_owner->movespline->Finalized())
1027 return false;
1028
1029 G3D::Vector3 const& dest = _owner->movespline->FinalDestination();
1030 x = dest.x;
1031 y = dest.y;
1032 z = dest.z;
1033 return true;
1034}
bool Finalized() const
Definition MoveSpline.h:118
Vector3 FinalDestination() const
Definition MoveSpline.h:122
Movement::MoveSpline * movespline
Definition Unit.h:2114

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

Referenced by misc_commandscript::HandleMovegensCommand().

◆ GetMotionSlot()

_Ty MotionMaster::GetMotionSlot ( int  slot) const
inline
182 {
183 ASSERT(slot >= 0);
184 return Impl[slot];
185 }
#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
978{
979 if (empty() && type == IDLE_MOTION_TYPE)
980 return true;
981
982 for (int i = _top; i >= 0; --i)
983 {
984 if (Impl[i] && Impl[i]->GetMovementGeneratorType() == type)
985 return true;
986 }
987
988 return false;
989}

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

◆ InitDefault()

void MotionMaster::InitDefault ( )
90{
92}
@ MOTION_SLOT_IDLE
Definition MotionMaster.h:64
void Mutate(MovementGenerator *m, MovementSlot slot)
Definition MotionMaster.cpp:880
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
1001{
1002 top()->Initialize(_owner);
1003 _needInit[_top] = false;
1004}
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 
)
372{
373 if (!target)
374 {
375 return;
376 }
377
378 Position const& pos = target->GetPosition();
379 float angle = target->GetAngle(_owner);
380 G3D::Vector3 point;
381 point.x = pos.m_positionX + dist * cosf(angle);
382 point.y = pos.m_positionY + dist * sinf(angle);
383 point.z = pos.m_positionZ;
384
385 if (!_owner->GetMap()->CanReachPositionAndGetValidCoords(_owner, point.x, point.y, point.z, true, true))
386 {
387 return;
388 }
389
391 init.MoveTo(point.x, point.y, point.z, false);
392 init.SetWalk(true);
393 init.SetFacing(target);
394 init.SetOrientationInversed();
395 init.Launch();
396}
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:2907
Definition MoveSplineInit.h:63
Map * GetMap() const
Definition Object.h:625
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.

732{
734 return;
735
736 if (Impl[MOTION_SLOT_CONTROLLED] && Impl[MOTION_SLOT_CONTROLLED]->GetMovementGeneratorType() != DISTRACT_MOTION_TYPE)
737 return;
738
739 if (_owner->IsPlayer())
740 {
741 LOG_DEBUG("movement.motionmaster", "Player ({}) charge point (X: {} Y: {} Z: {})", _owner->GetGUID().ToString(), x, y, z);
742 Mutate(new PointMovementGenerator<Player>(id, x, y, z, FORCED_MOVEMENT_NONE, speed, orientation, path, generatePath, generatePath, std::nullopt, targetGUID), MOTION_SLOT_CONTROLLED);
743 }
744 else
745 {
746 LOG_DEBUG("movement.motionmaster", "Creature ({}) charge point (X: {} Y: {} Z: {})", _owner->GetGUID().ToString(), x, y, z);
747 Mutate(new PointMovementGenerator<Creature>(id, x, y, z, FORCED_MOVEMENT_NONE, speed, orientation, path, generatePath, generatePath, std::nullopt, targetGUID), MOTION_SLOT_CONTROLLED);
748 }
749}
@ MOTION_SLOT_CONTROLLED
Definition MotionMaster.h:66
@ DISTRACT_MOTION_TYPE
Definition MotionMaster.h:50
@ FORCED_MOVEMENT_NONE
Definition MotionMaster.h:86
@ UNIT_FLAG_DISABLE_MOVE
Definition UnitDefines.h:259
std::string ToString() const
Definition ObjectGuid.cpp:47
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:114
Definition PointMovementGenerator.h:28
bool HasUnitFlag(UnitFlags flags) const
Definition Unit.h:747

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::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_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_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::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.

755{
756 G3D::Vector3 dest = path.GetActualEndPosition();
757
758 MoveCharge(dest.x, dest.y, dest.z, speed, EVENT_CHARGE_PREPATH, nullptr, false, 0.0f, targetGUID);
759
760 // Charge movement is not started when using EVENT_CHARGE_PREPATH
762 init.MovebyPath(path.GetPath());
763 init.SetVelocity(speed);
764 init.Launch();
765}
#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:731

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
234{ 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:315
Definition MotionMaster.h:110

References MoveChase().

Referenced by MoveChase().

◆ MoveChase() [2/3]

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

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.

316{
317 // ignore movement request if target not exist
318 if (!target || target == _owner || _owner->HasUnitFlag(UNIT_FLAG_DISABLE_MOVE))
319 return;
320
322 {
323 if (_owner->IsPlayer())
324 {
326 gen->SetOffsetAndAngle(dist, angle);
327 gen->SetNewTarget(target);
328 }
329 else
330 {
332 gen->SetOffsetAndAngle(dist, angle);
333 gen->SetNewTarget(target);
334 }
335 return;
336 }
337
338 //_owner->ClearUnitState(UNIT_STATE_FOLLOW);
339 if (_owner->IsPlayer())
340 {
341 LOG_DEBUG("movement.motionmaster", "Player ({}) chase to {} ({})",
342 _owner->GetGUID().ToString(), target->IsPlayer() ? "player" : "creature", target->GetGUID().ToString());
344 }
345 else
346 {
347 LOG_DEBUG("movement.motionmaster", "Creature ({}) chase to {} ({})",
348 _owner->GetGUID().ToString(), target->IsPlayer() ? "player" : "creature", target->GetGUID().ToString());
350 }
351}
@ MOTION_SLOT_ACTIVE
Definition MotionMaster.h:65
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::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::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::DamageTaken(), PetAI::DoAttack(), ScriptedAI::DoStartMovement(), RestoreAttack::Execute(), boss_kologarn_eyebeam::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::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::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_razorscale::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)
425{
426 if (!target)
427 {
428 return;
429 }
430
431 Position pos;
432 if (!target->GetMeleeAttackPoint(_owner, pos))
433 {
434 return;
435 }
436
438 init.MoveTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), false);
439 init.SetWalk(true);
440 init.SetFacing(target);
441 init.Launch();
442}
bool GetMeleeAttackPoint(Unit *attacker, Position &pos)
Definition Unit.cpp:2828
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.

295{
296 // Xinef: do not allow to move with UNIT_FLAG_DISABLE_MOVE
298 return;
299
300 if (_owner->IsPlayer())
301 {
302 LOG_DEBUG("movement.motionmaster", "Player ({}) move confused", _owner->GetGUID().ToString());
304 }
305 else
306 {
307 LOG_DEBUG("movement.motionmaster", "Creature ({}) move confused", _owner->GetGUID().ToString());
309 }
310}
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).

860{
862 return;
863
865 return;
866
867 /*if (_owner->IsPlayer())
868 {
869 LOG_DEBUG("movement.motionmaster", "Player ({}) distracted (timer: {})", _owner->GetGUID().ToString(), timer);
870 }
871 else
872 {
873 LOG_DEBUG("movement.motionmaster", "Creature ({}) (timer: {})", _owner->GetGUID().ToString(), timer);
874 }*/
875
878}
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.

689{
691 return;
692
693 // use larger distance for vmap height search than in most other cases
695 if (tz <= INVALID_HEIGHT)
696 {
697 LOG_DEBUG("movement.motionmaster", "MotionMaster::MoveFall: unable retrive a proper height at map {} (x: {}, y: {}, z: {}).",
699 return;
700 }
701
702 // Abort too if the ground is very near
703 if (std::fabs(_owner->GetPositionZ() - tz) < 0.1f)
704 return;
705
706 if (_owner->IsPlayer())
707 {
711 }
712 else if (_owner->IsCreature() && addFlagForNPC) // pussywizard
713 {
719 }
720
722 init.MoveTo(_owner->GetPositionX(), _owner->GetPositionY(), tz + _owner->GetHoverHeight());
723 init.SetFall();
724
726}
#define MAX_FALL_DISTANCE
Definition GridTerrainData.h:28
#define INVALID_HEIGHT
Definition GridTerrainData.h:27
@ MOVEMENTFLAG_MASK_MOVING
Definition UnitDefines.h:405
@ MOVEMENTFLAG_FLYING
Definition UnitDefines.h:397
@ MOVEMENTFLAG_CAN_FLY
Definition UnitDefines.h:396
@ MOVEMENTFLAG_FALLING
Definition UnitDefines.h:384
Definition PointMovementGenerator.h:79
uint32 GetId() const
Definition Map.h:230
Player * ToPlayer()
Definition Object.h:202
bool IsCreature() const
Definition Object.h:205
void SetFallInformation(uint32 time, float z)
Definition Player.h:2371
float GetHoverHeight() const
Definition Unit.h:1717
void AddUnitMovementFlag(uint32 f)
Definition Unit.h:772
void SendMovementFlagUpdate(bool self=false)
Definition Unit.cpp:13051
void RemoveUnitMovementFlag(uint32 f)
Definition Unit.h:773
float GetMapHeight(float x, float y, float z, bool vmap=true, float distanceToSearch=50.0f) const
Definition Object.cpp:3086
MovementInfo m_movementInfo
Definition Object.h:698
Seconds GetGameTime()
Definition GameTime.cpp:38
void SetFallTime(uint32 newFallTime)
Definition Object.h:355

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(), npc_ulduar_aerial_command_unit::DoAction(), 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.

808{
809 if (!enemy)
810 return;
811
813 return;
814
815 if (_owner->IsPlayer())
816 {
817 LOG_DEBUG("movement.motionmaster", "Player ({}) flee from {} ({})",
818 _owner->GetGUID().ToString(), enemy->IsPlayer() ? "player" : "creature", enemy->GetGUID().ToString());
820 }
821 else
822 {
823 LOG_DEBUG("movement.motionmaster", "Creature ({}) flee from {} ({}) {}",
824 _owner->GetGUID().ToString(), enemy->IsPlayer() ? "player" : "creature", enemy->GetGUID().ToString(), time ? " for a limited time" : "");
825 if (time)
827 else
829 }
830}
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.

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

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::EnterEvadeMode(), npc_mrfloppy::npc_mrfloppyAI::EnterEvadeMode(), npc_pet_dk_ebon_gargoyle::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::IsSummonedBy(), npc_spirit_shade::npc_spirit_shadeAI::IsSummonedBy(), npc_sunblade_scout::JustEngagedWith(), npc_amanishi_scout::JustEngagedWith(), boss_warlord_kalithresh::JustEngagedWith(), boss_auriaya::JustSummoned(), npc_frosthound::JustSummoned(), boss_mekgineer_steamrigger::JustSummoned(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_xevozz::boss_xevozzAI::JustSummoned(), npc_ulduar_storm_tempered_keeper::JustSummoned(), boss_vexallus::JustSummoned(), boss_lady_vashj::JustSummoned(), npc_fel_guard_hound::npc_fel_guard_houndAI::MovementInform(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), SmartAI::OnCharmed(), npc_kernobee::OnQuestAccept(), Unit::PetSpellFail(), npc_jungle_punch_target::npc_jungle_punch_targetAI::proceedCwEvent(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_assembly_lightning::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::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_hodirs_fury::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_gen_toxic_wasteling::UpdateAI(), FollowerAI::UpdateAI(), npc_xt002_scrapbot::UpdateAI(), npc_xt002_boombot::UpdateAI(), and Player::UpdateCharmedAI().

◆ MoveFormation()

void MotionMaster::MoveFormation ( Unit leader,
float  dist,
float  angle,
uint32  point1,
uint32  point2 
)
471{
472 if (!leader || leader == _owner || _owner->HasUnitFlag(UNIT_FLAG_DISABLE_MOVE))
473 return;
474
475 if (!_owner->IsCreature())
476 return;
477
478 Mutate(new FormationMovementGenerator(leader, dist, angle, point1, point2), MOTION_SLOT_IDLE);
479}
Definition FormationMovementGenerator.h:29

References _owner, Unit::HasUnitFlag(), Object::IsCreature(), MOTION_SLOT_IDLE, Mutate(), and UNIT_FLAG_DISABLE_MOVE.

Referenced by CreatureGroup::LeaderStartedMoving().

◆ MoveForwards()

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

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

235{
237 if (empty() || !isStatic(top()))
239}
MovementGenerator * GetIdleMovementGenerator()
Definition MotionMaster.cpp:38

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

Referenced by PetAI::_stopAttack(), npc_nexus_lord::AttackStart(), boss_swamplord_muselek::AttackStart(), ArcherAI::AttackStart(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::DamageTaken(), npc_power_spark::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::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::MoveInLineOfSight(), PetAI::MovementInform(), boss_bug_trio::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), boss_four_horsemen::boss_four_horsemenAI::MovementInform(), boss_malygos::MovementInform(), boss_felmyst::MovementInform(), npc_escortAI::MovementInform(), SmartAI::MovepointReached(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_hover_disk::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::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::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::UpdateAI(), npc_power_spark::UpdateAI(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_razorscale::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.

666{
667 LOG_DEBUG("movement.motionmaster", "Unit ({}) jump to point (X: {} Y: {} Z: {})", _owner->GetGUID().ToString(), x, y, z);
668
669 if (speedXY <= 0.1f)
670 return;
671
672 float moveTimeHalf = speedZ / Movement::gravity;
673 float max_height = -Movement::computeFallElevation(moveTimeHalf, false, -speedZ);
674
676 init.MoveTo(x, y, z);
677 init.SetParabolic(max_height, 0);
678 init.SetVelocity(speedXY);
679 if (target)
680 init.SetFacing(target);
681
683}
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.

649{
650 //this function may make players fall below map
651 if (_owner->IsPlayer())
652 return;
653
654 float x, y, z;
655
656 float moveTimeHalf = speedZ / Movement::gravity;
657 float dist = 2 * moveTimeHalf * speedXY;
658 _owner->GetClosePoint(x, y, z, _owner->GetObjectSize(), dist, angle);
659 MoveJump(x, y, z, speedXY, speedZ);
660}
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:2766
float GetObjectSize() const
Definition Object.cpp:2838

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 
)
620{
621 //this function may make players fall below map
622 if (_owner->IsPlayer())
623 return;
624
625 if (speedXY <= 0.1f)
626 return;
627
628 Position dest = _owner->GetPosition();
629 float moveTimeHalf = speedZ / Movement::gravity;
630 float dist = 2 * moveTimeHalf * speedXY;
631 float max_height = -Movement::computeFallElevation(moveTimeHalf, false, -speedZ);
632
633 // Use a mmap raycast to get a valid destination.
634 _owner->MovePositionToFirstCollision(dest, dist, _owner->GetRelativeAngle(srcX, srcY) + float(M_PI));
635
637 init.MoveTo(dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ());
638 init.SetParabolic(max_height, 0);
639 init.SetOrientationFixed(true);
640 init.SetVelocity(speedXY);
641
643}
void MovePositionToFirstCollision(Position &pos, float dist, float angle)
Definition Object.cpp:2925
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.

580{
581 Position pos = {x, y, z, 0.0f};
582 MoveLand(id, pos, speed);
583}
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:553

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
207 {
209 {
210 if (reset)
212 else
213 _cleanFlag &= ~MMCF_RESET;
215 }
216 else
217 DirectExpire(reset);
218 }
void DirectExpire(bool reset)
Definition MotionMaster.cpp:176
void DelayedExpire()
Definition MotionMaster.cpp:196

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(), go_commandscript::DoTeleportToTransport(), 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::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
221 {
222 // xinef: cannot be used during motion update!
223 if (!(_cleanFlag & MMCF_UPDATE))
224 DirectExpireSlot(slot, reset);
225 }
void DirectExpireSlot(MovementSlot slot, bool reset)
Definition MotionMaster.cpp:209

References _cleanFlag, DirectExpireSlot(), and MMCF_UPDATE.

Referenced by Unit::AtEngage(), PetAI::DoAttack(), CreatureGroup::FormationReset(), Unit::RemoveCharmedBy(), and CreatureGroup::RemoveFormationMovement().

◆ MovePath()

void MotionMaster::MovePath ( uint32  path_id,
ForcedMovement  forcedMovement = FORCED_MOVEMENT_NONE,
PathSource  pathSource = PathSource::WAYPOINT_MGR 
)
520{
521 WaypointPath const* path;
522 switch (pathSource)
523 {
524 default:
526 path = sWaypointMgr->GetPath(path_id);
527 break;
529 path = sSmartWaypointMgr->GetPath(path_id);
530 break;
531 }
532
533 if (path == nullptr)
534 {
535 LOG_ERROR("sql.sql", "WaypointMovementGenerator::LoadPath: creature {} ({}) doesn't have waypoint path id: {} pathSource: {}",
536 _owner->GetName(), _owner->GetGUID().ToString(), path_id, pathSource);
537 return;
538 }
539
541 for (auto const& node : path->Nodes)
542 {
543 points.push_back(G3D::Vector3(node.X, node.Y, node.Z));
544 }
545
546 // pass the new PointsArray* to the appropriate MoveSplinePath function
547 MoveSplinePath(&points, forcedMovement);
548}
#define LOG_ERROR(filterType__,...)
Definition Log.h:158
@ SMART_WAYPOINT_MGR
#define sSmartWaypointMgr
Definition SmartScriptMgr.h:2263
#define sWaypointMgr
Definition WaypointMgr.h:54
void MoveSplinePath(Movement::PointsArray *path, ForcedMovement forcedMovement=FORCED_MOVEMENT_NONE)
Definition MotionMaster.cpp:503
std::string const & GetName() const
Definition Object.h:528
std::vector< Vector3 > PointsArray
Definition MoveSplineInitArgs.h:28
Definition WaypointDefines.h:60

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

Referenced by boss_alar::ConstructWaypointsAndMove(), boss_skadi_grauf::boss_skadi_graufAI::DoAction(), npc_batrider::npc_batrider(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::PassengerBoarded(), npc_preparations_for_war_vehicle::PassengerBoarded(), boss_razorscale::UpdateAI(), boss_skadi_grauf::boss_skadi_graufAI::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
241 { 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:240
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::DamageTaken(), npc_ulduar_aerial_command_unit::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_hadronox_crusherPackAI::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::DoAction(), npc_brann_bronzebeard_algalon::DoAction(), npc_ahune_bunny::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), npc_power_spark::DoAction(), npc_hover_disk::DoAction(), npc_ulduar_aerial_command_unit::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_sartharion_dragonAI::HandleExtraEvent(), boss_malygos::HandleIntroSpeech(), PetAI::HandleReturnMovement(), boss_eck::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::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(), boss_novos::JustSummoned(), boss_skadi::boss_skadiAI::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(), 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::Reset(), npc_xt002_boombot::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::SendLavaWaves(), gunship_npc_AI::SetData(), npc_ulduar_mimiron_rocket::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::UpdateAI(), boss_majordomo::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(), boss_hadronox::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::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::UpdateAI(), npc_power_spark::UpdateAI(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), boss_algalon_the_observer::UpdateAI(), npc_brann_bronzebeard_algalon::UpdateAI(), boss_stormcaller_brundir::UpdateAI(), boss_flame_leviathan::UpdateAI(), boss_flame_leviathan_safety_container::UpdateAI(), npc_ulduar_emergency_fire_bot::UpdateAI(), npc_ulduar_expedition_engineer::UpdateAI(), boss_ymiron::boss_ymironAI::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.

487{
489 return;
490
491 if (_owner->IsPlayer())
492 {
493 LOG_DEBUG("movement.motionmaster", "Player ({}) targeted point (Id: {} X: {} Y: {} Z: {})", _owner->GetGUID().ToString(), id, x, y, z);
494 Mutate(new PointMovementGenerator<Player>(id, x, y, z, forcedMovement, speed, orientation, nullptr, generatePath, forceDestination, animTier), slot);
495 }
496 else
497 {
498 LOG_DEBUG("movement.motionmaster", "Creature ({}) targeted point (ID: {} X: {} Y: {} Z: {})", _owner->GetGUID().ToString(), id, x, y, z);
499 Mutate(new PointMovementGenerator<Creature>(id, x, y, z, forcedMovement, speed, orientation, nullptr, generatePath, forceDestination, animTier), slot);
500 }
501}

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.

245{
247 return;
248
249 if (_owner->IsCreature())
250 {
251 LOG_DEBUG("movement.motionmaster", "Creature ({}) start moving random", _owner->GetGUID().ToString());
253 }
254}
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::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_lady_vashj::JustSummoned(), boss_kaelthas::JustSummoned(), boss_mechano_lord_capacitus::JustSummoned(), npc_crystalline_frayer::LeaveSeedPod(), boss_ebonroc::MovementInform(), npc_collapsing_star::npc_collapsing_star(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_ulduar_saronite_vapors::npc_ulduar_saronite_vapors(), instance_serpent_shrine::instance_serpentshrine_cavern_InstanceMapScript::OnCreatureCreate(), SmartScript::ProcessAction(), npc_brew_bubble::Reset(), npc_crystalline_frayer::Reset(), npc_infernal_attacker::npc_infernal_attackerAI::Reset(), npc_cameron::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_yoggsaron_death_orb::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.

931{
932 if (!time)
933 return;
934
936}
Definition IdleMovementGenerator.h:34

References MOTION_SLOT_ACTIVE, and Mutate().

◆ MoveSeekAssistance()

void MotionMaster::MoveSeekAssistance ( float  x,
float  y,
float  z 
)
768{
769 // Xinef: do not allow to move with UNIT_FLAG_DISABLE_MOVE
771 return;
772
773 if (_owner->IsPlayer())
774 {
775 LOG_ERROR("movement.motionmaster", "Player ({}) attempt to seek assistance", _owner->GetGUID().ToString());
776 }
777 else
778 {
779 LOG_DEBUG("movement.motionmaster", "Creature ({}) seek assistance (X: {} Y: {} Z: {})", _owner->GetGUID().ToString(), x, y, z);
781 _owner->CastStop(0, false);
784 }
785}
@ REACT_PASSIVE
Definition Unit.h:566
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:206
void CastStop(uint32 except_spellid=0, bool withInstant=true)
Interrupt the unit cast for all the current spells.
Definition Unit.cpp:1343
bool AttackStop()
Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell...
Definition Unit.cpp:7436

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)
788{
789 // Xinef: do not allow to move with UNIT_FLAG_DISABLE_MOVE
791 return;
792
793 if (_owner->IsPlayer())
794 {
795 LOG_ERROR("movement.motionmaster", "Player ({}) attempt to call distract after assistance", _owner->GetGUID().ToString());
796 }
797 else
798 {
799 LOG_DEBUG("movement.motionmaster", "Creature ({}) is distracted after assistance call (Time: {})", _owner->GetGUID().ToString(), time);
801 }
802}
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.

614{
615 Position pos = {x, y, z, 0.0f};
616 MoveTakeoff(id, pos, speed, skipAnimation);
617}
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:588

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
262{
263 Clear(false);
264
266 {
267 LOG_DEBUG("movement.motionmaster", "Creature ({}) targeted home", _owner->GetGUID().ToString());
269 }
271 {
273
275 return;
276
277 LOG_DEBUG("movement.motionmaster", "Pet or controlled creature ({}) targeting home", _owner->GetGUID().ToString());
278 Unit* target = _owner->ToCreature()->GetCharmerOrOwner();
279 if (target)
280 {
281 LOG_DEBUG("movement.motionmaster", "Following {} ({})", target->IsPlayer() ? "player" : "creature", target->GetGUID().ToString());
283 }
284 }
285 else
286 {
287 LOG_ERROR("movement.motionmaster", "Player ({}) attempt targeted home", _owner->GetGUID().ToString());
288 }
289}
constexpr float PET_FOLLOW_DIST
Definition PetDefines.h:206
@ UNIT_STATE_EVADE
Definition UnitDefines.h:194
Definition HomeMovementGenerator.h:26
void Clear(bool reset=true)
Definition MotionMaster.h:193
Definition Unit.h:664
void ClearUnitState(uint32 f)
Definition Unit.h:737
Unit * GetCharmerOrOwner() const
Definition Unit.h:1286
virtual float GetFollowAngle() const
Definition Unit.h:1895
ObjectGuid GetCharmerOrOwnerGUID() const
Definition Unit.h:1295

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::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_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::Reset(), npc_ulduar_expedition_engineer::SetData(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_ulduar_expedition_engineer::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 
)
833{
834 if (_owner->IsPlayer())
835 {
836 if (path < sTaxiPathNodesByPath.size())
837 {
838 LOG_DEBUG("movement.motionmaster", "{} taxi to (Path {} node {})", _owner->GetName(), path, pathnode);
840 mgen->LoadPath(_owner->ToPlayer());
842 }
843 else
844 {
845 LOG_ERROR("movement.motionmaster", "{} attempt taxi to (not existed Path {} node {})",
846 _owner->GetName(), path, pathnode);
847 }
848 }
849 else
850 {
851 LOG_ERROR("movement.motionmaster", "Creature ({}) attempt taxi to (Path {} node {})", _owner->GetGUID().ToString(), path, pathnode);
852 }
853}
TaxiPathNodesByPath sTaxiPathNodesByPath
Definition DBCStores.cpp:187
Definition WaypointMovementGenerator.h:101
void LoadPath(Player *player)
Definition WaypointMovementGenerator.cpp:570

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.

914{
915 if (!path_id)
916 return;
917
919 return;
920
921 Mutate(new WaypointMovementGenerator<Creature>(path_id, repeatable, pathSource), MOTION_SLOT_IDLE);
922
923 LOG_DEBUG("movement.motionmaster", "{} ({}) start moving over path(Id:{}, repeatable: {})",
924 _owner->IsPlayer() ? "Player" : "Creature", _owner->GetGUID().ToString(), path_id, repeatable ? "YES" : "NO");
925}
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(), 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::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::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::SetData(), npc_eastvale_peasent::SetData(), npc_akama_illidan::sGossipSelect(), npc_varian_wrynn::npc_varian_wrynnAI::SpawnWave(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), boss_felmyst::StartIntro(), boss_gyth::UpdateAI(), boss_rend_blackhand::UpdateAI(), boss_victor_nefarius::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
881{
882 bool const delayed = (_cleanFlag & MMCF_UPDATE);
883
884 while (MovementGenerator* curr = Impl[slot])
885 {
886 // clear slot AND decrease top immediately to avoid crashes when referencing null top in DirectDelete
887 Impl[slot] = nullptr;
888 while (!empty() && !top())
889 --_top;
890
891 if (delayed)
892 DelayedDelete(curr);
893 else
894 DirectDelete(curr);
895 }
896
897 if (_top < slot)
898 _top = slot;
899
900 Impl[slot] = m;
901 if (_top > slot)
902 _needInit[slot] = true;
903 else
904 {
905 _needInit[slot] = false;
906 m->Initialize(_owner);
907 }
908}

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(), MoveFormation(), MoveIdle(), MoveJump(), MoveKnockbackFrom(), MoveLand(), MovePoint(), MoveRandom(), MoveRotate(), MoveSeekAssistance(), MoveSeekAssistanceDistract(), MoveSplinePath(), MoveTakeoff(), MoveTargetedHome(), MoveTaxiFlight(), and MoveWaypoint().

◆ needInitTop()

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

References _needInit, _top, and empty().

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

◆ pop()

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

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

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

◆ propagateSpeedChange()

void MotionMaster::propagateSpeedChange ( )
939{
940 /*Impl::container_type::iterator it = Impl::c.begin();
941 for (; it != end(); ++it)
942 {
943 (*it)->unitSpeedChanged();
944 }*/
945 for (int i = 0; i <= _top; ++i)
946 {
947 if (Impl[i])
949 }
950}
virtual void unitSpeedChanged()
Definition MovementGenerator.h:43

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

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

◆ ReinitializeMovement()

void MotionMaster::ReinitializeMovement ( )
953{
954 for (int i = 0; i <= _top; ++i)
955 {
956 if (Impl[i])
957 Impl[i]->Reset(_owner);
958 }
959}

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

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

◆ size()

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

References _top.

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

◆ top()

◆ UpdateMotion()

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

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: