Рендер предмета относительно руки

Версия Minecraft
1.7.10
173
1
3
вертел я этот рендер, как говорится
Собственно, надо сделать рендер как игрок держит щит если у него в руках меч.
Более менее понял как это работает, сделал вот так:
Код:
@SubscribeEvent
    public void grembipi1(RenderPlayerEvent.Specials.Post event) {

        ItemStack is = event.entityPlayer.getCurrentEquippedItem();
        ItemStack x = event.entityPlayer.inventory.getStackInSlot(0);

        if (is != null && is.getItem() instanceof ItemSword) {
            
            GL11.glPushMatrix();
            {
                IIcon icon = x.getItem().getIcon(x, 0);
                Tessellator tessellator = Tessellator.instance;
                ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), icon.getIconWidth(), icon.getIconHeight(), 0.0625F);
            }
            GL11.glPopMatrix();

Получилось довольно криво.  Как крутить и перемещать я знаю, но вот как сделать так, чтобы щит двигался относительно левой руки игрока? Как высчитать ее координаты?
 

Вложения

  • 2016-08-01_10.42.59.png
    2016-08-01_10.42.59.png
    221.3 KB · Просмотры: 144
173
1
3
Так шейпа то у меня нету. Только 2Д текстурка щита
 
216
6
19
Создаешь рендер предмета (рендерить надо не через ивент), в рендере предмета настраиваешь как будет отображаться предмет от первого лица, от третьего, на земле. И все.
Узнать как добавить рендер предмету можно в гугле

GL11.glTranslatef(x, y, z);// Перемещение
GL11.glScalef(x, y, z); //масштабирование
GL11.glRotatef(x, y, z); //поворот
 
173
1
3
Его рендер у меня есть, но я же говорю, как сделать его относительно руки? То есть он рендерится рядом со мной, но при движении рук щит висит в воздухе как деревянный
 
216
6
19
Тот код, что ты написал первым сообщением в теме - рендер относительно игрока, а чтобы рендерить вместе с рукой игрока - нужно создавать отдельный класс рендера для предмета и уже там все прописывать...
 
173
1
3
С последнего моего ответа я перелопатил код:
Эвент:

Код:
@SubscribeEvent
    public void grembipi1(RenderPlayerEvent.Specials.Post event) {

        ItemStack is = event.entityPlayer.getCurrentEquippedItem();
        ItemStack x = event.entityPlayer.inventory.getStackInSlot(0);
        RenderTestShield rs = new RenderTestShield();
        if (is != null && is.getItem() instanceof ItemSword) {

                rs.renderItem(IItemRenderer.ItemRenderType.EQUIPPED, x, event.entityPlayer, event.entityPlayer);

Сам рендер:
Код:
public class RenderTestShield implements IItemRenderer {

    public static final ResourceLocation texture = new ResourceLocation("main:textures/items/shield.png");

    @Override
    public boolean handleRenderType(ItemStack is, ItemRenderType type) {
        if (type == ItemRenderType.INVENTORY) return false;
        return true;
    }

    @Override
    public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack is, ItemRendererHelper helper) {
        if (type == ItemRenderType.INVENTORY) return false;
        return true;
    }


    @Override
    public void renderItem(ItemRenderType type, ItemStack item, Object... data) {
        switch (type) {
            case EQUIPPED_FIRST_PERSON:
                renderEquippedItem(item, (EntityLivingBase) data[1], true);
                break;
            case EQUIPPED:
                renderEquippedItem(item, (EntityLivingBase) data[1], false);
                break;

            default:
        }
    }

    ModelBiped mb = new ModelBiped();
    private void renderEquippedItem(ItemStack stack, EntityLivingBase entity, boolean firstPerson) {
        GL11.glPushMatrix();
        float scale = 2.3f;
        float f = scale;
        GL11.glScalef(f, f, f);
        IIcon icon = stack.getItem().getIcon(stack, 0);
        Tessellator tessellator = Tessellator.instance;
        ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), icon.getIconWidth(), icon.getIconHeight(), 0.0625F);
        GL11.glPopMatrix();
    }
}


Onneros, да, я забыл что написал в начале :D


Вот так это выглядит:
Просто рендер предмета

Рендер предмета через эвент:


При этом первый вариант работает нормально - щит бегает вместе с рукой, а второй рендер стоит столбом :(
 
173
1
3
Onneros написал(а):
Имеешь ввиду рендер через ивент не двигается? Таки зачем тебе его тогда использовать?

Ты меня запутал. Показываю:
При первом варианте просто рендер, приведенный мною выше. Это я держу предмет в руке, при нем щит бегает вместе с рукой. 
Во втором варианте вызывается тот же самый рендер, но при этом он не двигается вместе с рукой игрока. А мне нужно чтобы он двигался. Вот моя проблема.
[video=youtube]https://www.youtube.com/watch?v=zDhvIFkRhB0&feature=youtu.be[/video]
 
173
1
3
Ну да... наверное стоило сначала рассказать о своей задумке :)
Моя цель сделать так, чтобы при выборе какого-либо оружия если у игрока в определенном слоте в инвентаре есть щит, то он брался в левую руку.

Первый вариант работает если я беру в сами руки щит.

Мне то нужно, чтобы брался именно меч и уже тогда при нем рендерился дополнительно щит.
 
173
1
3
wilah написал(а):
Ты достаёшь часть тела и пишешь postRender. Всё!
Куда пишешь то? -_-
Везде потыкал, вроде не влияет ни на что...
 
173
1
3
wilah написал(а):
Ты достаёшь часть тела и пишешь postRender. Всё!

Попробовал написать так:
Код:
 @SubscribeEvent
    public void grembipi1(RenderPlayerEvent.Specials.Post event) {

        ItemStack is = event.entityPlayer.getCurrentEquippedItem();
        ItemStack x = event.entityPlayer.inventory.getStackInSlot(0);

        ModelBiped mb = new ModelBiped();
        ModelRenderer leftArm = mb.bipedLeftArm;
        RenderTestShield rs = new RenderTestShield();
        if (is != null && is.getItem() instanceof ItemSword) {

            leftArm.postRender(Что писать здесь? И где это писать?);
            rs.renderItem(IItemRenderer.ItemRenderType.EQUIPPED, x, event.entityPlayer, event.entityPlayer);
}
 
173
1
3
То ли я дурак, то ли лыжи не едут... Не работает
Попробовал еще вот так:
Код:
 @SubscribeEvent
    public void grembipi1(RenderPlayerEvent.Specials.Post event) {

        ItemStack is = event.entityPlayer.getCurrentEquippedItem();
        ItemStack stack = event.entityPlayer.inventory.getStackInSlot(0);

        ModelBiped mb = new ModelBiped();
        ModelRenderer leftArm = mb.bipedLeftArm;
        if (is != null && is.getItem() instanceof ItemSword) {

            leftArm.postRender(0.0625f);
            IIcon icon = stack.getItem().getIcon(stack, 0);
            Tessellator tessellator = Tessellator.instance;
            ItemRenderer.renderItemIn2D(tessellator, icon.getMaxU(), icon.getMinV(), icon.getMinU(), icon.getMaxV(), icon.getIconWidth(), icon.getIconHeight(), 0.0625F);
            
 
173
1
3
Добавил оптимизации программе, которая не работает. Лучше не стало :)
 
Сверху