From 5f686c1c12e1abfc071fa3bda028da7a9e527183 Mon Sep 17 00:00:00 2001 From: ZacSharp <68165024+ZacSharp@users.noreply.github.com> Date: Thu, 20 Aug 2020 22:40:16 +0200 Subject: [PATCH] improve isSafeToCancel in MovementDiagonal even more It did not return true early enough for backfill while cornering over air --- .../movement/movements/MovementDiagonal.java | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/src/main/java/baritone/pathing/movement/movements/MovementDiagonal.java b/src/main/java/baritone/pathing/movement/movements/MovementDiagonal.java index 2631af84..1ea0591c 100644 --- a/src/main/java/baritone/pathing/movement/movements/MovementDiagonal.java +++ b/src/main/java/baritone/pathing/movement/movements/MovementDiagonal.java @@ -31,6 +31,7 @@ import baritone.utils.pathing.MutableMoveResult; import com.google.common.collect.ImmutableSet; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; +import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.init.Blocks; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; @@ -58,11 +59,34 @@ public class MovementDiagonal extends Movement { @Override protected boolean safeToCancel(MovementState state) { - return ctx.playerFeet().equals(src) || (( - MovementHelper.canWalkOn(ctx, new BlockPos(src.x, src.y - 1, dest.z)) - ) && - MovementHelper.canWalkOn(ctx, new BlockPos(dest.x, src.y - 1, src.z))); - } + //too simple. backfill does not work after cornering with this + //return MovementHelper.canWalkOn(ctx, ctx.playerFeet().down()); + EntityPlayerSP player = ctx.player(); + double offset = 0.25; + double x = player.posX; + double y = player.posY - 1; + double z = player.posZ; + //standard + if (ctx.playerFeet().equals(src)){ + return true; + } + //both corners are walkable + if (MovementHelper.canWalkOn(ctx, new BlockPos(src.x, src.y - 1, dest.z)) + && MovementHelper.canWalkOn(ctx, new BlockPos(dest.x, src.y - 1, src.z))){ + return true; + } + //we are in a likely unwalkable corner, check for a supporting block + if (ctx.playerFeet().equals(new BetterBlockPos(src.x, src.y, dest.z)) + || ctx.playerFeet().equals(new BetterBlockPos(dest.x, src.y, src.z))){ + if (MovementHelper.canWalkOn(ctx, new BetterBlockPos(x + offset, y, z + offset)) + || MovementHelper.canWalkOn(ctx, new BetterBlockPos(x + offset, y, z - offset)) + || MovementHelper.canWalkOn(ctx, new BetterBlockPos(x - offset, y, z + offset)) + || MovementHelper.canWalkOn(ctx, new BetterBlockPos(x - offset, y, z - offset))){ + return true; + } + } + return false; + } @Override public double calculateCost(CalculationContext context) {