From 9693c4d61698b8726409834ffc5fec114635c083 Mon Sep 17 00:00:00 2001 From: UndercoverGoose <53491740+UndercoverGoose@users.noreply.github.com> Date: Sun, 23 Nov 2025 22:36:12 -0500 Subject: [PATCH 01/14] add jumping to place block above head, add toggle for said jumping, add ability to run anywhere --- .../cigarette/module/bedwars/AutoBlockIn.java | 73 +++++++++++++++---- .../dev/cigarette/precomputed/BlockIn.java | 2 +- 2 files changed, 61 insertions(+), 14 deletions(-) diff --git a/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java b/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java index d1f25523..0f4672be 100644 --- a/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java +++ b/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java @@ -7,12 +7,15 @@ import dev.cigarette.gui.widget.ToggleWidget; import dev.cigarette.helper.KeybindHelper; import dev.cigarette.lib.PlayerEntityL; +import dev.cigarette.lib.Raycast; import dev.cigarette.module.TickModule; import dev.cigarette.precomputed.BlockIn; +import net.minecraft.block.ShapeContext; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.world.ClientWorld; import net.minecraft.item.ItemStack; +import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Vec3d; @@ -29,17 +32,21 @@ public class AutoBlockIn extends TickModule { private final ToggleWidget switchToBlocks = new ToggleWidget("Switch to Blocks", "Automatically switches to blocks once activated.").withDefaultState(true); private final ToggleWidget switchToTool = new ToggleWidget("Switch to Tools", "Automatically switches to a tool once finished.").withDefaultState(true); private final SliderWidget variation = new SliderWidget("Variation", "Applies randomness to the delay between block places.").withBounds(0, 1, 4); + private final ToggleWidget jumpEnabled = new ToggleWidget("Jump", "Jumps immediately to ensure the block above you is placed.").withDefaultState(true); + private final ToggleWidget ignoreBeds = new ToggleWidget("Ignore Bed Proximity", "Ignores bed proximity and allows activation anywhere in bedwars.").withDefaultState(false); private boolean running = false; private BlockPos originalPos = null; + private Vec3d originalPosVec = null; private float originalYaw = 0; private float originalPitch = 0; private Vec3d previousVector = null; private int cooldownTicks = 0; + private boolean hasJumped = false; private AutoBlockIn(String id, String name, String tooltip) { super(ToggleWidget::module, id, name, tooltip); - this.setChildren(keybind, speed, proximityToBeds, switchToBlocks, switchToTool, variation); + this.setChildren(keybind, speed, proximityToBeds, switchToBlocks, switchToTool, variation, jumpEnabled, ignoreBeds); keybind.registerConfigKey(id + ".key"); speed.registerConfigKey(id + ".speed"); proximityToBeds.registerConfigKey(id + ".proximity"); @@ -48,15 +55,18 @@ private AutoBlockIn(String id, String name, String tooltip) { variation.registerConfigKey(id + ".variation"); } - private void enable(@NotNull ClientPlayerEntity player) { + private void enable(@NotNull ClientWorld world, @NotNull ClientPlayerEntity player) { running = true; + hasJumped = false; originalPos = player.getBlockPos(); + originalPosVec = player.getPos(); originalYaw = player.getYaw(); originalPitch = player.getPitch(); } private void disable(@NotNull ClientPlayerEntity player) { running = false; + hasJumped = false; player.setYaw(originalYaw); player.setPitch(originalPitch); previousVector = null; @@ -85,7 +95,7 @@ private void disableAndSwitch(@NotNull ClientPlayerEntity player) { Vec3d eye = player.getEyePos(); double distance = faceCenter.distanceTo(eye); - if (distance > 3) continue; + if (distance > 4) continue; Direction face = Direction.fromVector(offset, Direction.UP).getOpposite(); if (face == Direction.UP && eye.getY() <= faceCenter.getY()) continue; @@ -95,16 +105,24 @@ private void disableAndSwitch(@NotNull ClientPlayerEntity player) { if (face == Direction.EAST && eye.getX() <= faceCenter.getX()) continue; if (face == Direction.WEST && eye.getX() >= faceCenter.getX()) continue; + BlockHitResult res = Raycast.raycastBlock(eye, faceCenter, ShapeContext.absent()); + if (res.getType() != BlockHitResult.Type.MISS) { + if (!res.getBlockPos().equals(neighborPos)) continue; + } + if (closest == null || distance < closestDistance) { - closest = new ReachableNeighbor(neighborPos, face, faceCenter); + closest = new ReachableNeighbor(neighborPos, face, faceCenter, distance); closestDistance = distance; } } return closest; } - private @Nullable Vec3d getNextBlockPlaceVector(@NotNull ClientWorld world, @NotNull ClientPlayerEntity player) { - if (!player.getBlockPos().equals(originalPos)) return null; + private @Nullable NextVector getNextBlockPlaceVector(@NotNull ClientWorld world, @NotNull ClientPlayerEntity player) { + BlockPos newBlockPos = player.getBlockPos(); + if (newBlockPos.getX() != originalPos.getX() || newBlockPos.getZ() != originalPos.getZ() || Math.abs(newBlockPos.getY() - originalPos.getY()) > 2) return null; + ReachableNeighbor closest = null; + ReachableNeighbor jumpNeighbor = null; for (Vec3i offset : BlockIn.PLAYER_NEIGHBORS) { BlockPos pos = originalPos.add(offset); if (!world.getBlockState(pos).isAir()) continue; @@ -112,7 +130,19 @@ private void disableAndSwitch(@NotNull ClientPlayerEntity player) { ReachableNeighbor neighbor = getReachableNeighbor(world, player, pos); if (neighbor == null) continue; - return neighbor.faceCenter().subtract(player.getEyePos()).normalize(); + if (offset.getX() == 0 && offset.getZ() == 0) { + jumpNeighbor = neighbor; + continue; + } + if (closest == null || neighbor.distance < closest.distance) { + closest = neighbor; + } + } + if (closest != null) { + return new NextVector(closest.faceCenter().subtract(player.getEyePos()).normalize(), false); + } + if (jumpNeighbor != null) { + return new NextVector(jumpNeighbor.faceCenter().subtract(player.getEyePos()).normalize(), true); } return null; } @@ -121,10 +151,14 @@ private void disableAndSwitch(@NotNull ClientPlayerEntity player) { protected void onEnabledTick(MinecraftClient client, @NotNull ClientWorld world, @NotNull ClientPlayerEntity player) { if (!running) { if (!keybind.getKeybind().wasPhysicallyPressed()) return; + if (ignoreBeds.getRawState()) { + enable(world, player); + return; + } BlockPos pos = player.getBlockPos(); for (BedwarsAgent.PersistentBed bed : BedwarsAgent.getVisibleBeds()) { if (bed.head().isWithinDistance(pos, proximityToBeds.getRawState()) || bed.foot().isWithinDistance(pos, proximityToBeds.getRawState())) { - enable(player); + enable(world, player); return; } } @@ -137,18 +171,28 @@ protected void onEnabledTick(MinecraftClient client, @NotNull ClientWorld world, return; } - Vec3d nextLookVector = getNextBlockPlaceVector(world, player); - if (nextLookVector == null || (previousVector != null && previousVector.equals(nextLookVector))) { + NextVector next = getNextBlockPlaceVector(world, player); + if (next == null || (previousVector != null && previousVector.equals(next.lookVector))) { + if (jumpEnabled.getRawState() && player.getPos().getY() > originalPosVec.getY()) { + return; + } disableAndSwitch(player); return; } - previousVector = nextLookVector; + previousVector = next.lookVector; - PlayerEntityL.setRotationVector(player, nextLookVector); + PlayerEntityL.setRotationVector(player, next.lookVector); KeybindHelper.KEY_USE_ITEM.press(); int rand = variation.getRawState().intValue() > 0 ? (int) (Math.random() * variation.getRawState().intValue()) : 0; cooldownTicks = 16 - speed.getRawState().intValue() + rand; + + if (jumpEnabled.getRawState() && !hasJumped && !next.aboveHead) { + if (world.getBlockState(BlockPos.ofFloored(player.getPos().add(0, 2, 0))).isAir()) { + KeybindHelper.KEY_JUMP.holdForTicks(1); + hasJumped = true; + } + } } @Override @@ -156,6 +200,9 @@ public boolean inValidGame() { return GameDetector.rootGame == GameDetector.ParentGame.BEDWARS && GameDetector.subGame == GameDetector.ChildGame.INSTANCED_BEDWARS; } - private record ReachableNeighbor(BlockPos pos, Direction side, Vec3d faceCenter) { + private record ReachableNeighbor(BlockPos pos, Direction side, Vec3d faceCenter, double distance) { + } + + private record NextVector(Vec3d lookVector, boolean aboveHead) { } } diff --git a/src/main/java/dev/cigarette/precomputed/BlockIn.java b/src/main/java/dev/cigarette/precomputed/BlockIn.java index 2e3503b0..10edb2dd 100644 --- a/src/main/java/dev/cigarette/precomputed/BlockIn.java +++ b/src/main/java/dev/cigarette/precomputed/BlockIn.java @@ -3,6 +3,6 @@ import net.minecraft.util.math.Vec3i; public class BlockIn { - public static final Vec3i[] PLAYER_NEIGHBORS = new Vec3i[]{new Vec3i(1, 0, 0), new Vec3i(-1, 0, 0), new Vec3i(1, -1, 0), new Vec3i(-1, -1, 0), new Vec3i(0, 0, 1), new Vec3i(0, 0, -1), new Vec3i(0, -1, 1), new Vec3i(0, -1, -1), new Vec3i(1, 1, 0), new Vec3i(-1, 1, 0), new Vec3i(0, 1, 1), new Vec3i(0, 1, -1), new Vec3i(0, 2, 0)}; + public static final Vec3i[] PLAYER_NEIGHBORS = new Vec3i[]{new Vec3i(1, 0, 0), new Vec3i(-1, 0, 0), new Vec3i(1, -1, 0), new Vec3i(-1, -1, 0), new Vec3i(1, -2, 0), new Vec3i(-1, -2, 0), new Vec3i(0, 0, 1), new Vec3i(0, 0, -1), new Vec3i(0, -1, 1), new Vec3i(0, -1, -1), new Vec3i(0, -2, 1), new Vec3i(0, -2, -1), new Vec3i(1, 1, 0), new Vec3i(-1, 1, 0), new Vec3i(0, 1, 1), new Vec3i(0, 1, -1), new Vec3i(1, 2, 0), new Vec3i(-1, 2, 0), new Vec3i(0, 2, 1), new Vec3i(0, 2, -1), new Vec3i(0, 2, 0)}; public static final Vec3i[] BLOCK_NEIGHBORS = new Vec3i[]{new Vec3i(1, 0, 0), new Vec3i(-1, 0, 0), new Vec3i(0, 0, 1), new Vec3i(0, 0, -1), new Vec3i(0, 1, 0), new Vec3i(0, -1, 0)}; } From c1c5faa74fde21847bd354cc8832f08ba7dfe4eb Mon Sep 17 00:00:00 2001 From: UndercoverGoose <53491740+UndercoverGoose@users.noreply.github.com> Date: Tue, 25 Nov 2025 13:13:41 -0500 Subject: [PATCH 02/14] add option to prioritize the strongest block to block in with --- .../cigarette/module/bedwars/AutoBlockIn.java | 88 +++++++++++++++++-- 1 file changed, 83 insertions(+), 5 deletions(-) diff --git a/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java b/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java index 0f4672be..c4ce3655 100644 --- a/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java +++ b/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java @@ -2,18 +2,18 @@ import dev.cigarette.GameDetector; import dev.cigarette.agent.BedwarsAgent; -import dev.cigarette.gui.widget.KeybindWidget; -import dev.cigarette.gui.widget.SliderWidget; -import dev.cigarette.gui.widget.ToggleWidget; +import dev.cigarette.gui.widget.*; import dev.cigarette.helper.KeybindHelper; import dev.cigarette.lib.PlayerEntityL; import dev.cigarette.lib.Raycast; import dev.cigarette.module.TickModule; import dev.cigarette.precomputed.BlockIn; +import net.minecraft.block.BlockState; import net.minecraft.block.ShapeContext; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.world.ClientWorld; +import net.minecraft.item.BlockItem; import net.minecraft.item.ItemStack; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; @@ -35,6 +35,16 @@ public class AutoBlockIn extends TickModule { private final ToggleWidget jumpEnabled = new ToggleWidget("Jump", "Jumps immediately to ensure the block above you is placed.").withDefaultState(true); private final ToggleWidget ignoreBeds = new ToggleWidget("Ignore Bed Proximity", "Ignores bed proximity and allows activation anywhere in bedwars.").withDefaultState(false); + private final TextWidget allowedBlocksText = new TextWidget("Block Config", "Configure which blocks can be used by the module.").centered(false); + private final DropdownWidget allowedBlocks = new DropdownWidget<>("", null); + private final ToggleWidget prioritizeStrongest = new ToggleWidget("Prioritize Strongest", "Prioritizes stronger blocks over weaker ones when placing.\nOrder: Obsidian > Endstone > Wood > Clay > Wool > Glass").withDefaultState(true); + private final ToggleWidget enableObsidian = new ToggleWidget("Use Obsidian", "Allows the module to use obsidian blocks.").withDefaultState(false); + private final ToggleWidget enableEndstone = new ToggleWidget("Use Endstone", "Allows the module to use endstone blocks.").withDefaultState(true); + private final ToggleWidget enableWood = new ToggleWidget("Use Wood", "Allows the module to use wood blocks.").withDefaultState(true); + private final ToggleWidget enableClay = new ToggleWidget("Use Clay", "Allows the module to use clay blocks.").withDefaultState(true); + private final ToggleWidget enableWool = new ToggleWidget("Use Wool", "Allows the module to use wool blocks.").withDefaultState(true); + private final ToggleWidget enableGlass = new ToggleWidget("Use Glass", "Allows the module to use glass blocks.").withDefaultState(false); + private boolean running = false; private BlockPos originalPos = null; private Vec3d originalPosVec = null; @@ -46,13 +56,22 @@ public class AutoBlockIn extends TickModule { private AutoBlockIn(String id, String name, String tooltip) { super(ToggleWidget::module, id, name, tooltip); - this.setChildren(keybind, speed, proximityToBeds, switchToBlocks, switchToTool, variation, jumpEnabled, ignoreBeds); + allowedBlocks.setHeader(allowedBlocksText); + allowedBlocks.setChildren(prioritizeStrongest, enableObsidian, enableEndstone, enableWood, enableClay, enableWool, enableGlass); + this.setChildren(keybind, speed, proximityToBeds, switchToBlocks, switchToTool, variation, jumpEnabled, ignoreBeds, allowedBlocks); keybind.registerConfigKey(id + ".key"); speed.registerConfigKey(id + ".speed"); proximityToBeds.registerConfigKey(id + ".proximity"); switchToBlocks.registerConfigKey(id + ".switchblocks"); switchToTool.registerConfigKey(id + ".switchtool"); variation.registerConfigKey(id + ".variation"); + prioritizeStrongest.registerConfigKey(id + ".prioritizestrongest"); + enableObsidian.registerConfigKey(id + ".allow.obsidian"); + enableEndstone.registerConfigKey(id + ".allow.endstone"); + enableWood.registerConfigKey(id + ".allow.wood"); + enableClay.registerConfigKey(id + ".allow.clay"); + enableWool.registerConfigKey(id + ".allow.wool"); + enableGlass.registerConfigKey(id + ".allow.glass"); } private void enable(@NotNull ClientWorld world, @NotNull ClientPlayerEntity player) { @@ -147,6 +166,34 @@ private void disableAndSwitch(@NotNull ClientPlayerEntity player) { return null; } + private boolean switchToNextStackOfBlocks(@NotNull ClientPlayerEntity player) { + int bestSlot = 0; + BlockPriority bestBlock = null; + for (int i = 0; i < 9; i++) { + BlockPriority block = BlockPriority.fromStack(player.getInventory().getStack(i)); + if (!block.isBedwarsBlock()) continue; + if (!prioritizeStrongest.getRawState()) { + player.getInventory().setSelectedSlot(i); + return true; + } + if (block == BlockPriority.OBSIDIAN && !enableObsidian.getRawState()) continue; + if (block == BlockPriority.ENDSTONE && !enableEndstone.getRawState()) continue; + if (block == BlockPriority.WOOD && !enableWood.getRawState()) continue; + if (block == BlockPriority.CLAY && !enableClay.getRawState()) continue; + if (block == BlockPriority.WOOL && !enableWool.getRawState()) continue; + if (block == BlockPriority.GLASS && !enableGlass.getRawState()) continue; + if (bestBlock == null || block.strongerThan(bestBlock)) { + bestSlot = i; + bestBlock = block; + } + } + if (bestBlock != null) { + player.getInventory().setSelectedSlot(bestSlot); + return true; + } + return false; + } + @Override protected void onEnabledTick(MinecraftClient client, @NotNull ClientWorld world, @NotNull ClientPlayerEntity player) { if (!running) { @@ -166,7 +213,7 @@ protected void onEnabledTick(MinecraftClient client, @NotNull ClientWorld world, } if (--cooldownTicks > 0) return; - if (!BedwarsAgent.isBlock(player.getMainHandStack()) && (!switchToBlocks.getRawState() || !BedwarsAgent.switchToNextStackOfBlocks(player))) { + if (!switchToBlocks.getRawState() || !switchToNextStackOfBlocks(player)) { disable(player); return; } @@ -205,4 +252,35 @@ private record ReachableNeighbor(BlockPos pos, Direction side, Vec3d faceCenter, private record NextVector(Vec3d lookVector, boolean aboveHead) { } + + private enum BlockPriority { + OBSIDIAN(10), ENDSTONE(8), WOOD(6), CLAY(4), WOOL(2), GLASS(1), NONE(0); + + private int id; + + BlockPriority(int id) { + this.id = id; + } + + public boolean isBedwarsBlock() { + return this != NONE; + } + + public boolean strongerThan(BlockPriority other) { + return this.id > other.id; + } + + public static BlockPriority fromStack(ItemStack item) { + if (item.getItem() instanceof BlockItem blockItem) { + BlockState state = blockItem.getBlock().getDefaultState(); + if (BedwarsAgent.isObsidian(state)) return OBSIDIAN; + if (BedwarsAgent.isEndStone(state)) return ENDSTONE; + if (BedwarsAgent.isWood(state)) return WOOD; + if (BedwarsAgent.isClay(state)) return CLAY; + if (BedwarsAgent.isWool(state)) return WOOL; + if (BedwarsAgent.isGlass(state)) return GLASS; + } + return NONE; + } + } } From 69913557a8e97e96768f84b38fb96a29d3959fe3 Mon Sep 17 00:00:00 2001 From: UndercoverGoose <53491740+UndercoverGoose@users.noreply.github.com> Date: Tue, 25 Nov 2025 13:14:14 -0500 Subject: [PATCH 03/14] fix: ignore bed prox state does not persist --- src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java b/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java index c4ce3655..7661841e 100644 --- a/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java +++ b/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java @@ -65,6 +65,7 @@ private AutoBlockIn(String id, String name, String tooltip) { switchToBlocks.registerConfigKey(id + ".switchblocks"); switchToTool.registerConfigKey(id + ".switchtool"); variation.registerConfigKey(id + ".variation"); + ignoreBeds.registerConfigKey(id + ".ignorebeds"); prioritizeStrongest.registerConfigKey(id + ".prioritizestrongest"); enableObsidian.registerConfigKey(id + ".allow.obsidian"); enableEndstone.registerConfigKey(id + ".allow.endstone"); From 6b6d5244a45b6999fde9f810b2e7b701a619d5f2 Mon Sep 17 00:00:00 2001 From: UndercoverGoose <53491740+UndercoverGoose@users.noreply.github.com> Date: Tue, 25 Nov 2025 13:25:41 -0500 Subject: [PATCH 04/14] reorder the options to make more sense --- src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java b/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java index 7661841e..90a0997e 100644 --- a/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java +++ b/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java @@ -58,7 +58,7 @@ private AutoBlockIn(String id, String name, String tooltip) { super(ToggleWidget::module, id, name, tooltip); allowedBlocks.setHeader(allowedBlocksText); allowedBlocks.setChildren(prioritizeStrongest, enableObsidian, enableEndstone, enableWood, enableClay, enableWool, enableGlass); - this.setChildren(keybind, speed, proximityToBeds, switchToBlocks, switchToTool, variation, jumpEnabled, ignoreBeds, allowedBlocks); + this.setChildren(keybind, allowedBlocks, switchToBlocks, switchToTool, jumpEnabled, speed, variation, proximityToBeds, ignoreBeds); keybind.registerConfigKey(id + ".key"); speed.registerConfigKey(id + ".speed"); proximityToBeds.registerConfigKey(id + ".proximity"); From 29d4c9ef33ff9c0d68ab436493f8d75b9a73a0c1 Mon Sep 17 00:00:00 2001 From: UndercoverGoose <53491740+UndercoverGoose@users.noreply.github.com> Date: Tue, 25 Nov 2025 13:33:48 -0500 Subject: [PATCH 05/14] remove ignore prox toggle in favor of setting the prox slider to 0 --- .../java/dev/cigarette/module/bedwars/AutoBlockIn.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java b/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java index 90a0997e..555dc257 100644 --- a/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java +++ b/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java @@ -28,12 +28,11 @@ public class AutoBlockIn extends TickModule { private final KeybindWidget keybind = new KeybindWidget("Keybind", "A key to trigger the block in module."); private final SliderWidget speed = new SliderWidget("Speed", "The higher the speed, the less time spent between adjusting the camera and placing blocks.").withBounds(0, 12, 15); - private final SliderWidget proximityToBeds = new SliderWidget("Max Proximity", "How many blocks close you need to be to any beds for the module to be allowed to activate.").withBounds(1, 5, 9); + private final SliderWidget proximityToBeds = new SliderWidget("Max Proximity", "How many blocks close you need to be to any beds for the module to be allowed to activate. Set to 0 to remove the proximity requirement entirely, allowing you to block-in anywhere.").withBounds(0, 5, 9); private final ToggleWidget switchToBlocks = new ToggleWidget("Switch to Blocks", "Automatically switches to blocks once activated.").withDefaultState(true); private final ToggleWidget switchToTool = new ToggleWidget("Switch to Tools", "Automatically switches to a tool once finished.").withDefaultState(true); private final SliderWidget variation = new SliderWidget("Variation", "Applies randomness to the delay between block places.").withBounds(0, 1, 4); private final ToggleWidget jumpEnabled = new ToggleWidget("Jump", "Jumps immediately to ensure the block above you is placed.").withDefaultState(true); - private final ToggleWidget ignoreBeds = new ToggleWidget("Ignore Bed Proximity", "Ignores bed proximity and allows activation anywhere in bedwars.").withDefaultState(false); private final TextWidget allowedBlocksText = new TextWidget("Block Config", "Configure which blocks can be used by the module.").centered(false); private final DropdownWidget allowedBlocks = new DropdownWidget<>("", null); @@ -58,14 +57,13 @@ private AutoBlockIn(String id, String name, String tooltip) { super(ToggleWidget::module, id, name, tooltip); allowedBlocks.setHeader(allowedBlocksText); allowedBlocks.setChildren(prioritizeStrongest, enableObsidian, enableEndstone, enableWood, enableClay, enableWool, enableGlass); - this.setChildren(keybind, allowedBlocks, switchToBlocks, switchToTool, jumpEnabled, speed, variation, proximityToBeds, ignoreBeds); + this.setChildren(keybind, allowedBlocks, switchToBlocks, switchToTool, jumpEnabled, speed, variation, proximityToBeds); keybind.registerConfigKey(id + ".key"); speed.registerConfigKey(id + ".speed"); proximityToBeds.registerConfigKey(id + ".proximity"); switchToBlocks.registerConfigKey(id + ".switchblocks"); switchToTool.registerConfigKey(id + ".switchtool"); variation.registerConfigKey(id + ".variation"); - ignoreBeds.registerConfigKey(id + ".ignorebeds"); prioritizeStrongest.registerConfigKey(id + ".prioritizestrongest"); enableObsidian.registerConfigKey(id + ".allow.obsidian"); enableEndstone.registerConfigKey(id + ".allow.endstone"); @@ -199,7 +197,7 @@ private boolean switchToNextStackOfBlocks(@NotNull ClientPlayerEntity player) { protected void onEnabledTick(MinecraftClient client, @NotNull ClientWorld world, @NotNull ClientPlayerEntity player) { if (!running) { if (!keybind.getKeybind().wasPhysicallyPressed()) return; - if (ignoreBeds.getRawState()) { + if (proximityToBeds.getRawState() == 0) { enable(world, player); return; } From 4368dafae73791b672fa97bc905774f1efbde123 Mon Sep 17 00:00:00 2001 From: UndercoverGoose <53491740+UndercoverGoose@users.noreply.github.com> Date: Tue, 25 Nov 2025 13:54:44 -0500 Subject: [PATCH 06/14] move block switcher to BedwarsAgent so it can be used elsewhere --- .../dev/cigarette/agent/BedwarsAgent.java | 64 +++++++++++++++++++ .../cigarette/module/bedwars/AutoBlockIn.java | 59 +---------------- 2 files changed, 65 insertions(+), 58 deletions(-) diff --git a/src/main/java/dev/cigarette/agent/BedwarsAgent.java b/src/main/java/dev/cigarette/agent/BedwarsAgent.java index 9545c280..b08ff2c4 100644 --- a/src/main/java/dev/cigarette/agent/BedwarsAgent.java +++ b/src/main/java/dev/cigarette/agent/BedwarsAgent.java @@ -126,6 +126,36 @@ public static boolean switchToNextStackOfBlocks(ClientPlayerEntity player) { return false; } + public static boolean switchToNextStackOfBlocks(@NotNull ClientPlayerEntity player, BlockConfig config) { + if (config.selectFirst && isBlock(player.getMainHandStack())) return true; + int bestSlot = 0; + BlockPriority bestBlock = null; + for (int i = 0; i < 9; i++) { + BlockPriority block = BlockPriority.fromStack(player.getInventory().getStack(i)); + if (!block.isBedwarsBlock()) continue; + if (config.selectFirst) { + player.getInventory().setSelectedSlot(i); + return true; + } + if (block == BlockPriority.OBSIDIAN && !config.enableObsidian) continue; + if (block == BlockPriority.ENDSTONE && !config.enableEndstone) continue; + if (block == BlockPriority.WOOD && !config.enableWood) continue; + if (block == BlockPriority.CLAY && !config.enableClay) continue; + if (block == BlockPriority.WOOL && !config.enableWool) continue; + if (block == BlockPriority.GLASS && !config.enableGlass) continue; + + if (bestBlock == null || (block.strongerThan(bestBlock) == config.orderStrongest)) { + bestSlot = i; + bestBlock = block; + } + } + if (bestBlock != null) { + player.getInventory().setSelectedSlot(bestSlot); + return true; + } + return false; + } + @Override public boolean inValidGame() { return GameDetector.rootGame == GameDetector.ParentGame.BEDWARS; @@ -159,4 +189,38 @@ public boolean contains(BlockPos pos) { return this.head.equals(pos) || this.foot.equals(pos); } } + + private enum BlockPriority { + OBSIDIAN(10), ENDSTONE(8), WOOD(6), CLAY(4), WOOL(2), GLASS(1), NONE(0); + + private final int id; + + BlockPriority(int id) { + this.id = id; + } + + public boolean isBedwarsBlock() { + return this != NONE; + } + + public boolean strongerThan(BlockPriority other) { + return this.id > other.id; + } + + public static BlockPriority fromStack(ItemStack item) { + if (item.getItem() instanceof BlockItem blockItem) { + BlockState state = blockItem.getBlock().getDefaultState(); + if (BedwarsAgent.isObsidian(state)) return OBSIDIAN; + if (BedwarsAgent.isEndStone(state)) return ENDSTONE; + if (BedwarsAgent.isWood(state)) return WOOD; + if (BedwarsAgent.isClay(state)) return CLAY; + if (BedwarsAgent.isWool(state)) return WOOL; + if (BedwarsAgent.isGlass(state)) return GLASS; + } + return NONE; + } + } + + public record BlockConfig(boolean enableObsidian, boolean enableEndstone, boolean enableWood, boolean enableClay, boolean enableWool, boolean enableGlass, boolean orderStrongest, boolean selectFirst) { + } } diff --git a/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java b/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java index 555dc257..edc62972 100644 --- a/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java +++ b/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java @@ -8,12 +8,10 @@ import dev.cigarette.lib.Raycast; import dev.cigarette.module.TickModule; import dev.cigarette.precomputed.BlockIn; -import net.minecraft.block.BlockState; import net.minecraft.block.ShapeContext; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.world.ClientWorld; -import net.minecraft.item.BlockItem; import net.minecraft.item.ItemStack; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; @@ -166,31 +164,7 @@ private void disableAndSwitch(@NotNull ClientPlayerEntity player) { } private boolean switchToNextStackOfBlocks(@NotNull ClientPlayerEntity player) { - int bestSlot = 0; - BlockPriority bestBlock = null; - for (int i = 0; i < 9; i++) { - BlockPriority block = BlockPriority.fromStack(player.getInventory().getStack(i)); - if (!block.isBedwarsBlock()) continue; - if (!prioritizeStrongest.getRawState()) { - player.getInventory().setSelectedSlot(i); - return true; - } - if (block == BlockPriority.OBSIDIAN && !enableObsidian.getRawState()) continue; - if (block == BlockPriority.ENDSTONE && !enableEndstone.getRawState()) continue; - if (block == BlockPriority.WOOD && !enableWood.getRawState()) continue; - if (block == BlockPriority.CLAY && !enableClay.getRawState()) continue; - if (block == BlockPriority.WOOL && !enableWool.getRawState()) continue; - if (block == BlockPriority.GLASS && !enableGlass.getRawState()) continue; - if (bestBlock == null || block.strongerThan(bestBlock)) { - bestSlot = i; - bestBlock = block; - } - } - if (bestBlock != null) { - player.getInventory().setSelectedSlot(bestSlot); - return true; - } - return false; + return BedwarsAgent.switchToNextStackOfBlocks(player, new BedwarsAgent.BlockConfig(enableObsidian.getRawState(), enableEndstone.getRawState(), enableWood.getRawState(), enableClay.getRawState(), enableWool.getRawState(), enableGlass.getRawState(), prioritizeStrongest.getRawState(), !prioritizeStrongest.getRawState())); } @Override @@ -251,35 +225,4 @@ private record ReachableNeighbor(BlockPos pos, Direction side, Vec3d faceCenter, private record NextVector(Vec3d lookVector, boolean aboveHead) { } - - private enum BlockPriority { - OBSIDIAN(10), ENDSTONE(8), WOOD(6), CLAY(4), WOOL(2), GLASS(1), NONE(0); - - private int id; - - BlockPriority(int id) { - this.id = id; - } - - public boolean isBedwarsBlock() { - return this != NONE; - } - - public boolean strongerThan(BlockPriority other) { - return this.id > other.id; - } - - public static BlockPriority fromStack(ItemStack item) { - if (item.getItem() instanceof BlockItem blockItem) { - BlockState state = blockItem.getBlock().getDefaultState(); - if (BedwarsAgent.isObsidian(state)) return OBSIDIAN; - if (BedwarsAgent.isEndStone(state)) return ENDSTONE; - if (BedwarsAgent.isWood(state)) return WOOD; - if (BedwarsAgent.isClay(state)) return CLAY; - if (BedwarsAgent.isWool(state)) return WOOL; - if (BedwarsAgent.isGlass(state)) return GLASS; - } - return NONE; - } - } } From e1e1deb0ac2053586614d35881991ef8ec19b622 Mon Sep 17 00:00:00 2001 From: UndercoverGoose <53491740+UndercoverGoose@users.noreply.github.com> Date: Tue, 25 Nov 2025 14:13:45 -0500 Subject: [PATCH 07/14] feat: place weak blocks on player non-adjacent positions --- .../cigarette/module/bedwars/AutoBlockIn.java | 26 ++++++++++++------- .../dev/cigarette/precomputed/BlockIn.java | 8 ++++++ 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java b/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java index edc62972..099829bf 100644 --- a/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java +++ b/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java @@ -35,6 +35,7 @@ public class AutoBlockIn extends TickModule { private final TextWidget allowedBlocksText = new TextWidget("Block Config", "Configure which blocks can be used by the module.").centered(false); private final DropdownWidget allowedBlocks = new DropdownWidget<>("", null); private final ToggleWidget prioritizeStrongest = new ToggleWidget("Prioritize Strongest", "Prioritizes stronger blocks over weaker ones when placing.\nOrder: Obsidian > Endstone > Wood > Clay > Wool > Glass").withDefaultState(true); + private final ToggleWidget weakNonAdjacent = new ToggleWidget("Weak Non-Adjacent", "Places the weakest blocks on positions not immediately next to or above the player.").withDefaultState(true); private final ToggleWidget enableObsidian = new ToggleWidget("Use Obsidian", "Allows the module to use obsidian blocks.").withDefaultState(false); private final ToggleWidget enableEndstone = new ToggleWidget("Use Endstone", "Allows the module to use endstone blocks.").withDefaultState(true); private final ToggleWidget enableWood = new ToggleWidget("Use Wood", "Allows the module to use wood blocks.").withDefaultState(true); @@ -54,7 +55,7 @@ public class AutoBlockIn extends TickModule { private AutoBlockIn(String id, String name, String tooltip) { super(ToggleWidget::module, id, name, tooltip); allowedBlocks.setHeader(allowedBlocksText); - allowedBlocks.setChildren(prioritizeStrongest, enableObsidian, enableEndstone, enableWood, enableClay, enableWool, enableGlass); + allowedBlocks.setChildren(prioritizeStrongest, weakNonAdjacent, enableObsidian, enableEndstone, enableWood, enableClay, enableWool, enableGlass); this.setChildren(keybind, allowedBlocks, switchToBlocks, switchToTool, jumpEnabled, speed, variation, proximityToBeds); keybind.registerConfigKey(id + ".key"); speed.registerConfigKey(id + ".speed"); @@ -63,6 +64,7 @@ private AutoBlockIn(String id, String name, String tooltip) { switchToTool.registerConfigKey(id + ".switchtool"); variation.registerConfigKey(id + ".variation"); prioritizeStrongest.registerConfigKey(id + ".prioritizestrongest"); + weakNonAdjacent.registerConfigKey(id + ".weaknonadjacent"); enableObsidian.registerConfigKey(id + ".allow.obsidian"); enableEndstone.registerConfigKey(id + ".allow.endstone"); enableWood.registerConfigKey(id + ".allow.wood"); @@ -138,6 +140,7 @@ private void disableAndSwitch(@NotNull ClientPlayerEntity player) { BlockPos newBlockPos = player.getBlockPos(); if (newBlockPos.getX() != originalPos.getX() || newBlockPos.getZ() != originalPos.getZ() || Math.abs(newBlockPos.getY() - originalPos.getY()) > 2) return null; ReachableNeighbor closest = null; + Vec3i closestOffset = null; ReachableNeighbor jumpNeighbor = null; for (Vec3i offset : BlockIn.PLAYER_NEIGHBORS) { BlockPos pos = originalPos.add(offset); @@ -152,13 +155,14 @@ private void disableAndSwitch(@NotNull ClientPlayerEntity player) { } if (closest == null || neighbor.distance < closest.distance) { closest = neighbor; + closestOffset = offset; } } if (closest != null) { - return new NextVector(closest.faceCenter().subtract(player.getEyePos()).normalize(), false); + return new NextVector(closest.faceCenter().subtract(player.getEyePos()).normalize(), false, BlockIn.isPlayerAdjacent(closestOffset)); } if (jumpNeighbor != null) { - return new NextVector(jumpNeighbor.faceCenter().subtract(player.getEyePos()).normalize(), true); + return new NextVector(jumpNeighbor.faceCenter().subtract(player.getEyePos()).normalize(), true, true); } return null; } @@ -167,6 +171,10 @@ private boolean switchToNextStackOfBlocks(@NotNull ClientPlayerEntity player) { return BedwarsAgent.switchToNextStackOfBlocks(player, new BedwarsAgent.BlockConfig(enableObsidian.getRawState(), enableEndstone.getRawState(), enableWood.getRawState(), enableClay.getRawState(), enableWool.getRawState(), enableGlass.getRawState(), prioritizeStrongest.getRawState(), !prioritizeStrongest.getRawState())); } + private boolean switchToWeakestBlocks(@NotNull ClientPlayerEntity player) { + return BedwarsAgent.switchToNextStackOfBlocks(player, new BedwarsAgent.BlockConfig(enableObsidian.getRawState(), enableEndstone.getRawState(), enableWood.getRawState(), enableClay.getRawState(), enableWool.getRawState(), enableGlass.getRawState(), false, false)); + } + @Override protected void onEnabledTick(MinecraftClient client, @NotNull ClientWorld world, @NotNull ClientPlayerEntity player) { if (!running) { @@ -186,11 +194,6 @@ protected void onEnabledTick(MinecraftClient client, @NotNull ClientWorld world, } if (--cooldownTicks > 0) return; - if (!switchToBlocks.getRawState() || !switchToNextStackOfBlocks(player)) { - disable(player); - return; - } - NextVector next = getNextBlockPlaceVector(world, player); if (next == null || (previousVector != null && previousVector.equals(next.lookVector))) { if (jumpEnabled.getRawState() && player.getPos().getY() > originalPosVec.getY()) { @@ -201,6 +204,11 @@ protected void onEnabledTick(MinecraftClient client, @NotNull ClientWorld world, } previousVector = next.lookVector; + if (!switchToBlocks.getRawState() || !(next.isAdjacent || !weakNonAdjacent.getRawState() ? switchToNextStackOfBlocks(player) : switchToWeakestBlocks(player))) { + disable(player); + return; + } + PlayerEntityL.setRotationVector(player, next.lookVector); KeybindHelper.KEY_USE_ITEM.press(); @@ -223,6 +231,6 @@ public boolean inValidGame() { private record ReachableNeighbor(BlockPos pos, Direction side, Vec3d faceCenter, double distance) { } - private record NextVector(Vec3d lookVector, boolean aboveHead) { + private record NextVector(Vec3d lookVector, boolean aboveHead, boolean isAdjacent) { } } diff --git a/src/main/java/dev/cigarette/precomputed/BlockIn.java b/src/main/java/dev/cigarette/precomputed/BlockIn.java index 10edb2dd..fb0f8a32 100644 --- a/src/main/java/dev/cigarette/precomputed/BlockIn.java +++ b/src/main/java/dev/cigarette/precomputed/BlockIn.java @@ -5,4 +5,12 @@ public class BlockIn { public static final Vec3i[] PLAYER_NEIGHBORS = new Vec3i[]{new Vec3i(1, 0, 0), new Vec3i(-1, 0, 0), new Vec3i(1, -1, 0), new Vec3i(-1, -1, 0), new Vec3i(1, -2, 0), new Vec3i(-1, -2, 0), new Vec3i(0, 0, 1), new Vec3i(0, 0, -1), new Vec3i(0, -1, 1), new Vec3i(0, -1, -1), new Vec3i(0, -2, 1), new Vec3i(0, -2, -1), new Vec3i(1, 1, 0), new Vec3i(-1, 1, 0), new Vec3i(0, 1, 1), new Vec3i(0, 1, -1), new Vec3i(1, 2, 0), new Vec3i(-1, 2, 0), new Vec3i(0, 2, 1), new Vec3i(0, 2, -1), new Vec3i(0, 2, 0)}; public static final Vec3i[] BLOCK_NEIGHBORS = new Vec3i[]{new Vec3i(1, 0, 0), new Vec3i(-1, 0, 0), new Vec3i(0, 0, 1), new Vec3i(0, 0, -1), new Vec3i(0, 1, 0), new Vec3i(0, -1, 0)}; + public static final Vec3i[] PLAYER_ADJACENT = new Vec3i[]{new Vec3i(1, 0, 0), new Vec3i(-1, 0, 0), new Vec3i(0, 0, 1), new Vec3i(0, 0, -1), new Vec3i(1, 1, 0), new Vec3i(-1, 1, 0), new Vec3i(0, 1, 1), new Vec3i(0, 1, -1), new Vec3i(0, -1, 0), new Vec3i(0, 2, 0)}; + + public static boolean isPlayerAdjacent(Vec3i offset) { + for (Vec3i adj : PLAYER_ADJACENT) { + if (adj.equals(offset)) return true; + } + return false; + } } From 17fff138f2a5c6e60e4559f1ec4cf8d2a495e71c Mon Sep 17 00:00:00 2001 From: UndercoverGoose <53491740+UndercoverGoose@users.noreply.github.com> Date: Tue, 25 Nov 2025 14:23:58 -0500 Subject: [PATCH 08/14] fix: block-in trys to place on beds and ladders which arent full cubes --- src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java b/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java index 099829bf..ca54eb48 100644 --- a/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java +++ b/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java @@ -8,6 +8,8 @@ import dev.cigarette.lib.Raycast; import dev.cigarette.module.TickModule; import dev.cigarette.precomputed.BlockIn; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.block.ShapeContext; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.ClientPlayerEntity; @@ -108,7 +110,9 @@ private void disableAndSwitch(@NotNull ClientPlayerEntity player) { double closestDistance = 0; for (Vec3i offset : BlockIn.BLOCK_NEIGHBORS) { BlockPos neighborPos = pos.add(offset); - if (world.getBlockState(neighborPos).isAir()) continue; + + BlockState state = world.getBlockState(neighborPos); + if (state.isAir() || BedwarsAgent.isBed(state) || state.isOf(Blocks.LADDER)) continue; Vec3d faceCenter = neighborPos.toCenterPos().subtract(new Vec3d(offset).multiply(0.5f)); Vec3d eye = player.getEyePos(); From 01e2040eccfdc6a40b10dbdb4238ca261d862c2a Mon Sep 17 00:00:00 2001 From: UndercoverGoose <53491740+UndercoverGoose@users.noreply.github.com> Date: Tue, 25 Nov 2025 14:43:47 -0500 Subject: [PATCH 09/14] fix: water interference --- src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java b/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java index ca54eb48..ce43e2b0 100644 --- a/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java +++ b/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java @@ -112,7 +112,7 @@ private void disableAndSwitch(@NotNull ClientPlayerEntity player) { BlockPos neighborPos = pos.add(offset); BlockState state = world.getBlockState(neighborPos); - if (state.isAir() || BedwarsAgent.isBed(state) || state.isOf(Blocks.LADDER)) continue; + if (state.isAir() || state.isOf(Blocks.WATER) || BedwarsAgent.isBed(state) || state.isOf(Blocks.LADDER)) continue; Vec3d faceCenter = neighborPos.toCenterPos().subtract(new Vec3d(offset).multiply(0.5f)); Vec3d eye = player.getEyePos(); @@ -148,7 +148,9 @@ private void disableAndSwitch(@NotNull ClientPlayerEntity player) { ReachableNeighbor jumpNeighbor = null; for (Vec3i offset : BlockIn.PLAYER_NEIGHBORS) { BlockPos pos = originalPos.add(offset); - if (!world.getBlockState(pos).isAir()) continue; + + BlockState state = world.getBlockState(pos); + if (!state.isAir() && !state.isOf(Blocks.WATER)) continue; ReachableNeighbor neighbor = getReachableNeighbor(world, player, pos); if (neighbor == null) continue; From 770fbc590266941edbe65b349f9aca396603a5b0 Mon Sep 17 00:00:00 2001 From: UndercoverGoose <53491740+UndercoverGoose@users.noreply.github.com> Date: Tue, 25 Nov 2025 17:52:05 -0500 Subject: [PATCH 10/14] fix: entity interference and being able to start the block-in while not fully on a block --- .../cigarette/module/bedwars/AutoBlockIn.java | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java b/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java index ce43e2b0..df2de223 100644 --- a/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java +++ b/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java @@ -16,10 +16,8 @@ import net.minecraft.client.world.ClientWorld; import net.minecraft.item.ItemStack; import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.math.Vec3i; +import net.minecraft.util.hit.HitResult; +import net.minecraft.util.math.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -105,14 +103,18 @@ private void disableAndSwitch(@NotNull ClientPlayerEntity player) { } } + private boolean blockBlockedByEntity(@NotNull ClientWorld world, @NotNull ClientPlayerEntity player, @NotNull BlockPos pos) { + return !world.getOtherEntities(player, new Box(pos)).isEmpty(); + } + private @Nullable ReachableNeighbor getReachableNeighbor(@NotNull ClientWorld world, @NotNull ClientPlayerEntity player, BlockPos pos) { ReachableNeighbor closest = null; double closestDistance = 0; for (Vec3i offset : BlockIn.BLOCK_NEIGHBORS) { BlockPos neighborPos = pos.add(offset); - BlockState state = world.getBlockState(neighborPos); if (state.isAir() || state.isOf(Blocks.WATER) || BedwarsAgent.isBed(state) || state.isOf(Blocks.LADDER)) continue; + Vec3d faceCenter = neighborPos.toCenterPos().subtract(new Vec3d(offset).multiply(0.5f)); Vec3d eye = player.getEyePos(); @@ -127,9 +129,11 @@ private void disableAndSwitch(@NotNull ClientPlayerEntity player) { if (face == Direction.EAST && eye.getX() <= faceCenter.getX()) continue; if (face == Direction.WEST && eye.getX() >= faceCenter.getX()) continue; - BlockHitResult res = Raycast.raycastBlock(eye, faceCenter, ShapeContext.absent()); - if (res.getType() != BlockHitResult.Type.MISS) { - if (!res.getBlockPos().equals(neighborPos)) continue; + HitResult res = Raycast.raycast(eye, faceCenter, ShapeContext.absent()); + if (res.getType() == BlockHitResult.Type.BLOCK) { + if (!((BlockHitResult) res).getBlockPos().equals(neighborPos)) continue; + } else if (res.getType() == HitResult.Type.ENTITY) { + continue; } if (closest == null || distance < closestDistance) { @@ -151,6 +155,7 @@ private void disableAndSwitch(@NotNull ClientPlayerEntity player) { BlockState state = world.getBlockState(pos); if (!state.isAir() && !state.isOf(Blocks.WATER)) continue; + if (blockBlockedByEntity(world, player, pos)) continue; ReachableNeighbor neighbor = getReachableNeighbor(world, player, pos); if (neighbor == null) continue; @@ -185,6 +190,12 @@ private boolean switchToWeakestBlocks(@NotNull ClientPlayerEntity player) { protected void onEnabledTick(MinecraftClient client, @NotNull ClientWorld world, @NotNull ClientPlayerEntity player) { if (!running) { if (!keybind.getKeybind().wasPhysicallyPressed()) return; + double xDecimal = player.getX() - Math.floor(player.getX()); + double zDecimal = player.getZ() - Math.floor(player.getZ()); + if (xDecimal < 0.3 || xDecimal > 0.7 || zDecimal < 0.3 || zDecimal > 0.7) { + return; + } + if (proximityToBeds.getRawState() == 0) { enable(world, player); return; From 47c1431a6c5c73b7c844af628ba0aabfa43385dd Mon Sep 17 00:00:00 2001 From: UndercoverGoose <53491740+UndercoverGoose@users.noreply.github.com> Date: Tue, 25 Nov 2025 22:48:48 -0500 Subject: [PATCH 11/14] feat: make block-in 0.05 seconds faster --- .../cigarette/module/bedwars/AutoBlockIn.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java b/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java index df2de223..fc312621 100644 --- a/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java +++ b/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java @@ -196,18 +196,19 @@ protected void onEnabledTick(MinecraftClient client, @NotNull ClientWorld world, return; } + enableChecks: if (proximityToBeds.getRawState() == 0) { enable(world, player); - return; - } - BlockPos pos = player.getBlockPos(); - for (BedwarsAgent.PersistentBed bed : BedwarsAgent.getVisibleBeds()) { - if (bed.head().isWithinDistance(pos, proximityToBeds.getRawState()) || bed.foot().isWithinDistance(pos, proximityToBeds.getRawState())) { - enable(world, player); - return; + } else { + BlockPos pos = player.getBlockPos(); + for (BedwarsAgent.PersistentBed bed : BedwarsAgent.getVisibleBeds()) { + if (bed.head().isWithinDistance(pos, proximityToBeds.getRawState()) || bed.foot().isWithinDistance(pos, proximityToBeds.getRawState())) { + enable(world, player); + break enableChecks; + } } + return; } - return; } if (--cooldownTicks > 0) return; From 27f3de9bda5970c7282fb20331a16caa20714e5a Mon Sep 17 00:00:00 2001 From: UndercoverGoose <53491740+UndercoverGoose@users.noreply.github.com> Date: Fri, 28 Nov 2025 01:39:54 -0500 Subject: [PATCH 12/14] add option to tp to the center of the block so alignment is perfect every time --- .../java/dev/cigarette/module/bedwars/AutoBlockIn.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java b/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java index fc312621..613d143a 100644 --- a/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java +++ b/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java @@ -31,6 +31,7 @@ public class AutoBlockIn extends TickModule { private final ToggleWidget switchToTool = new ToggleWidget("Switch to Tools", "Automatically switches to a tool once finished.").withDefaultState(true); private final SliderWidget variation = new SliderWidget("Variation", "Applies randomness to the delay between block places.").withBounds(0, 1, 4); private final ToggleWidget jumpEnabled = new ToggleWidget("Jump", "Jumps immediately to ensure the block above you is placed.").withDefaultState(true); + private final ToggleWidget tpToCenter = new ToggleWidget("TP to Center", "Risky option that teleports you to the center of the block when activating the module to ensure proper placement.").withDefaultState(false); private final TextWidget allowedBlocksText = new TextWidget("Block Config", "Configure which blocks can be used by the module.").centered(false); private final DropdownWidget allowedBlocks = new DropdownWidget<>("", null); @@ -56,7 +57,7 @@ private AutoBlockIn(String id, String name, String tooltip) { super(ToggleWidget::module, id, name, tooltip); allowedBlocks.setHeader(allowedBlocksText); allowedBlocks.setChildren(prioritizeStrongest, weakNonAdjacent, enableObsidian, enableEndstone, enableWood, enableClay, enableWool, enableGlass); - this.setChildren(keybind, allowedBlocks, switchToBlocks, switchToTool, jumpEnabled, speed, variation, proximityToBeds); + this.setChildren(keybind, allowedBlocks, switchToBlocks, switchToTool, jumpEnabled, tpToCenter, speed, variation, proximityToBeds); keybind.registerConfigKey(id + ".key"); speed.registerConfigKey(id + ".speed"); proximityToBeds.registerConfigKey(id + ".proximity"); @@ -64,6 +65,7 @@ private AutoBlockIn(String id, String name, String tooltip) { switchToTool.registerConfigKey(id + ".switchtool"); variation.registerConfigKey(id + ".variation"); prioritizeStrongest.registerConfigKey(id + ".prioritizestrongest"); + tpToCenter.registerConfigKey(id + ".tptocenter"); weakNonAdjacent.registerConfigKey(id + ".weaknonadjacent"); enableObsidian.registerConfigKey(id + ".allow.obsidian"); enableEndstone.registerConfigKey(id + ".allow.endstone"); @@ -193,7 +195,10 @@ protected void onEnabledTick(MinecraftClient client, @NotNull ClientWorld world, double xDecimal = player.getX() - Math.floor(player.getX()); double zDecimal = player.getZ() - Math.floor(player.getZ()); if (xDecimal < 0.3 || xDecimal > 0.7 || zDecimal < 0.3 || zDecimal > 0.7) { - return; + if (!tpToCenter.getRawState()) return; + double xCorrection = 0.5 - xDecimal; + double zCorrection = 0.5 - zDecimal; + player.updatePosition(player.getX() + xCorrection, player.getY(), player.getZ() + zCorrection); } enableChecks: From e94080dc3ff64fc11af23efaf9f9259098aa116a Mon Sep 17 00:00:00 2001 From: UndercoverGoose <53491740+UndercoverGoose@users.noreply.github.com> Date: Fri, 28 Nov 2025 02:26:53 -0500 Subject: [PATCH 13/14] update tp to center to teleport to the closest edge inside the block + some randomization --- src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java b/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java index 613d143a..730d286f 100644 --- a/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java +++ b/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java @@ -196,8 +196,8 @@ protected void onEnabledTick(MinecraftClient client, @NotNull ClientWorld world, double zDecimal = player.getZ() - Math.floor(player.getZ()); if (xDecimal < 0.3 || xDecimal > 0.7 || zDecimal < 0.3 || zDecimal > 0.7) { if (!tpToCenter.getRawState()) return; - double xCorrection = 0.5 - xDecimal; - double zCorrection = 0.5 - zDecimal; + double xCorrection = (xDecimal < 0.3 ? (0.3 + Math.random() * 0.069) : Math.min(xDecimal, 0.7 - Math.random() * 0.069)) - xDecimal; + double zCorrection = (zDecimal < 0.3 ? 0.3 + Math.random() * 0.069 : Math.min(zDecimal, 0.7 - Math.random() * 0.069)) - zDecimal; player.updatePosition(player.getX() + xCorrection, player.getY(), player.getZ() + zCorrection); } From 0f673090f22d4e88b1b3cf56f60001ff5116ba30 Mon Sep 17 00:00:00 2001 From: UndercoverGoose <53491740+UndercoverGoose@users.noreply.github.com> Date: Fri, 28 Nov 2025 02:40:53 -0500 Subject: [PATCH 14/14] continually run the module until the key is released --- src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java b/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java index 730d286f..970e4672 100644 --- a/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java +++ b/src/main/java/dev/cigarette/module/bedwars/AutoBlockIn.java @@ -191,7 +191,7 @@ private boolean switchToWeakestBlocks(@NotNull ClientPlayerEntity player) { @Override protected void onEnabledTick(MinecraftClient client, @NotNull ClientWorld world, @NotNull ClientPlayerEntity player) { if (!running) { - if (!keybind.getKeybind().wasPhysicallyPressed()) return; + if (!keybind.getKeybind().isPhysicallyPressed()) return; double xDecimal = player.getX() - Math.floor(player.getX()); double zDecimal = player.getZ() - Math.floor(player.getZ()); if (xDecimal < 0.3 || xDecimal > 0.7 || zDecimal < 0.3 || zDecimal > 0.7) {