diff options
4 files changed, 21 insertions, 13 deletions
diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 7c25d871900..e62d26e0917 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -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"); diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h index 840a8a08116..5f82006ef32 100644 --- a/src/server/game/Movement/MotionMaster.h +++ b/src/server/game/Movement/MotionMaster.h @@ -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 diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp index bc2373809c3..4676ebb8141 100644 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.cpp @@ -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; diff --git a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h index 280e5bf9579..8de8f5de52b 100755 --- a/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/WaypointMovementGenerator.h @@ -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; }; |