AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
Movement::MoveSplineInit Class Reference

#include "MoveSplineInit.h"

Public Member Functions

 MoveSplineInit (Unit *m)
 
int32 Launch ()
 
void Stop ()
 
void SetParabolic (float amplitude, float start_time)
 
void SetAnimation (AnimType anim)
 
void SetFacing (float angle)
 
void SetFacing (Vector3 const &point)
 
void SetFacing (Unit const *target)
 
void MovebyPath (const PointsArray &path, int32 pointId=0)
 
void MoveTo (const Vector3 &destination, bool generatePath=false, bool forceDestination=false)
 
void MoveTo (float x, float y, float z, bool generatePath=false, bool forceDestination=false)
 
void SetFirstPointId (int32 pointId)
 
void SetSmooth ()
 
void SetFly ()
 
void SetWalk (bool enable)
 
void SetCyclic ()
 
void SetFall ()
 
void SetTransportEnter ()
 
void SetTransportExit ()
 
void SetOrientationInversed ()
 
void SetOrientationFixed (bool enable)
 
void SetVelocity (float velocity)
 
PointsArrayPath ()
 
void DisableTransportPathTransformations ()
 

Protected Attributes

MoveSplineInitArgs args
 
Unitunit
 

Detailed Description

Constructor & Destructor Documentation

◆ MoveSplineInit()

Movement::MoveSplineInit::MoveSplineInit ( Unit m)
explicit
197 : unit(m)
198 {
201 // mix existing state into new
204 }
MovementFlags
Definition UnitDefines.h:367
@ MOVEMENTFLAG_ONTRANSPORT
Definition UnitDefines.h:378
@ MOVEMENTFLAG_DISABLE_GRAVITY
Definition UnitDefines.h:379
@ MOVEMENTFLAG_CAN_FLY
Definition UnitDefines.h:393
@ MOVEMENTFLAG_WALKING
Definition UnitDefines.h:377
bool flying
Definition MoveSplineFlag.h:121
bool walkmode
Definition MoveSplineFlag.h:120
MoveSplineInitArgs args
Definition MoveSplineInit.h:160
Unit * unit
Definition MoveSplineInit.h:161
T NewId()
Definition MovementTypedefs.h:63
bool HasUnitMovementFlag(uint32 f) const
Definition Unit.h:759
ObjectGuid GetTransGUID() const override
Definition Unit.cpp:18787
MovementInfo m_movementInfo
Definition Object.h:693
UInt32Counter splineIdGen
Definition MovementUtil.cpp:25
bool HasMovementFlag(uint32 flag) const
Definition Object.h:346
MoveSplineFlag flags
Definition MoveSplineInitArgs.h:53
uint32 splineId
Definition MoveSplineInitArgs.h:58
bool TransformForTransport
Definition MoveSplineInitArgs.h:61

References args, Movement::MoveSplineInitArgs::flags, Movement::MoveSplineFlag::flying, Unit::GetTransGUID(), MovementInfo::HasMovementFlag(), Unit::HasUnitMovementFlag(), WorldObject::m_movementInfo, MOVEMENTFLAG_CAN_FLY, MOVEMENTFLAG_DISABLE_GRAVITY, MOVEMENTFLAG_ONTRANSPORT, MOVEMENTFLAG_WALKING, Movement::counter< T, limit >::NewId(), Movement::MoveSplineInitArgs::splineId, Movement::splineIdGen, Movement::MoveSplineInitArgs::TransformForTransport, unit, and Movement::MoveSplineFlag::walkmode.

Member Function Documentation

◆ DisableTransportPathTransformations()

◆ Launch()

