[Гайд] Бронь с моделью 1.7.10

1,239
2
24
Всем привет!Сегодня,я расскажу как сделать бронь с собственной моделью.​
Что понадобится:​
=========================================================================================​
  • Minecraft версии 1.7.10
  • Среда разработки
  • Программа Techne
  • Прямые руки
=========================================================================================​
Начнем:​
1)Нам понадобится модель для той или иной части брони.Я объясню создание модели на примере шлема:​
********​
1.1 Создаем новый проект в tecnhe и наследуем его от ModelBiped​
384c972abd.png
 
​
********​
1.2 Перед нами появляется Стив. Собственно,если хотим шлем,нагрудник,штаны,ботинки с моделью-пожалуйста.​
Есть 1 важное но : все детали определенной части модели должны иметь одинаковую систему координат с частью тела, которой они принадлежат. Начало системы координат в Techne обозначается синей сферой.​
Простым языком: если делаете модель для шлема,то клацаете мышкой по голове и создаете куб.​
Если нагрудник или штаны-то начало системы координат только от торса и ног.​
********
​
1.3 После того как вы создали свою модель переходим к ее назначению.К примеру у меня модель такая:​
70d3939e37.png

​
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. и у нас высвечивает кучу вариантов ​
bc291ffdfb.png


​
bipedBody - нагрудник.Думаю с английским у вас проблем нет.
Примечание: при рендере штанов нужно применять шейпы к левой ноге и правой.Это у нас 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;
    }

​
Ну вроде ничего не забыл.Если для наглядности нужно добавить и другие модели то пишите​
 
Негодно. Не пойму статический класс или переменная. Во-вторых у коня лучше. Там только id убрать и все
3
Код:
PartyHat.aimedBow =((EntityPlayer)entityLiving).getItemInUseDuration() > 2;

На любой предмет реагирует
[merge_posts_bbcode]Добавлено: 28.04.2015 00:43:51[/merge_posts_bbcode]

Код:
if(itemStack != null)

Не нужно. Там есть instanceof
 
>Модельки в сервер прокси.
Переплюнул, да. По кое-какому параметру.

Но у тебя есть и полезная инфа, которой не было у меня - addChild.
 
Пусть сделает фиксы и все. Переносить не надо
Туториал надо понять,а не скопировать(с)
 
Опять же, советую сначала понять все, а только потом выкладывать.
 
А можно как-то это сделать не зная Java коддинга ?
 
Скопипасть готовый пример, подставь свои параметры(это самый минимум, но тебе все равно надо знать, хоть как поля объявлять...)
 
Код конечно не мой,я лишь копался 3 дня с этой моделью для брони,я просто выложил "как это правильно сделать" в виде гайда.Переносить или не переносить решать модераторам,я не настаиваю.Пофикшу что смогу и внесу поправки
 
Хехе. Скопировал с уже готового туториала,да ещё и вопросы задавал
 
Dovakin,докажи что я просто скопипастил.
1)Ты сам не написал не одного тутора (ну так покажи)
2)На форуме 2 гайда по рендеру модели в качестве брони,1-й от майнкрафтсрв а другой от лошадки.Оба гайда на 1.6.4 .Может другие не понимают разницу 1.7.10 и 1.6.4 или у них что то не получается.
3)Я все наглядно все объяснил а не просто кинул код сказав "разбирайтесь сами вот код"
4)Конечно,лучше искать зарубежные туториалы на англ. и разбираться дня 2 ,чем прочитать на родном языке и еще с пояснениями.
 
XuPuPG написал(а):
Dovakin,докажи что я просто скопипастил.
1)Ты сам не написал не одного тутора (ну так покажи)
2)На форуме 2 гайда по рендеру модели в качестве брони,1-й от майнкрафтсрв а другой от лошадки.Оба гайда на 1.6.4 .Может другие не понимают разницу 1.7.10 и 1.6.4 или у них что то не получается.
3)Я все наглядно все объяснил а не просто кинул код сказав "разбирайтесь сами вот код"
4)Конечно,лучше искать зарубежные туториалы на англ. и разбираться дня 2 ,чем прочитать на родном языке и еще с пояснениями.
Хирург, зачем модели серверная сторона?
Модели - чисто клиентское дело.
 
Кому как. Мне вообще без разницы, на английском или русском туториал. Главное - содержание.
 
Серьёзно?! Я могу заняться переводом туториалов.
Для хирурга-печеньки,я писал туториал по асм,но его удалили с тем аккаунтом. Не умеешь писать код и слушать критику,туториалы не для тебя(сам ни одного не написал,а этот не считается,Dupllicate id. Error...)
 
Тем более я знаю общепринятые правила
P.S. Хотел запилить,туториал,да. Но по какой теме? Я ж не хирурга,чтобы 3 туториал писать
P.P.S У коня в отличиях только id в кострукторе
P.P.P.S Просто поправь косяки и надейся на милость модерации
P.P.P.P.S У меня пичот, а ещё это оффтопик
 
Отличный гайд, большое тебе спасибо за него, всё очень подробно. Но есть пара недоработок:
1. Текстура брони накладывается на игрока, из-за чего не покрытые бронёй места становятся странными.
2. Очень сильно недоработанная анимация правой руки - если взять что-то в неё, она вылазит из брони, если начать есть яблоко, броня поднимает руки, как будто это лук.
Больше пока что не нашёл. Как фиксить первое я не знаю, да и лично мне оно не нужно, а вот решение второго скину чуть позже :D
[merge_posts_bbcode]Добавлено: 24.01.2016 19:52:29[/merge_posts_bbcode]

А вот и решение:
Код:
// Проверка положения рук при использовании предмета
if(entityLiving instanceof EntityPlayer && ((EntityPlayer) entityLiving).inventory.getCurrentItem() != null && ((EntityPlayer) entityLiving).inventory.getCurrentItem().getItemUseAction() == EnumAction.bow && ((EntityPlayer)entityLiving).getItemInUseDuration() > 1) {
    Chest.aimedBow = true;
} else {
    Chest.aimedBow = false;
}

// Проверка положения при взятии в руку предмета
if (entityLiving instanceof EntityPlayer && ((EntityPlayer) entityLiving).inventory.getCurrentItem() != null && ((EntityPlayer) entityLiving).inventory.getCurrentItem().stackSize != 0) {
    Chest.heldItemRight = 1;
} else {
    Chest.heldItemRight = 0;
}
Это писать вместо "if(entityLiving instanceof EntityPlayer){PartyHat.aimedBow=((EntityPlayer)entityLiving).getItemInUseDuration() > 2;}" в классе нагрудника
 
Неа, просто всё это писать не рационально. *ко-ко-ко, сделай лучше*
 
Назад
Сверху