Core/Movement: FIxed followPathBackwardsFromEndToStart parameter of MotionMaster::MovePath

This commit is contained in:
Shauren
2024-03-12 11:49:42 +01:00
parent b93791255c
commit ca656f4254
4 changed files with 21 additions and 13 deletions

View File

@@ -1114,7 +1114,7 @@ void MotionMaster::MoveDistract(uint32 timer, float orientation)
void MotionMaster::MovePath(uint32 pathId, bool repeatable, Optional<Milliseconds> duration, Optional<float> speed,
MovementWalkRunSpeedSelectionMode speedSelectionMode, Optional<std::pair<Milliseconds, Milliseconds>> waitTimeRangeAtPathEnd,
Optional<float> wanderDistanceAtPathEnds, bool followPathBackwardsFromEndToStart, bool generatePath)
Optional<float> wanderDistanceAtPathEnds, Optional<bool> followPathBackwardsFromEndToStart, bool generatePath)
{
if (!pathId)
return;
@@ -1127,7 +1127,7 @@ void MotionMaster::MovePath(uint32 pathId, bool repeatable, Optional<Millisecond
void MotionMaster::MovePath(WaypointPath const& path, bool repeatable, Optional<Milliseconds> duration, Optional<float> speed,
MovementWalkRunSpeedSelectionMode speedSelectionMode, Optional<std::pair<Milliseconds, Milliseconds>> waitTimeRangeAtPathEnd,
Optional<float> wanderDistanceAtPathEnds, bool followPathBackwardsFromEndToStart, bool generatePath)
Optional<float> wanderDistanceAtPathEnds, Optional<bool> followPathBackwardsFromEndToStart, bool generatePath)
{
TC_LOG_DEBUG("movement.motionmaster", "MotionMaster::MovePath: '{}', starts moving over path Id: {} (repeatable: {})",
_owner->GetGUID().ToString(), path.Id, repeatable ? "YES" : "NO");

View File

@@ -200,11 +200,11 @@ class TC_GAME_API MotionMaster
void MovePath(uint32 pathId, bool repeatable, Optional<Milliseconds> duration = {}, Optional<float> speed = {},
MovementWalkRunSpeedSelectionMode speedSelectionMode = MovementWalkRunSpeedSelectionMode::Default,
Optional<std::pair<Milliseconds, Milliseconds>> waitTimeRangeAtPathEnd = {}, Optional<float> wanderDistanceAtPathEnds = {},
bool followPathBackwardsFromEndToStart = false, bool generatePath = true);
Optional<bool> followPathBackwardsFromEndToStart = {}, bool generatePath = true);
void MovePath(WaypointPath const& path, bool repeatable, Optional<Milliseconds> duration = {}, Optional<float> speed = {},
MovementWalkRunSpeedSelectionMode speedSelectionMode = MovementWalkRunSpeedSelectionMode::Default,
Optional<std::pair<Milliseconds, Milliseconds>> waitTimeRangeAtPathEnd = {}, Optional<float> wanderDistanceAtPathEnds = {},
bool followPathBackwardsFromEndToStart = false, bool generatePath = true);
Optional<bool> followPathBackwardsFromEndToStart = {}, bool generatePath = true);
/**
* \brief Makes the Unit turn in place

View File

@@ -30,7 +30,7 @@
WaypointMovementGenerator<Creature>::WaypointMovementGenerator(uint32 pathId, bool repeating, Optional<Milliseconds> duration, Optional<float> speed,
MovementWalkRunSpeedSelectionMode speedSelectionMode, Optional<std::pair<Milliseconds, Milliseconds>> waitTimeRangeAtPathEnd,
Optional<float> wanderDistanceAtPathEnds, bool followPathBackwardsFromEndToStart, bool generatePath)
Optional<float> wanderDistanceAtPathEnds, Optional<bool> followPathBackwardsFromEndToStart, bool generatePath)
: _nextMoveTime(0), _pathId(pathId), _repeating(repeating), _loadedFromDB(true),
_speed(speed), _speedSelectionMode(speedSelectionMode), _waitTimeRangeAtPathEnd(std::move(waitTimeRangeAtPathEnd)),
_wanderDistanceAtPathEnds(wanderDistanceAtPathEnds), _followPathBackwardsFromEndToStart(followPathBackwardsFromEndToStart), _isReturningToStart(false),
@@ -46,7 +46,7 @@ WaypointMovementGenerator<Creature>::WaypointMovementGenerator(uint32 pathId, bo
WaypointMovementGenerator<Creature>::WaypointMovementGenerator(WaypointPath const& path, bool repeating, Optional<Milliseconds> duration, Optional<float> speed,
MovementWalkRunSpeedSelectionMode speedSelectionMode, Optional<std::pair<Milliseconds, Milliseconds>> waitTimeRangeAtPathEnd,
Optional<float> wanderDistanceAtPathEnds, bool followPathBackwardsFromEndToStart, bool generatePath)
Optional<float> wanderDistanceAtPathEnds, Optional<bool> followPathBackwardsFromEndToStart, bool generatePath)
: _nextMoveTime(0), _pathId(0), _repeating(repeating), _loadedFromDB(false),
_speed(speed), _speedSelectionMode(speedSelectionMode), _waitTimeRangeAtPathEnd(std::move(waitTimeRangeAtPathEnd)),
_wanderDistanceAtPathEnds(wanderDistanceAtPathEnds), _followPathBackwardsFromEndToStart(followPathBackwardsFromEndToStart), _isReturningToStart(false),
@@ -133,8 +133,6 @@ void WaypointMovementGenerator<Creature>::DoInitialize(Creature* owner)
return;
}
_followPathBackwardsFromEndToStart = GetPath()->Flags.HasFlag(WaypointPathFlags::FollowPathBackwardsFromEndToStart);
if (GetPath()->Nodes.size() == 1)
_repeating = false;
@@ -285,7 +283,7 @@ void WaypointMovementGenerator<Creature>::OnArrived(Creature* owner)
_nextMoveTime.Reset(waypoint.Delay);
}
if (_waitTimeRangeAtPathEnd && _followPathBackwardsFromEndToStart
if (_waitTimeRangeAtPathEnd && IsFollowingPathBackwardsFromEndToStart()
&& ((_isReturningToStart && _currentNode == 0) || (!_isReturningToStart && _currentNode == GetPath()->Nodes.size() - 1)))
{
owner->ClearUnitState(UNIT_STATE_ROAMING_MOVE);
@@ -433,7 +431,7 @@ bool WaypointMovementGenerator<Creature>::ComputeNextNode()
if ((_currentNode == GetPath()->Nodes.size() - 1) && !_repeating)
return false;
if (!_followPathBackwardsFromEndToStart || GetPath()->Nodes.size() < WAYPOINT_PATH_FLAG_FOLLOW_PATH_BACKWARDS_MINIMUM_NODES)
if (!IsFollowingPathBackwardsFromEndToStart() || GetPath()->Nodes.size() < WAYPOINT_PATH_FLAG_FOLLOW_PATH_BACKWARDS_MINIMUM_NODES)
_currentNode = (_currentNode + 1) % GetPath()->Nodes.size();
else
{
@@ -458,6 +456,14 @@ bool WaypointMovementGenerator<Creature>::ComputeNextNode()
return true;
}
bool WaypointMovementGenerator<Creature>::IsFollowingPathBackwardsFromEndToStart() const
{
if (_followPathBackwardsFromEndToStart)
return *_followPathBackwardsFromEndToStart;
return GetPath()->Flags.HasFlag(WaypointPathFlags::FollowPathBackwardsFromEndToStart);
}
std::string WaypointMovementGenerator<Creature>::GetDebugInfo() const
{
std::stringstream sstr;

View File

@@ -38,11 +38,11 @@ class WaypointMovementGenerator<Creature> : public MovementGeneratorMedium<Creat
explicit WaypointMovementGenerator(uint32 pathId, bool repeating, Optional<Milliseconds> duration = {}, Optional<float> speed = {},
MovementWalkRunSpeedSelectionMode speedSelectionMode = MovementWalkRunSpeedSelectionMode::Default,
Optional<std::pair<Milliseconds, Milliseconds>> waitTimeRangeAtPathEnd = {}, Optional<float> wanderDistanceAtPathEnds = {},
bool followPathBackwardsFromEndToStart = false, bool generatePath = true);
Optional<bool> followPathBackwardsFromEndToStart = {}, bool generatePath = true);
explicit WaypointMovementGenerator(WaypointPath const& path, bool repeating, Optional<Milliseconds> duration, Optional<float> speed,
MovementWalkRunSpeedSelectionMode speedSelectionMode,
Optional<std::pair<Milliseconds, Milliseconds>> waitTimeRangeAtPathEnd, Optional<float> wanderDistanceAtPathEnds,
bool followPathBackwardsFromEndToStart, bool generatePath);
Optional<bool> followPathBackwardsFromEndToStart, bool generatePath);
~WaypointMovementGenerator();
MovementGeneratorType GetMovementGeneratorType() const override;
@@ -78,6 +78,8 @@ class WaypointMovementGenerator<Creature> : public MovementGeneratorMedium<Creat
return false;
}
bool IsFollowingPathBackwardsFromEndToStart() const;
TimeTracker _nextMoveTime;
uint32 _pathId;
bool _repeating;
@@ -88,7 +90,7 @@ class WaypointMovementGenerator<Creature> : public MovementGeneratorMedium<Creat
MovementWalkRunSpeedSelectionMode _speedSelectionMode;
Optional<std::pair<Milliseconds, Milliseconds>> _waitTimeRangeAtPathEnd;
Optional<float> _wanderDistanceAtPathEnds;
bool _followPathBackwardsFromEndToStart;
Optional<bool> _followPathBackwardsFromEndToStart;
bool _isReturningToStart;
bool _generatePath;
};