From ca656f4254e979f049c3cf34e39d5d975e02f2d6 Mon Sep 17 00:00:00 2001 From: Shauren Date: Tue, 12 Mar 2024 11:49:42 +0100 Subject: Core/Movement: FIxed followPathBackwardsFromEndToStart parameter of MotionMaster::MovePath --- src/server/game/Movement/MotionMaster.cpp | 4 ++-- src/server/game/Movement/MotionMaster.h | 4 ++-- .../MovementGenerators/WaypointMovementGenerator.cpp | 18 ++++++++++++------ .../MovementGenerators/WaypointMovementGenerator.h | 8 +++++--- 4 files changed, 21 insertions(+), 13 deletions(-) (limited to 'src') 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 duration, Optional speed, MovementWalkRunSpeedSelectionMode speedSelectionMode, Optional> waitTimeRangeAtPathEnd, - Optional wanderDistanceAtPathEnds, bool followPathBackwardsFromEndToStart, bool generatePath) + Optional wanderDistanceAtPathEnds, Optional followPathBackwardsFromEndToStart, bool generatePath) { if (!pathId) return; @@ -1127,7 +1127,7 @@ void MotionMaster::MovePath(uint32 pathId, bool repeatable, Optional duration, Optional speed, MovementWalkRunSpeedSelectionMode speedSelectionMode, Optional> waitTimeRangeAtPathEnd, - Optional wanderDistanceAtPathEnds, bool followPathBackwardsFromEndToStart, bool generatePath) + Optional wanderDistanceAtPathEnds, Optional 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 duration = {}, Optional speed = {}, MovementWalkRunSpeedSelectionMode speedSelectionMode = MovementWalkRunSpeedSelectionMode::Default, Optional> waitTimeRangeAtPathEnd = {}, Optional wanderDistanceAtPathEnds = {}, - bool followPathBackwardsFromEndToStart = false, bool generatePath = true); + Optional followPathBackwardsFromEndToStart = {}, bool generatePath = true); void MovePath(WaypointPath const& path, bool repeatable, Optional duration = {}, Optional speed = {}, MovementWalkRunSpeedSelectionMode speedSelectionMode = MovementWalkRunSpeedSelectionMode::Default, Optional> waitTimeRangeAtPathEnd = {}, Optional wanderDistanceAtPathEnds = {}, - bool followPathBackwardsFromEndToStart = false, bool generatePath = true); + Optional 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::WaypointMovementGenerator(uint32 pathId, bool repeating, Optional duration, Optional speed, MovementWalkRunSpeedSelectionMode speedSelectionMode, Optional> waitTimeRangeAtPathEnd, - Optional wanderDistanceAtPathEnds, bool followPathBackwardsFromEndToStart, bool generatePath) + Optional wanderDistanceAtPathEnds, Optional 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::WaypointMovementGenerator(uint32 pathId, bo WaypointMovementGenerator::WaypointMovementGenerator(WaypointPath const& path, bool repeating, Optional duration, Optional speed, MovementWalkRunSpeedSelectionMode speedSelectionMode, Optional> waitTimeRangeAtPathEnd, - Optional wanderDistanceAtPathEnds, bool followPathBackwardsFromEndToStart, bool generatePath) + Optional wanderDistanceAtPathEnds, Optional 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::DoInitialize(Creature* owner) return; } - _followPathBackwardsFromEndToStart = GetPath()->Flags.HasFlag(WaypointPathFlags::FollowPathBackwardsFromEndToStart); - if (GetPath()->Nodes.size() == 1) _repeating = false; @@ -285,7 +283,7 @@ void WaypointMovementGenerator::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::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::ComputeNextNode() return true; } +bool WaypointMovementGenerator::IsFollowingPathBackwardsFromEndToStart() const +{ + if (_followPathBackwardsFromEndToStart) + return *_followPathBackwardsFromEndToStart; + + return GetPath()->Flags.HasFlag(WaypointPathFlags::FollowPathBackwardsFromEndToStart); +} + std::string WaypointMovementGenerator::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 : public MovementGeneratorMedium duration = {}, Optional speed = {}, MovementWalkRunSpeedSelectionMode speedSelectionMode = MovementWalkRunSpeedSelectionMode::Default, Optional> waitTimeRangeAtPathEnd = {}, Optional wanderDistanceAtPathEnds = {}, - bool followPathBackwardsFromEndToStart = false, bool generatePath = true); + Optional followPathBackwardsFromEndToStart = {}, bool generatePath = true); explicit WaypointMovementGenerator(WaypointPath const& path, bool repeating, Optional duration, Optional speed, MovementWalkRunSpeedSelectionMode speedSelectionMode, Optional> waitTimeRangeAtPathEnd, Optional wanderDistanceAtPathEnds, - bool followPathBackwardsFromEndToStart, bool generatePath); + Optional followPathBackwardsFromEndToStart, bool generatePath); ~WaypointMovementGenerator(); MovementGeneratorType GetMovementGeneratorType() const override; @@ -78,6 +78,8 @@ class WaypointMovementGenerator : public MovementGeneratorMedium : public MovementGeneratorMedium> _waitTimeRangeAtPathEnd; Optional _wanderDistanceAtPathEnds; - bool _followPathBackwardsFromEndToStart; + Optional _followPathBackwardsFromEndToStart; bool _isReturningToStart; bool _generatePath; }; -- cgit v1.2.3