编辑代码

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);
    }
}