- Версия(и) Minecraft
- 1.7.10
В этом ресурсе Вы узнаете:
Скачать исходники
Скачать мод
Что нам нужно:
Немного кода:
Регистрируем нужные ресурсы
Создаем свой новый сет брони
Присваиваем пустые текстуры брони и предмета, конкретно там где :null и :textures/items/null.png (на примере нагрудника)
Регистрация рендера предмета
Рендер брони в руках, инвентаре, на земле (на примере нагрудника)
Вызов рендера, когда броня одета на игрока
Сам рендер, когда броня одета на игрока (на примере нагрудника)
Результат:
- Как добавить OBJ модель брони в игру;
- Как отрендерить модель в инвентаре, руках, когда она одета или дропнута.
- Работает с модом SmartMoving;
- Добавлено ускорение рендера, спасибо @Dahaka и @timaxa007;
Скачать исходники
Скачать мод
Что нам нужно:
Модель формата *.obj
Разделение всех элементов модели
Текстура формата *.png
Разделение всех элементов модели
Текстура формата *.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();
}
}
}
Рендер в инвентаре
Рендер в руках
Рендер в руках от 3-го лица
Рендер в руках
Рендер в руках от 3-го лица
Вызов рендера, когда броня одета на игрока
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();
}
Результат: