• Страница 1 из 1
  • 1
Модератор форума: KHz, mef_prog, Mo3RiN  
[Modloader]Основы Программирования Для Minecraft Часть 3
KHzДата: Пятница, 28.10.2011, 22:12 | Сообщение # 1
Группа: Администраторы
Сообщений: 29
Награды: 0
Репутация: 5
Статус: Offline
Глава 7. Создание нового инструмента (на основе стандартных материалов).

Сейчас мы сделаем веник. Он будет у нас аналогом алмазного меча.

Добавим к пабликам строку:

Code
public static final Item venik = new ItemSword(3002, EnumToolMaterial.EMERALD).setItemName("venik");


Разберем.

Обозначаем что это за предмет. Есть sword, axe, pickaxe и spade. В нашем случае - меч.

Code
new ItemSword


ID.

Code
3002


Материал инструмента.
WOOD - Дерево
STONE - Камень
IRON - Железо
EMERALD - Алмаз
GOLD - Золото


Code
EnumToolMaterial.EMERALD


Добавим все как обычно.

Code
venik.iconIndex = ModLoader.addOverride("/gui/items.png", "/textures/venik.png");
ModLoader.AddName(venik, "Venik");
ModLoader.AddRecipe(new ItemStack(venik, 1), new Object[]{ "XXX", "#X#", "#X#", Character.valueOf('X'), Block.dirt});


Кидаем текстуру в minecraft.jar/textures.

(размеры не изменять!)

Тестируем!

Глава 8. Создание нового инструмента и его свойств.

Открываем EnumToolMaterial.java.

Ищем строку:

Code
GOLD("GOLD", 4, 0, 32, 12F, 0),


И добавляем ниже новые характеристики:

Code
TITAN("TITAN", 5, 5, 100, 25F, 5);


Название.

Code
TITAN


Первая пятерка - порядковый номер свойства.
Вторая - уровень разрушения.
Сотня - количество разрушаемых блоков в общем (состояние инструмента).
25F - сила разрушения, скорость.
5 - сила удара для мобов.

Сравнивайте со стандартными свойствами и делайте новые.
Теперь просто в mod_gcc, в строке инструмента:

Code
EnumToolMaterial.EMERALD


Пишите ваше свойство.
Например:

Code
EnumToolMaterial.TITAN


Так же хочу рассказать про уровень разрушения.
На данный момент в игре используется только 5 уровней.

0 - дерево.
1 - камень.
2 - железо.
3 - алмаз.
4 - золото.

Открываем ItemPickaxe.java и смотрим код.
Можно заметить что обсидиан разрушается только алмазной киркой - уровнем 3.

Code
Когда стоит строка:
getHarvestLevel() == 3


Значит разрушение происходит ТОЛЬКО 3 уровнем.

Code
А когда стоит:
getHarvestLevel() >= 1


То значит, разрушение происходит от 1 уровня до максимального.

Если хотите чтобы ваш блок разрушался только вашей киркой (точнее дроп) - ставите уровень 5 в свойстве.
Затем дописываем в ItemPickaxe (или что у вас там) новую строку по типу:

Code
if(block == mod_gcc.newblock)
          {
              return toolMaterial.getHarvestLevel() == 5;
          }


Таким образом только одна кирка сможет разрушить данный блок, а точнее с вашей киркой разрушение пройдет быстрее и из блока может что-то выпасть.

Глава 9. Создание нового нейтрального моба - Advanced.

Ну, для начала скажу, что в создании моба нет ничего сложно. Основная проблема, которая может у вас возникнуть, так это создание новой модельки. Я взял обычного криппера и чуть-чуть перерисовал текстуру.

Создаем файл и указываем название mod_freeper.java.
Эта часть кода должна быть уже известна вам, если прошли предыдущие уроки конечно.

Code
package net.minecraft.src;

import java.util.*;
import java.util.Map;

public class mod_freeper extends BaseMod
{

   public String Version()
   {
   return "1..1";
   }
}

Теперь в класс mod_freeper вставляем следующий код:

Code
public mod_freeper()
   {
   ModLoader.RegisterEntityID(EntityFreeper.class, "Freeper", ModLoader.getUniqueEntityId());

   ModLoader.AddSpawn(EntityFreeper.class, 500, EnumCreatureType.creature);
   }


Регестрируем моба в нашем мире:

Code
ModLoader.RegisterEntityID(EntityFreeper.class, "Freeper", ModLoader.getUniqueEntityId());


Спавн моба. Число 500 обозначает их редкость:

Code
ModLoader.AddSpawn(EntityFreeper.class, 500, EnumCreatureType.creature);


Размер тени мы сможем указать при помощи этого кода:

Code
public void AddRenderer(Map map)
   {
   map.put(EntityFreeper.class, new RenderFreeper(new ModelFreeper(), 1.0F));
   }


Далее.

Создаем файл под названием EntityFreeper.java.

Вписываем туда этот код:

Code
package net.minecraft.src;


Создаем класс EntityFreeper с указанием, что это нейтральный моб (животное).

Code
public class EntityFreeper extends EntityAnimal


Вписываем в класс EntityFreeper следующий код:

Code
public EntityFreeper(World world)
      {
          super(world);
          texture = "/mob/freeper.png";
          setSize(1.5F, 1.5F);
      }


Тут мы объясняем мобу, что мир, в котором он будет жить, супер:

Code
super(world);


Тут мы указываем путь к текстуре:

Code
texture = "/mob/freeper.png";



(размеры не изменять!)

Тут размеры коллайдера на мобе:

Code
setSize(1F, 1F);


Это просто скопируйте. Тут записываются и считываются данные.

