Obj Лук, некрутящиеся предикаты

Версия Minecraft
1.12.2
173
1
3
Приветствую
Захотел сделать лук с obj моделью, скопировал json файлик из стандартного лука. Модель отображается, но она полностью игнорирует display настройки. То есть ни крутить, ни изменять размер/положение модели я не могу. Добавлял в папку assets/model/item

Код json лука:
Java:
{
    "parent": "item/generated",
    "display": {
        "thirdperson_righthand": {
            "rotation": [ -80, 260, -40 ],
            "translation": [ -1, -2, 2.5 ],
            "scale": [ 0.9, 0.9, 0.9 ]
        },
        "thirdperson_lefthand": {
            "rotation": [ -80, -280, 40 ],
            "translation": [ -1, -2, 2.5 ],
            "scale": [ 0.9, 0.9, 0.9 ]
        },
        "firstperson_righthand": {
            "rotation": [ 0, -90, 25 ],
            "translation": [ 1.13, 3.2, 1.13],
            "scale": [ 0.68, 0.68, 0.68 ]
        },
        "firstperson_lefthand": {
            "rotation": [ 0, 90, -25 ],
            "translation": [ 1.13, 3.2, 1.13],
            "scale": [ 0.68, 0.68, 0.68 ]
        }
    },
    "overrides": [
        {
            "predicate": {
                "pulling": 0
            },
            "model": "slcube:item/testbow_standby.obj"
        },
        {
            "predicate": {
                "pulling": 1
            },
            "model": "slcube:item/testbow_pulling_0.obj"
        },
        {
            "predicate": {
                "pulling": 1,
                "pull": 0.65
            },
            "model": "slcube:item/testbow_pulling_1.obj"
        },
        {
            "predicate": {
                "pulling": 1,
                "pull": 0.9
            },
            "model": "slcube:item/testbow_pulling_2.obj"
        }
    ]
}


Добавление модели в blockstates работает и крутится, но не позволяет работать с предикатами, то есть модель статична. Может тогда есть возможность как-то динамично менять модель предмета с одной на другую эвентами?

Есть какие-нибудь идеи?)
 
1,038
57
229
Я конечно извращенец и стреляю сразу с пушки, но почему бы не рисовать самому?
Через рендер предмета
 
173
1
3
Не особо понимаю как рендерится предмет в 1.12 версии. Они ж всё перелопатили под json. В какую сторону копать?)
 
1,038
57
229
RenderSpecificHandEvent

откуда то с git:
@SubscribeEvent
public static void renderItem(RenderSpecificHandEvent evt) {
  Minecraft mc = Minecraft.getMinecraft();
  if(!ConfigHandler.lexicon3dModel
      || mc.gameSettings.thirdPersonView != 0
      || mc.player.getHeldItem(evt.getHand()).isEmpty()
      || mc.player.getHeldItem(evt.getHand()).getItem() != ModItems.lexicon)
    return;
  evt.setCanceled(true);
  try {
    renderItemInFirstPerson(mc.player, evt.getPartialTicks(), evt.getInterpolatedPitch(), evt.getHand(), evt.getSwingProgress(), evt.getItemStack(), evt.getEquipProgress());
  } catch (Throwable throwable) {
    Botania.LOGGER.warn("Failed to render lexicon");
  }
}
 
173
1
3
И откуда ж цепляется метод renderItemInFirstPerson?
 
1,038
57
229
а он тебе не нужен, ты тут должен нарисовать свою модель
может это тоже пригодится eleksploded/BananaCraft

ещё рендерить OBJ можно как то через json Rendering-1.12 - McJty Modding, это для тех кто сюда ещё зайдет.
 
1,038
57
229
173
1
3
Смешно, при таком коде рендерится только первая модель предмета из json)
Java:
 @SubscribeEvent
    public void onRenderHand(RenderSpecificHandEvent event)
    {
        EntityPlayer player = Minecraft.getMinecraft().player;
        if (!player.isSneaking() && event.getItemStack().getItem() == ItemsRegister.testBow) {
            ItemStack stack = event.getItemStack();
            if (!stack.isEmpty()) {
                RenderHelper.enableStandardItemLighting();
                GlStateManager.enableLighting();
                GlStateManager.pushMatrix();
                GlStateManager.translate(0.3, -0.2, -0.4);
                GlStateManager.scale(0.5f, 0.5f, 0.5f);

                Minecraft.getMinecraft().getRenderItem().renderItem(stack, ItemCameraTransforms.TransformType.FIRST_PERSON_RIGHT_HAND);

                GlStateManager.popMatrix();
                event.setCanceled(true);
            }
        }
    }

То есть модель не меняется при натягивании тетивы
 
173
1
3
Не нашел в твоих ссылках какой-либо работы с obj, там просто рендер предмета через стандартный renderItem :(
 
1,038
57
229
То есть модель не меняется при натягивании тетивы
дык ты не сделал условия замены? ты постоянно рисуешь одно и тоже, верно?
мне просто надо понять опыт которым ты обладаешь, путем наводящих вопросов.
И на основе этого, как провести тебя к выходу, так будто ты сам дошел до этого.
 
173
1
3
Условия замены - это собственно предикаты, которые работают на стандартном луке)
Они работали когда я просто отдавал на стандартный рендер json с ними, код которого в первом сообщении. Проблема была в том, что эти предикаты никак нельзя трансформировать.
Можно запилить условия замены вручную в эвенте, например, от тех же предикатов, но тогда я не понимаю как мне напрямую цеплять модель obj
 
