diff --git a/src/main/java/baritone/bot/pathing/movement/MovementHelper.java b/src/main/java/baritone/bot/pathing/movement/MovementHelper.java index 7737ca1e..d542431e 100644 --- a/src/main/java/baritone/bot/pathing/movement/MovementHelper.java +++ b/src/main/java/baritone/bot/pathing/movement/MovementHelper.java @@ -56,6 +56,10 @@ public interface MovementHelper extends ActionCosts, Helper { */ static boolean canWalkThrough(BlockPos pos) { IBlockState state = BlockStateInterface.get(pos); + return canWalkThrough(pos, state); + } + + static boolean canWalkThrough(BlockPos pos, IBlockState state) { Block block = state.getBlock(); if (block instanceof BlockLilyPad || block instanceof BlockFire @@ -193,6 +197,7 @@ public interface MovementHelper extends ActionCosts, Helper { return new MovementDescend(pos, destDown); } } + System.out.println(dest + " descend distance!"); // we're clear for a fall 2 // let's see how far we can fall for (int fallHeight = 3; true; fallHeight++) { @@ -200,14 +205,15 @@ public interface MovementHelper extends ActionCosts, Helper { if (onto.getY() <= 0) { break; } - if (BlockStateInterface.isAir(onto)) { + IBlockState ontoBlock = BlockStateInterface.get(onto); + if (BlockStateInterface.isWater(ontoBlock.getBlock())) { + return new MovementFall(pos, onto); + } + if (canWalkThrough(onto, ontoBlock)) { continue; } - if (BlockStateInterface.isWater(onto)) { - return new MovementFall(pos, onto); - } - if (MovementHelper.canWalkOn(onto)) { - return new MovementFall(pos, onto); + if (canWalkOn(onto, ontoBlock)) { + return new MovementFall(pos, onto.up()); } break; } 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 c2b6cee2..c2147009 100644 --- a/src/main/java/baritone/bot/pathing/movement/movements/MovementFall.java +++ b/src/main/java/baritone/bot/pathing/movement/movements/MovementFall.java @@ -67,13 +67,13 @@ public class MovementFall extends Movement { case RUNNING: BlockPos playerFeet = playerFeet(); if (!BlockStateInterface.isWater(dest) && src.getY() - dest.getY() > 3) { - if(!player().inventory.hasItemStack(new ItemStack(new ItemBucket(Blocks.WATER)))) { + if (!player().inventory.hasItemStack(new ItemStack(new ItemBucket(Blocks.WATER)))) { state.setStatus(MovementStatus.UNREACHABLE); } player().inventory.currentItem = player().inventory.getSlotFor(new ItemStack(new ItemBucket(Blocks.WATER))); LookBehaviorUtils.reachable(dest).ifPresent(rotation -> - state.setInput(InputOverrideHandler.Input.CLICK_RIGHT, true) - .setTarget(new MovementTarget(rotation)) + state.setInput(InputOverrideHandler.Input.CLICK_RIGHT, true) + .setTarget(new MovementTarget(rotation)) ); } else { Rotation rotationToBlock = Utils.calcRotationFromVec3d(playerHead(), Utils.calcCenterFromCoords(dest, world())); diff --git a/src/main/java/baritone/bot/utils/BlockStateInterface.java b/src/main/java/baritone/bot/utils/BlockStateInterface.java index db763ded..2b51ac56 100644 --- a/src/main/java/baritone/bot/utils/BlockStateInterface.java +++ b/src/main/java/baritone/bot/utils/BlockStateInterface.java @@ -70,6 +70,10 @@ public class BlockStateInterface { return BlockStateInterface.getBlock(pos).equals(Blocks.AIR); } + public static boolean isAir(IBlockState state) { + return state.getBlock().equals(Blocks.AIR); + } + static boolean canFall(BlockPos pos) { return BlockStateInterface.get(pos).getBlock() instanceof BlockFalling; }