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

Версия Minecraft
1.20.1
API
Forge
32
1
2
Как получить позицию руки игрока, конкретно той части где рука держит предмет?
 
Из модели берёшь 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);
    }

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