AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
WaypointMovementGenerator< Creature > Class Reference

#include "WaypointMovementGenerator.h"

Inheritance diagram for WaypointMovementGenerator< Creature >:
MovementGeneratorMedium< Creature, WaypointMovementGenerator< Creature > > PathMovementBase< T, P > MovementGenerator

Public Member Functions

 WaypointMovementGenerator (uint32 _path_id=0, PathSource pathSource=PathSource::WAYPOINT_MGR, bool _repeating=true, bool _stalled=false)
 
 ~WaypointMovementGenerator ()
 
void DoInitialize (Creature *)
 
void DoFinalize (Creature *)
 
void DoReset (Creature *)
 
bool DoUpdate (Creature *, uint32 diff)
 
void Pause (uint32 timer=0)
 
void Resume (uint32 overrideTimer)
 
void MovementInform (Creature *)
 
MovementGeneratorType GetMovementGeneratorType ()
 
void LoadPath (Creature *)
 
- Public Member Functions inherited from MovementGeneratorMedium< Creature, WaypointMovementGenerator< Creature > >
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 void unitSpeedChanged ()
 
virtual bool GetResetPosition (float &, float &, float &)
 
- Public Member Functions inherited from PathMovementBase< T, P >
 PathMovementBase ()
 
 PathMovementBase (P path)
 
virtual ~PathMovementBase ()
 
uint32 GetCurrentNode () const
 

Private Member Functions

void Stop (int32 time)
 
bool Stopped ()
 
bool CanMove (int32 diff)
 
void OnArrived (Creature *)
 
bool StartMove (Creature *)
 
void StartMoveNow (Creature *creature)
 

Private Attributes

TimeTrackerSmall i_nextMoveTime
 
bool m_isArrivalDone
 
uint32 path_id
 
bool repeating
 
bool stalled
 
PathSource i_pathSource
 

Additional Inherited Members

- Protected Attributes inherited from PathMovementBase< T, P >
i_path
 
uint32 i_currentNode
 

Detailed Description

Constructor & Destructor Documentation

◆ WaypointMovementGenerator()

WaypointMovementGenerator< Creature >::WaypointMovementGenerator ( uint32  _path_id = 0,
PathSource  pathSource = PathSource::WAYPOINT_MGR,
bool  _repeating = true,
bool  _stalled = false 
)
inline
58 : PathMovementBase((WaypointPath const*)nullptr), i_nextMoveTime(0), m_isArrivalDone(false), path_id(_path_id), repeating(_repeating), stalled(_stalled), i_pathSource(pathSource) {}
std::map< uint32, WaypointData > WaypointPath
Definition WaypointMgr.h:48
PathMovementBase()
Definition WaypointMovementGenerator.h:38
PathSource i_pathSource
Definition WaypointMovementGenerator.h:99
bool m_isArrivalDone
Definition WaypointMovementGenerator.h:95
bool repeating
Definition WaypointMovementGenerator.h:97
TimeTrackerSmall i_nextMoveTime
Definition WaypointMovementGenerator.h:94
uint32 path_id
Definition WaypointMovementGenerator.h:96
bool stalled
Definition WaypointMovementGenerator.h:98

◆ ~WaypointMovementGenerator()

59{ i_path = nullptr; }
P i_path
Definition WaypointMovementGenerator.h:45

Member Function Documentation

◆ CanMove()

bool WaypointMovementGenerator< Creature >::CanMove ( int32  diff)
inlineprivate
80 {
82 return i_nextMoveTime.Passed();
83 }
void Update(int32 diff)
Definition Timer.h:239
bool Passed() const
Definition Timer.h:244

◆ DoFinalize()

void WaypointMovementGenerator< Creature >::DoFinalize ( Creature creature)
72{
74}
@ UNIT_STATE_ROAMING_MOVE
Definition UnitDefines.h:192
@ UNIT_STATE_ROAMING
Definition UnitDefines.h:174
void ClearUnitState(uint32 f)
Definition Unit.h:722

References Unit::ClearUnitState(), UNIT_STATE_ROAMING, and UNIT_STATE_ROAMING_MOVE.

◆ DoInitialize()

