[1.7.10/1.6.4] Пример Брони с Obj моделью (слив кода)

timaxa007

Модератор
5,831
409
672
[1.7.10] (без использования эвента)
(github.com) test_armor_obj_1_7_10
В 3D-редакторе:


В игре:




[1.7.10] (без использования эвента) - Этот пост #1.
[1.7.10] (с использованием эвента) - Пост #11.
[1.6.4] (без использования эвента) - Пост #10.
[1.6.4] (с использованием эвента) - Пост #13.
---
[1.7.10] (с использованием эвента) - Пост #15.
---
[1.12.2] (без использования эвента) - Пост #35
 
Последнее редактирование:
2,505
81
397
RE: [1.7.10] Пример Брони с Obj моделью (слив кода)

Зачем свой color? У итемов он же итак есть и перед рендером он устанавливается сам.
 

timaxa007

Модератор
5,831
409
672
RE: [1.7.10] Пример Брони с Obj моделью (слив кода)

Dahaka, я пробовал указывать цвет по ванильному методу, красились сами предметы, а вот модель брони не покрасилось.

Броня другая, но в методе отдаю чёрный цвет.


По этому мне и пришлось добавить:
Код:
if (hasColor(is) && armorModel instanceof ArmorCustomModel)
((ArmorCustomModel)armorModel).color = getColor(is)

Краситься и предмет и сама модель.
 
2,505
81
397
RE: [1.7.10] Пример Брони с Obj моделью (слив кода)

Я понимаю. Я тоже так делал такой костыль до того, как узнал, что ВСЕ само красится. И модели и иконка. Но у меня модель не obj. Может быть ты случайно поставил glcolor(1,1,1) сам? Так не должно быть.
 

timaxa007

Модератор
5,831
409
672
RE: [1.7.10] Пример Брони с Obj моделью (слив кода)

У меня "GL11.glColor3f(1F, 1F, 1F);" стоит в конце рендера, так как он нужен типа для сброса цвета, чтобы последующие рендеры не красились, если была эта модель покрашена. Даже если его убрать ни чего не измениться.


"GL11.glColor3f(1F, 1F, 1F);" в другом месте рендера брони, вроде у меня не где не стоит.
 
173
1
3
RE: [1.7.10] Пример Брони с Obj моделью (слив кода)

Никто не знает что пришло на замену
Код:
AdvancedModelLoader

в новых версиях? Каким образом можно подгрузить obj или json модельку?
 

timaxa007

Модератор
5,831
409
672
RE: [1.7.10] Пример Брони с Obj моделью (слив кода)

Lobotino, вроде obj:
Код:
IModel model = ModelLoaderRegistry.getModel(new ResourceLocation(MyMod.MODID, "models/model.obj"));
 
173
1
3
RE: [1.7.10] Пример Брони с Obj моделью (слив кода)

timaxa007 написал(а):
Lobotino, вроде obj:
Код:
IModel model = ModelLoaderRegistry.getModel(new ResourceLocation(MyMod.MODID, "models/model.obj"));

Как тогда работать с рендерингом? Там ниже этой строки в твоем коде идет много-много рендера
Код:
model.renderPart("right_leg");
renderPart метода там нет...
 

timaxa007

Модератор
5,831
409
672
RE: [1.7.10] Пример Брони с Obj моделью (слив кода)

Lobotino, я не знаю как на новых версиях по частям рендерить obj модель.
 

timaxa007

Модератор
5,831
409
672
[1.6.4] (без использования эвента) Портирование версии 1.7.10 для 1.6.4.
(github.com) test_armor_obj_1_6_4
Код:
@Mod(modid = TestArmorObjMOD.MODID, name = TestArmorObjMOD.NAME, version = TestArmorObjMOD.VERSION)
public class TestArmorObjMOD {

	public static final String
	MODID = "test_armor_obj",
	NAME = "Test Armor Obj",
	VERSION = "0.001";

	@Mod.Instance(MODID) public static TestArmorObjMOD instance;

	public Configuration main;

	private static int
	item_armor_test_obj_helm_id,
	item_armor_test_obj_vest_id,
	item_armor_test_obj_pants_id,
	item_armor_test_obj_boots_id
	;

	public static Item
	itemArmorTestObjHelm,
	itemArmorTestObjVest,
	itemArmorTestObjPants,
	itemArmorTestObjBoots
	;

