[1.7.10] 3D OBJ Armor / Броня

[1.7.10] 3D OBJ Armor / Броня 0.0.1

Нет прав для скачивания
Версия(и) Minecraft
1.7.10
В этом ресурсе Вы узнаете:
  • Как добавить OBJ модель брони в игру;
  • Как отрендерить модель в инвентаре, руках, когда она одета или дропнута.
Плюсы:
- Работает с модом SmartMoving;

Минусы:
- Нет толковой оптимизации, кто готов помочь по этому гайду - Ускорение рендера моделей, приглашаю.

Скачать исходники
Скачать мод

Что нам нужно:
Модель формата *.obj
obj.png


Разделение всех элементов модели
obj2.png


Текстура формата *.png
armor.png

Немного кода:
Регистрируем нужные ресурсы
Resources.java:
public class Resources {

    public static final IModelCustom model = AdvancedModelLoader.loadModel(new ResourceLocation(Info.modid, "models/armor/armor.obj"));

    public static final ResourceLocation texture = new ResourceLocation(Info.modid, "textures/models/armor/armor.png");

}
Создаем свой новый сет брони
LoadItemArmor.java:
    public static ItemArmor helmet, body, pants, boots;

    public static ArmorMaterial ARMOR;

    public static void registerItems() { 
        ARMOR = EnumHelper.addArmorMaterial("ARMOR", 100, new int[] {4, 7, 6, 3}, 0);

        helmet = new Armor.Helmet(LoadItemArmor.ARMOR, 0, 0);
        body = new Armor.Body(LoadItemArmor.ARMOR, 1, 1);
        pants = new Armor.Pants(LoadItemArmor.ARMOR, 2, 2);
        boots = new Armor.Boots(LoadItemArmor.ARMOR, 3, 3); 

        GameRegistry.registerItem(helmet, helmet.getUnlocalizedName());
        GameRegistry.registerItem(body, body.getUnlocalizedName());
        GameRegistry.registerItem(pants, pants.getUnlocalizedName());
        GameRegistry.registerItem(boots, boots.getUnlocalizedName());
    }
Присваиваем пустые текстуры брони и предмета, конкретно там где :null и :textures/items/null.png (на примере нагрудника)
Armor.java:
    public static class Body extends ItemArmor {
        public Body(ArmorMaterial armorMaterial, int par3, int par4) {
            super(armorMaterial, par3, par4);
            this.setCreativeTab(LoadTab.tabArmor);
            this.setUnlocalizedName("body");
            this.setTextureName(Info.modid + ":null");
        }

        @SideOnly(Side.CLIENT)
        public void addInformation(final ItemStack stack, final EntityPlayer player, final List line, boolean advanced) {
            ArmorType.getDefence(line, this.damageReduceAmount);
        }

        @SideOnly(Side.CLIENT)
        @Override
        public String getArmorTexture(ItemStack armor, Entity entity, int slot, String type) {
            return Info.modid + ":textures/items/null.png";
        }

    }
Регистрация рендера предмета, как 3D модели (в инвентаре, руках, на земле)
ClientProxy.java:
    public void renderIcons() {
        MinecraftForgeClient.registerItemRenderer(LoadItemArmor.helmet, new RenderItemArmor.renderItemHelmet());
        MinecraftForgeClient.registerItemRenderer(LoadItemArmor.body, new RenderItemArmor.renderItemBody());
        MinecraftForgeClient.registerItemRenderer(LoadItemArmor.pants, new RenderItemArmor.renderItemPants());
        MinecraftForgeClient.registerItemRenderer(LoadItemArmor.boots, new RenderItemArmor.renderItemBoots());
    }