void WaypointMovementGenerator< Creature >::DoInitialize ( Creature creature)
66{
67 LoadPath(creature);
69}
void AddUnitState(uint32 f)
Definition Unit.h:720
void LoadPath(Creature *)
Definition WaypointMovementGenerator.cpp:33

References Unit::AddUnitState(), UNIT_STATE_ROAMING, and UNIT_STATE_ROAMING_MOVE.

◆ DoReset()

void WaypointMovementGenerator< Creature >::DoReset ( Creature creature)
77{
78 if (stalled)
79 {
80 return;
81 }
83 StartMoveNow(creature);
84}
void StartMoveNow(Creature *creature)
Definition WaypointMovementGenerator.h:88

References Unit::AddUnitState(), UNIT_STATE_ROAMING, and UNIT_STATE_ROAMING_MOVE.

◆ DoUpdate()

bool WaypointMovementGenerator< Creature >::DoUpdate ( Creature creature,
uint32  diff 
)
232{
233 // Waypoint movement can be switched on/off
234 // This is quite handy for escort quests and other stuff
235 if (stalled)
236 {
237 Stop(1000);
238 return true;
239 }
241 {
242 creature->StopMoving();
243 Stop(1000);
244 return true;
245 }
246
247 // prevent a crash at empty waypoint path.
248 if (!i_path || i_path->empty())
249 return false;
250
251 // Xinef: Dont allow dead creatures to move
252 if (!creature->IsAlive())
253 return false;
254
255 if (Stopped())
256 {
257 if (CanMove(diff))
258 return StartMove(creature);
259 }
260 else
261 {
262 if (creature->movespline->Finalized())
263 {
264 OnArrived(creature);
265 return StartMove(creature);
266 }
267 }
268 return true;
269}
@ UNIT_STATE_NOT_MOVE
Definition UnitDefines.h:222
bool IsMovementPreventedByCasting() const override
Definition Creature.cpp:3532
bool Finalized() const
Definition MoveSpline.h:116
Movement::MoveSpline * movespline
Definition Unit.h:2071
bool IsAlive() const
Definition Unit.h:1748
void StopMoving()
Definition Unit.cpp:16660
bool HasUnitState(const uint32 f) const
Definition Unit.h:721
bool Stopped()
Definition WaypointMovementGenerator.h:77
void OnArrived(Creature *)
Definition WaypointMovementGenerator.cpp:86
void Stop(int32 time)
Definition WaypointMovementGenerator.h:75
bool CanMove(int32 diff)
Definition WaypointMovementGenerator.h:79
bool StartMove(Creature *)
Definition WaypointMovementGenerator.cpp:117

References Movement::MoveSpline::Finalized(), Unit::HasUnitState(), Unit::IsAlive(), Creature::IsMovementPreventedByCasting(), Unit::movespline, Unit::StopMoving(), and UNIT_STATE_NOT_MOVE.

◆ GetMovementGeneratorType()

MovementGeneratorType WaypointMovementGenerator< Creature >::GetMovementGeneratorType ( )
inlinevirtual

Implements MovementGenerator.

69{ return WAYPOINT_MOTION_TYPE; }
@ WAYPOINT_MOTION_TYPE
Definition MotionMaster.h:41

References WAYPOINT_MOTION_TYPE.

◆ LoadPath()

void WaypointMovementGenerator< Creature >::LoadPath ( Creature creature)
34{
35 switch (i_pathSource)
36 {
38 {
39 if (!path_id)
40 path_id = creature->GetWaypointPath();
41
42 i_path = sWaypointMgr->GetPath(path_id);
43 break;
44 }
46 {
48 break;
49 }
50 }
51
52 if (!i_path)
53 {
54 // No movement found for entry
55 LOG_ERROR("sql.sql", "WaypointMovementGenerator::LoadPath: creature {} ({}) doesn't have waypoint path id: {}",
56 creature->GetName(), creature->GetGUID().ToString(), path_id);
57 return;
58 }
59
60 i_currentNode = i_path->begin()->first;
61
62 StartMoveNow(creature);
63}
#define LOG_ERROR(filterType__,...)
Definition Log.h:158
@ SMART_WAYPOINT_MGR
#define sSmartWaypointMgr
Definition SmartScriptMgr.h:2232
#define sWaypointMgr
Definition WaypointMgr.h:79
uint32 GetWaypointPath() const
Definition Creature.h:349
std::string ToString() const
Definition ObjectGuid.cpp:47
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:113
uint32 i_currentNode
Definition WaypointMovementGenerator.h:46
std::string const & GetName() const
Definition Object.h:525

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

