From 2d79d7856204c6eef6aea5ea3dcac6a35ad01d72 Mon Sep 17 00:00:00 2001 From: Redstone1024 <2824517378@qq.com> Date: Tue, 27 Aug 2024 10:23:59 +0800 Subject: [PATCH] Add AimAssist feature --- .../java/com/example/addon/AddonTemplate.java | 1 + .../com/example/addon/modules/AimAssist.java | 155 ++++++++++++++++++ 2 files changed, 156 insertions(+) create mode 100644 src/main/java/com/example/addon/modules/AimAssist.java diff --git a/src/main/java/com/example/addon/AddonTemplate.java b/src/main/java/com/example/addon/AddonTemplate.java index fcabb11..30a92cf 100644 --- a/src/main/java/com/example/addon/AddonTemplate.java +++ b/src/main/java/com/example/addon/AddonTemplate.java @@ -27,6 +27,7 @@ public class AddonTemplate extends MeteorAddon { // Modules Modules.get().add(new ModuleExample()); Modules.get().add(new Prediction()); + Modules.get().add(new AimAssist()); // Commands Commands.add(new CommandExample()); diff --git a/src/main/java/com/example/addon/modules/AimAssist.java b/src/main/java/com/example/addon/modules/AimAssist.java new file mode 100644 index 0000000..8402f93 --- /dev/null +++ b/src/main/java/com/example/addon/modules/AimAssist.java @@ -0,0 +1,155 @@ +package com.example.addon.modules; + +import com.example.addon.AddonTemplate; +import meteordevelopment.meteorclient.events.render.Render3DEvent; +import meteordevelopment.meteorclient.events.world.TickEvent; +import meteordevelopment.meteorclient.settings.*; +import meteordevelopment.meteorclient.systems.friends.Friends; +import meteordevelopment.meteorclient.systems.modules.Module; +import meteordevelopment.meteorclient.utils.entity.EntityUtils; +import meteordevelopment.meteorclient.utils.entity.SortPriority; +import meteordevelopment.meteorclient.utils.entity.Target; +import meteordevelopment.meteorclient.utils.entity.TargetUtils; +import meteordevelopment.meteorclient.utils.player.PlayerUtils; +import meteordevelopment.orbit.EventHandler; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.util.math.MathHelper; +import org.joml.Vector3d; + +import java.util.Set; + +public class AimAssist extends Module { + private final SettingGroup sgGeneral = settings.getDefaultGroup(); + private final SettingGroup sgSpeed = settings.createGroup("Aim Speed"); + + // General + + private final Setting>> entities = sgGeneral.add(new EntityTypeListSetting.Builder() + .name("entities") + .description("Entities to aim at.") + .defaultValue(EntityType.PLAYER) + .build() + ); + + private final Setting range = sgGeneral.add(new DoubleSetting.Builder() + .name("range") + .description("The range at which an entity can be targeted.") + .defaultValue(5) + .min(0) + .build() + ); + + private final Setting ignoreWalls = sgGeneral.add(new BoolSetting.Builder() + .name("ignore-walls") + .description("Whether or not to ignore aiming through walls.") + .defaultValue(false) + .build() + ); + + private final Setting priority = sgGeneral.add(new EnumSetting.Builder() + .name("priority") + .description("How to select target from entities in range.") + .defaultValue(SortPriority.LowestHealth) + .build() + ); + + private final Setting bodyTarget = sgGeneral.add(new EnumSetting.Builder() + .name("aim-target") + .description("Which part of the entities body to aim at.") + .defaultValue(Target.Body) + .build() + ); + + // Aim Speed + + private final Setting instant = sgSpeed.add(new BoolSetting.Builder() + .name("instant-look") + .description("Instantly looks at the entity.") + .defaultValue(false) + .build() + ); + + private final Setting speed = sgSpeed.add(new DoubleSetting.Builder() + .name("speed") + .description("How fast to aim at the entity.") + .defaultValue(5) + .min(0) + .visible(() -> !instant.get()) + .build() + ); + + private final Vector3d vec3d1 = new Vector3d(); + private Entity target; + + public AimAssist() { super(AddonTemplate.CATEGORY, "aim-assist", "Automatically aims at entities."); } + + @EventHandler + private void onTick(TickEvent.Post event) { + target = TargetUtils.get(entity -> { + if (!entity.isAlive()) return false; + if (mc.player.distanceTo(entity) >= range.get()) return false; + if (!ignoreWalls.get() && !PlayerUtils.canSeeEntity(entity)) return false; + if (entity == mc.player || !entities.get().contains(entity.getType())) return false; + + if (entity instanceof PlayerEntity) { + return Friends.get().shouldAttack((PlayerEntity) entity); + } + + return true; + }, priority.get()); + } + + @EventHandler + private void onRender(Render3DEvent event) { + if (target != null) aim(target, event.tickDelta, instant.get()); + } + + private void aim(Entity target, double delta, boolean instant) { + vec3d1.set( + MathHelper.lerp(delta, target.lastRenderX, target.getX()), + MathHelper.lerp(delta, target.lastRenderY, target.getY()), + MathHelper.lerp(delta, target.lastRenderZ, target.getZ()) + ); + + switch (bodyTarget.get()) { + case Head -> vec3d1.add(0, target.getEyeHeight(target.getPose()), 0); + case Body -> vec3d1.add(0, target.getEyeHeight(target.getPose()) / 2, 0); + } + + double deltaX = vec3d1.x - mc.player.getX(); + double deltaZ = vec3d1.z - mc.player.getZ(); + double deltaY = vec3d1.y - (mc.player.getY() + mc.player.getEyeHeight(mc.player.getPose())); + + double angle = Math.toDegrees(Math.atan2(deltaZ, deltaX)) - 90; + double deltaAngle; + double toRotate; + + if (instant) { + mc.player.setYaw((float) angle); + } else { + deltaAngle = MathHelper.wrapDegrees(angle - mc.player.getYaw()); + toRotate = speed.get() * (deltaAngle >= 0 ? 1 : -1) * delta; + if ((toRotate >= 0 && toRotate > deltaAngle) || (toRotate < 0 && toRotate < deltaAngle)) toRotate = deltaAngle; + mc.player.setYaw(mc.player.getYaw() + (float) toRotate); + } + + double idk = Math.sqrt(deltaX * deltaX + deltaZ * deltaZ); + angle = -Math.toDegrees(Math.atan2(deltaY, idk)); + + if (instant) { + mc.player.setPitch((float) angle); + } else { + deltaAngle = MathHelper.wrapDegrees(angle - mc.player.getPitch()); + toRotate = speed.get() * (deltaAngle >= 0 ? 1 : -1) * delta; + if ((toRotate >= 0 && toRotate > deltaAngle) || (toRotate < 0 && toRotate < deltaAngle)) toRotate = deltaAngle; + mc.player.setPitch(mc.player.getPitch() + (float) toRotate); + } + } + + @Override + public String getInfoString() { + return EntityUtils.getName(target); + } +}