diff --git a/src/main/java/baritone/bot/pathing/movement/MovementHelper.java b/src/main/java/baritone/bot/pathing/movement/MovementHelper.java index 9547e044..f96eb64b 100644 --- a/src/main/java/baritone/bot/pathing/movement/MovementHelper.java +++ b/src/main/java/baritone/bot/pathing/movement/MovementHelper.java @@ -217,12 +217,21 @@ public interface MovementHelper extends ActionCosts, Helper { static Movement generateMovementFallOrDescend(BlockPos pos, EnumFacing direction, CalculationContext calcContext) { BlockPos dest = pos.offset(direction); - for (int i = 0; i < 4; i++) { - if (!(BlockStateInterface.get(dest.down(i - 1)).getBlock() instanceof BlockAir)) { - //if any of these four aren't air, that means that a fall N isn't possible - //so try a movementdescend + // A + //SA + // B + // B + // C + // D + //if S is where you start, both of B need to be air for a movementfall + //A is plausibly breakable by either descend or fall + //C, D, etc determine the length of the fall + for (int i = 1; i < 3; i++) { + if (!canWalkThrough(dest.down(i))) { + //if any of these two (B in the diagram) aren't air + //have to do a descend, because fall is impossible - //if all four of them are air, a movementdescend isn't possible anyway + //this doesn't guarantee descend is possible, it just guarantees fall is impossible return new MovementDescend(pos, dest.down()); // standard move out by 1 and descend by 1 } } diff --git a/src/main/java/baritone/bot/pathing/movement/movements/MovementFall.java b/src/main/java/baritone/bot/pathing/movement/movements/MovementFall.java index 462acd25..9fa07143 100644 --- a/src/main/java/baritone/bot/pathing/movement/movements/MovementFall.java +++ b/src/main/java/baritone/bot/pathing/movement/movements/MovementFall.java @@ -50,10 +50,17 @@ public class MovementFall extends Movement { if (!BlockStateInterface.isWater(dest) && src.getY() - dest.getY() > 3) { placeBucketCost = ActionCosts.PLACE_ONE_BLOCK_COST; } - if (getTotalHardnessOfBlocksToBreak(context.getToolSet()) != 0) { + double frontTwo = MovementHelper.getMiningDurationTicks(context.getToolSet(), positionsToBreak[0]) + MovementHelper.getMiningDurationTicks(context.getToolSet(), positionsToBreak[1]); + if (frontTwo >= COST_INF) { return COST_INF; } - return WALK_OFF_BLOCK_COST + FALL_N_BLOCKS_COST[positionsToBreak.length - 1] + placeBucketCost; + for (int i = 2; i < positionsToBreak.length; i++) { + if (MovementHelper.getMiningDurationTicks(context.getToolSet(), positionsToBreak[i]) > 0) { + //can't break while falling + return COST_INF; + } + } + return WALK_OFF_BLOCK_COST + FALL_N_BLOCKS_COST[positionsToBreak.length - 1] + placeBucketCost + frontTwo; } @Override