	@Mod.EventHandler
	public void init(cpw.mods.fml.common.event.FMLInitializationEvent event) {
		itemArmorTestObjHelm = new ItemArmorTestObj(item_armor_test_obj_helm_id, EnumArmorMaterial.IRON, 0)
				.setUnlocalizedName("armor_test_obj_helm").setCreativeTab(CreativeTabs.tabCombat);
		GameRegistry.registerItem(itemArmorTestObjHelm, "item_armor_test_obj_helm");

		itemArmorTestObjVest = new ItemArmorTestObj(item_armor_test_obj_vest_id, EnumArmorMaterial.IRON, 1)
				.setUnlocalizedName("armor_test_obj_vest").setCreativeTab(CreativeTabs.tabCombat);
		GameRegistry.registerItem(itemArmorTestObjVest, "item_armor_test_obj_vest");

		itemArmorTestObjPants = new ItemArmorTestObj(item_armor_test_obj_pants_id, EnumArmorMaterial.IRON, 2)
				.setUnlocalizedName("armor_test_obj_pants").setCreativeTab(CreativeTabs.tabCombat);
		GameRegistry.registerItem(itemArmorTestObjPants, "item_armor_test_obj_pants");

		itemArmorTestObjBoots = new ItemArmorTestObj(item_armor_test_obj_boots_id, EnumArmorMaterial.IRON, 3)
				.setUnlocalizedName("armor_test_obj_boots").setCreativeTab(CreativeTabs.tabCombat);
		GameRegistry.registerItem(itemArmorTestObjBoots, "item_armor_test_obj_boots");
	}

	@Mod.EventHandler
	public void preInit(cpw.mods.fml.common.event.FMLPreInitializationEvent event) {
		main = new Configuration(event.getSuggestedConfigurationFile());
		main.load();
		item_armor_test_obj_helm_id = main.getItem("item_armor_test_obj_helm_id", 4000).getInt();
		item_armor_test_obj_vest_id = main.getItem("item_armor_test_obj_vest_id", 4001).getInt();
		item_armor_test_obj_pants_id = main.getItem("item_armor_test_obj_pants_id", 4002).getInt();
		item_armor_test_obj_boots_id = main.getItem("item_armor_test_obj_boots_id", 4003).getInt();
		main.save();
	}

}
Код:
public class ItemArmorTestObj extends ItemArmor {

	public ItemArmorTestObj(int id, EnumArmorMaterial armorMaterial, int partArmor) {
		super(id, armorMaterial, 0, partArmor);
	}

	@SideOnly(Side.CLIENT)
	@Override
	public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack is, int armorSlot) {
		ModelBiped armorModel = new ArmorTestModel(armorSlot);
		if (is.getItem() instanceof ItemArmorTestObj) {
			armorModel = fillingArmorModel(armorModel, entityLiving);
			if (hasColor(is) && armorModel instanceof ArmorCustomModel)
				((ArmorCustomModel)armorModel).color = getColor(is);
		}
		return armorModel;
	}

	public static ModelBiped fillingArmorModel(ModelBiped model, EntityLivingBase entityLiving) {
		if (model == null) return model;
		model.bipedHead.showModel = 
				model.bipedHeadwear.showModel = 
				model.bipedBody.showModel = 
				model.bipedRightArm.showModel = 
				model.bipedLeftArm.showModel = 
				model.bipedRightLeg.showModel = 
				model.bipedLeftLeg.showModel = false;
		model.isSneak = entityLiving.isSneaking();
		model.isRiding = entityLiving.isRiding();
		model.isChild = entityLiving.isChild();
		/*
		Я хотел model.bipedHead.showModel, model.isSneak и т.п. писать в самой модели, но они не страбатывают.
		Дальше код не проверял в модели, да уже не собирался из-за кода выше.
		 */
		//model.heldItemRight = entityLiving.getEquipmentInSlot(0) != null ? 1 : 0;
		ItemStack held_item = entityLiving.getCurrentItemOrArmor(0);
		if (held_item != null) {
			model.heldItemRight = 1;

			if (entityLiving instanceof EntityPlayer) {
				EntityPlayer player = (EntityPlayer)entityLiving;

				if (player.getItemInUseCount() > 0) {
					EnumAction enumaction = held_item.getItemUseAction();
					if (enumaction == EnumAction.bow) model.aimedBow = true;
					else if (enumaction == EnumAction.block) model.heldItemRight = 3;
				}

			}

		} else model.heldItemRight = 0;

		if (entityLiving instanceof EntitySkeleton)
			model.aimedBow = ((EntitySkeleton)entityLiving).getSkeletonType() == 1;

		return model;
	}

}
Код:
@SideOnly(Side.CLIENT)
public abstract class ArmorCustomModel extends ModelBiped {

