AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
PointMovementGenerator< T > Class Template Reference

#include "PointMovementGenerator.h"

Inheritance diagram for PointMovementGenerator< T >:
MovementGeneratorMedium< T, PointMovementGenerator< T > > MovementGenerator

Public Member Functions

 PointMovementGenerator (uint32 _id, float _x, float _y, float _z, ForcedMovement forcedMovement, float _speed=0.0f, float orientation=0.0f, Movement::PointsArray const *_path=nullptr, bool generatePath=false, bool forceDestination=false, std::optional< AnimTier > animTier=std::nullopt, ObjectGuid chargeTargetGUID=ObjectGuid::Empty, bool reverseOrientation=false)
 
void DoInitialize (T *)
 
void DoFinalize (T *)
 
void DoReset (T *)
 
bool DoUpdate (T *, uint32)
 
void MovementInform (T *)
 
void Pause (uint32 timer=0) override
 
void Resume (uint32 overrideTimer=0) override
 
void unitSpeedChanged () override
 
MovementGeneratorType GetMovementGeneratorType () override
 
bool GetDestination (float &x, float &y, float &z) const
 
- Public Member Functions inherited from MovementGeneratorMedium< T, PointMovementGenerator< T > >
void Initialize (Unit *u) override
 
void Finalize (Unit *u) override
 
void Reset (Unit *u) override
 
bool Update (Unit *u, uint32 time_diff) override
 
- Public Member Functions inherited from MovementGenerator
virtual ~MovementGenerator ()
 
virtual uint32 GetSplineId () const
 
virtual bool GetResetPosition (float &, float &, float &)
 

Private Attributes

uint32 id
 
float i_x
 
float i_y
 
float i_z
 
float speed
 
float i_orientation
 
bool i_recalculateSpeed {}
 
Movement::PointsArray m_precomputedPath
 
bool _generatePath
 
bool _forceDestination
 
bool _reverseOrientation
 
ObjectGuid _chargeTargetGUID
 
ForcedMovement _forcedMovement
 
std::optional< AnimTier > _animTier
 
bool _stalled {}
 
bool _hasBeenStalled {}
 
std::optional< int32 > _pauseTime
 

Detailed Description

template<class T>
class PointMovementGenerator< T >

Constructor & Destructor Documentation

◆ PointMovementGenerator()

template<class T >
PointMovementGenerator< T >::PointMovementGenerator ( uint32  _id,
float  _x,
float  _y,
float  _z,
ForcedMovement  forcedMovement,
float  _speed = 0.0f,
float  orientation = 0.0f,
Movement::PointsArray const *  _path = nullptr,
bool  generatePath = false,
bool  forceDestination = false,
std::optional< AnimTier >  animTier = std::nullopt,
ObjectGuid  chargeTargetGUID = ObjectGuid::Empty,
bool  reverseOrientation = false 
)
inline
33 : id(_id), i_x(_x), i_y(_y), i_z(_z), speed(_speed), i_orientation(orientation), _generatePath(generatePath), _forceDestination(forceDestination), _reverseOrientation(reverseOrientation),
34 _chargeTargetGUID(chargeTargetGUID), _forcedMovement(forcedMovement), _animTier(animTier)
35 {
36 if (_path)
37 m_precomputedPath = *_path;
38 }
std::optional< AnimTier > _animTier
Definition PointMovementGenerator.h:68
ObjectGuid _chargeTargetGUID
Definition PointMovementGenerator.h:66
float i_z
Definition PointMovementGenerator.h:58
ForcedMovement _forcedMovement
Definition PointMovementGenerator.h:67
bool _generatePath
Definition PointMovementGenerator.h:63
float speed
Definition PointMovementGenerator.h:59
float i_orientation
Definition PointMovementGenerator.h:60
Movement::PointsArray m_precomputedPath
Definition PointMovementGenerator.h:62
float i_x
Definition PointMovementGenerator.h:58
bool _forceDestination
Definition PointMovementGenerator.h:64
bool _reverseOrientation
Definition PointMovementGenerator.h:65
uint32 id
Definition PointMovementGenerator.h:57
float i_y
Definition PointMovementGenerator.h:58