int32 Movement::MoveSplineInit::Launch ( )
60 {
61 MoveSpline& move_spline = *unit->movespline;
62
64 Location real_position;
65 // there is a big chance that current position is unknown if current state is not finalized, need compute it
66 // this also allows CalculatePath spline position and update map position in much greater intervals
67 // Don't compute for transport movement if the unit is in a motion between two transports
68 if (!move_spline.Finalized() && move_spline.onTransport == transport)
69 real_position = move_spline.ComputePosition();
70 else
71 {
72 Position const* pos;
73 if (!transport)
74 pos = unit;
75 else
77
78 real_position.x = pos->GetPositionX();
79 real_position.y = pos->GetPositionY();
80 real_position.z = pos->GetPositionZ();
81 real_position.orientation = unit->GetOrientation();
82 }
83
84 // should i do the things that user should do? - no.
85 if (args.path.empty())
86 return 0;
87
88 // corrent first vertex
89 args.path[0] = real_position;
90 args.initialOrientation = real_position.orientation;
91 move_spline.onTransport = transport;
92
94 moveFlags |= MOVEMENTFLAG_SPLINE_ENABLED;
95
97 {
98 moveFlags = (moveFlags & ~(MOVEMENTFLAG_BACKWARD)) | MOVEMENTFLAG_FORWARD;
99 }
100 else
101 {
102 moveFlags = (moveFlags & ~(MOVEMENTFLAG_FORWARD)) | MOVEMENTFLAG_BACKWARD;
103 }
104
105 bool isOrientationOnly = args.path.size() == 2 && args.path[0] == args.path[1];
106
107 if (moveFlags & MOVEMENTFLAG_ROOT) // This case should essentially never occur - hence the trace logging - hints to issues elsewhere
108 {
109 LOG_TRACE("movement", "Invalid movement during root. Entry: {} IsImmobilized {}, moveflags {}", unit->GetEntry(), unit->IsImmobilizedState() ? "true" : "false", moveFlags);
110 moveFlags &= ~MOVEMENTFLAG_MASK_MOVING;
111 }
112
113 if (isOrientationOnly)
114 moveFlags &= ~MOVEMENTFLAG_MASK_MOVING;
115
116 if (!args.HasVelocity)
117 {
118 // If spline is initialized with SetWalk method it only means we need to select
119 // walk move speed for it but not add walk flag to unit
120 uint32 moveFlagsForSpeed = moveFlags;
121 if (args.flags.walkmode)
122 moveFlagsForSpeed |= MOVEMENTFLAG_WALKING;
123 else
124 moveFlagsForSpeed &= ~MOVEMENTFLAG_WALKING;
125
126 args.velocity = unit->GetSpeed(SelectSpeedType(moveFlagsForSpeed));
127 }
128
129 // limit the speed in the same way the client does
130 args.velocity = std::min(args.velocity, args.flags.catmullrom || args.flags.flying ? 50.0f : std::max(28.0f, unit->GetSpeed(MOVE_RUN) * 4.0f));
131
132 if (!args.Validate(unit))
133 return 0;
134
136 move_spline.Initialize(args);
137
139 data << unit->GetPackGUID();
140 if (transport)
141 {
142 data.SetOpcode(SMSG_MONSTER_MOVE_TRANSPORT);
143 data << unit->GetTransGUID().WriteAsPacked();
144 data << int8(unit->GetTransSeat());
145 }
146
147 PacketBuilder::WriteMonsterMove(move_spline, data);
148 unit->SendMessageToSet(&data, true);
149
150 return move_spline.Duration();
151 }
std::uint32_t uint32
Definition Define.h:107
std::int8_t int8
Definition Define.h:105
#define LOG_TRACE(filterType__,...)
Definition Log.h:174
@ MOVEMENTFLAG_SPLINE_ENABLED
Definition UnitDefines.h:396
@ MOVEMENTFLAG_FORWARD
Definition UnitDefines.h:369
@ MOVEMENTFLAG_BACKWARD
Definition UnitDefines.h:370
@ MOVEMENTFLAG_ROOT
Definition UnitDefines.h:380
@ MOVE_RUN
Definition UnitDefines.h:354
bool catmullrom
Definition MoveSplineFlag.h:126
bool orientationInversed
Definition MoveSplineFlag.h:135
static void WriteMonsterMove(const MoveSpline &mov, ByteBuffer &data)
Definition MovementPacketBuilder.cpp:142
PackedGuid WriteAsPacked() const
Definition ObjectGuid.h:316
PackedGuid const & GetPackGUID() const
Definition Object.h:115
uint32 GetEntry() const
Definition Object.h:116
bool IsImmobilizedState() const
Definition Unit.h:770
Movement::MoveSpline * movespline
Definition Unit.h:2071
float GetSpeed(UnitMoveType mtype) const
Definition Unit.cpp:14512
int8 GetTransSeat() const
Definition Object.h:689
virtual void SendMessageToSet(WorldPacket const *data, bool self) const
Definition Object.cpp:2090
Definition WorldPacket.h:26
@ SMSG_MONSTER_MOVE
Definition Opcodes.h:251
@ SMSG_MONSTER_MOVE_TRANSPORT
Definition Opcodes.h:716
UnitMoveType SelectSpeedType(uint32 moveFlags)
Definition MoveSplineInit.cpp:30
STL namespace.
Definition zone_shadowmoon_valley.cpp:809
float y
Definition zone_shadowmoon_valley.cpp:810
float z
Definition zone_shadowmoon_valley.cpp:810
float x
Definition zone_shadowmoon_valley.cpp:810
Position pos
Definition Object.h:309
struct MovementInfo::TransportInfo transport
void SetMovementFlags(uint32 flag)
Definition Object.h:343
uint32 GetMovementFlags() const
Definition Object.h:342
bool Validate(Unit *unit) const
============================================================================================
Definition MoveSpline.cpp:201
PointsArray path
Definition MoveSplineInitArgs.h:51
float initialOrientation
Definition MoveSplineInitArgs.h:59
bool HasVelocity
Definition MoveSplineInitArgs.h:60
float velocity
Definition MoveSplineInitArgs.h:55
Definition Position.h:27
float GetPositionZ() const
Definition Position.h:123
float GetOrientation() const
Definition Position.h:124
float GetPositionX() const
Definition Position.h:121
float GetPositionY() const
Definition Position.h:122

