Проблема почти всегда связана с неправильным использованием матриц или порядка умножения в рендере. Часто проще не использовать worldToScreen, а рисовать прямо в 3D пространстве. Это решит проблему летания, тк координаты будут привязаны к миру, а не к экрану.
Вот концепт от меня:
public class PlayerESP {
public static void render(MatrixStack matrixStack, float tickDelta) {
MinecraftClient client = MinecraftClient.getInstance();
Camera camera = client.gameRenderer.getCamera();
Vec3d cameraPos = camera.getPos();
for (PlayerEntity player : client.world.getPlayers()) {
if (player == client.player) continue;
double x = player.prevX + (player.getX() - player.prevX) * tickDelta;
double y = player.prevY + (player.getY() - player.prevY) * tickDelta;
double z = player.prevZ + (player.getZ() - player.prevZ) * tickDelta;
double renderX = x - cameraPos.x;
double renderY = y - cameraPos.y;
double renderZ = z - cameraPos.z;
matrixStack.push();
matrixStack.translate(renderX, renderY, renderZ);
Здесть рисуешь есп
matrixStack.pop();
}
}
}
Если очень нужен именно WorldToScreen, тебе нужна проекция. В маппингах на 1.21: тебе нужно получить GameRenderer и Camera. Получить матрицу проекции и вида. Использовать метод camera.project.
Возможно у тебя это: ты берешь координаты игрока за прошлый тик (player.getX()), а камеру за текущий. Юз prevX + (getX() - prevX) * tickDelta.
А вообще, лучше найди опенсорс проект и скопируй
