From 974a3416d86b714e10a0c324df7dfc722bd2bec6 Mon Sep 17 00:00:00 2001 From: Murat65536 Date: Thu, 8 May 2025 18:02:56 -0400 Subject: [PATCH] Integrate some magma block avoidance functionality. --- .../baritone/pathing/movement/MovementHelper.java | 15 ++++++++++++++- .../movement/movements/MovementAscend.java | 6 ++++++ .../movement/movements/MovementDescend.java | 3 +++ .../movement/movements/MovementDiagonal.java | 12 +++++++++--- .../movement/movements/MovementTraverse.java | 12 ++++++++---- 5 files changed, 40 insertions(+), 8 deletions(-) diff --git a/src/main/java/baritone/pathing/movement/MovementHelper.java b/src/main/java/baritone/pathing/movement/MovementHelper.java index 0fa326d51..db528de4a 100644 --- a/src/main/java/baritone/pathing/movement/MovementHelper.java +++ b/src/main/java/baritone/pathing/movement/MovementHelper.java @@ -50,6 +50,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; +import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -420,7 +421,7 @@ public interface MovementHelper extends ActionCosts, Helper { static Ternary canWalkOnBlockState(BlockState state) { Block block = state.getBlock(); - if (isBlockNormalCube(state) && block != Blocks.MAGMA_BLOCK && block != Blocks.BUBBLE_COLUMN && block != Blocks.HONEY_BLOCK) { + if (isBlockNormalCube(state) && block != Blocks.BUBBLE_COLUMN && block != Blocks.HONEY_BLOCK) { return YES; } if (block instanceof AzaleaBlock) { @@ -806,4 +807,16 @@ public interface MovementHelper extends ActionCosts, Helper { b == Blocks.LAVA || b == Blocks.WATER; } + + static List steppingOnBlocks(IPlayerContext ctx) { + List blocks = new ArrayList<>(); + for (byte x = -1; x <= 1; x++) { + for (byte z = -1; z <= 1; z++) { + if (ctx.player().getBoundingBox().intersects(Vec3.atLowerCornerOf(ctx.player().blockPosition()).add(x, 0, z), Vec3.atLowerCornerOf(ctx.player().blockPosition()).add(x + 1, 1, z + 1))) { + blocks.add(new BetterBlockPos(ctx.player().getBlockX() + x, ctx.player().getBlockY() - 1, ctx.player().getBlockZ() + z)); + } + } + } + return blocks; + } } diff --git a/src/main/java/baritone/pathing/movement/movements/MovementAscend.java b/src/main/java/baritone/pathing/movement/movements/MovementAscend.java index 717cd2e70..9b4899dd5 100644 --- a/src/main/java/baritone/pathing/movement/movements/MovementAscend.java +++ b/src/main/java/baritone/pathing/movement/movements/MovementAscend.java @@ -133,6 +133,8 @@ public class MovementAscend extends Movement { // jumpingFromBottomSlab must be false if (toPlace.getBlock() == Blocks.SOUL_SAND) { walk = WALK_ONE_OVER_SOUL_SAND_COST; + } else if (toPlace.getBlock() == Blocks.MAGMA_BLOCK) { + walk = SNEAK_ONE_BLOCK_COST; } else { walk = Math.max(JUMP_ONE_BLOCK_COST, WALK_ONE_BLOCK_COST); } @@ -188,6 +190,10 @@ public class MovementAscend extends Movement { return state; } MovementHelper.moveTowards(ctx, state, dest); + + if (jumpingOnto.getBlock() == Blocks.MAGMA_BLOCK) { + state.setInput(Input.SNEAK, true); + } if (MovementHelper.isBottomSlab(jumpingOnto) && !MovementHelper.isBottomSlab(BlockStateInterface.get(ctx, src.below()))) { return state; // don't jump while walking from a non double slab into a bottom slab } diff --git a/src/main/java/baritone/pathing/movement/movements/MovementDescend.java b/src/main/java/baritone/pathing/movement/movements/MovementDescend.java index 07d6d7d01..af9952242 100644 --- a/src/main/java/baritone/pathing/movement/movements/MovementDescend.java +++ b/src/main/java/baritone/pathing/movement/movements/MovementDescend.java @@ -255,6 +255,9 @@ public class MovementDescend extends Movement { double x = ctx.player().position().x - (src.getX() + 0.5); double z = ctx.player().position().z - (src.getZ() + 0.5); double fromStart = Math.sqrt(x * x + z * z); + + state.setInput(Input.SNEAK, BlockStateInterface.get(ctx, ctx.player().blockPosition().below()).getBlock() == Blocks.MAGMA_BLOCK); + if (!playerFeet.equals(dest) || ab > 0.25) { if (numTicks++ < 20 && fromStart < 1.25) { MovementHelper.moveTowards(ctx, state, fakeDest); diff --git a/src/main/java/baritone/pathing/movement/movements/MovementDiagonal.java b/src/main/java/baritone/pathing/movement/movements/MovementDiagonal.java index cf387d5c9..a7b535dc9 100644 --- a/src/main/java/baritone/pathing/movement/movements/MovementDiagonal.java +++ b/src/main/java/baritone/pathing/movement/movements/MovementDiagonal.java @@ -142,7 +142,10 @@ public class MovementDiagonal extends Movement { // For either possible soul sand, that affects half of our walking if (destWalkOn.getBlock() == Blocks.SOUL_SAND) { multiplier += (WALK_ONE_OVER_SOUL_SAND_COST - WALK_ONE_BLOCK_COST) / 2; - } else if (frostWalker) { + } else if (destWalkOn.getBlock() == Blocks.MAGMA_BLOCK) { + multiplier += (SNEAK_ONE_BLOCK_COST - WALK_ONE_BLOCK_COST) / 2; + } + else if (frostWalker) { // frostwalker lets us walk on water without the penalty } else if (destWalkOn.getBlock() == Blocks.WATER) { multiplier += context.walkOnWaterOnePenalty * SQRT_2; @@ -154,12 +157,15 @@ public class MovementDiagonal extends Movement { if (fromDownBlock == Blocks.SOUL_SAND) { multiplier += (WALK_ONE_OVER_SOUL_SAND_COST - WALK_ONE_BLOCK_COST) / 2; } + else if (fromDownBlock == Blocks.MAGMA_BLOCK) { + multiplier += (SNEAK_ONE_BLOCK_COST - WALK_ONE_BLOCK_COST) / 2; + } BlockState cuttingOver1 = context.get(x, y - 1, destZ); - if (cuttingOver1.getBlock() == Blocks.MAGMA_BLOCK || MovementHelper.isLava(cuttingOver1)) { + if (MovementHelper.isLava(cuttingOver1)) { return; } BlockState cuttingOver2 = context.get(destX, y - 1, z); - if (cuttingOver2.getBlock() == Blocks.MAGMA_BLOCK || MovementHelper.isLava(cuttingOver2)) { + if (MovementHelper.isLava(cuttingOver2)) { return; } boolean water = false; diff --git a/src/main/java/baritone/pathing/movement/movements/MovementTraverse.java b/src/main/java/baritone/pathing/movement/movements/MovementTraverse.java index cec3ca39a..b9b61da64 100644 --- a/src/main/java/baritone/pathing/movement/movements/MovementTraverse.java +++ b/src/main/java/baritone/pathing/movement/movements/MovementTraverse.java @@ -85,6 +85,7 @@ public class MovementTraverse extends Movement { if (frostWalker || MovementHelper.canWalkOn(context, destX, y - 1, destZ, destOn)) { //this is a walk, not a bridge double WC = WALK_ONE_BLOCK_COST; boolean water = false; + boolean sneaking = false; if (MovementHelper.isWater(pb0) || MovementHelper.isWater(pb1)) { WC = context.waterWalkSpeed; water = true; @@ -98,6 +99,9 @@ public class MovementTraverse extends Movement { } if (srcDownBlock == Blocks.SOUL_SAND) { WC += (WALK_ONE_OVER_SOUL_SAND_COST - WALK_ONE_BLOCK_COST) / 2; + } else if (srcDownBlock == Blocks.MAGMA_BLOCK) { + sneaking = true; + WC += (SNEAK_ONE_BLOCK_COST - WALK_ONE_BLOCK_COST) / 2; } } double hardness1 = MovementHelper.getMiningDurationTicks(context, destX, y, destZ, pb1, false); @@ -106,7 +110,7 @@ public class MovementTraverse extends Movement { } double hardness2 = MovementHelper.getMiningDurationTicks(context, destX, y + 1, destZ, pb0, true); // only include falling on the upper block to break if (hardness1 == 0 && hardness2 == 0) { - if (!water && context.canSprint) { + if (!water && !sneaking && context.canSprint) { // If there's nothing in the way, and this isn't water, and we aren't sneak placing // We can sprint =D // Don't check for soul sand, since we can sprint on that too @@ -213,12 +217,12 @@ public class MovementTraverse extends Movement { .setInput(Input.SPRINT, true); } - //sneak may have been set to true in the PREPPING state while mining an adjacent block - state.setInput(Input.SNEAK, false); - Block fd = BlockStateInterface.get(ctx, src.below()).getBlock(); boolean ladder = fd == Blocks.LADDER || fd == Blocks.VINE; + //sneak may have been set to true in the PREPPING state while mining an adjacent block, but we still want it to be true if the player is on magma + state.setInput(Input.SNEAK, MovementHelper.steppingOnBlocks(ctx).stream().anyMatch(block -> BlockStateInterface.get(ctx, block).getBlock() == Blocks.MAGMA_BLOCK)); + if (pb0.getBlock() instanceof DoorBlock || pb1.getBlock() instanceof DoorBlock) { boolean notPassable = pb0.getBlock() instanceof DoorBlock && !MovementHelper.isDoorPassable(ctx, src, dest) || pb1.getBlock() instanceof DoorBlock && !MovementHelper.isDoorPassable(ctx, dest, src); boolean canOpen = !(Blocks.IRON_DOOR.equals(pb0.getBlock()) || Blocks.IRON_DOOR.equals(pb1.getBlock()));