From 3738866b04eb5aab5d16ef4eb0d27cb5785d836a Mon Sep 17 00:00:00 2001 From: RickyTheRacc Date: Tue, 13 Dec 2022 20:59:22 -0600 Subject: [PATCH 1/4] Optimize validHole check Uses mc.world.getOtherEntities to check for entities (also fixes bug with ignoring collisions when force fill was pressed) --- .../systems/modules/combat/HoleFiller.java | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java index 9db3afea09..2224c68472 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java @@ -26,9 +26,11 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.entity.TntEntity; +import net.minecraft.entity.decoration.EndCrystalEntity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.BlockItem; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Vec3d; @@ -316,19 +318,24 @@ private boolean validHole(BlockPos pos) { if (distance(mc.player, pos, false) > placeRange.get()) return false; if (mc.world.getBlockState(pos).getBlock() == Blocks.COBWEB) return false; - if (smart.get() && !forceFill.get().isPressed()) { - boolean validHole = false; - for (PlayerEntity target : targets) { - if (target.getY() > pos.getY() - && !target.getBlockPos().equals(pos) - && (distance(target, pos, true) < feetRange.get()) - ) validHole = true; + if (((AbstractBlockAccessor) mc.world.getBlockState(pos).getBlock()).isCollidable()) return false; + if (((AbstractBlockAccessor) mc.world.getBlockState(pos.up()).getBlock()).isCollidable()) return false; + + Box box = new Box(pos); + if (!mc.world.getOtherEntities(null, box, entity -> entity instanceof PlayerEntity + || entity instanceof TntEntity || entity instanceof EndCrystalEntity).isEmpty()) return false; + + if (!smart.get() || forceFill.get().isPressed()) return true; + + boolean validHole = false; + for (PlayerEntity target : targets) { + if (target.getY() > pos.getY() && (distance(target, pos, true) < feetRange.get())) { + validHole = true; + break; } - if (!validHole) return false; } - if (((AbstractBlockAccessor) mc.world.getBlockState(pos).getBlock()).isCollidable()) return false; - return !((AbstractBlockAccessor) mc.world.getBlockState(pos.up()).getBlock()).isCollidable(); + return validHole; } private void setTargets() { From 0412e05fab141673cfb878aade028f350b595542 Mon Sep 17 00:00:00 2001 From: RickyTheRacc Date: Wed, 14 Dec 2022 22:40:26 -0600 Subject: [PATCH 2/4] Even MORE optimization Memory is the enemy --- .../systems/modules/combat/HoleFiller.java | 45 ++++++++++--------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java index 2224c68472..51fff4fe83 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java @@ -223,6 +223,9 @@ public class HoleFiller extends Module { private final List targets = new ArrayList<>(); private final List holes = new ArrayList<>(); + + private final BlockPos.Mutable testPos = new BlockPos.Mutable(); + private Vec3d testVec; private int timer; public HoleFiller() { @@ -314,12 +317,16 @@ private void onRender(Render3DEvent event) { } private boolean validHole(BlockPos pos) { - if (mc.player.getBlockPos().equals(pos)) return false; - if (distance(mc.player, pos, false) > placeRange.get()) return false; - if (mc.world.getBlockState(pos).getBlock() == Blocks.COBWEB) return false; + testPos.set(pos); + + if (mc.player.getBlockPos().equals(testPos)) return false; + if (distance(mc.player, testPos, false) > placeRange.get()) return false; + if (mc.world.getBlockState(testPos).getBlock() == Blocks.COBWEB) return false; - if (((AbstractBlockAccessor) mc.world.getBlockState(pos).getBlock()).isCollidable()) return false; - if (((AbstractBlockAccessor) mc.world.getBlockState(pos.up()).getBlock()).isCollidable()) return false; + if (((AbstractBlockAccessor) mc.world.getBlockState(testPos).getBlock()).isCollidable()) return false; + testPos.add(0, 1, 0); + if (((AbstractBlockAccessor) mc.world.getBlockState(testPos).getBlock()).isCollidable()) return false; + testPos.add(0, -1, 0); Box box = new Box(pos); if (!mc.world.getOtherEntities(null, box, entity -> entity instanceof PlayerEntity @@ -329,7 +336,7 @@ private boolean validHole(BlockPos pos) { boolean validHole = false; for (PlayerEntity target : targets) { - if (target.getY() > pos.getY() && (distance(target, pos, true) < feetRange.get())) { + if (target.getY() > testPos.getY() && (distance(target, testPos, true) < feetRange.get())) { validHole = true; break; } @@ -350,12 +357,9 @@ private void setTargets() { ) continue; if (onlyMoving.get()) { - Vec3d velocity = new Vec3d( - player.getX() - player.prevX, - player.getY() - player.prevY, - player.getZ() - player.prevZ - ); - if (velocity.length() == 0) continue; + if (player.getX() - player.prevX != 0) continue; + if (player.getY() - player.prevY != 0) continue; + if (player.getZ() - player.prevZ != 0) continue; } if (ignoreSafe.get()) { @@ -370,7 +374,8 @@ private boolean isSurrounded(PlayerEntity target) { for (Direction dir : Direction.values()) { if (dir == Direction.UP || dir == Direction.DOWN) continue; - Block block = mc.world.getBlockState(target.getBlockPos().offset(dir)).getBlock(); + testPos.set(target.getBlockPos().offset(dir)); + Block block = mc.world.getBlockState(testPos).getBlock(); if (block != Blocks.OBSIDIAN && block != Blocks.BEDROCK && block != Blocks.RESPAWN_ANCHOR && block != Blocks.CRYING_OBSIDIAN && block != Blocks.NETHERITE_BLOCK) { return false; @@ -381,22 +386,20 @@ private boolean isSurrounded(PlayerEntity target) { } private double distance(PlayerEntity player, BlockPos pos, boolean feet) { - Vec3d center = new Vec3d(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5); - if (feet) center.add(0, 0.5, 0); + testVec = player.getPos(); + if (!feet) testVec.add(0, player.getEyeHeight(mc.player.getPose()), 0); - Vec3d playerPos = player.getPos(); - if (!feet) playerPos.add(0, player.getEyeHeight(mc.player.getPose()), 0); else if (predict.get()) { - playerPos.add( + testVec.add( player.getX() - player.prevX, player.getY() - player.prevY, player.getZ() - player.prevZ ); } - double i = playerPos.x - center.x; - double j = playerPos.y - center.y; - double k = playerPos.z - center.z; + double i = testVec.x - (pos.getX() + 0.5); + double j = testVec.y - (pos.getX() + ((feet) ? 1 : 0.5)); + double k = testVec.z - (pos.getZ() + 0.5); return (Math.sqrt(i * i + j * j + k * k)); } From 56b41bd745588b61106911575e52abe2d81b494d Mon Sep 17 00:00:00 2001 From: RickyTheRacc Date: Thu, 15 Dec 2022 18:53:22 -0600 Subject: [PATCH 3/4] Add set(Blockpos) to Box Interface --- .../meteordevelopment/meteorclient/mixininterface/IBox.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/meteordevelopment/meteorclient/mixininterface/IBox.java b/src/main/java/meteordevelopment/meteorclient/mixininterface/IBox.java index 03159d3316..daf97f8a1f 100644 --- a/src/main/java/meteordevelopment/meteorclient/mixininterface/IBox.java +++ b/src/main/java/meteordevelopment/meteorclient/mixininterface/IBox.java @@ -5,8 +5,14 @@ package meteordevelopment.meteorclient.mixininterface; +import net.minecraft.util.math.BlockPos; + public interface IBox { void expand(double v); void set(double x1, double y1, double z1, double x2, double y2, double z2); + + default void set(BlockPos pos) { + set(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1); + } } From 05c45dc65569ec39b6132e10d9fe8b21f9bbeec2 Mon Sep 17 00:00:00 2001 From: RickyTheRacc Date: Thu, 15 Dec 2022 18:53:38 -0600 Subject: [PATCH 4/4] Use one box --- .../meteorclient/systems/modules/combat/HoleFiller.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java index 51fff4fe83..7f724705b4 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/HoleFiller.java @@ -8,6 +8,7 @@ import meteordevelopment.meteorclient.events.render.Render3DEvent; import meteordevelopment.meteorclient.events.world.TickEvent; import meteordevelopment.meteorclient.mixin.AbstractBlockAccessor; +import meteordevelopment.meteorclient.mixininterface.IBox; import meteordevelopment.meteorclient.renderer.ShapeMode; import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.friends.Friends; @@ -225,6 +226,7 @@ public class HoleFiller extends Module { private final List holes = new ArrayList<>(); private final BlockPos.Mutable testPos = new BlockPos.Mutable(); + private final Box box = new Box(0, 0, 0, 0, 0, 0); private Vec3d testVec; private int timer; @@ -328,7 +330,7 @@ private boolean validHole(BlockPos pos) { if (((AbstractBlockAccessor) mc.world.getBlockState(testPos).getBlock()).isCollidable()) return false; testPos.add(0, -1, 0); - Box box = new Box(pos); + ((IBox) box).set(pos); if (!mc.world.getOtherEntities(null, box, entity -> entity instanceof PlayerEntity || entity instanceof TntEntity || entity instanceof EndCrystalEntity).isEmpty()) return false;