fix(Core/Travel): Reject 2-point BuildShortcut paths between non-adjacent nodes

This commit is contained in:
bash 2026-05-18 01:14:14 +02:00
parent aa7baa99b2
commit bb747404ba
2 changed files with 6 additions and 9 deletions

View File

@ -752,15 +752,6 @@ std::vector<WorldPosition> WorldPosition::getPathStepFrom(WorldPosition startPos
std::vector<WorldPosition> retvec = fromPointsArray(points);
// PathGenerator can also return PATHFIND_NORMAL with just two
// points (start + end) as a fallback when polygon search fails
// partway through — effectively a teleport across whatever lies
// between. Reject long 2-point segments to avoid the chained
// probe accepting a 1000y+ "shortcut" as a valid path step.
// 75y matches the nodeFirstDis travelnode threshold elsewhere.
if (retvec.size() == 2 && retvec.front().distance(&retvec.back()) > 75.0f)
return {};
// Underwater path-extension. When PATHFIND_INCOMPLETE ends within
// 50y of dest and both endpoints are underwater with LOS, extend
// by one 5y step (or straight to dest if <5y). Lets bots traverse

View File

@ -226,6 +226,12 @@ TravelNodePath* TravelNode::BuildPath(TravelNode* endNode, Unit* bot, bool postP
bool canPath = endPos->isPathTo(path); // Check if we reached our destination.
// Reject 2-point paths between non-adjacent nodes — that's
// PathGenerator's BuildShortcut fallback "teleporting" the chain
// endpoint across whatever lies between, not a real walkable route.
if (canPath && path.size() == 2 && getPosition()->distance(endNode->getPosition()) > 5.0f)
canPath = false;
// Reject too-short or too-steep results — geometry shortcut that
// mmap returns but a player can't actually walk.
if (canPath && TravelPath::IsPathCheating(path, getPosition()->distance(endNode->getPosition())))