◆ MovementInform()

void WaypointMovementGenerator< Creature >::MovementInform ( Creature creature)
272{
273 if (creature->AI())
275
276 if (Unit* owner = creature->GetCharmerOrOwner())
277 {
278 if (UnitAI* AI = owner->GetAI())
279 {
280 AI->SummonMovementInform(creature, WAYPOINT_MOTION_TYPE, i_currentNode);
281 }
282 }
283 else
284 {
285 if (TempSummon* tempSummon = creature->ToTempSummon())
286 {
287 if (Unit* owner = tempSummon->GetSummonerUnit())
288 {
289 if (UnitAI* AI = owner->GetAI())
290 {
291 AI->SummonMovementInform(creature, WAYPOINT_MOTION_TYPE, i_currentNode);
292 }
293 }
294 }
295 }
296}
virtual void MovementInform(uint32, uint32)
Definition CreatureAI.h:161
CreatureAI * AI() const
Definition Creature.h:145
Definition TemporarySummon.h:40
Definition UnitAI.h:198
Definition Unit.h:650
TempSummon * ToTempSummon()
Definition Unit.h:716
Unit * GetCharmerOrOwner() const
Definition Unit.h:1253

References Creature::AI(), Unit::GetCharmerOrOwner(), CreatureAI::MovementInform(), Unit::ToTempSummon(), and WAYPOINT_MOTION_TYPE.

◆ OnArrived()

void WaypointMovementGenerator< Creature >::OnArrived ( Creature creature)
private
87{
88 if (!i_path || i_path->empty())
89 return;
91 return;
92
94 m_isArrivalDone = true;
95
96 auto currentNodeItr = i_path->find(i_currentNode);
97
98 if (currentNodeItr->second.event_id && urand(0, 99) < currentNodeItr->second.event_chance)
99 {
100 LOG_DEBUG("maps.script", "Creature movement start script {} at point {} for {}.",
101 currentNodeItr->second.event_id, i_currentNode, creature->GetGUID().ToString());
103 creature->GetMap()->ScriptsStart(sWaypointScripts, currentNodeItr->second.event_id, creature, nullptr);
104 }
105
106 // Inform script
107 MovementInform(creature);
109
110 if (currentNodeItr->second.delay)
111 {
113 Stop(currentNodeItr->second.delay);
114 }
115}
#define LOG_DEBUG(filterType__,...)
Definition Log.h:170
ScriptMapMap sWaypointScripts
Definition ObjectMgr.cpp:61
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:44
void UpdateWaypointID(uint32 wpID)
Definition Creature.h:353
void ScriptsStart(std::map< uint32, std::multimap< uint32, ScriptInfo > > const &scripts, uint32 id, Object *source, Object *target)
Put scripts in the execution queue.
Definition MapScripts.cpp:31
void MovementInform(Creature *)
Definition WaypointMovementGenerator.cpp:271
Map * GetMap() const
Definition Object.h:621

References Unit::ClearUnitState(), Object::GetGUID(), WorldObject::GetMap(), LOG_DEBUG, Map::ScriptsStart(), sWaypointScripts, ObjectGuid::ToString(), UNIT_STATE_ROAMING_MOVE, Creature::UpdateWaypointID(), and urand().

◆ Pause()

void WaypointMovementGenerator< Creature >::Pause ( uint32  timer = 0)
virtual

Reimplemented from MovementGenerator.

299{
300 if (timer)
301 i_nextMoveTime.Reset(timer);
302 else
303 {
304 // No timer? Will be paused forever until ::Resume is called
305 stalled = true;
307 }
308}
void Reset(int32 interval)
Definition Timer.h:249

◆ Resume()

void WaypointMovementGenerator< Creature >::Resume ( uint32  overrideTimer)
virtual

Reimplemented from MovementGenerator.

311{
312 stalled = false;
313}

◆ StartMove()