	public int color = -1;//Раскраска брони в цвет.

	public abstract void pre();//До всех частей.
	public abstract void post();//После всех частей.
	public abstract void partHead();//Часть: Голова.
	public abstract void partBody();//Часть: Тело.
	public abstract void partRightArm();//Часть: Правая рука.
	public abstract void partLeftArm();//Часть: Левая рука.
	public abstract void partRightLeg();//Часть: Правая нога.
	public abstract void partLeftLeg();//Часть: Левая нога.

	public void render(Entity entity, float x, float y, float z, float yaw, float pitch, float parTicks) {
		super.render(entity, x, y, z, yaw, pitch, parTicks);

		GL11.glPushMatrix();

		if (entity instanceof EntityZombie || entity instanceof EntitySkeleton || entity instanceof EntityGiantZombie) {
			float f6 = MathHelper.sin(onGround * (float)Math.PI);
			float f7 = MathHelper.sin((1.0F - (1.0F - onGround) * (1.0F - onGround)) * (float)Math.PI);

			bipedRightArm.rotateAngleZ = 0.0F;
			bipedRightArm.rotateAngleY = -(0.1F - f6 * 0.6F);
			bipedRightArm.rotateAngleX = -((float)Math.PI / 2F);
			bipedRightArm.rotateAngleX -= f6 * 1.2F - f7 * 0.4F;
			bipedRightArm.rotateAngleZ += MathHelper.cos(z * 0.09F) * 0.05F + 0.05F;
			bipedRightArm.rotateAngleX += MathHelper.sin(z * 0.067F) * 0.05F;

			bipedLeftArm.rotateAngleZ = 0.0F;
			bipedLeftArm.rotateAngleY = 0.1F - f6 * 0.6F;
			bipedLeftArm.rotateAngleX = -((float)Math.PI / 2F);
			bipedLeftArm.rotateAngleX -= f6 * 1.2F - f7 * 0.4F;
			bipedLeftArm.rotateAngleZ -= MathHelper.cos(z * 0.09F) * 0.05F + 0.05F;
			bipedLeftArm.rotateAngleX -= MathHelper.sin(z * 0.067F) * 0.05F;

			if (entity instanceof EntitySkeleton && ((EntitySkeleton)entity).getSkeletonType() == 1)
				GL11.glScalef(1.2F, 1.2F, 1.2F);

			else if (entity instanceof EntityGiantZombie)
				GL11.glScalef(6F, 6F, 6F);

		}


		if (color != -1) {
			float red = (float)(color >> 16 & 255) / 255F;
			float blue = (float)(color >> 8 & 255) / 255F;
			float green = (float)(color & 255) / 255F;
			GL11.glColor3f(red, blue, green);
		}

		pre();

		float f6 = 2.0F;

		{//partHead
			GL11.glPushMatrix();
			if (isChild) {
				GL11.glScalef(1.5F / f6, 1.5F / f6, 1.5F / f6);
				GL11.glTranslatef(0.0F, 16.0F * parTicks, 0.0F);
			}
			GL11.glTranslatef(bipedHead.rotationPointX * parTicks, bipedHead.rotationPointY * parTicks, bipedHead.rotationPointZ * parTicks);
			GL11.glRotatef(bipedHead.rotateAngleZ * (180F / (float)Math.PI), 0F, 0F, 1F);
			GL11.glRotatef(bipedHead.rotateAngleY * (180F / (float)Math.PI), 0F, 1F, 0F);
			GL11.glRotatef(bipedHead.rotateAngleX * (180F / (float)Math.PI), 1F, 0F, 0F);
			GL11.glRotatef(180F, 1F, 0F, 0F);
			partHead();
			GL11.glPopMatrix();
		}

		if (isChild) {
			GL11.glPushMatrix();
			GL11.glScalef(1.0F / f6, 1.0F / f6, 1.0F / f6);
			GL11.glTranslatef(0.0F, 24.0F * parTicks, 0.0F);
		}

		{//partBody
			GL11.glPushMatrix();
			GL11.glTranslatef(bipedBody.rotationPointX * parTicks, bipedBody.rotationPointY * parTicks, bipedBody.rotationPointZ * parTicks);
			GL11.glRotatef(bipedBody.rotateAngleZ * (180F / (float)Math.PI), 0F, 0F, 1F);
			GL11.glRotatef(bipedBody.rotateAngleY * (180F / (float)Math.PI), 0F, 1F, 0F);
			GL11.glRotatef(bipedBody.rotateAngleX * (180F / (float)Math.PI), 1F, 0F, 0F);
			GL11.glRotatef(180F, 1F, 0F, 0F);
			partBody();
			GL11.glPopMatrix();
		}

		{//partRightArm
			GL11.glPushMatrix();
			GL11.glTranslatef(bipedRightArm.rotationPointX * parTicks, bipedRightArm.rotationPointY * parTicks, bipedRightArm.rotationPointZ * parTicks);
			GL11.glRotatef(bipedRightArm.rotateAngleZ * (180F / (float)Math.PI), 0F, 0F, 1F);
			GL11.glRotatef(bipedRightArm.rotateAngleY * (180F / (float)Math.PI), 0F, 1F, 0F);
			GL11.glRotatef(bipedRightArm.rotateAngleX * (180F / (float)Math.PI), 1F, 0F, 0F);
			GL11.glRotatef(180F, 1F, 0F, 0F);
			partRightArm();
			GL11.glPopMatrix();
		}

		{//partLeftArm
			GL11.glPushMatrix();
			GL11.glTranslatef(bipedLeftArm.rotationPointX * parTicks, bipedLeftArm.rotationPointY * parTicks, bipedLeftArm.rotationPointZ * parTicks);
			GL11.glRotatef(bipedLeftArm.rotateAngleZ * (180F / (float)Math.PI), 0F, 0F, 1F);
			GL11.glRotatef(bipedLeftArm.rotateAngleY * (180F / (float)Math.PI), 0F, 1F, 0F);
			GL11.glRotatef(bipedLeftArm.rotateAngleX * (180F / (float)Math.PI), 1F, 0F, 0F);
			GL11.glRotatef(180F, 1F, 0F, 0F);
			partLeftArm();
			GL11.glPopMatrix();
		}

		{//partRightLeg
			GL11.glPushMatrix();
			GL11.glTranslatef(bipedRightLeg.rotationPointX * parTicks, bipedRightLeg.rotationPointY * parTicks, bipedRightLeg.rotationPointZ * parTicks);
			GL11.glRotatef(bipedRightLeg.rotateAngleZ * (180F / (float)Math.PI), 0F, 0F, 1F);
			GL11.glRotatef(bipedRightLeg.rotateAngleY * (180F / (float)Math.PI), 0F, 1F, 0F);
			GL11.glRotatef(bipedRightLeg.rotateAngleX * (180F / (float)Math.PI), 1F, 0F, 0F);
			GL11.glRotatef(180F, 1F, 0F, 0F);
			partRightLeg();
			GL11.glPopMatrix();
		}

		{//partLeftLeg
			GL11.glPushMatrix();
			GL11.glTranslatef(bipedLeftLeg.rotationPointX * parTicks, bipedLeftLeg.rotationPointY * parTicks, bipedLeftLeg.rotationPointZ * parTicks);
			GL11.glRotatef(bipedLeftLeg.rotateAngleZ * (180F / (float)Math.PI), 0F, 0F, 1F);
			GL11.glRotatef(bipedLeftLeg.rotateAngleY * (180F / (float)Math.PI), 0F, 1F, 0F);
			GL11.glRotatef(bipedLeftLeg.rotateAngleX * (180F / (float)Math.PI), 1F, 0F, 0F);
			GL11.glRotatef(180F, 1F, 0F, 0F);
			partLeftLeg();
			GL11.glPopMatrix();
		}

		if (isChild) {
			GL11.glPopMatrix();
		}

		post();

		GL11.glColor3f(1F, 1F, 1F);

		GL11.glPopMatrix();

	}

}
Код:
@SideOnly(Side.CLIENT)
public class ArmorTestModel extends ArmorCustomModel {