References PointMovementGenerator< T >::m_precomputedPath.

Member Function Documentation

◆ DoFinalize()

template<class T >
template void PointMovementGenerator< T >::DoFinalize ( T *  )
258{
259 unit->ClearUnitState(UNIT_STATE_ROAMING | UNIT_STATE_ROAMING_MOVE);
260 if (id == EVENT_CHARGE || id == EVENT_CHARGE_PREPATH)
261 {
262 unit->ClearUnitState(UNIT_STATE_CHARGING);
263
264 if (_chargeTargetGUID && _chargeTargetGUID == unit->GetTarget())
265 {
266 if (Unit* target = ObjectAccessor::GetUnit(*unit, _chargeTargetGUID))
267 {
268 unit->Attack(target, true);
269 }
270 }
271 }
272
273 // Only inform AI if this is a real arrival, not a finalize caused by a Pause/Stop
274 if (unit->movespline->Finalized() && !_hasBeenStalled)
275 MovementInform(unit);
276}
@ EVENT_CHARGE
Definition SharedDefines.h:3560
@ UNIT_STATE_ROAMING_MOVE
Definition UnitDefines.h:195
@ UNIT_STATE_CHARGING
Definition UnitDefines.h:190
@ UNIT_STATE_ROAMING
Definition UnitDefines.h:177
#define EVENT_CHARGE_PREPATH
Definition boss_icecrown_gunship_battle.cpp:108
void MovementInform(T *)
Definition PointMovementGenerator.cpp:316
bool _hasBeenStalled
Definition PointMovementGenerator.h:70
Definition Unit.h:665
Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
Definition ObjectAccessor.cpp:223

References EVENT_CHARGE, EVENT_CHARGE_PREPATH, ObjectAccessor::GetUnit(), UNIT_STATE_CHARGING, UNIT_STATE_ROAMING, and UNIT_STATE_ROAMING_MOVE.

◆ DoInitialize()

