From 81018a75025b739d7cc55cec5a1d5b80be383de7 Mon Sep 17 00:00:00 2001 From: Gingerbeard Date: Wed, 4 Jun 2025 00:05:34 -0400 Subject: [PATCH 1/6] Surround improvements * Added air place option for servers that don't allow air place * Added blocks per tick setting to allow for more blocks to be placed per tick. --- .../systems/modules/combat/Surround.java | 105 +++++++++--------- 1 file changed, 51 insertions(+), 54 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java index cbde7f3cd3..5797f87e7f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java @@ -21,7 +21,6 @@ import meteordevelopment.meteorclient.utils.render.color.Color; import meteordevelopment.meteorclient.utils.render.color.SettingColor; import meteordevelopment.meteorclient.utils.world.BlockUtils; -import meteordevelopment.meteorclient.utils.world.CardinalDirection; import meteordevelopment.meteorclient.utils.world.Dir; import meteordevelopment.orbit.EventHandler; import net.minecraft.block.Block; @@ -34,6 +33,7 @@ import net.minecraft.network.packet.c2s.play.PlayerInteractEntityC2SPacket; import net.minecraft.network.packet.s2c.play.DeathMessageS2CPacket; import net.minecraft.util.Hand; +import net.minecraft.util.math.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Box; @@ -64,6 +64,14 @@ public class Surround extends Module { .build() ); + private final Setting blocksPerTick = sgGeneral.add(new IntSetting.Builder() + .name("blocks-per-tick") + .description("How many blocks to place in one tick.") + .defaultValue(1) + .min(1) + .build() + ); + private final Setting
center = sgGeneral.add(new EnumSetting.Builder
() .name("center") .description("Teleports you to the center of the block.") @@ -85,6 +93,13 @@ public class Surround extends Module { .build() ); + private final Setting airPlace = sgGeneral.add(new BoolSetting.Builder() + .name("air-place") + .description("Allows Surround to place blocks in the air.") + .defaultValue(true) + .build() + ); + private final Setting toggleModules = sgGeneral.add(new BoolSetting.Builder() .name("toggle-modules") .description("Turn off other modules when surround is activated.") @@ -222,9 +237,6 @@ public class Surround extends Module { .build() ); - private final BlockPos.Mutable placePos = new BlockPos.Mutable(); - private final BlockPos.Mutable renderPos = new BlockPos.Mutable(); - private final BlockPos.Mutable testPos = new BlockPos.Mutable(); public ArrayList toActivate = new ArrayList<>(); private int ticks; @@ -238,24 +250,23 @@ public Surround() { private void onRender3D(Render3DEvent event) { if (!render.get()) return; + BlockPos playerPos = mc.player.getBlockPos(); + // Below - if (renderBelow.get()) draw(event, null, -1, 0); + if (renderBelow.get()) draw(playerPos.down(), event, 0); - // Regular surround positions - for (CardinalDirection direction : CardinalDirection.values()) { - draw(event, direction, 0, doubleHeight.get() ? Dir.UP : 0); - } + for (Direction direction : Direction.HORIZONTAL) { + BlockPos renderPos = playerPos.offset(direction); - // Double height - if (doubleHeight.get()) { - for (CardinalDirection direction : CardinalDirection.values()) { - draw(event, direction, 1, Dir.DOWN); - } + // Regular surround positions + draw(renderPos, event, doubleHeight.get() ? Dir.UP : 0); + + // Double height + if (doubleHeight.get()) draw(renderPos.up(), event, Dir.DOWN); } } - private void draw(Render3DEvent event, CardinalDirection direction, int y, int exclude) { - renderPos.set(offsetPosFromPlayer(direction, y)); + private void draw(BlockPos renderPos, Render3DEvent event, int exclude) { Color sideColor = getSideColor(renderPos); Color lineColor = getLineColor(renderPos); event.renderer.box(renderPos, sideColor, lineColor, shapeMode.get(), exclude); @@ -313,24 +324,36 @@ private void onTick(TickEvent.Pre event) { if (onlyOnGround.get() && !mc.player.isOnGround()) return; // Wait until the player has a block available to place - if (!getInvBlock().found()) return; + FindItemResult block = InvUtils.findInHotbar(itemStack -> blocks.get().contains(Block.getBlockFromItem(itemStack.getItem()))); + if (!block.found()) return; // Centering player if (center.get() == Center.Always) PlayerUtils.centerPlayer(); // Check surround blocks in order and place the first missing one if present int safe = 0; + int placedCount = 0; + + BlockPos playerPos = mc.player.getBlockPos(); // Looping through feet blocks - for (CardinalDirection direction : CardinalDirection.values()) { - if (place(direction, 0)) break; + for (Direction direction : Direction.HORIZONTAL) { + BlockPos placePos = playerPos.offset(direction); + + // Place support blocks if air place is disabled + if (!airPlace.get() && !hasNeighborBlock(placePos) && mc.world.getBlockState(placePos).isReplaceable()){ + if (place(placePos.down(), block) && ++placedCount >= blocksPerTick.get()) break; + } + + if (place(placePos, block) && ++placedCount >= blocksPerTick.get()) break; safe++; } // Looping through head blocks if (doubleHeight.get() && safe == 4) { - for (CardinalDirection direction : CardinalDirection.values()) { - if (place(direction, 1)) break; + for (Direction direction : Direction.HORIZONTAL) { + BlockPos placePos = playerPos.offset(direction).up(); + if (place(placePos, block) && ++placedCount >= blocksPerTick.get()) break; safe++; } } @@ -347,18 +370,9 @@ private void onTick(TickEvent.Pre event) { if (!complete && center.get() == Center.Incomplete) PlayerUtils.centerPlayer(); } - private boolean place(CardinalDirection direction, int y) { - placePos.set(offsetPosFromPlayer(direction, y)); - + private boolean place(BlockPos placePos, FindItemResult block) { // Attempt to place - boolean placed = BlockUtils.place( - placePos, - getInvBlock(), - rotate.get(), - 100, - swing.get(), - true - ); + boolean placed = BlockUtils.place(placePos, block, rotate.get(), 100, swing.get(), true); // Check if the block is being mined boolean beingMined = false; @@ -408,26 +422,6 @@ private void onPacketReceive(PacketEvent.Receive event) { } } - private BlockPos.Mutable offsetPosFromPlayer(CardinalDirection direction, int y) { - return offsetPos(mc.player.getBlockPos(), direction, y); - } - - private BlockPos.Mutable offsetPos(BlockPos origin, CardinalDirection direction, int y) { - if (direction == null) { - return testPos.set( - origin.getX(), - origin.getY() + y, - origin.getZ() - ); - } - - return testPos.set( - origin.getX() + direction.toDirection().getOffsetX(), - origin.getY() + y, - origin.getZ() + direction.toDirection().getOffsetZ() - ); - } - private BlockType getBlockType(BlockPos pos) { BlockState blockState = mc.world.getBlockState(pos); @@ -455,8 +449,11 @@ private Color getLineColor(BlockPos pos) { }; } - private FindItemResult getInvBlock() { - return InvUtils.findInHotbar(itemStack -> blocks.get().contains(Block.getBlockFromItem(itemStack.getItem()))); + private boolean hasNeighborBlock(BlockPos blockPos) { + for (Direction direction : Direction.values()) { + if (!mc.world.getBlockState(blockPos.offset(direction)).isReplaceable()) return true; + } + return false; } private boolean blockFilter(Block block) { From 8614fc137dd31eb2f6dd12a36060a8ea3efd3e3d Mon Sep 17 00:00:00 2001 From: Gingerbeard Date: Thu, 5 Jun 2025 07:38:15 -0400 Subject: [PATCH 2/6] dev more intuitive funct name --- .../meteorclient/systems/modules/combat/Surround.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java index 5797f87e7f..e6af91dd7d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java @@ -341,7 +341,7 @@ private void onTick(TickEvent.Pre event) { BlockPos placePos = playerPos.offset(direction); // Place support blocks if air place is disabled - if (!airPlace.get() && !hasNeighborBlock(placePos) && mc.world.getBlockState(placePos).isReplaceable()){ + if (!airPlace.get() && isAirPlace(placePos) && mc.world.getBlockState(placePos).isReplaceable()){ if (place(placePos.down(), block) && ++placedCount >= blocksPerTick.get()) break; } @@ -449,11 +449,11 @@ private Color getLineColor(BlockPos pos) { }; } - private boolean hasNeighborBlock(BlockPos blockPos) { + private boolean isAirPlace(BlockPos blockPos) { for (Direction direction : Direction.values()) { - if (!mc.world.getBlockState(blockPos.offset(direction)).isReplaceable()) return true; + if (!mc.world.getBlockState(blockPos.offset(direction)).isReplaceable()) return false; } - return false; + return true; } private boolean blockFilter(Block block) { From 0c4709d0e9765280cfe827d9ab7ee1634701f57c Mon Sep 17 00:00:00 2001 From: Gingerbeard Date: Tue, 10 Jun 2025 16:58:17 -0400 Subject: [PATCH 3/6] Better surround options --- .../meteorclient/systems/modules/combat/Surround.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java index e6af91dd7d..0fa73f2758 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java @@ -457,11 +457,7 @@ private boolean isAirPlace(BlockPos blockPos) { } private boolean blockFilter(Block block) { - return block == Blocks.OBSIDIAN || - block == Blocks.CRYING_OBSIDIAN || - block == Blocks.NETHERITE_BLOCK || - block == Blocks.ENDER_CHEST || - block == Blocks.RESPAWN_ANCHOR; + return block.getBlastResistance() >= 600 && block.getHardness() >= 0 && block != Blocks.REINFORCED_DEEPSLATE; } public enum Center { From c3a227eca88bf062335547fa61c9f67ee850a933 Mon Sep 17 00:00:00 2001 From: Gingerbeard Date: Thu, 12 Jun 2025 23:44:23 -0400 Subject: [PATCH 4/6] Better timer code --- .../systems/modules/combat/Surround.java | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java index 0fa73f2758..cd493a462d 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java @@ -238,7 +238,7 @@ public class Surround extends Module { ); public ArrayList toActivate = new ArrayList<>(); - private int ticks; + private int timer; public Surround() { super(Categories.Combat, "surround", "Surrounds you in blocks to prevent massive crystal damage."); @@ -280,7 +280,7 @@ public void onActivate() { if (center.get() == Center.OnActivate) PlayerUtils.centerPlayer(); // Reset delay - ticks = 0; + timer = delay.get(); if (toggleModules.get() && !modules.get().isEmpty() && mc.world != null && mc.player != null) { for (Module module : modules.get()) { @@ -305,14 +305,8 @@ public void onDeactivate() { @EventHandler private void onTick(TickEvent.Pre event) { - // Tick the placement timer, should always happen - if (ticks > 0) { - ticks--; - return; - } - else { - ticks = delay.get(); - } + // Delay + if (timer++ < delay.get()) return; // Toggle if Y level changed if (toggleOnYChange.get() && mc.player.lastY != mc.player.getY()) { @@ -358,6 +352,8 @@ private void onTick(TickEvent.Pre event) { } } + timer = 0; + boolean complete = safe == (doubleHeight.get() ? 8 : 4); // Disable if all the surround blocks are placed From 995c4710d3943165c349cef3ac7184b2303f8f94 Mon Sep 17 00:00:00 2001 From: Gingerbeard Date: Wed, 23 Jul 2025 15:12:47 -0400 Subject: [PATCH 5/6] Update to 1.21.8 --- .../meteorclient/systems/modules/combat/Surround.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java index cd493a462d..2394a9889c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java @@ -8,6 +8,7 @@ import meteordevelopment.meteorclient.events.packets.PacketEvent; import meteordevelopment.meteorclient.events.render.Render3DEvent; import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.mixin.DirectionAccessor; import meteordevelopment.meteorclient.mixin.WorldRendererAccessor; import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.settings.*; @@ -255,7 +256,7 @@ private void onRender3D(Render3DEvent event) { // Below if (renderBelow.get()) draw(playerPos.down(), event, 0); - for (Direction direction : Direction.HORIZONTAL) { + for (Direction direction : DirectionAccessor.meteor$getHorizontal()) { BlockPos renderPos = playerPos.offset(direction); // Regular surround positions @@ -331,7 +332,7 @@ private void onTick(TickEvent.Pre event) { BlockPos playerPos = mc.player.getBlockPos(); // Looping through feet blocks - for (Direction direction : Direction.HORIZONTAL) { + for (Direction direction : DirectionAccessor.meteor$getHorizontal()) { BlockPos placePos = playerPos.offset(direction); // Place support blocks if air place is disabled @@ -345,7 +346,7 @@ private void onTick(TickEvent.Pre event) { // Looping through head blocks if (doubleHeight.get() && safe == 4) { - for (Direction direction : Direction.HORIZONTAL) { + for (Direction direction : DirectionAccessor.meteor$getHorizontal()) { BlockPos placePos = playerPos.offset(direction).up(); if (place(placePos, block) && ++placedCount >= blocksPerTick.get()) break; safe++; @@ -372,7 +373,7 @@ private boolean place(BlockPos placePos, FindItemResult block) { // Check if the block is being mined boolean beingMined = false; - for (BlockBreakingInfo value : ((WorldRendererAccessor) mc.worldRenderer).getBlockBreakingInfos().values()) { + for (BlockBreakingInfo value : ((WorldRendererAccessor) mc.worldRenderer).meteor$getBlockBreakingInfos().values()) { if (value.getPos().equals(placePos)) { beingMined = true; break; From f88be6ee661b3fd0ed35040aac4f9ba8aaa7f893 Mon Sep 17 00:00:00 2001 From: Gingerbeard Date: Thu, 25 Sep 2025 13:30:23 -0400 Subject: [PATCH 6/6] Fixed centering problem --- .../systems/modules/combat/Surround.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java index 2394a9889c..3afdf2ff99 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/Surround.java @@ -325,38 +325,39 @@ private void onTick(TickEvent.Pre event) { // Centering player if (center.get() == Center.Always) PlayerUtils.centerPlayer(); - // Check surround blocks in order and place the first missing one if present - int safe = 0; int placedCount = 0; + boolean complete = true; BlockPos playerPos = mc.player.getBlockPos(); - // Looping through feet blocks + // Placing feet blocks for (Direction direction : DirectionAccessor.meteor$getHorizontal()) { BlockPos placePos = playerPos.offset(direction); // Place support blocks if air place is disabled if (!airPlace.get() && isAirPlace(placePos) && mc.world.getBlockState(placePos).isReplaceable()){ if (place(placePos.down(), block) && ++placedCount >= blocksPerTick.get()) break; + + if (mc.world.getBlockState(placePos.down()).isReplaceable()) complete = false; } if (place(placePos, block) && ++placedCount >= blocksPerTick.get()) break; - safe++; + + if (mc.world.getBlockState(placePos).isReplaceable()) complete = false; } - // Looping through head blocks - if (doubleHeight.get() && safe == 4) { + // Placing head blocks + if (doubleHeight.get() && complete) { for (Direction direction : DirectionAccessor.meteor$getHorizontal()) { BlockPos placePos = playerPos.offset(direction).up(); if (place(placePos, block) && ++placedCount >= blocksPerTick.get()) break; - safe++; + + if (mc.world.getBlockState(placePos).isReplaceable()) complete = false; } } timer = 0; - boolean complete = safe == (doubleHeight.get() ? 8 : 4); - // Disable if all the surround blocks are placed if (complete && toggleOnComplete.get()) { toggle();