From 1ff7e51eb20681586b1cc83c62a275f5d8b5cebb Mon Sep 17 00:00:00 2001 From: Gingerbeard Date: Tue, 27 May 2025 21:21:10 -0400 Subject: [PATCH 1/8] Anchor Aura rewrite * Completely overhauls Anchor Aura, changing it to be similiar to crystal aura in how it processes. --- .../systems/modules/combat/AnchorAura.java | 389 +++++++++--------- 1 file changed, 192 insertions(+), 197 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java index 69541d75e7..416a1e3eb7 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java @@ -18,7 +18,9 @@ import meteordevelopment.meteorclient.utils.player.*; import meteordevelopment.meteorclient.utils.render.color.SettingColor; import meteordevelopment.meteorclient.utils.world.BlockUtils; +import meteordevelopment.meteorclient.utils.world.BlockIterator; import meteordevelopment.orbit.EventHandler; +import net.minecraft.state.property.Properties; import net.minecraft.block.Blocks; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Items; @@ -27,7 +29,13 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Vec3d; +import net.minecraft.world.RaycastContext; +import net.minecraft.network.packet.c2s.play.ClientCommandC2SPacket; +import net.minecraft.network.packet.c2s.play.ClientCommandC2SPacket.Mode; + import org.jetbrains.annotations.Nullable; +import com.google.common.util.concurrent.AtomicDouble; +import java.util.concurrent.atomic.AtomicReference; public class AnchorAura extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); @@ -40,10 +48,10 @@ public class AnchorAura extends Module { private final Setting targetRange = sgGeneral.add(new DoubleSetting.Builder() .name("target-range") - .description("The radius in which players get targeted.") - .defaultValue(4) + .description("Range in which to target players.") + .defaultValue(10) .min(0) - .sliderMax(5) + .sliderMax(16) .build() ); @@ -54,24 +62,33 @@ public class AnchorAura extends Module { .build() ); - private final Setting rotationMode = sgGeneral.add(new EnumSetting.Builder() - .name("rotation-mode") - .description("The mode to rotate you server-side.") - .defaultValue(RotationMode.Both) + private final Setting minDamage = sgGeneral.add(new DoubleSetting.Builder() + .name("min-damage") + .description("The minimum damage to inflict on your target.") + .defaultValue(7) + .range(0, 36) .build() ); - private final Setting maxDamage = sgGeneral.add(new DoubleSetting.Builder() + private final Setting maxSelfDamage = sgGeneral.add(new DoubleSetting.Builder() .name("max-self-damage") - .description("The maximum self-damage allowed.") - .defaultValue(8) + .description("The maximum damage to inflict on yourself.") + .defaultValue(7) + .range(0, 36) + .build() + ); + + private final Setting antiSuicide = sgGeneral.add(new BoolSetting.Builder() + .name("anti-suicide") + .description("Will not place and break anchors if they will kill you.") + .defaultValue(true) .build() ); - private final Setting minHealth = sgGeneral.add(new DoubleSetting.Builder() - .name("min-health") - .description("The minimum health you have to be for Anchor Aura to work.") - .defaultValue(15) + private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() + .name("rotate") + .description("Rotates server-side towards the anchors being placed/broken.") + .defaultValue(true) .build() ); @@ -87,34 +104,34 @@ public class AnchorAura extends Module { private final Setting placeDelay = sgPlace.add(new IntSetting.Builder() .name("place-delay") .description("The tick delay between placing anchors.") - .defaultValue(2) + .defaultValue(5) .range(0, 10) .visible(place::get) .build() ); - private final Setting placeMode = sgPlace.add(new EnumSetting.Builder() - .name("place-mode") - .description("The way anchors are allowed to be placed near you.") - .defaultValue(Safety.Safe) + private final Setting placeRange = sgPlace.add(new DoubleSetting.Builder() + .name("place-range") + .description("The range at which anchors can be placed.") + .defaultValue(4) + .range(0, 6) .visible(place::get) .build() ); - private final Setting placeRange = sgPlace.add(new DoubleSetting.Builder() - .name("place-range") - .description("The radius in which anchors are placed in.") - .defaultValue(5) - .min(0) - .sliderMax(5) + private final Setting placeWallsRange = sgPlace.add(new DoubleSetting.Builder() + .name("walls-range") + .description("Range in which to place anchors when behind blocks.") + .defaultValue(4) + .range(0, 6) .visible(place::get) .build() ); - private final Setting placePositions = sgPlace.add(new EnumSetting.Builder() - .name("placement-positions") - .description("Where the Anchors will be placed on the entity.") - .defaultValue(PlaceMode.AboveAndBelow) + private final Setting airPlace = sgPlace.add(new BoolSetting.Builder() + .name("air-place") + .description("Allows Anchor Aura to place anchors in the air.") + .defaultValue(true) .visible(place::get) .build() ); @@ -124,24 +141,26 @@ public class AnchorAura extends Module { private final Setting breakDelay = sgBreak.add(new IntSetting.Builder() .name("break-delay") .description("The tick delay between breaking anchors.") - .defaultValue(10) + .defaultValue(1) .range(0, 10) .build() ); - private final Setting breakMode = sgBreak.add(new EnumSetting.Builder() - .name("break-mode") - .description("The way anchors are allowed to be broken near you.") - .defaultValue(Safety.Safe) + private final Setting breakRange = sgBreak.add(new DoubleSetting.Builder() + .name("break-range") + .description("Range in which to break anchors.") + .defaultValue(4.5) + .min(0) + .sliderMax(6) .build() ); - private final Setting breakRange = sgBreak.add(new DoubleSetting.Builder() - .name("break-range") - .description("The radius in which anchors are broken in.") - .defaultValue(5) + private final Setting breakWallsRange = sgBreak.add(new DoubleSetting.Builder() + .name("walls-range") + .description("Range in which to break anchors when behind blocks.") + .defaultValue(4.5) .min(0) - .sliderMax(5) + .sliderMax(6) .build() ); @@ -170,63 +189,47 @@ public class AnchorAura extends Module { // Render - private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() - .name("shape-mode") - .description("How the shapes are rendered.") - .defaultValue(ShapeMode.Both) + private final Setting swing = sgRender.add(new BoolSetting.Builder() + .name("swing") + .description("Whether to swing hand client-side.") + .defaultValue(true) .build() ); - private final Setting renderPlace = sgRender.add(new BoolSetting.Builder() - .name("render-place") + private final Setting render = sgRender.add(new BoolSetting.Builder() + .name("render") .description("Renders the block where it is placing an anchor.") .defaultValue(true) .build() ); - private final Setting placeSideColor = sgRender.add(new ColorSetting.Builder() - .name("place-side-color") - .description("The side color for positions to be placed.") - .defaultValue(new SettingColor(255, 0, 0, 75)) - .visible(renderPlace::get) - .build() - ); - - private final Setting placeLineColor = sgRender.add(new ColorSetting.Builder() - .name("place-line-color") - .description("The line color for positions to be placed.") - .defaultValue(new SettingColor(255, 0, 0, 255)) - .visible(renderPlace::get) - .build() - ); - - private final Setting renderBreak = sgRender.add(new BoolSetting.Builder() - .name("render-break") - .description("Renders the block where it is breaking an anchor.") - .defaultValue(true) + private final Setting shapeMode = sgRender.add(new EnumSetting.Builder() + .name("shape-mode") + .description("How the shapes are rendered.") + .defaultValue(ShapeMode.Both) + .visible(render::get) .build() ); - private final Setting breakSideColor = sgRender.add(new ColorSetting.Builder() - .name("break-side-color") - .description("The side color for anchors to be broken.") - .defaultValue(new SettingColor(255, 0, 0, 75)) - .visible(renderBreak::get) + private final Setting sideColor = sgRender.add(new ColorSetting.Builder() + .name("side-color") + .description("The side color for positions to be placed.") + .defaultValue(new SettingColor(15, 255, 211, 41)) + .visible(() -> render.get() && shapeMode.get().sides()) .build() ); - private final Setting breakLineColor = sgRender.add(new ColorSetting.Builder() - .name("break-line-color") - .description("The line color for anchors to be broken.") - .defaultValue(new SettingColor(255, 0, 0, 255)) - .visible(renderBreak::get) + private final Setting lineColor = sgRender.add(new ColorSetting.Builder() + .name("line-color") + .description("The line color for positions to be placed.") + .defaultValue(new SettingColor(15, 255, 211)) + .visible(() -> render.get() && shapeMode.get().lines()) .build() ); - private int placeDelayLeft; - private int breakDelayLeft; + private BlockPos renderBlockPos; + private int placeDelayLeft, breakDelayLeft; private PlayerEntity target; - private final BlockPos.Mutable mutable = new BlockPos.Mutable(); public AnchorAura() { super(Categories.Combat, "anchor-aura", "Automatically places and breaks Respawn Anchors to harm entities."); @@ -234,11 +237,17 @@ public AnchorAura() { @Override public void onActivate() { - placeDelayLeft = 0; + renderBlockPos = null; + placeDelayLeft = placeDelay.get(); breakDelayLeft = 0; target = null; } + @Override + public void onDeactivate() { + renderBlockPos = null; + } + @EventHandler private void onTick(TickEvent.Post event) { if (mc.world.getDimension().respawnAnchorWorks()) { @@ -247,166 +256,152 @@ private void onTick(TickEvent.Post event) { return; } + // Pause if (PlayerUtils.shouldPause(pauseOnMine.get(), pauseOnEat.get(), pauseOnDrink.get())) return; - if (EntityUtils.getTotalHealth(mc.player) <= minHealth.get()) return; + // Find a target if (TargetUtils.isBadTarget(target, targetRange.get())) { + renderBlockPos = null; target = TargetUtils.getPlayerTarget(targetRange.get(), targetPriority.get()); if (TargetUtils.isBadTarget(target, targetRange.get())) return; } - FindItemResult anchor = InvUtils.findInHotbar(Items.RESPAWN_ANCHOR); - FindItemResult glowStone = InvUtils.findInHotbar(Items.GLOWSTONE); + doAnchorAura(); + } - if (!anchor.found() || !glowStone.found()) return; + private void doAnchorAura() { + AtomicDouble bestPlaceDamage = new AtomicDouble(0); + AtomicReference bestPlaceBlockPos = new AtomicReference<>(new BlockPos.Mutable()); - if (breakDelayLeft >= breakDelay.get()) { - BlockPos breakPos = findBreakPos(target.getBlockPos()); - if (breakPos != null) { - breakDelayLeft = 0; + AtomicDouble bestBreakDamage = new AtomicDouble(0); + AtomicReference bestBreakBlockPos = new AtomicReference<>(new BlockPos.Mutable()); - if (rotationMode.get() == RotationMode.Both || rotationMode.get() == RotationMode.Break) { - BlockPos immutableBreakPos = breakPos.toImmutable(); - Rotations.rotate(Rotations.getYaw(breakPos), Rotations.getPitch(breakPos), 50, () -> breakAnchor(immutableBreakPos, anchor, glowStone)); - } else breakAnchor(breakPos, anchor, glowStone); - } - } + // Find best positions to place new anchors or break existing anchors + int iterationSize = (int) Math.ceil(Math.max(placeRange.get(), breakRange.get())); + BlockIterator.register(iterationSize, iterationSize, (blockPos, blockState) -> { + boolean isPlacing = blockState.getBlock() != Blocks.RESPAWN_ANCHOR; + + // Check raycast and range + double baseRange = isPlacing ? placeRange.get() : breakRange.get(); + double wallsRange = isPlacing ? placeWallsRange.get() : breakWallsRange.get(); + if (isOutOfRange(blockPos, baseRange, wallsRange)) return; - if (placeDelayLeft >= placeDelay.get() && place.get()) { - BlockPos placePos = findPlacePos(target.getBlockPos()); + // Check placement requirements + if (isPlacing) { + if (!BlockUtils.canPlace(blockPos)) return; - if (placePos != null) { - placeDelayLeft = 0; - BlockUtils.place(placePos.toImmutable(), anchor, (rotationMode.get() == RotationMode.Place || rotationMode.get() == RotationMode.Both), 50); + if (!airPlace.get() && !hasNeighborBlock(blockPos)) return; } - } - placeDelayLeft++; - breakDelayLeft++; - } + float bestDamage = isPlacing ? bestPlaceDamage.floatValue() : bestBreakDamage.floatValue(); + float selfDamage = DamageUtils.anchorDamage(mc.player, blockPos.toCenterPos()); + float targetDamage = DamageUtils.anchorDamage(target, blockPos.toCenterPos()); + + // Is the anchor optimal? + if (targetDamage >= minDamage.get() && targetDamage > bestDamage + && (!antiSuicide.get() || selfDamage <= maxSelfDamage.get()) + && (!antiSuicide.get() || PlayerUtils.getTotalHealth() - selfDamage > 0)) { + + if (isPlacing) { + bestPlaceDamage.set(targetDamage); + bestPlaceBlockPos.get().set(blockPos); + } else { + bestBreakDamage.set(targetDamage); + bestBreakBlockPos.get().set(blockPos); + } + } + }); - @EventHandler - private void onRender(Render3DEvent event) { - if (target == null) return; + BlockIterator.after(() -> { + renderBlockPos = null; - if (renderPlace.get()) { - BlockPos placePos = findPlacePos(target.getBlockPos()); - if (placePos == null) return; + FindItemResult anchor = InvUtils.findInHotbar(Items.RESPAWN_ANCHOR); + FindItemResult glowStone = InvUtils.findInHotbar(Items.GLOWSTONE); + if (!anchor.found() || !glowStone.found()) return; - event.renderer.box(placePos, placeSideColor.get(), placeLineColor.get(), shapeMode.get(), 0); - } + if (bestPlaceDamage.get() > 0 && place.get()) { + doPlace(bestPlaceBlockPos.get(), anchor); + } - if (renderBreak.get()) { - BlockPos breakPos = findBreakPos(target.getBlockPos()); - if (breakPos == null) return; + if (bestBreakDamage.get() > 0) { + doBreak(bestBreakBlockPos.get(), anchor, glowStone); + } - event.renderer.box(breakPos, breakSideColor.get(), breakLineColor.get(), shapeMode.get(), 0); - } + placeDelayLeft++; + }); } - @Nullable - private BlockPos findPlacePos(BlockPos targetPlacePos) { - switch (placePositions.get()) { - case All -> { - if (isValidPlace(targetPlacePos, 0, -1, 0)) return mutable; - else if (isValidPlace(targetPlacePos, 0, 2, 0)) return mutable; - else if (isValidPlace(targetPlacePos, 1, 0, 0)) return mutable; - else if (isValidPlace(targetPlacePos, -1, 0, 0)) return mutable; - else if (isValidPlace(targetPlacePos, 0, 0, 1)) return mutable; - else if (isValidPlace(targetPlacePos, 0, 0, -1)) return mutable; - else if (isValidPlace(targetPlacePos, 1, 1, 0)) return mutable; - else if (isValidPlace(targetPlacePos, -1, -1, 0)) return mutable; - else if (isValidPlace(targetPlacePos, 0, 1, 1)) return mutable; - else if (isValidPlace(targetPlacePos, 0, 0, -1)) return mutable; - } - case Above -> { - if (isValidPlace(targetPlacePos, 0, 2, 0)) return mutable; - } - case AboveAndBelow -> { - if (isValidPlace(targetPlacePos, 0, -1, 0)) return mutable; - else if (isValidPlace(targetPlacePos, 0, 2, 0)) return mutable; - } - case Around -> { - if (isValidPlace(targetPlacePos, 0, 0, -1)) return mutable; - else if (isValidPlace(targetPlacePos, 1, 0, 0)) return mutable; - else if (isValidPlace(targetPlacePos, -1, 0, 0)) return mutable; - else if (isValidPlace(targetPlacePos, 0, 0, 1)) return mutable; - } - } - return null; - } + private void doPlace(BlockPos blockPos, FindItemResult anchor) { + // Set render info + renderBlockPos = blockPos; - @Nullable - private BlockPos findBreakPos(BlockPos targetPos) { - if (isValidBreak(targetPos, 0, -1, 0)) return mutable; - else if (isValidBreak(targetPos, 0, 2, 0)) return mutable; - else if (isValidBreak(targetPos, 1, 0, 0)) return mutable; - else if (isValidBreak(targetPos, -1, 0, 0)) return mutable; - else if (isValidBreak(targetPos, 0, 0, 1)) return mutable; - else if (isValidBreak(targetPos, 0, 0, -1)) return mutable; - else if (isValidBreak(targetPos, 1, 1, 0)) return mutable; - else if (isValidBreak(targetPos, -1, -1, 0)) return mutable; - else if (isValidBreak(targetPos, 0, 1, 1)) return mutable; - else if (isValidBreak(targetPos, 0, 0, -1)) return mutable; - return null; - } + if (placeDelayLeft < placeDelay.get()) return; - private boolean getDamagePlace(BlockPos pos) { - return placeMode.get() == Safety.Suicide || DamageUtils.bedDamage(mc.player, pos.toCenterPos()) <= maxDamage.get(); - } + // Place anchor! + BlockUtils.place(blockPos, anchor, rotate.get(), 50, swing.get()); - private boolean getDamageBreak(BlockPos pos) { - return breakMode.get() == Safety.Suicide || DamageUtils.anchorDamage(mc.player, pos.toCenterPos()) <= maxDamage.get(); + placeDelayLeft = 0; } - private boolean isValidPlace(BlockPos origin, int xOffset, int yOffset, int zOffset) { - BlockUtils.mutateAround(mutable, origin, xOffset, yOffset, zOffset); - return Math.sqrt(mc.player.getBlockPos().getSquaredDistance(mutable)) <= placeRange.get() && getDamagePlace(mutable) && BlockUtils.canPlace(mutable); - } + private void doBreak(BlockPos blockPos, FindItemResult anchor, FindItemResult glowStone) { + // Set render info + renderBlockPos = blockPos; - private boolean isValidBreak(BlockPos origin, int xOffset, int yOffset, int zOffset) { - BlockUtils.mutateAround(mutable, origin, xOffset, yOffset, zOffset); - return mc.world.getBlockState(mutable).getBlock() == Blocks.RESPAWN_ANCHOR && Math.sqrt(mc.player.getBlockPos().getSquaredDistance(mutable)) <= breakRange.get() && getDamageBreak(mutable); - } + if (breakDelayLeft++ < breakDelay.get()) return; - private void breakAnchor(BlockPos pos, FindItemResult anchor, FindItemResult glowStone) { - if (pos == null || mc.world.getBlockState(pos).getBlock() != Blocks.RESPAWN_ANCHOR) return; + // Stop sneaking so interactions with the anchor are successful + if (mc.player.isSneaking()) { + mc.player.networkHandler.sendPacket(new ClientCommandC2SPacket(mc.player, Mode.RELEASE_SHIFT_KEY)); + } - mc.player.setSneaking(false); + Vec3d center = blockPos.toCenterPos(); - if (glowStone.isOffhand()) { - mc.interactionManager.interactBlock(mc.player, Hand.OFF_HAND, new BlockHitResult(new Vec3d(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5), Direction.UP, pos, true)); - } else { + // Charge the anchor + if (mc.world.getBlockState(blockPos).get(Properties.CHARGES) == 0) { InvUtils.swap(glowStone.slot(), true); - mc.interactionManager.interactBlock(mc.player, Hand.MAIN_HAND, new BlockHitResult(new Vec3d(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5), Direction.UP, pos, true)); + mc.interactionManager.interactBlock(mc.player, Hand.MAIN_HAND, new BlockHitResult(center, Direction.UP, blockPos, true)); } - if (anchor.isOffhand()) { - mc.interactionManager.interactBlock(mc.player, Hand.OFF_HAND, new BlockHitResult(new Vec3d(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5), Direction.UP, pos, true)); - } else { + // Explode the anchor when charged + if (mc.world.getBlockState(blockPos).get(Properties.CHARGES) > 0) { InvUtils.swap(anchor.slot(), true); - mc.interactionManager.interactBlock(mc.player, Hand.MAIN_HAND, new BlockHitResult(new Vec3d(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5), Direction.UP, pos, true)); + mc.interactionManager.interactBlock(mc.player, Hand.MAIN_HAND, new BlockHitResult(center, Direction.UP, blockPos, true)); } InvUtils.swapBack(); + + breakDelayLeft = 0; } - @Override - public String getInfoString() { - return EntityUtils.getName(target); + private boolean isOutOfRange(BlockPos blockPos, double baseRange, double wallsRange) { + Vec3d pos = blockPos.toCenterPos(); + if (!PlayerUtils.isWithin(pos, baseRange)) return true; + + RaycastContext raycastContext = new RaycastContext(mc.player.getEyePos(), pos, RaycastContext.ShapeType.COLLIDER, RaycastContext.FluidHandling.NONE, mc.player); + BlockHitResult result = mc.world.raycast(raycastContext); + if (result == null || !result.getBlockPos().equals(blockPos)) + return !PlayerUtils.isWithin(pos, wallsRange); + + return false; } - public enum PlaceMode { - Above, - Around, - AboveAndBelow, - All + private boolean hasNeighborBlock(BlockPos blockPos) + { + for (Direction direction : Direction.values()) { + if (!mc.world.getBlockState(blockPos.offset(direction)).isReplaceable()) return true; + } + return false; } - public enum RotationMode { - Place, - Break, - Both, - None + @EventHandler + private void onRender(Render3DEvent event) { + if (!render.get() || renderBlockPos == null) return; + + event.renderer.box(renderBlockPos, sideColor.get(), lineColor.get(), shapeMode.get(), 0); + } + + @Override + public String getInfoString() { + return EntityUtils.getName(target); } } From 0fe117be13b6e1e36d8e081490e7c26325429c0f Mon Sep 17 00:00:00 2001 From: Gingerbeard Date: Wed, 4 Jun 2025 00:36:44 -0400 Subject: [PATCH 2/8] dev fixed improper syntax style --- .../meteorclient/systems/modules/combat/AnchorAura.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java index 416a1e3eb7..778e88db36 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java @@ -385,8 +385,7 @@ private boolean isOutOfRange(BlockPos blockPos, double baseRange, double wallsRa return false; } - private boolean hasNeighborBlock(BlockPos blockPos) - { + private boolean hasNeighborBlock(BlockPos blockPos) { for (Direction direction : Direction.values()) { if (!mc.world.getBlockState(blockPos.offset(direction)).isReplaceable()) return true; } From ecb61471f12254fab86b6f3d7c472873fd8ea3e1 Mon Sep 17 00:00:00 2001 From: Gingerbeard Date: Thu, 5 Jun 2025 07:35:10 -0400 Subject: [PATCH 3/8] Better pause options for Anchor Aura --- .../systems/modules/combat/AnchorAura.java | 44 ++++++++++++------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java index 778e88db36..d769f49d23 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java @@ -11,6 +11,7 @@ import meteordevelopment.meteorclient.settings.*; import meteordevelopment.meteorclient.systems.modules.Categories; import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.systems.modules.Modules; import meteordevelopment.meteorclient.utils.entity.DamageUtils; import meteordevelopment.meteorclient.utils.entity.EntityUtils; import meteordevelopment.meteorclient.utils.entity.SortPriority; @@ -166,24 +167,24 @@ public class AnchorAura extends Module { // Pause - private final Setting pauseOnEat = sgPause.add(new BoolSetting.Builder() - .name("pause-on-eat") - .description("Pauses while eating.") - .defaultValue(false) - .build() - ); - - private final Setting pauseOnDrink = sgPause.add(new BoolSetting.Builder() - .name("pause-on-drink") - .description("Pauses while drinking potions.") - .defaultValue(false) + private final Setting pauseOnUse = sgPause.add(new BoolSetting.Builder() + .name("pause-on-use") + .description("Pauses while using an item.") + .defaultValue(true) .build() ); private final Setting pauseOnMine = sgPause.add(new BoolSetting.Builder() .name("pause-on-mine") .description("Pauses while mining blocks.") - .defaultValue(false) + .defaultValue(true) + .build() + ); + + private final Setting pauseOnCA = sgPause.add(new BoolSetting.Builder() + .name("pause-on-CA") + .description("Pauses while Crystal Aura is placing.") + .defaultValue(true) .build() ); @@ -257,7 +258,7 @@ private void onTick(TickEvent.Post event) { } // Pause - if (PlayerUtils.shouldPause(pauseOnMine.get(), pauseOnEat.get(), pauseOnDrink.get())) return; + if (shouldPause()) return; // Find a target if (TargetUtils.isBadTarget(target, targetRange.get())) { @@ -290,7 +291,7 @@ private void doAnchorAura() { if (isPlacing) { if (!BlockUtils.canPlace(blockPos)) return; - if (!airPlace.get() && !hasNeighborBlock(blockPos)) return; + if (!airPlace.get() && isAirPlace(blockPos)) return; } float bestDamage = isPlacing ? bestPlaceDamage.floatValue() : bestBreakDamage.floatValue(); @@ -385,10 +386,21 @@ private boolean isOutOfRange(BlockPos blockPos, double baseRange, double wallsRa return false; } - 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 true; + } + + private boolean shouldPause() { + if (pauseOnUse.get() && mc.player.isUsingItem()) return true; + + if (pauseOnMine.get() && mc.interactionManager.isBreakingBlock()) return true; + + CrystalAura CA = Modules.get().get(CrystalAura.class); + if (pauseOnCA.get() && CA.isActive() && CA.kaTimer > 0) return true; + return false; } From 115260bbe951da9c4c418729a695485c1276cc7f Mon Sep 17 00:00:00 2001 From: Gingerbeard Date: Thu, 5 Jun 2025 08:24:20 -0400 Subject: [PATCH 4/8] Better anchor aura delay configuration --- .../systems/modules/combat/AnchorAura.java | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java index d769f49d23..805e76ce1a 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java @@ -250,7 +250,7 @@ public void onDeactivate() { } @EventHandler - private void onTick(TickEvent.Post event) { + private void onTick(TickEvent.Pre event) { if (mc.world.getDimension().respawnAnchorWorks()) { error("You are in the Nether... disabling."); toggle(); @@ -258,7 +258,10 @@ private void onTick(TickEvent.Post event) { } // Pause - if (shouldPause()) return; + if (shouldPause()) { + renderBlockPos = null; + return; + } // Find a target if (TargetUtils.isBadTarget(target, targetRange.get())) { @@ -278,8 +281,8 @@ private void doAnchorAura() { AtomicReference bestBreakBlockPos = new AtomicReference<>(new BlockPos.Mutable()); // Find best positions to place new anchors or break existing anchors - int iterationSize = (int) Math.ceil(Math.max(placeRange.get(), breakRange.get())); - BlockIterator.register(iterationSize, iterationSize, (blockPos, blockState) -> { + int iteratorRange = (int) Math.ceil(Math.max(placeRange.get(), breakRange.get())); + BlockIterator.register(iteratorRange, iteratorRange, (blockPos, blockState) -> { boolean isPlacing = blockState.getBlock() != Blocks.RESPAWN_ANCHOR; // Check raycast and range @@ -320,15 +323,11 @@ private void doAnchorAura() { FindItemResult glowStone = InvUtils.findInHotbar(Items.GLOWSTONE); if (!anchor.found() || !glowStone.found()) return; - if (bestPlaceDamage.get() > 0 && place.get()) { - doPlace(bestPlaceBlockPos.get(), anchor); - } - if (bestBreakDamage.get() > 0) { doBreak(bestBreakBlockPos.get(), anchor, glowStone); + } else if (bestPlaceDamage.get() > 0 && place.get()) { + doPlace(bestPlaceBlockPos.get(), anchor); } - - placeDelayLeft++; }); } @@ -336,7 +335,7 @@ private void doPlace(BlockPos blockPos, FindItemResult anchor) { // Set render info renderBlockPos = blockPos; - if (placeDelayLeft < placeDelay.get()) return; + if (placeDelayLeft++ < placeDelay.get()) return; // Place anchor! BlockUtils.place(blockPos, anchor, rotate.get(), 50, swing.get()); From cd1dc13f60d71a1b9f6e66028c1a1a36c8c1da86 Mon Sep 17 00:00:00 2001 From: Gingerbeard Date: Thu, 5 Jun 2025 22:22:56 -0400 Subject: [PATCH 5/8] Removed pointless atomics --- .../systems/modules/combat/AnchorAura.java | 55 +++++++++---------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java index 805e76ce1a..ea8f254a5f 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java @@ -34,10 +34,6 @@ import net.minecraft.network.packet.c2s.play.ClientCommandC2SPacket; import net.minecraft.network.packet.c2s.play.ClientCommandC2SPacket.Mode; -import org.jetbrains.annotations.Nullable; -import com.google.common.util.concurrent.AtomicDouble; -import java.util.concurrent.atomic.AtomicReference; - public class AnchorAura extends Module { private final SettingGroup sgGeneral = settings.getDefaultGroup(); private final SettingGroup sgPlace = settings.createGroup("Place"); @@ -228,6 +224,12 @@ public class AnchorAura extends Module { .build() ); + private double bestPlaceDamage; + private BlockPos.Mutable bestPlacePos = new BlockPos.Mutable(); + + private double bestBreakDamage; + private BlockPos.Mutable bestBreakPos = new BlockPos.Mutable(); + private BlockPos renderBlockPos; private int placeDelayLeft, breakDelayLeft; private PlayerEntity target; @@ -274,11 +276,8 @@ private void onTick(TickEvent.Pre event) { } private void doAnchorAura() { - AtomicDouble bestPlaceDamage = new AtomicDouble(0); - AtomicReference bestPlaceBlockPos = new AtomicReference<>(new BlockPos.Mutable()); - - AtomicDouble bestBreakDamage = new AtomicDouble(0); - AtomicReference bestBreakBlockPos = new AtomicReference<>(new BlockPos.Mutable()); + bestPlaceDamage = 0; + bestBreakDamage = 0; // Find best positions to place new anchors or break existing anchors int iteratorRange = (int) Math.ceil(Math.max(placeRange.get(), breakRange.get())); @@ -297,7 +296,7 @@ private void doAnchorAura() { if (!airPlace.get() && isAirPlace(blockPos)) return; } - float bestDamage = isPlacing ? bestPlaceDamage.floatValue() : bestBreakDamage.floatValue(); + float bestDamage = isPlacing ? (float) bestPlaceDamage : (float) bestBreakDamage; float selfDamage = DamageUtils.anchorDamage(mc.player, blockPos.toCenterPos()); float targetDamage = DamageUtils.anchorDamage(target, blockPos.toCenterPos()); @@ -307,11 +306,11 @@ private void doAnchorAura() { && (!antiSuicide.get() || PlayerUtils.getTotalHealth() - selfDamage > 0)) { if (isPlacing) { - bestPlaceDamage.set(targetDamage); - bestPlaceBlockPos.get().set(blockPos); + bestPlaceDamage = targetDamage; + bestPlacePos.set(blockPos); } else { - bestBreakDamage.set(targetDamage); - bestBreakBlockPos.get().set(blockPos); + bestBreakDamage = targetDamage; + bestBreakPos.set(blockPos); } } }); @@ -323,29 +322,29 @@ private void doAnchorAura() { FindItemResult glowStone = InvUtils.findInHotbar(Items.GLOWSTONE); if (!anchor.found() || !glowStone.found()) return; - if (bestBreakDamage.get() > 0) { - doBreak(bestBreakBlockPos.get(), anchor, glowStone); - } else if (bestPlaceDamage.get() > 0 && place.get()) { - doPlace(bestPlaceBlockPos.get(), anchor); + if (bestBreakDamage > 0) { + doBreak(anchor, glowStone); + } else if (bestPlaceDamage > 0 && place.get()) { + doPlace(anchor); } }); } - private void doPlace(BlockPos blockPos, FindItemResult anchor) { + private void doPlace(FindItemResult anchor) { // Set render info - renderBlockPos = blockPos; + renderBlockPos = bestPlacePos; if (placeDelayLeft++ < placeDelay.get()) return; // Place anchor! - BlockUtils.place(blockPos, anchor, rotate.get(), 50, swing.get()); + BlockUtils.place(bestPlacePos, anchor, rotate.get(), 50, swing.get()); placeDelayLeft = 0; } - private void doBreak(BlockPos blockPos, FindItemResult anchor, FindItemResult glowStone) { + private void doBreak(FindItemResult anchor, FindItemResult glowStone) { // Set render info - renderBlockPos = blockPos; + renderBlockPos = bestBreakPos; if (breakDelayLeft++ < breakDelay.get()) return; @@ -354,18 +353,18 @@ private void doBreak(BlockPos blockPos, FindItemResult anchor, FindItemResult gl mc.player.networkHandler.sendPacket(new ClientCommandC2SPacket(mc.player, Mode.RELEASE_SHIFT_KEY)); } - Vec3d center = blockPos.toCenterPos(); + Vec3d center = bestBreakPos.toCenterPos(); // Charge the anchor - if (mc.world.getBlockState(blockPos).get(Properties.CHARGES) == 0) { + if (mc.world.getBlockState(bestBreakPos).get(Properties.CHARGES) == 0) { InvUtils.swap(glowStone.slot(), true); - mc.interactionManager.interactBlock(mc.player, Hand.MAIN_HAND, new BlockHitResult(center, Direction.UP, blockPos, true)); + mc.interactionManager.interactBlock(mc.player, Hand.MAIN_HAND, new BlockHitResult(center, Direction.UP, bestBreakPos, true)); } // Explode the anchor when charged - if (mc.world.getBlockState(blockPos).get(Properties.CHARGES) > 0) { + if (mc.world.getBlockState(bestBreakPos).get(Properties.CHARGES) > 0) { InvUtils.swap(anchor.slot(), true); - mc.interactionManager.interactBlock(mc.player, Hand.MAIN_HAND, new BlockHitResult(center, Direction.UP, blockPos, true)); + mc.interactionManager.interactBlock(mc.player, Hand.MAIN_HAND, new BlockHitResult(center, Direction.UP, bestBreakPos, true)); } InvUtils.swapBack(); From 0c17847cc98e2b30bf15338aa9fa9dccc45d88f5 Mon Sep 17 00:00:00 2001 From: Gingerbeard Date: Sat, 7 Jun 2025 23:00:11 -0400 Subject: [PATCH 6/8] Proper directional interaction --- .../meteorclient/systems/modules/combat/AnchorAura.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java index ea8f254a5f..9e92144112 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java @@ -358,13 +358,13 @@ private void doBreak(FindItemResult anchor, FindItemResult glowStone) { // Charge the anchor if (mc.world.getBlockState(bestBreakPos).get(Properties.CHARGES) == 0) { InvUtils.swap(glowStone.slot(), true); - mc.interactionManager.interactBlock(mc.player, Hand.MAIN_HAND, new BlockHitResult(center, Direction.UP, bestBreakPos, true)); + mc.interactionManager.interactBlock(mc.player, Hand.MAIN_HAND, new BlockHitResult(center, BlockUtils.getDirection(bestBreakPos), bestBreakPos, true)); } // Explode the anchor when charged if (mc.world.getBlockState(bestBreakPos).get(Properties.CHARGES) > 0) { InvUtils.swap(anchor.slot(), true); - mc.interactionManager.interactBlock(mc.player, Hand.MAIN_HAND, new BlockHitResult(center, Direction.UP, bestBreakPos, true)); + mc.interactionManager.interactBlock(mc.player, Hand.MAIN_HAND, new BlockHitResult(center, BlockUtils.getDirection(bestBreakPos), bestBreakPos, true)); } InvUtils.swapBack(); From 36b09fea45f0ede6fd3baf2413c20bee6f72b92e Mon Sep 17 00:00:00 2001 From: Gingerbeard Date: Thu, 12 Jun 2025 12:20:00 -0400 Subject: [PATCH 7/8] Fixed wrong maximum damage settings --- .../meteorclient/systems/modules/combat/AnchorAura.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java index 9e92144112..e9d3e4dea3 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java @@ -63,7 +63,8 @@ public class AnchorAura extends Module { .name("min-damage") .description("The minimum damage to inflict on your target.") .defaultValue(7) - .range(0, 36) + .min(0) + .sliderMax(36) .build() ); @@ -71,7 +72,8 @@ public class AnchorAura extends Module { .name("max-self-damage") .description("The maximum damage to inflict on yourself.") .defaultValue(7) - .range(0, 36) + .min(0) + .sliderMax(36) .build() ); From 0174b8dbf1282bd634e755e6d4fc9279ca56a66a Mon Sep 17 00:00:00 2001 From: Gingerbeard Date: Sat, 14 Jun 2025 08:55:39 -0400 Subject: [PATCH 8/8] Fixed issues for anchor aura --- .../systems/modules/combat/AnchorAura.java | 64 +++++++++++++++---- 1 file changed, 50 insertions(+), 14 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java index e9d3e4dea3..31e35f95c3 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/combat/AnchorAura.java @@ -23,6 +23,7 @@ import meteordevelopment.orbit.EventHandler; import net.minecraft.state.property.Properties; import net.minecraft.block.Blocks; +import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Items; import net.minecraft.util.Hand; @@ -84,6 +85,13 @@ public class AnchorAura extends Module { .build() ); + private final Setting swapBack = sgGeneral.add(new BoolSetting.Builder() + .name("swap-back") + .description("Switches to your previous slot after using anchors.") + .defaultValue(true) + .build() + ); + private final Setting rotate = sgGeneral.add(new BoolSetting.Builder() .name("rotate") .description("Rotates server-side towards the anchors being placed/broken.") @@ -137,9 +145,17 @@ public class AnchorAura extends Module { // Break + private final Setting chargeDelay = sgBreak.add(new IntSetting.Builder() + .name("charge-delay") + .description("The tick delay it takes to charge anchors.") + .defaultValue(1) + .range(0, 10) + .build() + ); + private final Setting breakDelay = sgBreak.add(new IntSetting.Builder() .name("break-delay") - .description("The tick delay between breaking anchors.") + .description("The tick delay it takes to break anchors.") .defaultValue(1) .range(0, 10) .build() @@ -233,7 +249,7 @@ public class AnchorAura extends Module { private BlockPos.Mutable bestBreakPos = new BlockPos.Mutable(); private BlockPos renderBlockPos; - private int placeDelayLeft, breakDelayLeft; + private int placeDelayLeft, chargeDelayLeft, breakDelayLeft; private PlayerEntity target; public AnchorAura() { @@ -244,6 +260,7 @@ public AnchorAura() { public void onActivate() { renderBlockPos = null; placeDelayLeft = placeDelay.get(); + chargeDelayLeft = 0; breakDelayLeft = 0; target = null; } @@ -339,7 +356,7 @@ private void doPlace(FindItemResult anchor) { if (placeDelayLeft++ < placeDelay.get()) return; // Place anchor! - BlockUtils.place(bestPlacePos, anchor, rotate.get(), 50, swing.get()); + BlockUtils.place(bestPlacePos, anchor, rotate.get(), 50, swing.get(), false, swapBack.get()); placeDelayLeft = 0; } @@ -348,30 +365,49 @@ private void doBreak(FindItemResult anchor, FindItemResult glowStone) { // Set render info renderBlockPos = bestBreakPos; - if (breakDelayLeft++ < breakDelay.get()) return; - - // Stop sneaking so interactions with the anchor are successful - if (mc.player.isSneaking()) { - mc.player.networkHandler.sendPacket(new ClientCommandC2SPacket(mc.player, Mode.RELEASE_SHIFT_KEY)); + if (rotate.get()) { + Rotations.rotate(Rotations.getYaw(bestBreakPos), Rotations.getPitch(bestBreakPos), 40, () -> { doInteract(anchor, glowStone); }); + } else { + doInteract(anchor, glowStone); } + } + + private void doInteract(FindItemResult anchor, FindItemResult glowStone) { + BlockState blockState = mc.world.getBlockState(bestBreakPos); + if (blockState.getBlock() != Blocks.RESPAWN_ANCHOR) return; Vec3d center = bestBreakPos.toCenterPos(); + int charges = blockState.get(Properties.CHARGES); + boolean sneaked = false; // Charge the anchor - if (mc.world.getBlockState(bestBreakPos).get(Properties.CHARGES) == 0) { - InvUtils.swap(glowStone.slot(), true); + if (charges == 0 && chargeDelayLeft++ >= chargeDelay.get()) { + InvUtils.swap(glowStone.slot(), swapBack.get()); + stopSneaking(); mc.interactionManager.interactBlock(mc.player, Hand.MAIN_HAND, new BlockHitResult(center, BlockUtils.getDirection(bestBreakPos), bestBreakPos, true)); + chargeDelayLeft = 0; + charges++; + sneaked = true; } // Explode the anchor when charged - if (mc.world.getBlockState(bestBreakPos).get(Properties.CHARGES) > 0) { - InvUtils.swap(anchor.slot(), true); + if (charges > 0 && breakDelayLeft++ >= breakDelay.get()) { + InvUtils.swap(anchor.slot(), swapBack.get()); + if (!sneaked) stopSneaking(); mc.interactionManager.interactBlock(mc.player, Hand.MAIN_HAND, new BlockHitResult(center, BlockUtils.getDirection(bestBreakPos), bestBreakPos, true)); + breakDelayLeft = 0; + + // Instantly break the anchor on client, stops invalid block placements + mc.world.setBlockState(bestBreakPos, mc.world.getFluidState(bestBreakPos).getBlockState(), 0); } - InvUtils.swapBack(); + if (swapBack.get()) InvUtils.swapBack(); + } - breakDelayLeft = 0; + private void stopSneaking() { + if (mc.player.isSneaking()) { + mc.player.networkHandler.sendPacket(new ClientCommandC2SPacket(mc.player, Mode.RELEASE_SHIFT_KEY)); + } } private boolean isOutOfRange(BlockPos blockPos, double baseRange, double wallsRange) {