Получить позицию(Forge 1.20.1)

Версия Minecraft
1.20.1
API
Forge
Как получить позицию руки игрока, конкретно той части где рука держит предмет?
 
Из модели берёшь ModelPart выбранной руки(Внутри есть позиция)

оффсет(вроде этот, взят из ItemInHandRenderer(лучше еще там посмореть))

Java:
private static final float ITEM_POS_X = 0.56F;
private static final float ITEM_POS_Y = -0.52F;
private static final float ITEM_POS_Z = -0.72F;
 
А ещё можно сделать чуть по другому

Java:
    public Vector3d getHand() {
        PlayerEntity player = mc.player;
        if (player != null) {
            // Позиция глаз
            Vector3d eyePos = player.getEyePosition(1.0F);
            // Пример смещения
            Vector3d handOffset = new Vector3d(0.0, -0.5, -0.5);
            // Позиция руки
            Vector3d handPos = eyePos.add(handOffset);
            return handPos;
        }
        return null;
    }

Далее уже можно дописать логику, чтоб по разному работал при разных действиях
 
Из модели берёшь ModelPart выбранной руки(Внутри есть позиция)

оффсет(вроде этот, взят из ItemInHandRenderer(лучше еще там посмореть))

Java:
private static final float ITEM_POS_X = 0.56F;
private static final float ITEM_POS_Y = -0.52F;
private static final float ITEM_POS_Z = -0.72F;
А каким образом получить ModelPart игрока?
 
Попробовал поискать и нашел, но не знаю как получить playerModel<>, где как раз и определены эти Modelpart

Модель можно получить из рендера а рендер - Minecraft.geInstance().getEntityRenderDistatcher().getRenderer(//Сущность)
 
Попробовал поискать и нашел, но не знаю как получить playerModel<>, где как раз и определены эти Modelpart
Написал код, но ничего не получается, pos принимает только одну координату, вообще где-то случайно в мире
Java:
 AbstractClientPlayer player = Minecraft.getInstance().player;

 PlayerRenderer renderer =(PlayerRenderer) Minecraft.getInstance().getEntityRenderDispatcher().getRenderer(player);
 PlayerModel<AbstractClientPlayer> model = renderer.getModel();

 Vec3 pos = new Vec3(model.leftArm.x, model.leftArm.y, model.leftArm.z);
 
Написал код, но ничего не получается, pos принимает только одну координату, вообще где-то случайно в мире
Java:
    public Vector3d getPlayerHandPosition() {
        AbstractClientPlayer player = Minecraft.getInstance().player;
        
        if (player == null) {
            return null;
        }
        
        PlayerRenderer renderer = (PlayerRenderer) Minecraft.getInstance().getEntityRenderDispatcher().getRenderer(player);
        PlayerModel<AbstractClientPlayer> model = renderer.getModel();
        Vector3d handPosition = new Vector3d(model.leftArm.x, model.leftArm.y, model.leftArm.z);
        Vector3d playerPosition = new Vector3d(player.getX(), player.getY(), player.getZ());
        Vector3d finalPosition = playerPosition.add(handPosition);

        return finalPosition;
    }
 
Написал код, но ничего не получается, pos принимает только одну координату, вообще где-то случайно в мире
Java:
 AbstractClientPlayer player = Minecraft.getInstance().player;

 PlayerRenderer renderer =(PlayerRenderer) Minecraft.getInstance().getEntityRenderDispatcher().getRenderer(player);
 PlayerModel<AbstractClientPlayer> model = renderer.getModel();

 Vec3 pos = new Vec3(model.leftArm.x, model.leftArm.y, model.leftArm.z);
YeanLondi, написал ваш код, но ситуация не улучшилась. Если вывести координаты leftHand, то они равны 5.0f по x, 2.5f по y и 0.0f по z. Получается что вектор перемещается за игроком, но он не в позиции руки, и еще он не вращается вместе с игроком.
 
YeanLondi, написал ваш код, но ситуация не улучшилась. Если вывести координаты leftHand, то они равны 5.0f по x, 2.5f по y и 0.0f по z. Получается что вектор перемещается за игроком, но он не в позиции руки, и еще он не вращается вместе с игроком.
Мне нужно заспавнить партиклы в месте, где игрок держит предмет, и необходимо чтобы позиция партиклов всегда находилась в позиции руки, и не менялась(следовала за движениями и поворотами игрока)
 
хм, интересная фишка)

Java:
    private static final Minecraft mc = Minecraft.getInstance();

    @SubscribeEvent
    public static void onRenderHand(RenderHandEvent event) {
        EntityPlayer player = mc.player;
        Vec3d handPosition = getHandPosition(player);
        spawnParticles(handPosition);
    }

    private static Vec3d getHandPosition(EntityPlayer player) {
        GlStateManager.pushMatrix();
        GlStateManager.translate(0.5F, 0.5F, 0.5F);
        Vec3d playerPos = player.getPositionVector();
        float yaw = player.rotationYaw * ((float) Math.PI / 180F);
        float pitch = player.rotationPitch * ((float) Math.PI / 180F);
        double xOffset = Math.sin(yaw) * Math.cos(pitch);
        double yOffset = -Math.sin(pitch);
        double zOffset = -Math.cos(yaw) * Math.cos(pitch);
        Vec3d handPosition = playerPos.add(xOffset, yOffset, zOffset);
        GlStateManager.popMatrix();
        return handPosition;
    }

    private static void spawnParticles(Vec3d position) {
        Particle particle = new Particle(/* ТТТТТТТТ */);
        mc.world.spawnEntity(particle);
    }

Попробуй, если что, отпишись.
Я просто правда хз, как подобное можно реализовать, мне кажется что подобное проще рендерить прям на предмете, нежели пытаться отловить позицию руки.
 
Назад
Сверху