Среда, 27 Ноября 2024, 08:11

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
[ModLoader] Основы программирования для Minecraft [Часть 2]
EyeДата: Среда, 24 Августа 2011, 06:51 | Сообщение # 1
заслуженный участник
Сейчас нет на сайте
Глава 4. Генерация блока в мире.

Сейчас я попробую рассказать, как заставить наш блок генерироваться в игровом мире.
Для примера он будет появляться у камня (2-3 блока вниз).

Откроем mod_gcc.java.

После первой строки добавьте строку:
Code
import java.util.Random;


А после 13 строки сделаем отступ и запишем вот это.
Code
public void GenerateSurface(World world, Random rand, int chunkX, int chunkZ)
      {
           for(int i = 0; i < 150; i++)
           {
               int randPosX = chunkX + rand.nextInt(16);
               int randPosY = rand.nextInt(150);
               int randPosZ = chunkZ + rand.nextInt(16);
               (new WorldGenMinable(mod_gcc.newblock.blockID, 32)).generate(world, rand, randPosX, randPosY, randPosZ);
           }
       }


Разбираем.

Число 150 отвечает за редкость блока в игровом мире. 150 - это почти вездесущий, и его будет дохрена.
Для теста 150 подойдет отлично. Далее просто экспериментируйте.
Code
for(int i = 0; i < 150; i++)


150 - высота блока от админиума (бедрока). В нашем случае получается он выше камня на один блок в генерации. Тоже можно экспериментировать.
Code
int randPosY = rand.nextInt(150);


mod_gcc - наш мод. newblock - регистр блока. Число 32 - количество блоков на одном месторождении. Для теста я использовал 32 блока.
Code
(new WorldGenMinable(mod_gcc.newblock.blockID, 32))


Проверяем.



Вот и все. Запускайте и пробуйте!

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





Глава 5. Создание еды или как слепить хавку.

Добавляем к пабликам строку:
Code
public static final Item pighead = new ItemFood(2001, 10, false).setItemName("pighead");


Разберем.

Первое число - ID, второе - количество половинок сердца для восстановления (всего 20 половинок), а false можно ли использовать на волке для привлечения. Далее все по прежнему.
Code
new Head(2001, 20, false)


Запишем привычные строки.
Code
pighead.iconIndex = ModLoader.addOverride("/gui/items.png", "/textures/pighead.png");
ModLoader.AddName(pighead, "Pig Head");
ModLoader.AddRecipe(new ItemStack(pighead, 1), new Object[]{ "XX", "X#", Character.valueOf('X'), Block.dirt});


Закинем текстуру в minecraft.jar/textures.

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

Создаем файлик pigHead.java.

Туда кидаем:
Code
package net.minecraft.src;

public class pigHead extends ItemFood {
         
      public pigHead(int i, int j) {
         super(i, j, true);
      }
}


Запускаем и пробуем!

Для развития:

Если хотите чтобы после поедания вашей еды выпадал предмет (например, если это суп), вместо старого паблика впишите новый:
Code
public static final Item pighead = new Head(2001, 20, false, 16).setItemName("pighead");


Переименуйте pigHead.java в Head.java и весь код замените на:
Code
package net.minecraft.src;

public class Head extends ItemFood    
{
         
      public Head(int i, int j, boolean flag, int k)
      {
         super(i, j, flag);
         healAmount = j;
         maxStackSize = k;
      }
         
       public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer)
       {
           itemstack.stackSize--;
           entityplayer.heal(healAmount);
           entityplayer.dropPlayerItem(new ItemStack(mod_gcc.pighead.shiftedIndex, 1, 0));
           return itemstack;
       }
       
      public int getHealAmount()
       {
           return healAmount;
       }

       protected int healAmount;
}


Единственное что вам тут понадобится - эта строка. После поедания еды выпадает она же в количестве 1. Можете экспериментировать. Для дропа других итемов, пишите Item.название.shiftedIndex.
Code
entityplayer.dropPlayerItem(new ItemStack(mod_gcc.pighead.shiftedIndex, 1, 0))


Глава 6. Создание руды или как сделать чтобы из блока выпадали предметы.

Тут все очень просто.
Открываем BlockNew.java.

Ищем:
Code
public int idDropped(int i, int j)
      {
              return mod_gcc.newblock.blockID;
         }
         public int quantityDropped(Random random)
         {
              return 1;
         }
}


Меняем на:
Code
public int idDropped(int i, Random random)
       {
     return Item.stick.shiftedIndex;
       }
       
       public int quantityDropped(Random random)
       {
           return 2 + random.nextInt(5);
       }
}


Разберем код выше.

Выкидываем палочки. Для дропа своих итемсов - пишите mod_gcc.nameItem.shiftedIndex - nameItem - название предмета.
Для дропа блоков - названиеблока.blockID.
Для дропа СВОИХ блоков или того же блока (по типу руды) - mod_gcc.названиеблока.blockID.
Code
return Item.stick.shiftedIndex;


Число 2 - минимальное значение дропа. Число 5 - максимальное значение. Значит игра будет рандомно давать вам от 2 до 5 палок с блока.
Code
return 2 + random.nextInt(5);


Проверяем.



Вот и все. Пробуйте!

Глава 7. Создание нового инструмента (на основе стандартных материалов).

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

Добавим к пабликам строку:
Code
public static final Item venik = new ItemSword(2002, EnumToolMaterial.EMERALD).setItemName("venik");


Разберем.

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


ID.
Code
2002


Материал инструмента.
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


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

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

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

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


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

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


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

Если хотите чтобы ваш блок разрушался только вашей киркой - ставите уровень 4 в свойстве.
Затем дописываем в ItemPickaxe (или что у вас там) новую строку по типу:
Code
if(block == mod_gcc.newblock)
           {
               return toolMaterial.getHarvestLevel() == 4;
           }


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


ICQ: 422190728,
E-Mail: funnyalien@yandex.ru,
Jabber: funnyalien@jabber.ru,
Steam: funnyalienvalentine,
Twitter: MrFunnyAlien,
Skype: happyconsole,
ВКонтакте: vk.com/twinemen,
Мобильный: +79199212414.


Сообщение отредактировал Eye - Среда, 24 Августа 2011, 06:57
zahar998899Дата: Суббота, 12 Ноября 2011, 06:52 | Сообщение # 2
почетный гость
Сейчас нет на сайте
а как возможно убрать инструмент?


Minecraft Realistiks
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг