- 1,239
- 2
- 24
Всем привет!Сегодня,я расскажу как сделать бронь с собственной моделью.
Что понадобится:
=========================================================================================
- Minecraft версии 1.7.10
- Среда разработки
- Программа Techne
- Прямые руки
Начнем:
1)Нам понадобится модель для той или иной части брони.Я объясню создание модели на примере шлема:
********
1.1 Создаем новый проект в tecnhe и наследуем его от ModelBiped
********
1.2 Перед нами появляется Стив. Собственно,если хотим шлем,нагрудник,штаны,ботинки с моделью-пожалуйста.
Есть 1 важное но : все детали определенной части модели должны иметь одинаковую систему координат с частью тела, которой они принадлежат. Начало системы координат в Techne обозначается синей сферой.
Простым языком: если делаете модель для шлема,то клацаете мышкой по голове и создаете куб.
Если нагрудник или штаны-то начало системы координат только от торса и ног.
********
1.3 После того как вы создали свою модель переходим к ее назначению.К примеру у меня модель такая:
P.S не надо кидаться тапками,я с techne не знаком вообще
1.4 Прежде чем экспортировать,не забудьте удалить все части Стива (голову,руки,ноги).Затем экспортируем модель в .java .У нас появляется файлик .java .
*************************************************************************************************************************2)Ну а теперь переходим в нашу мастерскую то есть eclipse/Idea .
Я дам код и буду в комментариях объяснять что к чему.
В главном классе создаем бронь.Я назову свой класс Helmet а переменную helmetModel
Код:
helmetModel = new Helmet(0, 0).setUnlocalizedName("bestarmorhelmet");
//Где (0,0) это тип брони. (0,0) - шлем, (0,1) - нагрудник и т.д
GameRegistry.registerItem(helmetModel, "Helmet");
Создали?Теперь создаем класс Helmet и внимательно смотрим:
Код:
public class Helmet extends ItemArmor{
public Helmet(int id, int armorType) {
super(ArmorMaterial.DIAMOND, id, armorType); //Материал
this.setCreativeTab(CreativeTabs.tabCombat);
this.setMaxStackSize(1);
this.setTextureName("PicJ"); //Текстурка итема
}
@Override
public void registerIcons(IIconRegister par1IconRegister)
{
this.itemIcon = par1IconRegister.registerIcon(Strings.MODID + ":PicJ"); //Текстурка итема
}
@Override
public String getArmorTexture(ItemStack stack, Entity entity, int slot,
String type) {
return "tm:textures/model/Cube.png"; //текстурка брони на игроке
}
ModelBiped PartyHat = new ModelBiped(); //вместо PartyHat называем как хотим
@Override
@SideOnly(Side.CLIENT)
public ModelBiped getArmorModel(EntityLivingBase entityLiving,
ItemStack itemStack, int armorSlot) {
if(itemStack != null){
if(itemStack.getItem() instanceof Helmet){
int type = ((ItemArmor)itemStack.getItem()).armorType;
PartyHat = TestMOD.proxy1.getArmorModel(0);
// TestMOD-ваш гл класс, proxy - это переменная с сервер прокси [пример: public static ServerProxy proxy1;]
//Все это,это регистрация модели в прокси .Где (0) это тип брони. 1-нагрудник, 2 - штаны , 3 - ботинки
}
if(PartyHat != null){
PartyHat.bipedHead.showModel = armorSlot == 0;
PartyHat.bipedHeadwear.showModel = armorSlot == 10;
PartyHat.bipedBody.showModel = armorSlot == 1 || armorSlot == 2;
PartyHat.bipedRightArm.showModel = armorSlot == 1;
PartyHat.bipedLeftArm.showModel = armorSlot == 1;
PartyHat.bipedRightLeg.showModel = armorSlot == 2 || armorSlot == 3;
PartyHat.bipedLeftLeg.showModel = armorSlot == 2 || armorSlot == 3;
PartyHat.isSneak = entityLiving.isSneaking();
PartyHat.isRiding = entityLiving.isRiding();
PartyHat.isChild = entityLiving.isChild();
if(entityLiving instanceof EntityPlayer){
PartyHat.aimedBow =((EntityPlayer)entityLiving).getItemInUseDuration() > 2;
}
}
}
return PartyHat;
}
}
2)И так,теперь класс модели.Ваш только что испеченный класс будет совершенно другой чем у меня.Сейчас покажу:
Ваш "новоиспеченный" класс модельки:
Код:
package net.minecraft.src;
public class ModelTutorial extends ModelBase
{
//fields
ModelRenderer Shape1;
ModelRenderer Shape2;
public ModelTutorial ()
{
textureWidth = 64;
textureHeight = 32;
Shape1 = new ModelRenderer(this, 0, 0);
Shape1.addBox(0F, 0F, 0F, 4, 1, 1);
Shape1.setRotationPoint(3F, -3F, 0F);
Shape1.setTextureSize(64, 32);
Shape1.mirror = true;
setRotation(Shape1, 0F, 0F, 0F);
Shape2 = new ModelRenderer(this, 0, 0);
Shape2.addBox(0F, 0F, 0F, 4, 1, 1);
Shape2.setRotationPoint(3F, -5F, 0F);
Shape2.setTextureSize(64, 32);
Shape2.mirror = true;
setRotation(Shape2, 0F, 0F, 0F);
}
public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5)
{
super.render(entity, f, f1, f2, f3, f4, f5);
setRotationAngles(f, f1, f2, f3, f4, f5);
Shape1.render(f5);
Shape2.render(f5);
}
private void setRotation(ModelRenderer model, float x, float y, float z)
{
model.rotateAngleX = x;
model.rotateAngleY = y;
model.rotateAngleZ = z;
}
public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5)
{
super.setRotationAngles(f, f1, f2, f3, f4, f5);
}
}
А вот мой:
Код:
public class ModelHelmet extends ModelBiped // меняем ModelBase на ModelBiped (обязательно!)
{
//fields
ModelRenderer Shape1;
public ModelHelmet(float f) //обязательно дописываем (float f)
{
textureWidth = 64;
textureHeight = 32;
Shape1 = new ModelRenderer(this, 0, 0); // тут ваши шейпы
Shape1.addBox(0F, 0F, 0F, 1, 1, 1);
Shape1.setRotationPoint(3F, -8F, 0F);
Shape1.setTextureSize(64, 32);
Shape1.mirror = true;
setRotation(Shape1, 3.141593F, 0F, 0F);
this.bipedHead.addChild(Shape1); //Смотреть сноску 1
}
public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5)
{
super.render(entity, f, f1, f2, f3, f4, f5);
setRotationAngles(f, f1, f2, f3, f4, f5, entity);
//Где мои шейпы?Они не нужны здесь ,смело удаляем все шейпы отсюда
}
private void setRotation(ModelRenderer model, float x, float y, float z)
{
model.rotateAngleX = x;
model.rotateAngleY = y;
model.rotateAngleZ = z;
}
public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5,Entity entity)
{
super.setRotationAngles(f, f1, f2, f3, f4, f5, entity);
}
}
Сноска 1 :
Код:
this.bipedHead.addChild(Shape1);
Хм,что же это? Разберем:
bipedHead - это голова Стива.Без этого у нас не будет модели.
Если у вас не голова а скажем торс(нагрудник) то пишем this. и у нас высвечивает кучу вариантов
bipedBody - нагрудник.Думаю с английским у вас проблем нет.
Примечание: при рендере штанов нужно применять шейпы к левой ноге и правой.Это у нас LeftLeg и RightLeg .Думаю с право и лево у вас проблем нет.
Примечание: при рендере штанов нужно применять шейпы к левой ноге и правой.Это у нас LeftLeg и RightLeg .Думаю с право и лево у вас проблем нет.
addChild(Shape1) - это значит что мы "говорим" шейпу 1 (Shape1) быть только в нагрудник и изменять позицию по отношению к телу.Если у вас шейпов на нагруднике больше 1 ,например 3 то пишем
Код:
this.bipedHead.addChild(Shape1);
this.bipedHead.addChild(Shape2);
this.bipedHead.addChild(Shape3);
Так же беспощадно мы поступаем со всеми шейпами на нагруднике , шлеме или другой части тела.
3) Ну теперь к прокси.Ничего страшного там нет.В любом месте ClientProxy пишем:
Код:
private static final ModelHelmet tutChest = new ModelHelmet(-1.0F);
@Override
public ModelBiped getArmorModel(int id){
return tutChest;
ModelHelmet - класс с моделью
tutChest - как хотим так и называем
(-1.0F) - размеры нашего тела при надетой части брони.Поиграйтесь с параметром узнаете.
getArmorModel - нам предложит его создать в ServerProxy .Но мы откажемся от любезности eclipse/Idea и сделаем его сами.
Теперь в сервер прокси:
Код:
public ModelBiped getArmorModel(int i) {
return null;
}
getArmorModel - это имя в клиент прокси которое ссылается на имя в клиент прокси в модели шлема.
Если у вас есть нагрудник или еще 1 шлем то в клиентском прокси меняем getArmorModel на любое имя например getArmorModel2.И так же пишем в серверном прокси.Кто не понял пример 2-х предметов:
ClientProxy (все определения такие же - класс модели
Код:
private static final ModelHelmet tutChest = new ModelHelmet(-1.0F);
@Override
public ModelBiped getArmorModel(int id){
return tutChest;
}
private static final BodyModel Chest = new BodyModel(-1.0F);
@Override
public ModelBiped getArmorModel1(int id){
return Chest;
}
ServerProxy
Код:
public ModelBiped getArmorModel(int i) {
// TODO Auto-generated method stub
return null;
}
public ModelBiped getArmorModel1(int id) {
// TODO Auto-generated method stub
return null;
}
Ну вроде ничего не забыл.Если для наглядности нужно добавить и другие модели то пишите