bool WaypointMovementGenerator< Creature >::StartMove ( Creature creature)
private

If creature is on transport, we assume waypoints set in DB are already transport offsets

Do not use formationDest here, MoveTo requires transport offsets due to DisableTransportPathTransformations() call but formationDest contains global coordinates

118{
119 if (!i_path || i_path->empty())
120 return false;
121
122 // Xinef: Dont allow dead creatures to move
123 if (!creature->IsAlive())
124 return false;
125
126 if (Stopped())
127 return true;
128
129 bool transportPath = creature->HasUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT) && creature->GetTransGUID();
130
131 if (m_isArrivalDone)
132 {
133 {
134 auto currentNodeItr = i_path->find(i_currentNode);
135 float x = currentNodeItr->second.x;
136 float y = currentNodeItr->second.y;
137 float z = currentNodeItr->second.z;
138 float o = creature->GetOrientation();
139
140 if (!transportPath)
141 creature->SetHomePosition(x, y, z, o);
142 else
143 {
144 if (Transport* trans = (creature->GetTransport() ? creature->GetTransport()->ToMotionTransport() : nullptr))
145 {
146 o -= trans->GetOrientation();
147 creature->SetTransportHomePosition(x, y, z, o);
148 trans->CalculatePassengerPosition(x, y, z, &o);
149 creature->SetHomePosition(x, y, z, o);
150 }
151 else
152 transportPath = false;
153 // else if (vehicle) - this should never happen, vehicle offsets are const
154 }
155 }
156
157 // Xinef: moved the upper IF here
158 uint32 lastPoint = i_path->rbegin()->first;
159 if ((i_currentNode == lastPoint) && !repeating) // If that's our last waypoint
160 {
161 creature->AI()->PathEndReached(path_id);
162 creature->GetMotionMaster()->Initialize();
163 return false;
164 }
165
167 if (lastPoint < i_currentNode)
168 i_currentNode = i_path->begin()->first;
169 }
170
171 // xinef: do not initialize motion if we got stunned in movementinform
173 {
174 return true;
175 }
176
177 auto currentNodeItr = i_path->find(i_currentNode);
178 WaypointData const& node = currentNodeItr->second;
179
180 m_isArrivalDone = false;
181
183
184 Movement::Location formationDest(node.x, node.y, node.z, 0.0f);
185 Movement::MoveSplineInit init(creature);
186
188 if (transportPath)
189 {
190 init.DisableTransportPathTransformations();
191 if (TransportBase* trans = creature->GetDirectTransport())
192 trans->CalculatePassengerPosition(formationDest.x, formationDest.y, formationDest.z, &formationDest.orientation);
193 }
194
195 float z = node.z;
196 creature->UpdateAllowedPositionZ(node.x, node.y, z);
199 init.MoveTo(node.x, node.y, z, true, true);
200
201 if (node.orientation.has_value() && node.delay > 0)
202 init.SetFacing(*node.orientation);
203
204 switch (node.move_type)
205 {
207 init.SetAnimation(Movement::ToGround);
208 break;
210 init.SetAnimation(Movement::ToFly);
211 break;
213 init.SetWalk(false);
214 break;
216 init.SetWalk(true);
217 break;
218 default:
219 break;
220 }
221
222 init.Launch();
223
224 //Call for creature group update
225 if (creature->GetFormation() && creature->GetFormation()->GetLeader() == creature)
226 creature->GetFormation()->LeaderMoveTo(formationDest.x, formationDest.y, formationDest.z, node.move_type);
227
228 return true;
229}
std::uint32_t uint32
Definition Define.h:107
@ MOVEMENTFLAG_ONTRANSPORT
Definition UnitDefines.h:378
@ WAYPOINT_MOVE_TYPE_RUN
Definition WaypointMgr.h:30
@ WAYPOINT_MOVE_TYPE_LAND
Definition WaypointMgr.h:31
@ WAYPOINT_MOVE_TYPE_TAKEOFF
Definition WaypointMgr.h:32
@ WAYPOINT_MOVE_TYPE_WALK
Definition WaypointMgr.h:29
virtual void PathEndReached(uint32)
Definition CreatureAI.h:164
Creature * GetLeader() const
Definition CreatureGroups.h:99
void LeaderMoveTo(float x, float y, float z, uint32 move_type)
Definition CreatureGroups.cpp:347
void SetHomePosition(float x, float y, float z, float o)
Definition Creature.h:339
CreatureGroup const * GetFormation() const
Definition Creature.h:356
void SetTransportHomePosition(float x, float y, float z, float o)
Definition Creature.h:344
MotionTransport * ToMotionTransport()
Definition GameObject.h:326
void Initialize()
Definition MotionMaster.cpp:74
Definition MoveSplineInit.h:71
Definition VehicleDefines.h:130
Definition Transport.h:30
MotionMaster * GetMotionMaster()
Definition Unit.h:1713
bool HasUnitMovementFlag(uint32 f) const
Definition Unit.h:759
TransportBase * GetDirectTransport() const
Definition Unit.cpp:18798
ObjectGuid GetTransGUID() const override
Definition Unit.cpp:18787
void UpdateAllowedPositionZ(float x, float y, float &z, float *groundZ=nullptr) const
Definition Object.cpp:1587
Transport * GetTransport() const
Definition Object.h:683
@ ToFly
Definition MoveSplineInit.h:36
@ ToGround
Definition MoveSplineInit.h:34
Definition MoveSpline.h:27
float GetOrientation() const
Definition Position.h:124
Definition WaypointMgr.h:38
float z
Definition WaypointMgr.h:40
float x
Definition WaypointMgr.h:40
float y
Definition WaypointMgr.h:40
std::optional< float > orientation
Definition WaypointMgr.h:41
uint32 delay
Definition WaypointMgr.h:42
uint32 move_type
Definition WaypointMgr.h:44