template<class T >
template void PointMovementGenerator< T >::DoInitialize ( T *  )
Todo:
: rename this flag to something more appropriate since it is set to true even without speed change now.
31{
32 _stalled = false;
33 _hasBeenStalled = false;
34 _pauseTime.reset();
35
36 if (unit->HasUnitState(UNIT_STATE_NOT_MOVE) || unit->IsMovementPreventedByCasting())
37 {
38 // the next line is to ensure that a new spline is created in DoUpdate() once the unit is no longer rooted/stunned
40 i_recalculateSpeed = true;
41 return;
42 }
43
44 if (!unit->IsStopped())
45 unit->StopMoving();
46
47 unit->AddUnitState(UNIT_STATE_ROAMING | UNIT_STATE_ROAMING_MOVE);
48 if (id == EVENT_CHARGE || id == EVENT_CHARGE_PREPATH)
49 {
50 unit->AddUnitState(UNIT_STATE_CHARGING);
51 }
52
53 i_recalculateSpeed = false;
54 Movement::MoveSplineInit init(unit);
55
57 init.SetOrientationInversed();
58
59 if (m_precomputedPath.size() > 2) // pussywizard: for charge
60 init.MovebyPath(m_precomputedPath);
61 else if (_generatePath)
62 {
63 PathGenerator path(unit);
64 bool result = path.CalculatePath(i_x, i_y, i_z, _forceDestination);
65 if (result && !(path.GetPathType() & PATHFIND_NOPATH) && path.GetPath().size() > 2)
66 {
67 m_precomputedPath = path.GetPath();
68 init.MovebyPath(m_precomputedPath);
69 }
70 else
71 {
72 // Xinef: fix strange client visual bug, moving on z coordinate only switches orientation by 180 degrees (visual only)
73 if (G3D::fuzzyEq(unit->GetPositionX(), i_x) && G3D::fuzzyEq(unit->GetPositionY(), i_y))
74 {
75 i_x += 0.2f * cos(unit->GetOrientation());
76 i_y += 0.2f * std::sin(unit->GetOrientation());
77 }
78
79 init.MoveTo(i_x, i_y, i_z, true);
80 }
81 }
82 else
83 {
84 // Xinef: fix strange client visual bug, moving on z coordinate only switches orientation by 180 degrees (visual only)
85 if (G3D::fuzzyEq(unit->GetPositionX(), i_x) && G3D::fuzzyEq(unit->GetPositionY(), i_y))
86 {
87 i_x += 0.2f * cos(unit->GetOrientation());
88 i_y += 0.2f * std::sin(unit->GetOrientation());
89 }
90
91 init.MoveTo(i_x, i_y, i_z, true);
92 }
93 if (speed > 0.0f)
94 init.SetVelocity(speed);
95
97 init.SetWalk(true);
99 init.SetWalk(false);
100
101 if (i_orientation > 0.0f)
102 {
103 init.SetFacing(i_orientation);
104 }
105
106 if (_animTier)
107 init.SetAnimation(*_animTier);
108
109 init.Launch();
110}
@ FORCED_MOVEMENT_WALK
Definition MotionMaster.h:87
@ FORCED_MOVEMENT_RUN
Definition MotionMaster.h:88
@ PATHFIND_NOPATH
Definition PathGenerator.h:50
@ UNIT_STATE_NOT_MOVE
Definition UnitDefines.h:225
Definition MoveSplineInit.h:63
Definition PathGenerator.h:59
bool i_recalculateSpeed
Definition PointMovementGenerator.h:61
bool _stalled
Definition PointMovementGenerator.h:69
std::optional< int32 > _pauseTime
Definition PointMovementGenerator.h:71

References UNIT_STATE_NOT_MOVE.

◆ DoReset()

template<class T >
template void PointMovementGenerator< T >::DoReset ( T *  )
304{
305 if (!unit->IsStopped())
306 unit->StopMoving();
307
308 unit->AddUnitState(UNIT_STATE_ROAMING | UNIT_STATE_ROAMING_MOVE);
309 if (id == EVENT_CHARGE || id == EVENT_CHARGE_PREPATH)
310 {
311 unit->AddUnitState(UNIT_STATE_CHARGING);
312 }
313}

References EVENT_CHARGE, EVENT_CHARGE_PREPATH, UNIT_STATE_CHARGING, UNIT_STATE_ROAMING, and UNIT_STATE_ROAMING_MOVE.

◆ DoUpdate()