	public static final IModelCustom
	model = AdvancedModelLoader.loadModel("/assets/" + TestArmorObjMOD.MODID + "/model/armor/armor_plane.obj")
	;
	public static final ResourceLocation
	//texture = new ResourceLocation(TestArmorObjMOD.MODID, "textures/model/armor/armor_plane.png"),
	texture_glass = new ResourceLocation("minecraft", "textures/blocks/glass.png"),
	texture_wood = new ResourceLocation("minecraft", "textures/blocks/planks_oak.png")
	;
	private final int partType;

	/**armorType: 0 - head, 1 - body and arms, 2 - legs, 3 - feet.**/
	public ArmorTestModel(int armorType) {
		partType = armorType;
	}

	@Override
	public void pre() {
		GL11.glEnable(GL11.GL_BLEND);
		GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
		//Minecraft.getMinecraft().renderEngine.bindTexture(texture);
	}

	@Override
	public void post() {
		GL11.glDisable(GL11.GL_BLEND);
	}

	@Override
	public void partHead() {
		if (partType == 0) {
			GL11.glTranslatef(0F, -1.5F, 0F);
			Minecraft.getMinecraft().renderEngine.bindTexture(texture_glass);
			model.renderPart("glass");
			Minecraft.getMinecraft().renderEngine.bindTexture(texture_wood);
			model.renderPart("helm");
		}
	}

