diff --git a/Source/Game/Movement/Generators/WaypointMovement.cs b/Source/Game/Movement/Generators/WaypointMovement.cs index 340e1bc8c..63f4d6723 100644 --- a/Source/Game/Movement/Generators/WaypointMovement.cs +++ b/Source/Game/Movement/Generators/WaypointMovement.cs @@ -25,12 +25,12 @@ namespace Game.Movement MovementWalkRunSpeedSelectionMode _speedSelectionMode; (TimeSpan min, TimeSpan max)? _waitTimeRangeAtPathEnd; float? _wanderDistanceAtPathEnds; - bool _followPathBackwardsFromEndToStart; + bool? _followPathBackwardsFromEndToStart; bool _isReturningToStart; bool _generatePath; public WaypointMovementGenerator(uint pathId = 0, bool repeating = true, TimeSpan? duration = null, float? speed = null, MovementWalkRunSpeedSelectionMode speedSelectionMode = MovementWalkRunSpeedSelectionMode.Default, - (TimeSpan min, TimeSpan max)? waitTimeRangeAtPathEnd = null, float? wanderDistanceAtPathEnds = null, bool followPathBackwardsFromEndToStart = false, bool generatePath = true) + (TimeSpan min, TimeSpan max)? waitTimeRangeAtPathEnd = null, float? wanderDistanceAtPathEnds = null, bool? followPathBackwardsFromEndToStart = null, bool generatePath = true) { _nextMoveTime = new TimeTracker(0); @@ -55,7 +55,7 @@ namespace Game.Movement } public WaypointMovementGenerator(WaypointPath path, bool repeating = true, TimeSpan? duration = null, float? speed = null, MovementWalkRunSpeedSelectionMode speedSelectionMode = MovementWalkRunSpeedSelectionMode.Default, - (TimeSpan min, TimeSpan max)? waitTimeRangeAtPathEnd = null, float? wanderDistanceAtPathEnds = null, bool followPathBackwardsFromEndToStart = false, bool generatePath = true) + (TimeSpan min, TimeSpan max)? waitTimeRangeAtPathEnd = null, float? wanderDistanceAtPathEnds = null, bool? followPathBackwardsFromEndToStart = null, bool generatePath = true) { _nextMoveTime = new TimeTracker(0); _repeating = repeating; @@ -143,8 +143,6 @@ namespace Game.Movement return; } - _followPathBackwardsFromEndToStart = _path.Flags.HasFlag(WaypointPathFlags.FollowPathBackwardsFromEndToStart); - if (_path.Nodes.Count == 1) _repeating = false; @@ -296,7 +294,7 @@ namespace Game.Movement _nextMoveTime.Reset(waypoint.Delay); } - if (_waitTimeRangeAtPathEnd.HasValue && _followPathBackwardsFromEndToStart + if (_waitTimeRangeAtPathEnd.HasValue && IsFollowingPathBackwardsFromEndToStart() && ((_isReturningToStart && _currentNode == 0) || (!_isReturningToStart && _currentNode == _path.Nodes.Count - 1))) { owner.ClearUnitState(UnitState.RoamingMove); @@ -446,7 +444,7 @@ namespace Game.Movement if ((_currentNode == _path.Nodes.Count - 1) && !_repeating) return false; - if (!_followPathBackwardsFromEndToStart || _path.Nodes.Count < 2) + if (!IsFollowingPathBackwardsFromEndToStart() || _path.Nodes.Count < 2) _currentNode = (_currentNode + 1) % _path.Nodes.Count; else { @@ -470,6 +468,14 @@ namespace Game.Movement return true; } + bool IsFollowingPathBackwardsFromEndToStart() + { + if (_followPathBackwardsFromEndToStart.HasValue) + return _followPathBackwardsFromEndToStart.Value; + + return _path.Flags.HasFlag(WaypointPathFlags.FollowPathBackwardsFromEndToStart); + } + public override string GetDebugInfo() { return $"Current Node: {_currentNode}\n{base.GetDebugInfo()}"; diff --git a/Source/Game/Movement/MotionMaster.cs b/Source/Game/Movement/MotionMaster.cs index c5ce47732..0f8f01228 100644 --- a/Source/Game/Movement/MotionMaster.cs +++ b/Source/Game/Movement/MotionMaster.cs @@ -1030,7 +1030,7 @@ namespace Game.Movement } public void MovePath(uint pathId, bool repeatable, TimeSpan? duration = null, float? speed = null, MovementWalkRunSpeedSelectionMode speedSelectionMode = MovementWalkRunSpeedSelectionMode.Default, - (TimeSpan min, TimeSpan max)? waitTimeRangeAtPathEnd = null, float? wanderDistanceAtPathEnds = null, bool followPathBackwardsFromEndToStart = false, bool generatePath = true) + (TimeSpan min, TimeSpan max)? waitTimeRangeAtPathEnd = null, float? wanderDistanceAtPathEnds = null, bool? followPathBackwardsFromEndToStart = null, bool generatePath = true) { if (pathId == 0) return; @@ -1040,7 +1040,7 @@ namespace Game.Movement } public void MovePath(WaypointPath path, bool repeatable, TimeSpan? duration = null, float? speed = null, MovementWalkRunSpeedSelectionMode speedSelectionMode = MovementWalkRunSpeedSelectionMode.Default, - (TimeSpan min, TimeSpan max)? waitTimeRangeAtPathEnd = null, float? wanderDistanceAtPathEnds = null, bool followPathBackwardsFromEndToStart = false, bool generatePath = true) + (TimeSpan min, TimeSpan max)? waitTimeRangeAtPathEnd = null, float? wanderDistanceAtPathEnds = null, bool? followPathBackwardsFromEndToStart = null, bool generatePath = true) { Log.outDebug(LogFilter.Movement, $"MotionMaster::MovePath: '{_owner.GetGUID()}', starts moving over path Id: {path.Id} (repeatable: {repeatable})"); Add(new WaypointMovementGenerator(path, repeatable, duration, speed, speedSelectionMode, waitTimeRangeAtPathEnd, wanderDistanceAtPathEnds, followPathBackwardsFromEndToStart, generatePath), MovementSlot.Default);