template<class T >
template bool PointMovementGenerator< T >::DoUpdate ( T *  ,
uint32   
)
114{
115 if (!unit)
116 return false;
117
118 if (unit->IsMovementPreventedByCasting())
119 {
120 unit->StopMoving();
121 return true;
122 }
123
124 if (unit->HasUnitState(UNIT_STATE_NOT_MOVE))
125 {
126 if (!unit->HasUnitState(UNIT_STATE_CHARGING))
127 unit->StopMoving();
128 return true;
129 }
130
131 unit->AddUnitState(UNIT_STATE_ROAMING_MOVE);
132
133 if (_pauseTime.has_value())
134 {
135 if (diff >= static_cast<uint32>(_pauseTime.value()))
136 _pauseTime.reset();
137 else
138 {
139 _pauseTime = static_cast<int32>(_pauseTime.value() - diff);
140 return true;
141 }
142
143 _hasBeenStalled = false;
144 _stalled = false;
145 i_recalculateSpeed = true;
146 }
147
148 // Relaunch path when speed changed or when resuming from a stall.
149 // Keep an indefinitely paused movement stalled until Resume() clears _stalled.
151 {
152 i_recalculateSpeed = false;
153 Movement::MoveSplineInit init(unit);
154
156 init.SetOrientationInversed();
157
158 auto rebasePrecomputedPath = [this, unit](std::optional<uint32> offset = std::nullopt)
159 {
160 Movement::PointsArray rebasedPath;
161 G3D::Vector3 currentPos(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ());
162
163 if (m_precomputedPath.empty())
164 return rebasedPath;
165
166 if (offset.has_value())
167 {
168 if (offset.value() >= m_precomputedPath.size())
169 {
170 rebasedPath.push_back(currentPos);
171 rebasedPath.push_back(m_precomputedPath.back());
172 return rebasedPath;
173 }
174
175 rebasedPath.insert(rebasedPath.end(), m_precomputedPath.begin() + offset.value(), m_precomputedPath.end());
176 }
177 else
178 {
179 uint32 closestPointIndex = 0;
180 float closestPointDist = std::numeric_limits<float>::max();
181 for (uint32 pointIndex = 1; pointIndex < m_precomputedPath.size(); ++pointIndex)
182 {
183 float const sqDist = (currentPos - m_precomputedPath[pointIndex]).squaredLength();
184 if (sqDist < closestPointDist)
185 {
186 closestPointDist = sqDist;
187 closestPointIndex = pointIndex;
188 }
189 }
190
191 rebasedPath.insert(rebasedPath.end(), m_precomputedPath.begin() + closestPointIndex, m_precomputedPath.end());
192 }
193
194 // MovebyPath requires the first point to be the mover's current position.
195 rebasedPath.insert(rebasedPath.begin(), currentPos);
196 return rebasedPath;
197 };
198
199 if (m_precomputedPath.size())
200 {
201 if (!unit->movespline->Finalized())
202 {
203 uint32 offset = std::min(uint32(unit->movespline->_currentSplineIdx()), uint32(m_precomputedPath.size()));
204 m_precomputedPath = rebasePrecomputedPath(offset);
205
206 if (m_precomputedPath.size() > 2)
207 init.MovebyPath(m_precomputedPath);
208 else if (m_precomputedPath.size() == 2)
209 init.MoveTo(m_precomputedPath[1].x, m_precomputedPath[1].y, m_precomputedPath[1].z, true);
210 }
211 else
212 {
213 // Unit was stopped (finalized) due to Pause/StopMoving; trim path from current position.
214 m_precomputedPath = rebasePrecomputedPath();
215
216 if (m_precomputedPath.size() > 2)
217 init.MovebyPath(m_precomputedPath);
218 else if (m_precomputedPath.size() == 2)
219 init.MoveTo(m_precomputedPath[1].x, m_precomputedPath[1].y, m_precomputedPath[1].z, true);
220 else
221 init.MoveTo(i_x, i_y, i_z, true);
222 }
223 }
224 else
225 init.MoveTo(i_x, i_y, i_z, true);
226
227 if (speed > 0.0f) // Default value for point motion type is 0.0, if 0.0 spline will use GetSpeed on unit
228 init.SetVelocity(speed);
229
231 init.SetWalk(true);
233 init.SetWalk(false);
234
235 if (_animTier)
236 init.SetAnimation(*_animTier);
237
238 if (i_orientation > 0.0f)
239 init.SetFacing(i_orientation);
240
241 init.Launch();
242 }
243
244 // If finalized but we were stalled (paused) keep generator active so Finalize() won't be called
245 if (unit->movespline->Finalized())
246 {
247 if (_hasBeenStalled)
248 return true;
249
250 return false;
251 }
252
253 return true;
254}
std::int32_t int32
Definition Define.h:103
std::uint32_t uint32
Definition Define.h:107
std::vector< Vector3 > PointsArray
Definition MoveSplineInitArgs.h:28