References args, Movement::MoveSplineFlag::catmullrom, Movement::MoveSpline::ComputePosition(), Movement::MoveSpline::Duration(), Movement::MoveSpline::Finalized(), Movement::MoveSplineInitArgs::flags, Movement::MoveSplineFlag::flying, Object::GetEntry(), MovementInfo::GetMovementFlags(), Position::GetOrientation(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Unit::GetSpeed(), Unit::GetTransGUID(), WorldObject::GetTransSeat(), Unit::HasUnitMovementFlag(), Movement::MoveSplineInitArgs::HasVelocity, Movement::MoveSpline::Initialize(), Movement::MoveSplineInitArgs::initialOrientation, Unit::IsImmobilizedState(), LOG_TRACE, WorldObject::m_movementInfo, MOVE_RUN, MOVEMENTFLAG_BACKWARD, MOVEMENTFLAG_FORWARD, MOVEMENTFLAG_ONTRANSPORT, MOVEMENTFLAG_ROOT, MOVEMENTFLAG_SPLINE_ENABLED, MOVEMENTFLAG_WALKING, Unit::movespline, Movement::MoveSpline::onTransport, Movement::Location::orientation, Movement::MoveSplineFlag::orientationInversed, Movement::MoveSplineInitArgs::path, MovementInfo::TransportInfo::pos, Movement::SelectSpeedType(), WorldObject::SendMessageToSet(), MovementInfo::SetMovementFlags(), WorldPacket::SetOpcode(), SMSG_MONSTER_MOVE, SMSG_MONSTER_MOVE_TRANSPORT, MovementInfo::transport, unit, Movement::MoveSplineInitArgs::Validate(), Movement::MoveSplineInitArgs::velocity, Movement::MoveSplineFlag::walkmode, ObjectGuid::WriteAsPacked(), and Movement::PacketBuilder::WriteMonsterMove().

Referenced by Unit::_ExitVehicle(), RandomMovementGenerator< T >::_setRandomLocation(), HomeMovementGenerator< Creature >::_setTargetLocation(), Vehicle::AddPassenger(), ChaseMovementGenerator< T >::DispatchSplineToPosition(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DoAction(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), EscortMovementGenerator< T >::DoInitialize(), FlightPathMovementGenerator::DoReset(), ConfusedMovementGenerator< T >::DoUpdate(), EscortMovementGenerator< T >::DoUpdate(), PointMovementGenerator< T >::DoUpdate(), FollowMovementGenerator< T >::DoUpdate(), MoveDelayed::Execute(), EffectMovementGenerator::Initialize(), npc_medivh_bm::JustSummoned(), Unit::MonsterMoveWithSpeed(), MotionMaster::MoveBackwards(), MotionMaster::MoveCharge(), MotionMaster::MoveCircleTarget(), MotionMaster::MoveForwards(), npc_cosmetic_toy_plane::Reset(), Unit::SetFacingTo(), Unit::SetFacingToObject(), FleeingMovementGenerator< T >::SetTargetLocation(), WaypointMovementGenerator< Creature >::StartMove(), Unit::StopMovingOnCurrentPos(), and boss_malygos::boss_malygosAI::UpdateAI().

◆ MovebyPath()

◆ MoveTo() [1/2]

void Movement::MoveSplineInit::MoveTo ( const Vector3 &  destination,
bool  generatePath = false,
bool  forceDestination = false 
)
227 {
228 if (generatePath)
229 {
230 PathGenerator path(unit);
231 bool result = path.CalculatePath(dest.x, dest.y, dest.z, forceDestination);
232 if (result && !(path.GetPathType() & PATHFIND_NOPATH))
233 {
234 MovebyPath(path.GetPath());
235 return;
236 }
237 }
238
240 args.path.resize(2);
241 TransportPathTransform transform(unit, args.TransformForTransport);
242 args.path[1] = transform(dest);
243 }
@ PATHFIND_NOPATH
Definition PathGenerator.h:50
void MovebyPath(const PointsArray &path, int32 pointId=0)
Definition MoveSplineInit.h:175
Definition PathGenerator.h:59

References args, PathGenerator::CalculatePath(), PathGenerator::GetPath(), PathGenerator::GetPathType(), MovebyPath(), Movement::MoveSplineInitArgs::path, Movement::MoveSplineInitArgs::path_Idx_offset, PATHFIND_NOPATH, Movement::MoveSplineInitArgs::TransformForTransport, and unit.

Referenced by Unit::_ExitVehicle(), RandomMovementGenerator< T >::_setRandomLocation(), HomeMovementGenerator< Creature >::_setTargetLocation(), Vehicle::AddPassenger(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), EscortMovementGenerator< T >::DoInitialize(), ConfusedMovementGenerator< T >::DoUpdate(), EscortMovementGenerator< T >::DoUpdate(), PointMovementGenerator< T >::DoUpdate(), MoveDelayed::Execute(), Unit::MonsterMoveWithSpeed(), MotionMaster::MoveBackwards(), MotionMaster::MoveCircleTarget(), MotionMaster::MoveFall(), MotionMaster::MoveForwards(), MotionMaster::MoveJump(), MotionMaster::MoveKnockbackFrom(), MotionMaster::MoveLand(), MotionMaster::MoveTakeoff(), MoveTo(), Unit::SetFacingTo(), Unit::SetFacingToObject(), WaypointMovementGenerator< Creature >::StartMove(), Unit::StopMovingOnCurrentPos(), and boss_malygos::boss_malygosAI::UpdateAI().

◆ MoveTo() [2/2]

void Movement::MoveSplineInit::MoveTo ( float  x,
float  y,
float  z,
bool  generatePath = false,
bool  forceDestination = false 
)
inline
183 {
184 MoveTo(G3D::Vector3(x, y, z), generatePath, forceDestination);
185 }
void MoveTo(const Vector3 &destination, bool generatePath=false, bool forceDestination=false)
Definition MoveSplineInit.cpp:226

References MoveTo().

◆ Path()

PointsArray & Movement::MoveSplineInit::Path ( )
inline

◆ SetAnimation()

void Movement::MoveSplineInit::SetAnimation ( AnimType  anim)
inline
195 {
196 args.time_perc = 0.f;
198 }
std::uint8_t uint8
Definition Define.h:109
void EnableAnimation(uint8 anim)
Definition MoveSplineFlag.h:104
float time_perc
Definition MoveSplineInitArgs.h:57

References args, Movement::MoveSplineFlag::EnableAnimation(), Movement::MoveSplineInitArgs::flags, and Movement::MoveSplineInitArgs::time_perc.

Referenced by MotionMaster::MoveLand(), MotionMaster::MoveTakeoff(), and WaypointMovementGenerator< Creature >::StartMove().

◆ SetCyclic()

void Movement::MoveSplineInit::SetCyclic ( )
inline

◆ SetFacing() [1/3]

void Movement::MoveSplineInit::SetFacing ( float  angle)
213 {
215 {
216 if (Unit* vehicle = unit->GetVehicleBase())
217 angle -= vehicle->GetOrientation();
218 else if (Transport* transport = unit->GetTransport())
219 angle -= transport->GetOrientation();
220 }
221
222 args.facing.angle = G3D::wrap(angle, 0.f, (float)G3D::twoPi());
224 }
void EnableFacingAngle()
Definition MoveSplineFlag.h:110
Definition Transport.h:30
Definition Unit.h:650
Unit * GetVehicleBase() const
Definition Unit.cpp:18773
Transport * GetTransport() const
Definition Object.h:683
FacingInfo facing
Definition MoveSplineInitArgs.h:52
float angle
Definition MoveSplineInitArgs.h:37

References Movement::FacingInfo::angle, args, Movement::MoveSplineFlag::EnableFacingAngle(), Movement::MoveSplineInitArgs::facing, Movement::MoveSplineInitArgs::flags, WorldObject::GetTransport(), Unit::GetVehicleBase(), Movement::MoveSplineInitArgs::TransformForTransport, and unit.

Referenced by Unit::_ExitVehicle(), HomeMovementGenerator< Creature >::_setTargetLocation(), Vehicle::AddPassenger(), ChaseMovementGenerator< T >::DispatchSplineToPosition(), PointMovementGenerator< T >::DoUpdate(), MoveDelayed::Execute(), MotionMaster::MoveBackwards(), MotionMaster::MoveCircleTarget(), MotionMaster::MoveForwards(), MotionMaster::MoveJump(), Unit::SetFacingTo(), Unit::SetFacingToObject(), WaypointMovementGenerator< Creature >::StartMove(), Unit::StopMovingOnCurrentPos(), and boss_malygos::boss_malygosAI::UpdateAI().

◆ SetFacing() [2/3]

void Movement::MoveSplineInit::SetFacing ( Unit const *  target)

◆ SetFacing() [3/3]

void Movement::MoveSplineInit::SetFacing ( Vector3 const &  point)
inline
201 {
202 TransportPathTransform transform(unit, args.TransformForTransport);
203 Vector3 finalSpot = transform(spot);
204 args.facing.f.x = finalSpot.x;
205 args.facing.f.y = finalSpot.y;
206 args.facing.f.z = finalSpot.z;
208 }
void EnableFacingPoint()
Definition MoveSplineFlag.h:109
struct Movement::FacingInfo::@297 f
float z
Definition MoveSplineInitArgs.h:34
float x
Definition MoveSplineInitArgs.h:34
float y
Definition MoveSplineInitArgs.h:34

References args, Movement::MoveSplineFlag::EnableFacingPoint(), Movement::FacingInfo::f, Movement::MoveSplineInitArgs::facing, Movement::MoveSplineInitArgs::flags, Movement::MoveSplineInitArgs::TransformForTransport, unit, Movement::FacingInfo::x, Movement::FacingInfo::y, and Movement::FacingInfo::z.

◆ SetFall()

void Movement::MoveSplineInit::SetFall ( )
inline

◆ SetFirstPointId()

void Movement::MoveSplineInit::SetFirstPointId ( int32  pointId)
inline

◆ SetFly()

void Movement::MoveSplineInit::SetFly ( )
inline

◆ SetOrientationFixed()

void Movement::MoveSplineInit::SetOrientationFixed ( bool  enable)
inline

◆ SetOrientationInversed()

void Movement::MoveSplineInit::SetOrientationInversed ( )
inline

◆ SetParabolic()

void Movement::MoveSplineInit::SetParabolic ( float  amplitude,
float  start_time 
)
inline

◆ SetSmooth()

void Movement::MoveSplineInit::SetSmooth ( )
inline

◆ SetTransportEnter()

void Movement::MoveSplineInit::SetTransportEnter ( )
inline

◆ SetTransportExit()

void Movement::MoveSplineInit::SetTransportExit ( )
inline

◆ SetVelocity()

◆ SetWalk()

◆ Stop()

void Movement::MoveSplineInit::Stop ( )
154 {
155 MoveSpline& move_spline = *unit->movespline;
156
157 // No need to stop if we are not moving
158 if (move_spline.Finalized())
159 return;
160
162 Location loc;
163 if (move_spline.onTransport == transport)
164 loc = move_spline.ComputePosition();
165 else
166 {
167 Position const* pos;
168 if (!transport)
169 pos = unit;
170 else
172
173 loc.x = pos->GetPositionX();
174 loc.y = pos->GetPositionY();
175 loc.z = pos->GetPositionZ();
176 loc.orientation = unit->GetOrientation();
177 }
178
181 move_spline.onTransport = transport;
182 move_spline.Initialize(args);
183
185 data << unit->GetPackGUID();
186 if (transport)
187 {
188 data.SetOpcode(SMSG_MONSTER_MOVE_TRANSPORT);
189 data << unit->GetTransGUID().WriteAsPacked();
190 data << int8(unit->GetTransSeat());
191 }
192
194 unit->SendMessageToSet(&data, true);
195 }
@ Done
Definition MoveSplineFlag.h:39
static void WriteStopMovement(Vector3 const &loc, uint32 splineId, ByteBuffer &data)
Definition MovementPacketBuilder.cpp:91
void RemoveMovementFlag(uint32 flag)
Definition Object.h:345

References args, Movement::MoveSpline::ComputePosition(), Movement::MoveSplineFlag::Done, Movement::MoveSpline::Finalized(), Movement::MoveSplineInitArgs::flags, Position::GetOrientation(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Unit::GetTransGUID(), WorldObject::GetTransSeat(), Unit::HasUnitMovementFlag(), Movement::MoveSpline::Initialize(), WorldObject::m_movementInfo, MOVEMENTFLAG_BACKWARD, MOVEMENTFLAG_FORWARD, MOVEMENTFLAG_ONTRANSPORT, MOVEMENTFLAG_SPLINE_ENABLED, Unit::movespline, Movement::MoveSpline::onTransport, Movement::Location::orientation, MovementInfo::TransportInfo::pos, MovementInfo::RemoveMovementFlag(), WorldObject::SendMessageToSet(), WorldPacket::SetOpcode(), SMSG_MONSTER_MOVE, SMSG_MONSTER_MOVE_TRANSPORT, Movement::MoveSplineInitArgs::splineId, MovementInfo::transport, unit, ObjectGuid::WriteAsPacked(), and Movement::PacketBuilder::WriteStopMovement().

Referenced by Unit::StopMoving().

Member Data Documentation

◆ args

◆ unit

Unit* Movement::MoveSplineInit::unit
protected

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