	@Override
	public void partBody() {
		if (partType == 1) {
			GL11.glTranslatef(0F, -1.5F, 0F);
			Minecraft.getMinecraft().renderEngine.bindTexture(texture_wood);
			model.renderPart("body");
			model.renderPart("plane");
		}
	}

	@Override
	public void partRightArm() {
		if (partType == 1) {
			GL11.glTranslatef(0.3125F, -1.375F, 0F);
			Minecraft.getMinecraft().renderEngine.bindTexture(texture_wood);
			model.renderPart("right_arm");
		}
	}

	@Override
	public void partLeftArm() {
		if (partType == 1) {
			GL11.glTranslatef(-0.3125F, -1.375F, 0F);
			Minecraft.getMinecraft().renderEngine.bindTexture(texture_wood);
			model.renderPart("left_arm");
		}
	}

	@Override
	public void partRightLeg() {
		GL11.glTranslatef(0.125F, -0.75F, 0F);
		if (partType == 2) {
			Minecraft.getMinecraft().renderEngine.bindTexture(texture_wood);
			model.renderPart("right_leg");
		}
		if (partType == 3) {
			Minecraft.getMinecraft().renderEngine.bindTexture(texture_wood);
			model.renderPart("right_boot");
		}
	}

	@Override
	public void partLeftLeg() {
		GL11.glTranslatef(-0.125F, -0.75F, 0F);
		if (partType == 2) {
			Minecraft.getMinecraft().renderEngine.bindTexture(texture_wood);
			model.renderPart("left_leg");
		}
		if (partType == 3) {
			Minecraft.getMinecraft().renderEngine.bindTexture(texture_wood);
			model.renderPart("left_boot");
		}
	}

}
 

timaxa007

Модератор
5,831
409
672
[1.7.10] (с использованием эвента)
И в очередном тестировании, выявилось ещё одна проблема,

по эвенту должны были подняться руки игрока и руки брони, но у брони они не поднялись. Не стал я что-то ещё делать или исправлять подобную проблему.
Я сделал, чтобы по эвенту RenderPlayerEvent.SetArmorModel рендерилась своя модель, если в слоте брони был нужный предмет.
Что примечательно: метод getArmorModel находиться в Item, но этот метод срабатывает, если этот Item является наследником ItemArmor. А эвент RenderPlayerEvent.SetArmorModel срабатывает, если в слотах брони что-то лежит. Если правильно использовать этот код, то можно сделать так, чтобы модель рендерилась от определённого слота, даже от своего слота.
Но не кто не мешает использовать ItemArmor место простого Item.
По этому, я решил использовал RenderPlayerEvent для рендера модели на игроке используя из из эвента event.renderer.modelBipedMain, что из них брать нужные повороты для модели:
[1.7.10]

Но к сожалению для моба у меня не получилось настроить как надо:

Двигалась эта модель всегда не как надо.
Если кому надо, то вот ссылка: (github.com) Custom_Armor_Event_1_7_10 - на исходники, без рендера для моба.
Если что, то можно использовать подобное, для рендера модели на игроке, не только зависимости от того, что есть в слотах брони, но и по другим условиям (модель рюкзака, если он есть в своём слоте для рюкзака/какой либо предмет по типу застрявшей стрелы в игроке, но что-то другое [сюрикен, шрапнель, перевязка и/или шина для ноги/руки]).
 