Code
public void writeEntityToNBT(NBTTagCompound nbttagcompound)
      {
          super.writeEntityToNBT(nbttagcompound);
      }

      public void readEntityFromNBT(NBTTagCompound nbttagcompound)
      {
          super.readEntityFromNBT(nbttagcompound);
      }


Теперь мы указываем звуки, которые он будет издавать.

Это отвечает за то, что он будет издавать постоянно. В моем случае он будет КУКАРЕКАТЬ как петушок.

Code
protected String getLivingSound()
{
          return "mob.chicken";
      }


Это отвечает за то, что он будет издавать при уменьшении HP.

Code
    protected String getHurtSound()
      {
          return "mob.creeper";
      }


Это отвечает за то, что он будет издавать при смерти.

Code
    protected String getDeathSound()
      {
          return "mob.creeperdeath";
      }


Устанавливаем громкость.

Code
    protected float getSoundVolume()
      {
          return 0.4F;
      }


Вписываем ID предмета, который выпадет после смерти моба.

Code
protected int getDropItemId()
      {
          return 289;
      }


Проверяем.



Идем далее.

Назвав файл RenderFreeper.java, мы вписываем в него следующий код:

Code
package net.minecraft.src;

public class RenderFreeper extends RenderLiving
{

      public RenderFreeper(ModelBase modelbase, float f)
      {
          super(modelbase, f);
      }

      public void func_177_a(EntityFreeper ebs, double d, double d1, double d2,   
              float f, float f1)
      {
          super.doRenderLiving(ebs, d, d1, d2, f, f1);
      }

      public void doRenderLiving(EntityLiving entityliving, double d, double d1, double d2,   
              float f, float f1)
      {
          func_177_a((EntityFreeper)entityliving, d, d1, d2, f, f1);
      }

      public void doRender(Entity entity, double d, double d1, double d2,   
              float f, float f1)
      {
          func_177_a((EntityFreeper)entity, d, d1, d2, f, f1);
      }
}


Собственно это он генерирует нашего моба в мире (отображает). Думаю и вам, и мне будет легче, если вы просто скопируете его к себе.

Начинаем, как всегда с того, что создаем файл и даем ему имя. В данном случае, имя ему будет ModelFreeper.java.
Ну и, наконец, самое главное... модель нашего моба. Чтобы делать модели для minecraft'a, нужна специальная программа, она называется Techne. Впоследствии, возможно мы и напишем пару уроков по “созданию” модели в этой программе. Но пока, скопируйте просто готовый код фрипера. Объяснять тут ничего не надо, так как программа сама все вам сгенерирует.

Code
package net.minecraft.src;

public class ModelFreeper extends ModelBase
{

      public ModelFreeper()
      {
          this(0.0F);
      }

      public ModelFreeper(float f)
      {
          int i = 4;
          head = new ModelRenderer(0, 0);
          head.addBox(-4F, -8F, -4F, 8, 8, 8, f);
          head.setRotationPoint(0.0F, i, 0.0F);
          field_1270_b = new ModelRenderer(32, 0);
          field_1270_b.addBox(-4F, -8F, -4F, 8, 8, 8, f + 0.5F);
          field_1270_b.setRotationPoint(0.0F, i, 0.0F);
          body = new ModelRenderer(16, 16);
          body.addBox(-4F, 0.0F, -2F, 8, 12, 4, f);
          body.setRotationPoint(0.0F, i, 0.0F);
          leg1 = new ModelRenderer(0, 16);
          leg1.addBox(-2F, 0.0F, -2F, 4, 6, 4, f);
          leg1.setRotationPoint(-2F, 12 + i, 4F);
          leg2 = new ModelRenderer(0, 16);
          leg2.addBox(-2F, 0.0F, -2F, 4, 6, 4, f);
          leg2.setRotationPoint(2.0F, 12 + i, 4F);
          leg3 = new ModelRenderer(0, 16);
          leg3.addBox(-2F, 0.0F, -2F, 4, 6, 4, f);
          leg3.setRotationPoint(-2F, 12 + i, -4F);
          leg4 = new ModelRenderer(0, 16);
          leg4.addBox(-2F, 0.0F, -2F, 4, 6, 4, f);
          leg4.setRotationPoint(2.0F, 12 + i, -4F);
      }

      public void render(float f, float f1, float f2, float f3, float f4, float f5)
      {
          setRotationAngles(f, f1, f2, f3, f4, f5);
          head.render(f5);
          body.render(f5);
          leg1.render(f5);
          leg2.render(f5);
          leg3.render(f5);
          leg4.render(f5);
      }

      public void setRotationAngles(float f, float f1, float f2, float f3, float f4, float f5)
      {
          head.rotateAngleY = f3 / 57.29578F;
          head.rotateAngleX = f4 / 57.29578F;
          leg1.rotateAngleX = MathHelper.cos(f * 0.6662F) * 1.4F * f1;
          leg2.rotateAngleX = MathHelper.cos(f * 0.6662F + 3.141593F) * 1.4F * f1;
          leg3.rotateAngleX = MathHelper.cos(f * 0.6662F + 3.141593F) * 1.4F * f1;
          leg4.rotateAngleX = MathHelper.cos(f * 0.6662F) * 1.4F * f1;
      }

      public ModelRenderer head;
      public ModelRenderer field_1270_b;
      public ModelRenderer body;
      public ModelRenderer leg1;
      public ModelRenderer leg2;
      public ModelRenderer leg3;
      public ModelRenderer leg4;
}


Скриншот из игры:



© FunnyAlien


[Skype][Steam][Portfolio][CodHacks.ru]
 
  • Страница 1 из 1
  • 1
Поиск:

 

Полная статистика форума

Ваш текст ну или чего хотите