[Гайд] Бронь с моделью 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;
    }

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

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

Код:
if(itemStack != null)

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

Но у тебя есть и полезная инфа, которой не было у меня - addChild.
 
1,683
1
Пусть сделает фиксы и все. Переносить не надо
Туториал надо понять,а не скопировать(с)
 
2,955
12
Опять же, советую сначала понять все, а только потом выкладывать.
 
471
5
А можно как-то это сделать не зная Java коддинга ?
 
7,099
324
1,510
Скопипасть готовый пример, подставь свои параметры(это самый минимум, но тебе все равно надо знать, хоть как поля объявлять...)
 
1,239
2
24
Код конечно не мой,я лишь копался 3 дня с этой моделью для брони,я просто выложил "как это правильно сделать" в виде гайда.Переносить или не переносить решать модераторам,я не настаиваю.Пофикшу что смогу и внесу поправки
 
1,683
1
Хехе. Скопировал с уже готового туториала,да ещё и вопросы задавал
 
1,239
2
24
Dovakin,докажи что я просто скопипастил.
1)Ты сам не написал не одного тутора (ну так покажи)
2)На форуме 2 гайда по рендеру модели в качестве брони,1-й от майнкрафтсрв а другой от лошадки.Оба гайда на 1.6.4 .Может другие не понимают разницу 1.7.10 и 1.6.4 или у них что то не получается.
3)Я все наглядно все объяснил а не просто кинул код сказав "разбирайтесь сами вот код"
4)Конечно,лучше искать зарубежные туториалы на англ. и разбираться дня 2 ,чем прочитать на родном языке и еще с пояснениями.
 
25
0
XuPuPG написал(а):
Dovakin,докажи что я просто скопипастил.
1)Ты сам не написал не одного тутора (ну так покажи)
2)На форуме 2 гайда по рендеру модели в качестве брони,1-й от майнкрафтсрв а другой от лошадки.Оба гайда на 1.6.4 .Может другие не понимают разницу 1.7.10 и 1.6.4 или у них что то не получается.
3)Я все наглядно все объяснил а не просто кинул код сказав "разбирайтесь сами вот код"
4)Конечно,лучше искать зарубежные туториалы на англ. и разбираться дня 2 ,чем прочитать на родном языке и еще с пояснениями.
Хирург, зачем модели серверная сторона?
Модели - чисто клиентское дело.
 
2,955
12
Кому как. Мне вообще без разницы, на английском или русском туториал. Главное - содержание.
 
1,683
1
Серьёзно?! Я могу заняться переводом туториалов.
Для хирурга-печеньки,я писал туториал по асм,но его удалили с тем аккаунтом. Не умеешь писать код и слушать критику,туториалы не для тебя(сам ни одного не написал,а этот не считается,Dupllicate id. Error...)
 
1,683
1
Тем более я знаю общепринятые правила
P.S. Хотел запилить,туториал,да. Но по какой теме? Я ж не хирурга,чтобы 3 туториал писать
P.P.S У коня в отличиях только id в кострукторе
P.P.P.S Просто поправь косяки и надейся на милость модерации
P.P.P.P.S У меня пичот, а ещё это оффтопик
 
1,976
68
220
Отличный гайд, большое тебе спасибо за него, всё очень подробно. Но есть пара недоработок:
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;}" в классе нагрудника
 
1,137
5
3
Неа, просто всё это писать не рационально. *ко-ко-ко, сделай лучше*
 
Сверху