timaxa007 написал(а):
И в очередном тестировании, выявилось ещё одна проблема,

по эвенту должны были подняться руки игрока и руки брони, но у брони они не поднялись. Не стал я что-то ещё делать или исправлять подобную проблему.
Я сделал, чтобы по эвенту RenderPlayerEvent.SetArmorModel рендерилась своя модель, если в слоте брони был нужный предмет.
Что примечательно: метод getArmorModel находиться в Item, но этот метод срабатывает, если этот Item является наследником ItemArmor. А эвент RenderPlayerEvent.SetArmorModel срабатывает, если в слотах брони что-то лежит. Если правильно использовать этот код, то можно сделать так, чтобы модель рендерилась от определённого слота, даже от своего слота.
Но не кто не мешает использовать ItemArmor место простого Item.
По этому, я решил использовал RenderPlayerEvent для рендера модели на игроке используя из из эвента event.renderer.modelBipedMain, что из них брать нужные повороты для модели:
[1.7.10]

Но к сожалению для моба у меня не получилось настроить как надо:

Двигалась эта модель всегда не как надо.
Если кому надо, то вот ссылка: (github.com) Custom_Armor_Event_1_7_10 - на исходники, без рендера для моба.
Если что, то можно использовать подобное, для рендера модели на игроке, не только зависимости от того, что есть в слотах брони, но и по другим условиям (модель рюкзака, если он есть в своём слоте для рюкзака/какой либо предмет по типу застрявшей стрелы в игроке, но что-то другое [сюрикен, шрапнель, перевязка и/или шина для ноги/руки]).

спасибо :sleepy:
 

timaxa007

Модератор
5,831
409
672
[1.6.4] (с использованием эвента) Портирование версии 1.7.10 для 1.6.4.
(github.com) Custom_Armor_Event_1_6_4
Одно из отличий: место "event.renderer.modelBipedMain" используется рефлексия:
Код:
ModelBiped modelBipedMain = ReflectionHelper.getPrivateValue(RenderPlayer.class, event.renderer, "modelBipedMain", "field_77109_a", "f");
Так как на 1.6.4 она приватная.
Сделал это из-за того, что использования getArmorModel(EntityLivingBase, ItemStack, int), так-же как и на 1.7.10, приводит к некоторой не правильной работы брони. При тестировании (не мной) брони без использования эвента, при определённых условиях руки брони не правильно работали. Скриншота или видео нет.
Просадок в fps не было замечено.


 
1,976
68
220
Настало время поднять эту тему из пучин и дополнить версию 1.7.10 фиксом поворотов, держания предметов итп :D
(просто потому что я задолбался каждый раз искать фикс :rolleyes:)
Java:
{
            EntityLivingBase living = (EntityLivingBase) entity;
            isSneak = living != null ? living.isSneaking() : false;
            if(living != null && living instanceof EntityPlayer) {
                EntityPlayer player = (EntityPlayer) living;

                ItemStack itemstack = player.inventory.getCurrentItem();
                heldItemRight = itemstack != null ? 1 : 0;

                aimedBow = false;
                if (itemstack != null && player.getItemInUseCount() > 0) {
                    EnumAction enumaction = itemstack.getItemUseAction();

                    if (enumaction == EnumAction.block)
                        heldItemRight = 3;
                    else if(enumaction == EnumAction.bow)
                        aimedBow = true;
                }
            }
        }

P.S. Хвала великому Vazkii!
 

timaxa007

Модератор
5,831
409
672
(github.com) Armor_OBJ_1_7_10_Event
Отличия от "[1.7.10] (с использованием эвента) - Пост #11.":
- Сервер пишет, что нету класса "ArmorCustomModelTest" ("ArmorCustomModel" и всех от него наследников) для SERVER стороны, хотя он только CLIENT. Теперь модели для предмета задаются не в самом предмете, а в EventsClient в методе getModel, под нужными условиями.
- Используется не Item, а ItemArmor. А то некоторым сложно переделать это. И в ItemCustomArmorDummy добавлен метод от Forge getArmorModel, чтобы скрыть ванильный рендер брони.
 

timaxa007

Модератор
5,831
409
672

timaxa007

Модератор
5,831
409
672
@Egorka, 3D's Max 8 SP3 (не 2008 и не 2018).

---
Мне привычнее в этой программе. В blender'е я пока-что не привык делать.
 
Сверху