References EVENT_CHARGE_PREPATH, FORCED_MOVEMENT_RUN, FORCED_MOVEMENT_WALK, Movement::MoveSplineInit::Launch(), Movement::MoveSplineInit::MovebyPath(), Movement::MoveSplineInit::MoveTo(), Movement::MoveSplineInit::SetAnimation(), Movement::MoveSplineInit::SetFacing(), Movement::MoveSplineInit::SetOrientationInversed(), Movement::MoveSplineInit::SetVelocity(), Movement::MoveSplineInit::SetWalk(), UNIT_STATE_CHARGING, UNIT_STATE_NOT_MOVE, and UNIT_STATE_ROAMING_MOVE.

◆ GetDestination()

template<class T >
bool PointMovementGenerator< T >::GetDestination ( float &  x,
float &  y,
float &  z 
) const
inline

◆ GetMovementGeneratorType()

template<class T >
MovementGeneratorType PointMovementGenerator< T >::GetMovementGeneratorType ( )
inlineoverridevirtual

Implements MovementGenerator.

53{ return POINT_MOTION_TYPE; }
@ POINT_MOTION_TYPE
Definition MotionMaster.h:48

References POINT_MOTION_TYPE.

◆ MovementInform()

template<class T >
void PointMovementGenerator< T >::MovementInform ( T *  )
317{
318}

◆ Pause()

template<class T >
template void PointMovementGenerator< T >::Pause ( uint32  timer = 0)
overridevirtual

Reimplemented from MovementGenerator.

280{
281 _stalled = timer ? false : true;
282 _hasBeenStalled = true;
283 if (timer)
284 _pauseTime = static_cast<int32>(timer);
285 else
286 _pauseTime.reset();
287}

◆ Resume()

template<class T >
template void PointMovementGenerator< T >::Resume ( uint32  overrideTimer = 0)
overridevirtual

Reimplemented from MovementGenerator.

291{
292 _hasBeenStalled = false;
293 _stalled = false;
294 if (overrideTimer)
295 _pauseTime = static_cast<int32>(overrideTimer);
296 else
297 _pauseTime.reset();
298
299 i_recalculateSpeed = true;
300}

◆ unitSpeedChanged()

template<class T >
void PointMovementGenerator< T >::unitSpeedChanged ( )
inlineoverridevirtual

Member Data Documentation

◆ _animTier

template<class T >
std::optional<AnimTier> PointMovementGenerator< T >::_animTier
private

◆ _chargeTargetGUID

template<class T >
ObjectGuid PointMovementGenerator< T >::_chargeTargetGUID
private

◆ _forceDestination

template<class T >
bool PointMovementGenerator< T >::_forceDestination
private

◆ _forcedMovement

template<class T >
ForcedMovement PointMovementGenerator< T >::_forcedMovement
private

◆ _generatePath

template<class T >
bool PointMovementGenerator< T >::_generatePath
private

◆ _hasBeenStalled

template<class T >
bool PointMovementGenerator< T >::_hasBeenStalled {}
private
70{};

◆ _pauseTime

template<class T >
std::optional<int32> PointMovementGenerator< T >::_pauseTime
private

◆ _reverseOrientation

template<class T >
bool PointMovementGenerator< T >::_reverseOrientation
private

◆ _stalled

template<class T >
bool PointMovementGenerator< T >::_stalled {}
private
69{};

◆ i_orientation

template<class T >
float PointMovementGenerator< T >::i_orientation
private

◆ i_recalculateSpeed

template<class T >
bool PointMovementGenerator< T >::i_recalculateSpeed {}
private

◆ i_x

template<class T >
float PointMovementGenerator< T >::i_x
private

◆ i_y

template<class T >
float PointMovementGenerator< T >::i_y
private

◆ i_z

template<class T >
float PointMovementGenerator< T >::i_z
private

◆ id

template<class T >
uint32 PointMovementGenerator< T >::id
private

◆ m_precomputedPath

template<class T >
Movement::PointsArray PointMovementGenerator< T >::m_precomputedPath
private

◆ speed

template<class T >
float PointMovementGenerator< T >::speed
private

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