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 (AnimTier 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 (Vector3 const &start, Vector3 const &destination, bool generatePath=true, bool forceDestination=false)
 
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
173 : unit(m)
174 {
177 // mix existing state into new
180 }
MovementFlags
Definition UnitDefines.h:370
@ MOVEMENTFLAG_ONTRANSPORT
Definition UnitDefines.h:381
@ MOVEMENTFLAG_DISABLE_GRAVITY
Definition UnitDefines.h:382
@ MOVEMENTFLAG_CAN_FLY
Definition UnitDefines.h:396
@ MOVEMENTFLAG_WALKING
Definition UnitDefines.h:380
bool flying
Definition MoveSplineFlag.h:121
MoveSplineInitArgs args
Definition MoveSplineInit.h:153
Unit * unit
Definition MoveSplineInit.h:154
T NewId()
Definition MovementTypedefs.h:63
bool HasUnitMovementFlag(uint32 f) const
Definition Unit.h:774
ObjectGuid GetTransGUID() const override
Definition Unit.cpp:14981
MovementInfo m_movementInfo
Definition Object.h:698
UInt32Counter splineIdGen
Definition MovementUtil.cpp:25
bool HasMovementFlag(uint32 flag) const
Definition Object.h:346
bool walk
Definition MoveSplineInitArgs.h:62
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::MoveSplineInitArgs::walk.

Member Function Documentation

◆ DisableTransportPathTransformations()

◆ Launch()

int32 Movement::MoveSplineInit::Launch ( )
36 {
37 MoveSpline& move_spline = *unit->movespline;
38
40 Location real_position;
41 // there is a big chance that current position is unknown if current state is not finalized, need compute it
42 // this also allows CalculatePath spline position and update map position in much greater intervals
43 // Don't compute for transport movement if the unit is in a motion between two transports
44 if (!move_spline.Finalized() && move_spline.onTransport == transport)
45 real_position = move_spline.ComputePosition();
46 else
47 {
48 Position const* pos;
49 if (!transport)
50 pos = unit;
51 else
53
54 real_position.x = pos->GetPositionX();
55 real_position.y = pos->GetPositionY();
56 real_position.z = pos->GetPositionZ();
57 real_position.orientation = unit->GetOrientation();
58 }
59
60 // should i do the things that user should do? - no.
61 if (args.path.empty())
62 return 0;
63
64 // corrent first vertex
65 args.path[0] = real_position;
66 args.initialOrientation = real_position.orientation;
67 move_spline.onTransport = transport;
68
70 moveFlags |= MOVEMENTFLAG_SPLINE_ENABLED;
71
73 {
74 moveFlags = (moveFlags & ~(MOVEMENTFLAG_BACKWARD)) | MOVEMENTFLAG_FORWARD;
75 }
76 else
77 {
78 moveFlags = (moveFlags & ~(MOVEMENTFLAG_FORWARD)) | MOVEMENTFLAG_BACKWARD;
79 }
80
81 bool isOrientationOnly = args.path.size() == 2 && args.path[0] == args.path[1];
82
83 if (moveFlags & MOVEMENTFLAG_ROOT) // This case should essentially never occur - hence the trace logging - hints to issues elsewhere
84 {
85 LOG_TRACE("movement", "Invalid movement during root. Entry: {} IsImmobilized {}, moveflags {}", unit->GetEntry(), unit->IsImmobilizedState() ? "true" : "false", moveFlags);
86 moveFlags &= ~MOVEMENTFLAG_MASK_MOVING;
87 }
88
89 if (isOrientationOnly)
90 moveFlags &= ~MOVEMENTFLAG_MASK_MOVING;
91
92 if (!args.HasVelocity)
93 {
94 // If spline is initialized with SetWalk method it only means we need to select
95 // walk move speed for it but not add walk flag to unit
96 uint32 moveFlagsForSpeed = moveFlags;
97 if (args.walk)
98 moveFlagsForSpeed |= MOVEMENTFLAG_WALKING;
99 else
100 moveFlagsForSpeed &= ~MOVEMENTFLAG_WALKING;
101
102 args.velocity = unit->GetSpeed(SelectSpeedType(moveFlagsForSpeed));
103 }
104
105 // limit the speed in the same way the client does
106 args.velocity = std::min(args.velocity, args.flags.catmullrom || args.flags.flying ? 50.0f : std::max(28.0f, unit->GetSpeed(MOVE_RUN) * 4.0f));
107
108 if (!args.Validate(unit))
109 return 0;
110
112 move_spline.Initialize(args);
113
115 data << unit->GetPackGUID();
116 if (transport)
117 {
118 data.SetOpcode(SMSG_MONSTER_MOVE_TRANSPORT);
119 data << unit->GetTransGUID().WriteAsPacked();
120 data << int8(unit->GetTransSeat());
121 }
122
123 PacketBuilder::WriteMonsterMove(move_spline, data);
124 unit->SendMessageToSet(&data, true);
125
126 return move_spline.Duration();
127 }
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:399
@ MOVEMENTFLAG_FORWARD
Definition UnitDefines.h:372
@ MOVEMENTFLAG_BACKWARD
Definition UnitDefines.h:373
@ MOVEMENTFLAG_ROOT
Definition UnitDefines.h:383
@ MOVE_RUN
Definition UnitDefines.h:357
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:116
uint32 GetEntry() const
Definition Object.h:117
bool IsImmobilizedState() const
Definition Unit.h:785
Movement::MoveSpline * movespline
Definition Unit.h:2114
float GetSpeed(UnitMoveType mtype) const
Definition Unit.cpp:11265
int8 GetTransSeat() const
Definition Object.h:694
virtual void SendMessageToSet(WorldPacket const *data, bool self) const
Definition Object.cpp:2113
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:202
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::MoveSplineInitArgs::walk, 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::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(), FormationMovementGenerator::LaunchMovement(), 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(), and Unit::StopMovingOnCurrentPos().

◆ MovebyPath()

◆ MoveTo() [1/3]

void Movement::MoveSplineInit::MoveTo ( const Vector3 &  destination,
bool  generatePath = false,
bool  forceDestination = false 
)
222 {
223 if (generatePath)
224 {
225 PathGenerator path(unit);
226 bool result = path.CalculatePath(dest.x, dest.y, dest.z, forceDestination);
227 if (result && !(path.GetPathType() & PATHFIND_NOPATH))
228 {
229 MovebyPath(path.GetPath());
230 return;
231 }
232 }
233
235 args.path.resize(2);
236 TransportPathTransform transform(unit, args.TransformForTransport);
237 args.path[1] = transform(dest);
238 }
@ PATHFIND_NOPATH
Definition PathGenerator.h:50
void MovebyPath(const PointsArray &path, int32 pointId=0)
Definition MoveSplineInit.h:168
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.

◆ MoveTo() [2/3]

void Movement::MoveSplineInit::MoveTo ( float  x,
float  y,
float  z,
bool  generatePath = false,
bool  forceDestination = false 
)
inline
176 {
177 MoveTo(G3D::Vector3(x, y, z), generatePath, forceDestination);
178 }
void MoveTo(Vector3 const &start, Vector3 const &destination, bool generatePath=true, bool forceDestination=false)
Definition MoveSplineInit.cpp:202

References MoveTo().

◆ MoveTo() [3/3]

void Movement::MoveSplineInit::MoveTo ( Vector3 const &  start,
Vector3 const &  destination,
bool  generatePath = true,
bool  forceDestination = false 
)
203 {
204 if (generatePath)
205 {
206 PathGenerator path(unit);
207 bool result = path.CalculatePath(start.x, start.y, start.z, dest.x, dest.y, dest.z, forceDestination);
208 if (result && !(path.GetPathType() & PATHFIND_NOPATH))
209 {
210 MovebyPath(path.GetPath());
211 return;
212 }
213 }
214
216 args.path.resize(2);
217 TransportPathTransform transform(unit, args.TransformForTransport);
218 args.path[1] = transform(dest);
219 }

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::DoAction(), EscortMovementGenerator< T >::DoInitialize(), ConfusedMovementGenerator< T >::DoUpdate(), EscortMovementGenerator< T >::DoUpdate(), PointMovementGenerator< T >::DoUpdate(), MoveDelayed::Execute(), FormationMovementGenerator::LaunchMovement(), 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(), and Unit::StopMovingOnCurrentPos().

◆ Path()

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

◆ SetAnimation()

void Movement::MoveSplineInit::SetAnimation ( AnimTier  anim)
inline

◆ SetCyclic()

void Movement::MoveSplineInit::SetCyclic ( )
inline

◆ SetFacing() [1/3]

void Movement::MoveSplineInit::SetFacing ( float  angle)
189 {
191 {
192 if (Unit* vehicle = unit->GetVehicleBase())
193 angle -= vehicle->GetOrientation();
194 else if (Transport* transport = unit->GetTransport())
195 angle -= transport->GetOrientation();
196 }
197
198 args.facing.angle = G3D::wrap(angle, 0.f, (float)G3D::twoPi());
200 }
void EnableFacingAngle()
Definition MoveSplineFlag.h:110
Definition Transport.h:30
Definition Unit.h:664
Unit * GetVehicleBase() const
Definition Unit.cpp:14967
Transport * GetTransport() const
Definition Object.h:688
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(), and Unit::StopMovingOnCurrentPos().

◆ SetFacing() [2/3]

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

◆ SetFacing() [3/3]

void Movement::MoveSplineInit::SetFacing ( Vector3 const &  point)
inline
194 {
195 TransportPathTransform transform(unit, args.TransformForTransport);
196 Vector3 finalSpot = transform(spot);
197 args.facing.f.x = finalSpot.x;
198 args.facing.f.y = finalSpot.y;
199 args.facing.f.z = finalSpot.z;
201 }
void EnableFacingPoint()
Definition MoveSplineFlag.h:109
struct Movement::FacingInfo::@299 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()

◆ 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 ( )
130 {
131 MoveSpline& move_spline = *unit->movespline;
132
133 // No need to stop if we are not moving
134 if (move_spline.Finalized())
135 return;
136
138 Location loc;
139 if (move_spline.onTransport == transport)
140 loc = move_spline.ComputePosition();
141 else
142 {
143 Position const* pos;
144 if (!transport)
145 pos = unit;
146 else
148
149 loc.x = pos->GetPositionX();
150 loc.y = pos->GetPositionY();
151 loc.z = pos->GetPositionZ();
152 loc.orientation = unit->GetOrientation();
153 }
154
157 move_spline.onTransport = transport;
158 move_spline.Initialize(args);
159
161 data << unit->GetPackGUID();
162 if (transport)
163 {
164 data.SetOpcode(SMSG_MONSTER_MOVE_TRANSPORT);
165 data << unit->GetTransGUID().WriteAsPacked();
166 data << int8(unit->GetTransSeat());
167 }
168
170 unit->SendMessageToSet(&data, true);
171 }
@ 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: