From 7712c2a97346a69ff1e2bca731d3f7e2aa09c494 Mon Sep 17 00:00:00 2001 From: Anton Popovichenko Date: Mon, 14 Jul 2025 10:24:55 +0200 Subject: [PATCH] fix(Core/FleeingMovementGenerator): Prevent fleeing players from moving off cliffs (#22462) Co-authored-by: Kitzunu <24550914+Kitzunu@users.noreply.github.com> --- .../MovementGenerators/FleeingMovementGenerator.cpp | 11 ++++++----- .../MovementGenerators/FleeingMovementGenerator.h | 4 ++-- .../Movement/MovementGenerators/PathGenerator.cpp | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp index a4d9867ab..d34024655 100644 --- a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp @@ -144,6 +144,9 @@ void FleeingMovementGenerator::SetTargetLocation(T* owner) bool result = _path->CalculatePath(destination.GetPositionX(), destination.GetPositionY(), destination.GetPositionZ()); if (!result || (_path->GetPathType() & PathType(PATHFIND_NOPATH | PATHFIND_SHORTCUT | PATHFIND_FARFROMPOLY | PATHFIND_NOT_USING_PATH))) { + if (_fleeTargetGUID) + ++_invalidPathsCount; + _timer.Reset(100); return; } @@ -152,15 +155,13 @@ void FleeingMovementGenerator::SetTargetLocation(T* owner) if (_path->getPathLength() < MIN_PATH_LENGTH) { if (_fleeTargetGUID) - { - ++_shortPathsCount; - } + ++_invalidPathsCount; _timer.Reset(100); return; } - _shortPathsCount = 0; + _invalidPathsCount = 0; Movement::MoveSplineInit init(owner); init.MovebyPath(_path->GetPath()); @@ -175,7 +176,7 @@ void FleeingMovementGenerator::GetPoint(T* owner, Position& position) float casterDistance = 0.f; float casterAngle = 0.f; Unit* fleeTarget = nullptr; - if (_shortPathsCount < 5) + if (_invalidPathsCount < 5) fleeTarget = ObjectAccessor::GetUnit(*owner, _fleeTargetGUID); if (fleeTarget) diff --git a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h index ce654cf88..bcde0966e 100644 --- a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h +++ b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.h @@ -26,7 +26,7 @@ template class FleeingMovementGenerator : public MovementGeneratorMedium< T, FleeingMovementGenerator > { public: - explicit FleeingMovementGenerator(ObjectGuid fleeTargetGUID) : _path(nullptr), _fleeTargetGUID(fleeTargetGUID), _timer(0), _interrupt(false), _shortPathsCount(0) { } + explicit FleeingMovementGenerator(ObjectGuid fleeTargetGUID) : _path(nullptr), _fleeTargetGUID(fleeTargetGUID), _timer(0), _interrupt(false), _invalidPathsCount(0) { } MovementGeneratorType GetMovementGeneratorType() override { return FLEEING_MOTION_TYPE; } @@ -43,7 +43,7 @@ class FleeingMovementGenerator : public MovementGeneratorMedium< T, FleeingMovem ObjectGuid _fleeTargetGUID; TimeTracker _timer; bool _interrupt; - uint8 _shortPathsCount; + uint8 _invalidPathsCount; }; class TimedFleeingMovementGenerator : public FleeingMovementGenerator diff --git a/src/server/game/Movement/MovementGenerators/PathGenerator.cpp b/src/server/game/Movement/MovementGenerators/PathGenerator.cpp index 33bd7ec22..c59def7b7 100644 --- a/src/server/game/Movement/MovementGenerators/PathGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/PathGenerator.cpp @@ -556,7 +556,7 @@ void PathGenerator::BuildPointPath(const float* startPoint, const float* endPoin } // Special case with start and end positions very close to each other - if (_polyLength == 1 && pointCount == 1) + if (_polyLength == 1 && pointCount == 1 && !(dtResult & DT_SLOPE_TOO_STEEP)) { // First point is start position, append end position dtVcopy(&pathPoints[1 * VERTEX_SIZE], endPoint);