Рендер шлема в руках, инвентаре, на земле (на примере нагрудника)
RenderItemArmor.java:
    public static class renderItemBody implements IItemRenderer {

        @Override
        public boolean handleRenderType(ItemStack item, ItemRenderType type) {
            return true;
        }

        @Override
        public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) {
            return true;
        }

        @Override
        public void renderItem(ItemRenderType type, ItemStack item, Object... data) {     
            if (type == ItemRenderType.INVENTORY) {
                GL11.glPushMatrix();
                Minecraft.getMinecraft().renderEngine.bindTexture(Resources.texture);
                GL11.glTranslatef(0F, -1.75F, 0F);
                GL11.glScalef(0.75F, 0.75F, 0.9F);
                Resources.model.renderPart("body");
                Resources.model.renderPart("leftHand");
                Resources.model.renderPart("rightHand");
                GL11.glPopMatrix();
            } else if (type == ItemRenderType.EQUIPPED) {
                GL11.glPushMatrix();
                Minecraft.getMinecraft().renderEngine.bindTexture(Resources.texture);
                GL11.glTranslatef(-0.25F, -2F, 0.75F);
                Resources.model.renderPart("body");
                Resources.model.renderPart("leftHand");
                Resources.model.renderPart("rightHand");
                GL11.glPopMatrix();
            } else {
                GL11.glPushMatrix();
                Minecraft.getMinecraft().renderEngine.bindTexture(Resources.texture);
                GL11.glTranslatef(0F, -0.5F, 0F);
                GL11.glScalef(0.5F, 0.5F, 0.5F);
                Resources.model.renderPart("body");
                Resources.model.renderPart("leftHand");
                Resources.model.renderPart("rightHand");
                GL11.glPopMatrix();
            }
        }
    }
Рендер в инвентаре
2020-03-20_13.04.31.png


Рендер в руках
2020-03-20_13.05.27.png


Рендер в руках от 3-го лица
2020-03-20_13.05.45.png

Вызов рендера, когда броня одета на игрока
PlayerRenderHandler.java:
    @SubscribeEvent
    public void onPlayerRenderTick(RenderPlayerEvent.Specials.Post event) {
        if(event.entityPlayer == null) {
            return;
        }

        EntityPlayer player = (EntityPlayer) event.entityLiving;
        if (player.getCurrentArmor(3) != null) new RenderHelmet().render(player, event.renderer);
        if (player.getCurrentArmor(2) != null) new RenderBody().render(player, event.renderer);
        if (player.getCurrentArmor(1) != null) new RenderPants().render(player, event.renderer);
        if (player.getCurrentArmor(0) != null) new RenderBoots().render(player, event.renderer);
    }
Сам рендер, когда броня одета на игрока (на примере нагрудника)
RenderEquipArmor.java:
    public static void renderBody(RenderPlayer renderModel) {
        GL11.glPushMatrix();
        Minecraft.getMinecraft().renderEngine.bindTexture(Resources.texture);
        renderModel.modelBipedMain.bipedBody.postRender(0.0625F);
        GL11.glRotatef(180.0f, 1F, 0F, 0F);
        GL11.glTranslatef(0F, -1.51F, 0.0F);
        GL11.glScalef(0.51F, 0.51F, 0.51F);
        Resources.model.renderPart("body");
        GL11.glPopMatrix();

        GL11.glPushMatrix();
        Minecraft.getMinecraft().renderEngine.bindTexture(Resources.texture);
        renderModel.modelBipedMain.bipedLeftArm.postRender(0.0625F);
        GL11.glRotatef(180.0f, 1F, 0F, 0F);
        GL11.glTranslatef(-.32F, -1.4F, 0F);
        GL11.glScalef(0.51F, 0.51F, 0.51F);
        Resources.model.renderPart("leftHand");
        GL11.glPopMatrix();

        GL11.glPushMatrix();
        Minecraft.getMinecraft().renderEngine.bindTexture(Resources.texture);
        renderModel.modelBipedMain.bipedRightArm.postRender(0.0625F);
        GL11.glRotatef(180.0f, 1F, 0F, 0F);
        GL11.glTranslatef(.32F, -1.4F, 0F);
        GL11.glScalef(0.51F, 0.51F, 0.51F);
        Resources.model.renderPart("rightHand");
        GL11.glPopMatrix();
    }
Результат:
ico.png
  • Like
  • Wow
Реакции: No name и TheLivan
Автор
Fr0Le
Скачивания
5
Просмотры
183
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок
Сверху