package com.example.mymod;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.client.event.KeyDownCallback;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.client.option.KeyBinding;
import net.minecraft.client.util.InputUtil;
import net.minecraft.entity.Entity;
import net.minecraft.util.math.Box;
import net.minecraft.util.math.Vec3d;
import org.lwjgl.glfw.GLFW;
import java.util.List;
import java.util.Optional;
public class AutoAimMod implements ModInitializer {
private static final KeyBinding X_KEY_BINDING = KeyBinding.of("key.mymod.auto_aim", InputUtil.Type.KEYSYM, GLFW.GLFW_KEY_X, "key.categories.gameplay");
@Override
public void onInitialize() {
KeyDownCallback.EVENT.register((client, screen, key, scanCode, modifiers) -> {
if (X_KEY_BINDING.matchesKey(key, scanCode)) {
autoAim(client.player);
}
});
}
private void autoAim(ClientPlayerEntity player) {
if (player == null) return;
Vec3d playerPos = player.getPos();
double closestDistance = Double.MAX_VALUE;
Entity closestEntity = null;
Box box = new Box(playerPos, playerPos).expand(10, 10, 10);
List<Entity> entities = player.world.getOtherEntities(player, box);
for (Entity entity : entities) {
if (entity == player || entity.isSpectator() || entity.isDead()) continue;
double distance = player.getSquaredDistanceTo(entity);
if (distance < closestDistance) {
closestDistance = distance;
closestEntity = entity;
}
}
if (closestEntity != null) {
Vec3d targetPos = closestEntity.getEyePos();
lookAt(player, targetPos);
}
}
private void lookAt(ClientPlayerEntity player, Vec3d targetPos) {
Vec3d playerPos = player.getPos();
double deltaX = targetPos.x - playerPos.x;
double deltaY = targetPos.y - playerPos.y;
double deltaZ = targetPos.z - playerPos.z;
double distance = Math.sqrt(deltaX * deltaX + deltaZ * deltaZ);
float yaw = (float) Math.toDegrees(Math.atan2(deltaZ, deltaX)) - 90F;
float pitch = (float) -Math.toDegrees(Math.atan2(deltaY, distance));
player.setYaw(yaw);
player.setPitch(pitch);
}
}