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

[1.7.10] 3D OBJ Armor / 3Д ОБЖ Броня 0.0.2a

Нет прав для скачивания
Версия(и) Minecraft
1.7.10
В этом ресурсе Вы узнаете:
  • Как добавить OBJ модель брони в игру;
  • Как отрендерить модель в инвентаре, руках, когда она одета или дропнута.
Плюсы:
  • Работает с модом SmartMoving;
  • Добавлено ускорение рендера, спасибо @Dahaka и @timaxa007;
2020-05-24_22.35.15.png
2020-05-24_22.36.25.png

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

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


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


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

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

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

}
Создаем свой новый сет брони
LoadItemArmor.java:
public static ItemArmor customHelmet, customBody, customPants, customBoots;

    public static ArmorMaterial CUSTOMARMOR;

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

        customHelmet = new CustomItemArmor.Helmet(LoadItemArmor.CUSTOMARMOR, 0, 0);
        customBody = new CustomItemArmor.Body(LoadItemArmor.CUSTOMARMOR, 1, 1);
        customPants = new CustomItemArmor.Pants(LoadItemArmor.CUSTOMARMOR, 2, 2);
        customBoots = new CustomItemArmor.Boots(LoadItemArmor.CUSTOMARMOR, 3, 3);

        GameRegistry.registerItem(customHelmet, customHelmet.getUnlocalizedName());
        GameRegistry.registerItem(customBody, customBody.getUnlocalizedName());
        GameRegistry.registerItem(customPants, customPants.getUnlocalizedName());
        GameRegistry.registerItem(customBoots, customBoots.getUnlocalizedName());
    }
Присваиваем пустые текстуры брони и предмета, конкретно там где :null и :textures/items/null.png (на примере нагрудника)
Armor.java::
public static class Body extends ItemArmor implements customArmor, armorTypeBody {
    public Body(ArmorMaterial armorMaterial, int par3, int par4) {
        super(armorMaterial, par3, par4);
        this.setCreativeTab(LoadTab.tabArmor);
        this.setUnlocalizedName("customBody");
        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";
    }

}
Регистрация рендера предмета
ClientProxy.java::
public void renderIcons() {
    MinecraftForgeClient.registerItemRenderer(LoadItemArmor.customHelmet, new RenderItemArmor.renderItemHelmet());
    MinecraftForgeClient.registerItemRenderer(LoadItemArmor.customBody, new RenderItemArmor.renderItemBody());
    MinecraftForgeClient.registerItemRenderer(LoadItemArmor.customPants, new RenderItemArmor.renderItemPants());
    MinecraftForgeClient.registerItemRenderer(LoadItemArmor.customBoots, new RenderItemArmor.renderItemBoots());        
}

public void renderModels() {   
    //при условии что все *.obj модели будут иметь одинаковую структуру
    for(int i = 1; i <= 1; i++) {
        String model = "";
        //тут добавляем название моделей
        switch(i) {
        case(1):
            model = "customArmorModel";
        break;
        default:               
            break;
        }

        for(int j = 1; j <= 8; j++) {
            String part = "";
            //тут добавляем название частей модели
            switch(j) {
            case(1):
                part = "head";
            break;
            case(2):
                part = "body";
            break;
            case(3):
                part = "bodyHandLeft";
            break;
            case(4):
                part = "bodyHandRight";
            break;    
            case(5):
                part = "legLeft";
            break;
            case(6):
                part = "legRight";
            break;
            case(7):
                part = "bootLeft";
            break;
            case(8):
                part = "bootRight";
            break;
            default:
                break;
            }

            GL11.glCallList(ClientProxy.getRenderPart(model, part));
        }
    }
}

public static int getRenderPart(String model, String partName) {
    if(hash.containsKey(model + "_" + partName))
        return hash.get(model + "_" + partName);

    int displayList = GLAllocation.generateDisplayLists(1);
    GL11.glNewList(displayList, GL11.GL_COMPILE);
    AdvancedModelLoader.loadModel(new ResourceLocation(Info.modid, "models/armor/" + model + ".obj")).renderPart(partName);
    GL11.glEndList();
    hash.put(model + "_" + partName, displayList);
    return displayList;
}
Рендер шлема в руках, инвентаре, на земле (на примере нагрудника)
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) {
        setResources(item);

        if (type == ItemRenderType.INVENTORY) {
            GL11.glPushMatrix();
            Minecraft.getMinecraft().renderEngine.bindTexture(texture);
            GL11.glTranslatef(0F, -1.75F, 0F);
            GL11.glScalef(0.75F, 0.75F, 0.9F);
            GL11.glCallList(ClientProxy.getRenderPart(model, "body"));
            GL11.glCallList(ClientProxy.getRenderPart(model, "bodyHandLeft"));
            GL11.glCallList(ClientProxy.getRenderPart(model, "bodyHandRight"));

            GL11.glPopMatrix();
        } else if (type == ItemRenderType.EQUIPPED) {
            GL11.glPushMatrix();
            Minecraft.getMinecraft().renderEngine.bindTexture(texture);
            GL11.glTranslatef(-0.25F, -2F, 0.75F);
            GL11.glCallList(ClientProxy.getRenderPart(model, "body"));
            GL11.glCallList(ClientProxy.getRenderPart(model, "bodyHandLeft"));
            GL11.glCallList(ClientProxy.getRenderPart(model, "bodyHandRight"));
            GL11.glPopMatrix();
        } else {
            GL11.glPushMatrix();
            Minecraft.getMinecraft().renderEngine.bindTexture(texture);
            GL11.glTranslatef(0F, -0.5F, 0F);
            GL11.glScalef(0.5F, 0.5F, 0.5F);
            GL11.glCallList(ClientProxy.getRenderPart(model, "body"));
            GL11.glCallList(ClientProxy.getRenderPart(model, "bodyHandLeft"));
            GL11.glCallList(ClientProxy.getRenderPart(model, "bodyHandRight"));
            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) renderHelmet.render(player, event.renderer);
    if(player.getCurrentArmor(2) != null) renderBody.render(player, event.renderer);
    if(player.getCurrentArmor(1) != null) renderPants.render(player, event.renderer);
    if(player.getCurrentArmor(0) != null) renderBoots.render(player, event.renderer);
}
Сам рендер, когда броня одета на игрока (на примере нагрудника)
RenderEquipArmor.java::
public static void renderBody(RenderPlayer renderModel, Item equip) {
    setResources(equip);

    GL11.glPushMatrix();
    Minecraft.getMinecraft().renderEngine.bindTexture(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);
    GL11.glCallList(ClientProxy.getRenderPart(model, "body"));
    GL11.glPopMatrix();

    GL11.glPushMatrix();
    Minecraft.getMinecraft().renderEngine.bindTexture(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);
    GL11.glCallList(ClientProxy.getRenderPart(model, "bodyHandLeft"));
    GL11.glPopMatrix();

    GL11.glPushMatrix();
    Minecraft.getMinecraft().renderEngine.bindTexture(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);
    GL11.glCallList(ClientProxy.getRenderPart(model, "bodyHandRight"));
    GL11.glPopMatrix();
}
Результат:
ico.png
  • Like
  • Wow
Реакции: No name и TheLivan
Автор
Fr0Le
Скачивания
11
Просмотры
655
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок

Другие ресурсы пользователя Fr0Le

Последние обновления

  1. Обновление 0.0.2a

    Добавления: Добавлено ускорение рендера, спасибо @Dahaka и @timaxa007;
Сверху