- 1,990
- 18
- 105
Что нам потребуется:
1. MCP + Minecraft Forge.
2. Руки. Можно кривые, главное, чтобы основание было в правильной точке.
3. Приветствуется знание основ Java и ООП в целом.
4. Techne.
5. Растровый редактор изображений.
6. IDE или редактор кода.
6.1. Eclipse/IntelliJ IDEa/NetBeans/чтонибудьещё
6.2. NotePad++/VIM/чтонибудьещё
7.
8. Знать что такое прокси и с чем его употребляют. Желательно.
Если из списка всё при себе -
Глава 1. Создание модели в Techne.
Создаем новый проект. Наследуем его от ModelBiped, если хотим, чтобы моделька корректно отображалась на ГГ.
Углубляться в процесс моделирования я не буду, дело ваше, но есть одна важная деталь:
Все детали определенной части модели должны иметь одинаковую систему координат с частью тела, которой они принадлежат. Начало системы координат в Techne обозначается синей сферой.
Вот начало координат у головы.
Создаем бокс, смотрим где его начало координат.
Ага, в той же точке. Значит всё правильно.
- И что теперь, как мне задавать позицию, умник?
- Так для тебя же создали специальный параметр Offset. А позиция нашей "сферы" задается параметром Position.
Благодаря им мы и будем задавать позицию нужным частям нашей модели.
Кстати, есть ещё кое-что хорошее в Techne.
Благодаря связке Copy + Paste With Coordinates можно сэкономить уйму времени, расставляя боксы модельки.
Остальную часть моделирования я опущу, покажу лишь итог моей фантазии:
Да, и ещё одно важное замечание, не забудьте удалить самого ГГ из итоговой модели.
Т.е. не должно быть никаких head/body/right/left(arm/leg).
Собственно, итог:
Иии совсем итог:
Дальше экспортируем модель в Java код.
Глава 2. Настройка модели
Итак, мы получили код, его придется немного подправить.
Во-первых правим наследованный класс:
Код:
public class ModelHelmet extends ModelBiped
Традиционно добавляем параметр Entity в нужные методы:
Вот такие методы должны быть:
Код:
public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5, Entity entity) { //здесь добавился параметр entity
super.setRotationAngles(f, f1, f2, f3, f4, f5, entity); //и здесь
}
Код:
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 ArrayList<ModelRenderer> modelList = new ArrayList<ModelRenderer>();
Код:
modelList.add(Shape1);
modelList.add(Shape2);
modelList.add(Shape3);
modelList.add(Shape4);
modelList.add(Shape5);
modelList.add(Shape6);
modelList.add(Shape7);
modelList.add(Shape8);
modelList.add(Shape9);
modelList.add(Shape10);
modelList.add(Shape11);
modelList.add(Shape12);
modelList.add(Shape13);
modelList.add(Shape14);
modelList.add(Shape15);
modelList.add(Shape16);
modelList.add(Shape17);
modelList.add(Shape18);
modelList.add(Shape19);
modelList.add(Shape20);
modelList.add(Shape21);
modelList.add(Shape22);
Нуу, вроде всё, да? Пока хватит. Идем к следующей главе.
Глава 3. Создание предмета брони
Я не буду описывать здесь создание всех элементов брони, пока. Если вы попросите, то постараюсь сделать и для всего остального, только уж без наглядных моделек (в плане, мне лень делать модельки в течне), слишком много на них времени уходит.
Хватит отходить от темы, приступаем.
Сначала создадим класс брони:
Код:
public class ItemHelmet extends ItemArmor {
public ItemHelmet (int par1) {
super(par1, EnumArmorMaterial.CHAIN, 0, 0);
//аргументы: ID, материал, индекс рендера (нам не нужен, 0), тип брони
//типы брони:
//0 - шлем
//1 - кираса
//2 - поножи
//3 - ботинки
}
}
Методы регистрации иконки и текстуры:
Код:
@SideOnly(Side.CLIENT)
@Override
public void registerIcons(IconRegister par1IconRegister) {
this.itemIcon = par1IconRegister.registerIcon(ModInfo.MODID+":"+"icon_name");
//очевидно регистрируем иконку для брони
}
@Override
public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type) {
if (slot == 0) //шлем?
return ModInfo.MODID + ":textures/armor/" + "texture_name.png";
return ModInfo.MODID + ":textures/armor/" + "texture_name.png"; //ну мне лень было делать пустую текстуру
//привязываем текстуру, путь именно в таком в формате
//после MODID двоеточие, потом папки разделяются привычными слешами
//в конце обязательно .png!
}
И теперь переходим к главному, да-да, наша модель!
Код:
@SideOnly(Side.CLIENT)
@Override
public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, int armorSlot) {
if (armorSlot != 0) //если не шлем - бай-бай
return null;
if (itemStack != null && itemStack.getItem() instanceof ItemHelmet) {
ModelBiped model = ClientProxy.getArmorModel(); //Я сохранил инстанс модельки в клиентском прокси
return model;
}
else
return null;
}
Сразу покажу нетерпеливым регистрацию модели в прокси:
Код:
public static ModelBiped modelHelmet;
@Override
public void init() {
super.init();
modelHelmet = new ModelHelmet();
//хотел поиздеваться, да не буду, сразу скажу, что надо отключить рендер стандартных боксов брони
modelHelmet.bipedHead.showModel = false;
modelHelmet.bipedHeadwear.showModel = false;
modelHelmet.bipedBody.showModel = false;
modelHelmet.bipedLeftArm.showModel = false;
modelHelmet.bipedRightArm.showModel = false;
modelHelmet.bipedLeftLeg.showModel = false;
modelHelmet.bipedRightLeg.showModel = false;
modelHelmet.bipedCloak.showModel = false;
}
Больше про прокси пояснять не буду, сами изучайте, тем полно.
Ну вот вроде и всё, так?
Запускаем.
Ура ура!
Глава 4. Облом
Стоп, подожди-ка...
Что? Чтооооо?
А вот что, если заглянуть в код
Происходит такое: рендерится игрок, при этом на матрицу (камеру, кому как легче) заранее применяются некоторые трансформации, а именно - смещение, скейл, и поворот (немного не в таком порядке, ну неважно,
Но игра же не знает когда и как ей повернуть определенную часть брони, мы об этом ей должны сообщить сами.
Итак, берем из кода ModelBiped в методе setRotationAngles две строки
Код:
this.bipedHead.rotateAngleY = par4 / (180F / (float)Math.PI);
this.bipedHead.rotateAngleX = par5 / (180F / (float)Math.PI);
Иии применяем их к своим моделькам.
Но подождите, у нас 22 шейпа :0
А тут вспоминаем, что мы всё кидали в лист.
Тогда все укладывается в пару строчек, создадим метод для поворота по нужным осям.
Код:
private void setRotationAngleX(float angle) {
for (ModelRenderer modelRenderer : modelList) {
modelRenderer.rotateAngleX = angle;
}
}
private void setRotationAngleY(float angle) {
for (ModelRenderer modelRenderer : modelList) {
modelRenderer.rotateAngleY = angle;
}
}
Переделываем чуть метод setRotationAngles:
Код:
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);
//те 2 строки из ModelBiped
setRotationAngleY(f3 / (180F / (float)Math.PI));
setRotationAngleX(f4 / (180F / (float)Math.PI));
}
Всё поворачивается с головой как надо, но модель шлема не опускается при приседании?
Снова ползем в ModelBiped и дополняем наш код.
В модели setRotationAngles будет выглядеть как-то так:
Код:
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);
setRotationAngleY(f3 / (180F / (float)Math.PI));
setRotationAngleX(f4 / (180F / (float)Math.PI));
if (isSneak)
setRotationPointY(1.0F);
else
setRotationPointY(0.0F);
}
Вот новый метод:
Код:
private void setRotationPointY (float par) {
for (ModelRenderer modelRenderer : modelList) {
modelRenderer.rotationPointY = par;
}
}
И заодно снова идем в класс брони и не забываем менять состояние переменной isSneak, ведь модель сама не узнает, крадется игрок или нет.
Код:
@SideOnly(Side.CLIENT)
@Override
public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, int armorSlot) {
if (armorSlot != 0)
return null;
if (itemStack != null && itemStack.getItem() instanceof ItemHelmet) {
ModelBiped model = ClientProxy.getArmorModel();
model.isSneak = entityLiving.isSneaking();
return model;
}
else
return null;
}
Дальше проверяйте сами.
Пока всё, если надо будет ещё что добавить - пишите, скорее всего допишу всё в этой же теме.
[merge_posts_bbcode]Добавлено: 17.08.2014 01:27:00[/merge_posts_bbcode]
Кое-что забыл.
Лучше создать в начале в классе модели 4 отдельных списка, если хотите добавить и другие части брони, в каждый список добавляем нужные части модели и всё. Просто никто же не хочет, чтобы у него кираса или ШТАНЫ поворачивались вместе с головой?