References Unit::AddUnitState(), Creature::AI(), WaypointData::delay, Movement::MoveSplineInit::DisableTransportPathTransformations(), Unit::GetDirectTransport(), Creature::GetFormation(), CreatureGroup::GetLeader(), Unit::GetMotionMaster(), Position::GetOrientation(), Unit::GetTransGUID(), WorldObject::GetTransport(), Unit::HasUnitMovementFlag(), Unit::HasUnitState(), MotionMaster::Initialize(), Unit::IsAlive(), Creature::IsMovementPreventedByCasting(), Movement::MoveSplineInit::Launch(), CreatureGroup::LeaderMoveTo(), WaypointData::move_type, MOVEMENTFLAG_ONTRANSPORT, Movement::MoveSplineInit::MoveTo(), Movement::Location::orientation, WaypointData::orientation, CreatureAI::PathEndReached(), Movement::MoveSplineInit::SetAnimation(), Movement::MoveSplineInit::SetFacing(), Creature::SetHomePosition(), Creature::SetTransportHomePosition(), Movement::MoveSplineInit::SetWalk(), Movement::ToFly, Movement::ToGround, GameObject::ToMotionTransport(), UNIT_STATE_NOT_MOVE, UNIT_STATE_ROAMING_MOVE, WorldObject::UpdateAllowedPositionZ(), WAYPOINT_MOVE_TYPE_LAND, WAYPOINT_MOVE_TYPE_RUN, WAYPOINT_MOVE_TYPE_TAKEOFF, WAYPOINT_MOVE_TYPE_WALK, WaypointData::x, WaypointData::y, and WaypointData::z.

◆ StartMoveNow()

void WaypointMovementGenerator< Creature >::StartMoveNow ( Creature creature)
inlineprivate
89 {
91 StartMove(creature);
92 }

◆ Stop()

void WaypointMovementGenerator< Creature >::Stop ( int32  time)
inlineprivate
75{ i_nextMoveTime.Reset(time);}

◆ Stopped()

bool WaypointMovementGenerator< Creature >::Stopped ( )
inlineprivate
77{ return !i_nextMoveTime.Passed();}

Member Data Documentation

◆ i_nextMoveTime

◆ i_pathSource

PathSource WaypointMovementGenerator< Creature >::i_pathSource
private

◆ m_isArrivalDone

bool WaypointMovementGenerator< Creature >::m_isArrivalDone
private

◆ path_id

◆ repeating

bool WaypointMovementGenerator< Creature >::repeating
private

◆ stalled

bool WaypointMovementGenerator< Creature >::stalled
private

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