From 1ae193ada77b9aa15234b23f393140b36edc3238 Mon Sep 17 00:00:00 2001 From: Hedzer Kuijlman Date: Mon, 19 May 2025 20:31:13 +0200 Subject: [PATCH] Greatly improved Vein Miner performance --- .../wtf/hak/survivalfabric/features/Zoom.java | 27 +++- .../features/veinminer/drills/DrillBase.java | 126 ++++++++++-------- 2 files changed, 94 insertions(+), 59 deletions(-) diff --git a/src/client/java/wtf/hak/survivalfabric/features/Zoom.java b/src/client/java/wtf/hak/survivalfabric/features/Zoom.java index dfc8ec0..d5d45f1 100644 --- a/src/client/java/wtf/hak/survivalfabric/features/Zoom.java +++ b/src/client/java/wtf/hak/survivalfabric/features/Zoom.java @@ -7,24 +7,37 @@ import net.minecraft.client.option.KeyBinding; import net.minecraft.client.util.InputUtil; import net.minecraft.text.Text; import org.lwjgl.glfw.GLFW; +import org.spongepowered.asm.mixin.Unique; + +import static wtf.hak.survivalfabric.config.client.ClientConfigManager.getConfig; public class Zoom { private static final KeyBinding ZOOM_BIND = KeyBindingHelper.registerKeyBinding(new KeyBinding("key.survivalfabric.zoom", InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_C, "category.survivalfabric.survivalfabric")); - private static final float INITIAL_ZOOM = 20f; private static boolean SHOULD_ZOOM = false; - private static float ZOOM_STEP_VALUE = 2.5f; private static int ZOOM_STEP = 0; + @Unique + private static boolean initialSmoothZoom; + public static void register() { ClientTickEvents.END_CLIENT_TICK.register(client -> { - if (ZOOM_BIND.isPressed()) + + if (ZOOM_BIND.isPressed() && !SHOULD_ZOOM) { + if(getConfig().smoothCamera) { + initialSmoothZoom = MinecraftClient.getInstance().options.smoothCameraEnabled; + MinecraftClient.getInstance().options.smoothCameraEnabled = true; + } SHOULD_ZOOM = true; - else { + } else if (!ZOOM_BIND.isPressed() && SHOULD_ZOOM) { SHOULD_ZOOM = false; ZOOM_STEP = 0; + if(getConfig().smoothCamera) { + MinecraftClient.getInstance().options.smoothCameraEnabled = initialSmoothZoom; + } } + }); } @@ -33,7 +46,7 @@ public class Zoom { } public static float getZoomFov() { - return INITIAL_ZOOM - -ZOOM_STEP * ZOOM_STEP_VALUE; + return getConfig().initialZoom - -ZOOM_STEP * getConfig().zoomStep; } public static void modifyStep(int step) { @@ -42,9 +55,9 @@ public class Zoom { // Clamp the zoom level so the FOV stays within [1, 110] float zoomFov = getZoomFov(); if (zoomFov < 1) { - ZOOM_STEP = Math.round((1 - INITIAL_ZOOM) / ZOOM_STEP_VALUE) + 1; + ZOOM_STEP = Math.round((1 - getConfig().initialZoom) / getConfig().zoomStep) + 1; } else if (zoomFov > 110) { - ZOOM_STEP = Math.round((110 - INITIAL_ZOOM) / ZOOM_STEP_VALUE); + ZOOM_STEP = Math.round((110 - getConfig().initialZoom) / getConfig().zoomStep); } } } diff --git a/src/main/java/wtf/hak/survivalfabric/features/veinminer/drills/DrillBase.java b/src/main/java/wtf/hak/survivalfabric/features/veinminer/drills/DrillBase.java index 7885691..72c6350 100644 --- a/src/main/java/wtf/hak/survivalfabric/features/veinminer/drills/DrillBase.java +++ b/src/main/java/wtf/hak/survivalfabric/features/veinminer/drills/DrillBase.java @@ -13,7 +13,9 @@ import wtf.hak.survivalfabric.features.veinminer.VeinMinerSession; import wtf.hak.survivalfabric.utils.Scheduler; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import static wtf.hak.survivalfabric.SurvivalFabric.LOGGER; import static wtf.hak.survivalfabric.config.ConfigManager.getConfig; @@ -21,7 +23,6 @@ import static wtf.hak.survivalfabric.config.ConfigManager.getConfig; public class DrillBase implements Drill { protected VeinMinerSession session; - protected TagKey tag; public DrillBase(VeinMinerSession session, TagKey tag) { @@ -36,11 +37,11 @@ public class DrillBase implements Drill { @Override public boolean drill(BlockPos startPos) { - handleBlock(session.world.getBlockState(startPos).getBlock(), new ArrayList<>(), startPos, 0); + handleBlock(session.world.getBlockState(startPos).getBlock(), new HashSet<>(), startPos, 0); return true; } - private void handleBlock(Block initialBlock, List history, BlockPos pos, int brokenBlocks) { + private void handleBlock(Block initialBlock, Set history, BlockPos pos, int brokenBlocks) { if (brokenBlocks < getConfig().maxVeinSize) { history.add(pos); if (tryBreakBlock(pos)) { @@ -48,30 +49,40 @@ public class DrillBase implements Drill { int finalBrokenBlocks = brokenBlocks; // Put everything in a list to avoid scheduling a lot of tasks. - // Has the added benefit of only playing one sound - - List toBreak = new ArrayList<>(); - forXYZ(pos, 1, newPos -> { - if (!history.contains(newPos) && session.world.getBlockState(newPos).getBlock() == initialBlock) { - toBreak.add(newPos); - } - }); + Set toBreak = new HashSet<>(); + collectAdjacentBlocks(pos, history, initialBlock, toBreak); long delay = getConfig().veinAnimationTicks; - if (delay <= 0) - for (BlockPos newPos : toBreak) - handleBlock(initialBlock, history, newPos, finalBrokenBlocks); - else { - Scheduler.get().scheduleTask(() -> { - for (BlockPos newPos : toBreak) - handleBlock(initialBlock, history, newPos, finalBrokenBlocks); - }, delay); - } + // Use final or effectively final variables for lambda + final int[] finalBrokenBlocksArr = {finalBrokenBlocks}; + + if (delay <= 0) { + handleBlocksInBatch(toBreak, initialBlock, history, finalBrokenBlocksArr[0]); + } else { + Scheduler.get().scheduleTask(() -> handleBlocksInBatch(toBreak, initialBlock, history, finalBrokenBlocksArr[0]), delay); + } } } } + private void collectAdjacentBlocks(BlockPos pos, Set history, Block initialBlock, Set toBreak) { + forXYZ(pos, 1, new ForXYZHandler() { + @Override + public void handle(BlockPos newPos) { + if (!history.contains(newPos) && session.world.getBlockState(newPos).getBlock() == initialBlock) { + toBreak.add(newPos); + } + } + }); + } + + private void handleBlocksInBatch(Set toBreak, Block initialBlock, Set history, int finalBrokenBlocks) { + for (BlockPos newPos : toBreak) { + handleBlock(initialBlock, history, newPos, finalBrokenBlocks); + } + } + @Override public boolean isRightTool(BlockPos pos) { var blockState = session.world.getBlockState(pos); @@ -79,9 +90,12 @@ public class DrillBase implements Drill { } protected void forXYZ(BlockPos pos, int max, ForXYZHandler handler) { - forXYZ(pos, max, handlerPos -> { - handler.handle(handlerPos); - return 0; + forXYZ(pos, max, new ForXYZCounter() { + @Override + public int handle(BlockPos pos) { + handler.handle(pos); + return 1; // Accumulate one count for each position processed + } }, false); } @@ -90,14 +104,17 @@ public class DrillBase implements Drill { } protected void forXYZ(BlockPos pos, int max, ForXYZHandler handler, boolean forceVertical) { - forXYZ(pos, max, handlerPos -> { - handler.handle(handlerPos); - return 0; + forXYZ(pos, max, new ForXYZCounter() { + @Override + public int handle(BlockPos pos) { + handler.handle(pos); + return 1; // Accumulate one count for each position processed + } }, forceVertical); } protected int forXYZ(BlockPos pos, int max, ForXYZCounter handler, boolean forceVertical) { - ArrayList offsets = new ArrayList(); + Set offsets = new HashSet<>(); for (int d = 0; d <= max; ++d) { offsets.add(d); if (d != -d) { @@ -105,39 +122,21 @@ public class DrillBase implements Drill { } } - String[] order = new String[]{"x", "y", "z"}; - if (forceVertical) { - order = new String[]{"y", "x", "z"}; - } else { - ServerPlayerEntity player = session.player; - boolean majorPitchChange = player.getPitch() < -45.0 || player.getPitch() > 45.0; - boolean majorYawChange = (player.getYaw() > 45.0 && player.getYaw() < 135.0) || (player.getYaw() < -45.0 && player.getYaw() > -135.0); - if (majorPitchChange) { - if (majorYawChange) { - order = new String[]{"y", "z", "x"}; - } else { - order = new String[]{"y", "x", "z"}; - } - } else { - if (majorYawChange) { - order = new String[]{"z", "y", "x"}; - } - } - } - + String[] order = determineOrder(forceVertical); int counter = 0; + for (int i1 : offsets) { for (int i2 : offsets) { for (int i3 : offsets) { - int ix = order[0] == "x" ? i1 : order[1] == "x" ? i2 : i3; - int iy = order[0] == "y" ? i1 : order[1] == "y" ? i2 : i3; - int iz = order[0] == "z" ? i1 : order[1] == "z" ? i2 : i3; + int ix = order[0].equals("x") ? i1 : order[1].equals("x") ? i2 : i3; + int iy = order[0].equals("y") ? i1 : order[1].equals("y") ? i2 : i3; + int iz = order[0].equals("z") ? i1 : order[1].equals("z") ? i2 : i3; int px = pos.getX() + ix; int py = pos.getY() + iy; int pz = pos.getZ() + iz; - counter += handler.handle(new BlockPos(px, py, pz)); + counter += handler.handle(new BlockPos(px, py, pz)); // Works with ForXYZCounter, returning an int } } } @@ -145,6 +144,29 @@ public class DrillBase implements Drill { return counter; } + protected String[] determineOrder(boolean forceVertical) { + if (forceVertical) { + return new String[]{"y", "x", "z"}; + } else { + ServerPlayerEntity player = session.player; + boolean majorPitchChange = player.getPitch() < -45.0 || player.getPitch() > 45.0; + boolean majorYawChange = (player.getYaw() > 45.0 && player.getYaw() < 135.0) || (player.getYaw() < -45.0 && player.getYaw() > -135.0); + + if (majorPitchChange) { + if (majorYawChange) { + return new String[]{"y", "z", "x"}; + } else { + return new String[]{"y", "x", "z"}; + } + } else { + if (majorYawChange) { + return new String[]{"z", "y", "x"}; + } + } + } + return new String[]{"x", "y", "z"}; + } + protected boolean tryBreakBlock(BlockPos blockPos) { session.addPosition(blockPos); boolean success = isRightTool(blockPos) && session.player.interactionManager.tryBreakBlock(blockPos); @@ -168,4 +190,4 @@ public class DrillBase implements Drill { protected interface ForXYZCounter { int handle(BlockPos pos); } -} \ No newline at end of file +}