mirror of
https://github.com/liyunfan1223/mod-playerbots.git
synced 2026-06-20 15:39:25 +02:00
fix(Core/Travel): Reject 2-point BuildShortcut paths between non-adjacent nodes
This commit is contained in:
parent
537d7b0284
commit
2d83396c59
@ -752,15 +752,6 @@ std::vector<WorldPosition> WorldPosition::getPathStepFrom(WorldPosition startPos
|
|||||||
|
|
||||||
std::vector<WorldPosition> retvec = fromPointsArray(points);
|
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
|
// Underwater path-extension. When PATHFIND_INCOMPLETE ends within
|
||||||
// 50y of dest and both endpoints are underwater with LOS, extend
|
// 50y of dest and both endpoints are underwater with LOS, extend
|
||||||
// by one 5y step (or straight to dest if <5y). Lets bots traverse
|
// by one 5y step (or straight to dest if <5y). Lets bots traverse
|
||||||
|
|||||||
@ -226,6 +226,12 @@ TravelNodePath* TravelNode::BuildPath(TravelNode* endNode, Unit* bot, bool postP
|
|||||||
|
|
||||||
bool canPath = endPos->isPathTo(path); // Check if we reached our destination.
|
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
|
// Reject too-short or too-steep results — geometry shortcut that
|
||||||
// mmap returns but a player can't actually walk.
|
// mmap returns but a player can't actually walk.
|
||||||
if (canPath && TravelPath::IsPathCheating(path, getPosition()->distance(endNode->getPosition())))
|
if (canPath && TravelPath::IsPathCheating(path, getPosition()->distance(endNode->getPosition())))
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user