1,038
57
229
перестаньте использовать это сложное слово "предикаты", я его не знаю. И на сколько я знаю оно отвечает лишь на boolean. А это либо true, либо false. То есть только два варианта. А у вас может быть их и 10. А это уже не предикат, это уже будет "условие". Хотя предикат тоже является частным случаем "условия", но лишь одним из его подвидов.

Можно запилить условия замены вручную в эвенте
верно.
надо лишь сказать что рисовать вместо этой вот строки
Java:
if(blabla && blabla)
{

Minecraft.getMinecraft().getRenderItem().renderItem(stack, ItemCameraTransforms.TransformType.FIRST_PERSON_RIGHT_HAND);
} else if(blabla) {
ItemStask itemStack = new ItemStack(Items.DIAMONDS)
Minecraft.getMinecraft().getRenderItem().renderItem(itemStack, ItemCameraTransforms.TransformType.FIRST_PERSON_RIGHT_HAND);
} else {
GL11.glBegin(GL11.GL_QUADS);
GL11.Vertex3f(0,0,0);
GL11.Vertex3f(0,1,0);
GL11.Vertex3f(1,1,0);
GL11.Vertex3f(0,1,0);
GL11.glEnd();
}
 
173
1
3
Facepalm
И теперь мне создавать по 4 предмета на 1 лук? :m_faceplam:
Можно ведь как-то отрендерить чисто обжшную модель, вопрос был именно в этом)
 
1,038
57
229
И теперь мне создавать по 4 предмета на 1 лук?
зачем, можно тупо две модели в obj (когда натянут и когда расслаблен), или две иконки лука (которые уже есть). Я лишь привёл пример при котором в 1 предмете, может быть 3и разных рендера. То есть сколько угодно однотипных предметов хоть миллион других и всё в одном единственном предмете.
Ну... или можешь подождать ответа как это сделать в json, дело конечно твоё..
 
173
1
3
Ты рендеришь модель предмета по Itemstack-у
Все верно, в одном предмете несколько рендеров, но загружаешь ты модель через renderItem.

Мне нужно понять как брать свою обж модель и рендерить её. Не из стандартного предмета майна, а свою)
 
1,038
57
229
Minecraft написан на Java с применением либы LWJGL, соответственно всё что касается этих вещей и OpenGL доступно вам из других статей не относящихся к Minecraft.
 
