Всем привет! Я пытался реализовать ESP в своём моде с использованием forge API 1.20.1. Но я столкнулся с проблемой: я никак не могу получить верную позицию сущности на экране. Квадрат, который должен распологаться на месте сущности не попадает на неё. Вот мой код:
```java
import net.minecraft.client.Camera;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.phys.Vec3;
import net.minecraftforge.client.event.RenderGuiEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraft.client.gui.GuiGraphics;
import org.joml.Matrix4f;
import org.joml.Vector4f;
public class ESP {
private final Minecraft mc;
public ESP() {
this.mc = Minecraft.getInstance();
MinecraftForge.EVENT_BUS.register(this);
}
@SubscribeEvent
public void onRenderGui(RenderGuiEvent.Post event) {
GuiGraphics guiGraphics = event.getGuiGraphics();
for (Entity entity : mc.level.entitiesForRendering()) {
if (entity != mc.player && entity instanceof Player) {
// Пример координат сущности
float partialTicks = event.getPartialTick();
Vector4f screenPos = worldToScreen(entity.getPosition(partialTicks));
int screenX = (int) screenPos.x;
int screenY = (int) screenPos.y;
System.out.println(screenX + " " + screenY);
renderRectangle(guiGraphics, screenX, screenY, 20, 20, 0x80FF0000);
}
}
}
public void renderRectangle(GuiGraphics guiGraphics, int x, int y, int width, int height, int color) {
guiGraphics.fill(x, y, x + width, y + height, color);
}
public Vector4f worldToScreen(Vec3 worldPos) {
Minecraft minecraft = Minecraft.getInstance();
GameRenderer gameRenderer = minecraft.gameRenderer;
Camera camera = gameRenderer.getMainCamera();
Matrix4f projectionMatrix = gameRenderer.getProjectionMatrix(minecraft.getWindow().getGuiScale());
Matrix4f viewMatrix = new Matrix4f();
viewMatrix.identity();
Vec3 cameraPos = camera.getPosition();
viewMatrix.translate((float) -cameraPos.x, (float) -cameraPos.y, (float) -cameraPos.z);
viewMatrix.rotate((float) Math.toRadians(-camera.getXRot()), new org.joml.Vector3f(1, 0, 0));
viewMatrix.rotate((float) Math.toRadians(-camera.getYRot()), new org.joml.Vector3f(0, 1, 0));
Vector4f screenPos = new Vector4f((float) worldPos.x, (float) worldPos.y, (float) worldPos.z, 1.0F);
screenPos.mul(viewMatrix);
screenPos.mul(projectionMatrix);
if (screenPos.w > 0.0F) {
screenPos.div(screenPos.w);
}
float screenX = (screenPos.x + 1.0F) / 2.0F * minecraft.getWindow().getGuiScaledWidth();
float screenY = (1.0F - screenPos.y) / 2.0F * minecraft.getWindow().getGuiScaledHeight();
return new Vector4f(screenX, screenY, screenPos.z, screenPos.w);
}
}
```
В чём ошибка? Почему я получаю неверные экранные координаты?