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

Fr0Le

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
Fr0Le
В этом ресурсе Вы узнаете:
  • Как добавить 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
PHP:
public class Resources {

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

}

Создаем свой новый сет брони
LoadItemArmor.java
PHP:
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
PHP:
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
PHP:
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
PHP:
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

Рендер в руках
obj2.png

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

Вызов рендера, когда броня одета на игрока
PlayerRenderHandler.java
PHP:
@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
PHP:
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
 

Вложения

  • 2020-03-20_13.05.27.png
    2020-03-20_13.05.27.png
    136,8 КБ · Просмотры: 100
Последнее редактирование:
Обновление 0.0.2
Добавления:

  • Добавлено ускорение рендера, спасибо @Dahaka и @timaxa007;
2020-05-24_22.35.15.png
2020-05-24_22.36.25.png
 
А как сделать так, что типо одеваешь 1 предмет брони допустим нагрудник. А рендерится все части брони?
 
Прошу, сделай гайд на 1.12.2
Я новичок в этой сфере но очень нужно
 
Назад
Верх Низ