173
1
3
Пользы от ссылок было мало, честно своровал и переделал как в Galacticraft, может кому-то поможет мой быдлокод:
Java:
 private OBJModel.OBJBakedModel standBy1;
    private OBJModel.OBJBakedModel standBy2;
    private OBJModel.OBJBakedModel pulling1_0;
    private OBJModel.OBJBakedModel pulling1_1;
    private OBJModel.OBJBakedModel pulling1_2;
    private OBJModel.OBJBakedModel pulling1_3;
    private OBJModel.OBJBakedModel pulling2_0;
    private OBJModel.OBJBakedModel pulling2_1;
    private OBJModel.OBJBakedModel pulling2_2;
    private OBJModel.OBJBakedModel pulling2_3;
    private OBJModel.OBJBakedModel pulling3_0;
    private OBJModel.OBJBakedModel pulling3_1;
    private OBJModel.OBJBakedModel pulling3_2;
    private OBJModel.OBJBakedModel pulling3_3;


    public static void drawBakedModel(IBakedModel model)
    {
        Tessellator tessellator = Tessellator.getInstance();
        BufferBuilder worldrenderer = tessellator.getBuffer();
        worldrenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.ITEM);

        for (BakedQuad bakedquad : model.getQuads(null, null, 0))
        {
            worldrenderer.addVertexData(bakedquad.getVertexData());
        }

        tessellator.draw();
    }

    private void updateModels() {

        IModel model0 = null;
        IModel model1 = null;
        IModel model2 = null;
        IModel model3 = null;
        try {

            model0 = OBJLoaderSL.instance.loadModel(new ResourceLocation(SlCube.MODID, "testbow_standby.obj"));
            model1 = OBJLoaderSL.instance.loadModel(new ResourceLocation(SlCube.MODID, "testbow_pulling_0.obj"));
            model2 = OBJLoaderSL.instance.loadModel(new ResourceLocation(SlCube.MODID, "testbow_pulling_1.obj"));
            model3 = OBJLoaderSL.instance.loadModel(new ResourceLocation(SlCube.MODID, "testbow_pulling_2.obj"));

            Function<ResourceLocation, TextureAtlasSprite> spriteFunction = location -> Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite(location.toString());
            this.standBy1 = (OBJModel.OBJBakedModel) model0.bake(new OBJModel.OBJState(ImmutableList.of("bow"), false), DefaultVertexFormats.ITEM, spriteFunction);
            this.standBy2 = (OBJModel.OBJBakedModel) model0.bake(new OBJModel.OBJState(ImmutableList.of("plane"), false), DefaultVertexFormats.ITEM, spriteFunction);

            this.pulling1_0 = (OBJModel.OBJBakedModel) model1.bake(new OBJModel.OBJState(ImmutableList.of("bow"), false), DefaultVertexFormats.ITEM, spriteFunction);
            this.pulling1_1 = (OBJModel.OBJBakedModel) model1.bake(new OBJModel.OBJState(ImmutableList.of("plane"), false), DefaultVertexFormats.ITEM, spriteFunction);
            this.pulling1_2 = (OBJModel.OBJBakedModel) model1.bake(new OBJModel.OBJState(ImmutableList.of("arrow"), false), DefaultVertexFormats.ITEM, spriteFunction);
            this.pulling1_3 = (OBJModel.OBJBakedModel) model1.bake(new OBJModel.OBJState(ImmutableList.of("arrow1"), false), DefaultVertexFormats.ITEM, spriteFunction);

            this.pulling2_0 = (OBJModel.OBJBakedModel) model2.bake(new OBJModel.OBJState(ImmutableList.of("bow"), false), DefaultVertexFormats.ITEM, spriteFunction);
            this.pulling2_1 = (OBJModel.OBJBakedModel) model2.bake(new OBJModel.OBJState(ImmutableList.of("plane"), false), DefaultVertexFormats.ITEM, spriteFunction);
            this.pulling2_2 = (OBJModel.OBJBakedModel) model2.bake(new OBJModel.OBJState(ImmutableList.of("arrow"), false), DefaultVertexFormats.ITEM, spriteFunction);
            this.pulling2_3 = (OBJModel.OBJBakedModel) model2.bake(new OBJModel.OBJState(ImmutableList.of("arrow1"), false), DefaultVertexFormats.ITEM, spriteFunction);

            this.pulling3_0 = (OBJModel.OBJBakedModel) model3.bake(new OBJModel.OBJState(ImmutableList.of("bow"), false), DefaultVertexFormats.ITEM, spriteFunction);
            this.pulling3_1 = (OBJModel.OBJBakedModel) model3.bake(new OBJModel.OBJState(ImmutableList.of("plane"), false), DefaultVertexFormats.ITEM, spriteFunction);
            this.pulling3_2 = (OBJModel.OBJBakedModel) model3.bake(new OBJModel.OBJState(ImmutableList.of("arrow"), false), DefaultVertexFormats.ITEM, spriteFunction);
            this.pulling3_3 = (OBJModel.OBJBakedModel) model3.bake(new OBJModel.OBJState(ImmutableList.of("arrow1"), false), DefaultVertexFormats.ITEM, spriteFunction);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @SubscribeEvent
    public void onRenderHand(RenderSpecificHandEvent event) throws Exception {
        EntityPlayer player = Minecraft.getMinecraft().player;
        if (!player.isSneaking() && event.getItemStack().getItem() == ItemsRegister.testBow) {
            ItemStack stack = event.getItemStack();
            if (!stack.isEmpty()) {
                IItemPropertyGetter pullingGetter = stack.getItem().getPropertyGetter(new ResourceLocation("pulling"));
                if(pullingGetter == null) return;
                float pulling = pullingGetter.apply(stack, player.world, player);

                IItemPropertyGetter pullGetter = stack.getItem().getPropertyGetter(new ResourceLocation("pull"));
                if(pullGetter == null) return;
                float pull = pullGetter.apply(stack, player.world, player);


                updateModels();

                RenderHelper.enableStandardItemLighting();
                GlStateManager.enableLighting();
                GlStateManager.pushMatrix();
                GlStateManager.translate(0, -0.4, -0.6);
                GlStateManager.scale(0.5f, 0.5f, 0.5f);

                if(pulling == 0) {
                    drawBakedModel(standBy1);
                    drawBakedModel(standBy2);
                } else{
                    if(pull >= 0.65f)
                    {
                        if(pull >=  0.9f)
                        {
                            drawBakedModel(pulling1_0);
                            drawBakedModel(pulling1_1);
                            drawBakedModel(pulling1_2);
                            drawBakedModel(pulling1_3);
                        }else{
                            drawBakedModel(pulling2_0);
                            drawBakedModel(pulling2_1);
                            drawBakedModel(pulling2_2);
                            drawBakedModel(pulling2_3);
                        }
                    }else{
                        drawBakedModel(pulling3_0);
                        drawBakedModel(pulling3_1);
                        drawBakedModel(pulling3_2);
                        drawBakedModel(pulling3_3);
                    }
                }

                GlStateManager.popMatrix();
                event.setCanceled(true);
            }
        }
    }
 
173
1
3
Однако проблема не решилась для третьего лица. Есть идеи через какой эвент это делать?
Что-то крутил, вертел RenderPlayer, но так до конца геометрию и не понял
 
5,018
47
783
у вайта был тутор по моделям кодом, там все это можно делать еще в сырой модельке. иди читай
 
7,099
324
1,510
Сверху