Merge pull request #4519 from babbaj/edge-fix
Fix not moving from edge of block
This commit is contained in:
@@ -265,7 +265,7 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior,
|
||||
if (goal == null) {
|
||||
return false;
|
||||
}
|
||||
if (goal.isInGoal(ctx.playerFeet()) || goal.isInGoal(expectedSegmentStart)) {
|
||||
if (goal.isInGoal(ctx.playerFeet())) {
|
||||
return false;
|
||||
}
|
||||
synchronized (pathPlanLock) {
|
||||
@@ -553,7 +553,7 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior,
|
||||
});
|
||||
}
|
||||
|
||||
private static AbstractNodeCostSearch createPathfinder(BlockPos start, Goal goal, IPath previous, CalculationContext context) {
|
||||
private AbstractNodeCostSearch createPathfinder(BlockPos start, Goal goal, IPath previous, CalculationContext context) {
|
||||
Goal transformed = goal;
|
||||
if (Baritone.settings().simplifyUnloadedYCoord.value && goal instanceof IGoalRenderPos) {
|
||||
BlockPos pos = ((IGoalRenderPos) goal).getGoalPos();
|
||||
@@ -562,7 +562,14 @@ public final class PathingBehavior extends Behavior implements IPathingBehavior,
|
||||
}
|
||||
}
|
||||
Favoring favoring = new Favoring(context.getBaritone().getPlayerContext(), previous, context);
|
||||
return new AStarPathFinder(start.getX(), start.getY(), start.getZ(), transformed, favoring, context);
|
||||
BetterBlockPos feet = ctx.playerFeet();
|
||||
var realStart = new BetterBlockPos(start);
|
||||
var sub = feet.subtract(realStart);
|
||||
if (feet.getY() == realStart.getY() && Math.abs(sub.getX()) <= 1 && Math.abs(sub.getZ()) <= 1) {
|
||||
realStart = feet;
|
||||
}
|
||||
return new AStarPathFinder(realStart, start.getX(), start.getY(), start.getZ(), transformed, favoring, context);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -41,8 +41,8 @@ public final class AStarPathFinder extends AbstractNodeCostSearch {
|
||||
private final Favoring favoring;
|
||||
private final CalculationContext calcContext;
|
||||
|
||||
public AStarPathFinder(int startX, int startY, int startZ, Goal goal, Favoring favoring, CalculationContext context) {
|
||||
super(startX, startY, startZ, goal, context);
|
||||
public AStarPathFinder(BetterBlockPos realStart, int startX, int startY, int startZ, Goal goal, Favoring favoring, CalculationContext context) {
|
||||
super(realStart, startX, startY, startZ, goal, context);
|
||||
this.favoring = favoring;
|
||||
this.calcContext = context;
|
||||
}
|
||||
@@ -96,7 +96,7 @@ public final class AStarPathFinder extends AbstractNodeCostSearch {
|
||||
numNodes++;
|
||||
if (goal.isInGoal(currentNode.x, currentNode.y, currentNode.z)) {
|
||||
logDebug("Took " + (System.currentTimeMillis() - startTime) + "ms, " + numMovementsConsidered + " movements considered");
|
||||
return Optional.of(new Path(startNode, currentNode, numNodes, goal, calcContext));
|
||||
return Optional.of(new Path(realStart, startNode, currentNode, numNodes, goal, calcContext));
|
||||
}
|
||||
for (Moves moves : allMoves) {
|
||||
int newX = currentNode.x + moves.xOffset;
|
||||
|
||||
@@ -36,6 +36,7 @@ import java.util.Optional;
|
||||
*/
|
||||
public abstract class AbstractNodeCostSearch implements IPathFinder, Helper {
|
||||
|
||||
protected final BetterBlockPos realStart;
|
||||
protected final int startX;
|
||||
protected final int startY;
|
||||
protected final int startZ;
|
||||
@@ -81,7 +82,8 @@ public abstract class AbstractNodeCostSearch implements IPathFinder, Helper {
|
||||
*/
|
||||
protected static final double MIN_IMPROVEMENT = 0.01;
|
||||
|
||||
AbstractNodeCostSearch(int startX, int startY, int startZ, Goal goal, CalculationContext context) {
|
||||
AbstractNodeCostSearch(BetterBlockPos realStart, int startX, int startY, int startZ, Goal goal, CalculationContext context) {
|
||||
this.realStart = realStart;
|
||||
this.startX = startX;
|
||||
this.startY = startY;
|
||||
this.startZ = startZ;
|
||||
@@ -177,7 +179,7 @@ public abstract class AbstractNodeCostSearch implements IPathFinder, Helper {
|
||||
|
||||
@Override
|
||||
public Optional<IPath> pathToMostRecentNodeConsidered() {
|
||||
return Optional.ofNullable(mostRecentConsidered).map(node -> new Path(startNode, node, 0, goal, context));
|
||||
return Optional.ofNullable(mostRecentConsidered).map(node -> new Path(realStart, startNode, node, 0, goal, context));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -208,7 +210,7 @@ public abstract class AbstractNodeCostSearch implements IPathFinder, Helper {
|
||||
System.out.println("Path goes for " + Math.sqrt(dist) + " blocks");
|
||||
logDebug("A* cost coefficient " + COEFFICIENTS[i]);
|
||||
}
|
||||
return Optional.of(new Path(startNode, bestSoFar[i], numNodes, goal, context));
|
||||
return Optional.of(new Path(realStart, startNode, bestSoFar[i], numNodes, goal, context));
|
||||
}
|
||||
}
|
||||
// instead of returning bestSoFar[0], be less misleading
|
||||
|
||||
@@ -27,6 +27,7 @@ import baritone.pathing.movement.Movement;
|
||||
import baritone.pathing.movement.Moves;
|
||||
import baritone.pathing.path.CutoffPath;
|
||||
import baritone.utils.pathing.PathBase;
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
@@ -68,28 +69,34 @@ class Path extends PathBase {
|
||||
|
||||
private volatile boolean verified;
|
||||
|
||||
Path(PathNode start, PathNode end, int numNodes, Goal goal, CalculationContext context) {
|
||||
this.start = new BetterBlockPos(start.x, start.y, start.z);
|
||||
Path(BetterBlockPos realStart, PathNode start, PathNode end, int numNodes, Goal goal, CalculationContext context) {
|
||||
this.start = realStart;
|
||||
this.end = new BetterBlockPos(end.x, end.y, end.z);
|
||||
this.numNodes = numNodes;
|
||||
this.movements = new ArrayList<>();
|
||||
this.goal = goal;
|
||||
this.context = context;
|
||||
|
||||
// If the position the player is at is different from the position we told A* to start from
|
||||
// see PathingBehavior#createPathfinder and https://github.com/cabaletta/baritone/pull/4519
|
||||
var startNodePos = new BetterBlockPos(start.x, start.y, start.z);
|
||||
if (!realStart.equals(startNodePos)) {
|
||||
PathNode fakeNode = new PathNode(realStart.x, realStart.y, realStart.z, goal);
|
||||
fakeNode.cost = 0;
|
||||
start.previous = fakeNode;
|
||||
}
|
||||
|
||||
PathNode current = end;
|
||||
LinkedList<BetterBlockPos> tempPath = new LinkedList<>();
|
||||
LinkedList<PathNode> tempNodes = new LinkedList<>();
|
||||
// Repeatedly inserting to the beginning of an arraylist is O(n^2)
|
||||
// Instead, do it into a linked list, then convert at the end
|
||||
List<BetterBlockPos> tempPath = new ArrayList<>();
|
||||
List<PathNode> tempNodes = new ArrayList<>();
|
||||
while (current != null) {
|
||||
tempNodes.addFirst(current);
|
||||
tempPath.addFirst(new BetterBlockPos(current.x, current.y, current.z));
|
||||
tempNodes.add(current);
|
||||
tempPath.add(new BetterBlockPos(current.x, current.y, current.z));
|
||||
current = current.previous;
|
||||
}
|
||||
// Can't directly convert from the PathNode pseudo linked list to an array because we don't know how long it is
|
||||
// inserting into a LinkedList<E> keeps track of length, then when we addall (which calls .toArray) it's able
|
||||
// to performantly do that conversion since it knows the length.
|
||||
this.path = new ArrayList<>(tempPath);
|
||||
this.nodes = new ArrayList<>(tempNodes);
|
||||
// Nodes are traversed last to first so we need to reverse the list
|
||||
this.path = Lists.reverse(tempPath);
|
||||
this.nodes = Lists.reverse(tempNodes);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user