Створення модифікацій за допомогою Forge/1.6+

Матеріал з Minecraft Wiki
Перейти до: навігація, пошук

Тут знаходяться інструкції по створенню модифікацій, що працюють для версії 1.6+


Підготовка середовища і налаштування

Даний посібник написано для роботи з середовищем Eclipse під Windows.

Підготовка Forge

Перед початком створення вашої модифікації необхідно отримати вихідні файли Forge, які доступні на сайті https://files.minecraftforge.net/. Оскільки ця стаття присвячена розробці модифікацій під версію 1.6*, То, відповідно, завантажте який-небудь исходник з діапазону версій 1.6.1-1.6.4. Дуже важливо визначити серед них робочі збірки. На це може піти деякий час, але якщо ви дуже кмітливий читач, то ймовірно, вам не складе особливих труднощів ввести в пошуковику запит на подобу «minecraft forge 1.6.4 source download» і завантажити робочі вихідні Forge, вже знайдені за вас іншими людьми.

Після того, як ви отримали придатну для роботи збірку Forge (швидше за все в форматі .zip), розархівуйте її в зручну для вас директорію, але з одним невеликим умовою — в дорозі не повинно міститися прогалин і кирилиці. Таке обмеження з'являється через не проробленою розробниками обробки шляхів... Та й сама така обробка робиться, в основному тільки для краси і невеликого зручності для росіян. :)

Якщо ви все зробили правильно, то тепер ви можете відкрити вікно команд в кореневій директорії розпакувати Forge (або перейти в неї з командного рядка), після чого послідовно ввести 2 простенькі команди:

gradlew setupDecompWorkspace --refresh-dependencies
gradlew eclipse

Перша команда змушує gradlew виконати завдання setupDecompWorkspace, яка (як це можна зрозуміти з назви) почне щось декомпілювати. Але що? Правильно — Minecraft! Саме тому процес виконання цього завдання досить довгий і вам треба буде трохи потерпіти. Це як перевести підручник з квантової механіки з корейського на українську. Не думаю, що ви б впоралися з цим завданням за пару секунд...

Друге завдання, що їх посилають gradlew створює директорію в кореневій папці Forge під назвою «eclipse», яку доведеться вказати як шлях до майбутнього робочого простору в Eclipse. Ця команда необхідна, якщо ви хочете включити підтримку декомпілювати файлів Minecraft в Eclipse.

Якщо з якихось причин у gradlew не вийшло завершити хоча б один з перерахованих вище процесів, то, найімовірніше, вся справа в збірці Forge. Пошукайте іншу, їх досить багато.

На цьому підготовка Forge закінчена.

Налаштування Eclipse

Після установки і запуску Eclipse вам потрібно буде вибрати робоче середовище, в якій будуть міститися як вихідні вашої модифікації, так і вихідні Forge. Вкажіть в поле для введення шлях до папки «eclipse», що знаходиться в кореневій директорії, раніше вами розпакувати Forge.

В ідеальному випадку, після натискання клавіші Enter, перед вами з'явиться ваша майбутня робоча область, в ієрархії якої буде згорнута папка «Minecraft» без будь-яких страшних значків збоку від неї, на кшталт знаку оклику. Це буде означати те, що ви все зробили правильно. Інакше — вся справа або в вас, або в збірці Forge.

Основні уроки

Урок 1. Ваш пакет

Тепер коли ви розібралися з Forge і Eclipse, можна приступати до підготовки вашого мод-пакета.

Відкрийте згорнуту папку Minecraft в Eclipse. У самому її початку буде пакет src/main/java.

Для того, щоб в Java щось запрацювало вам в будь-якому випадку доведеться створити свій клас. Те ж саме і з модифікаціями.

Дозволяє створити пакет в пакеті. Це робиться просто: правою клавішою миші натисніть на вищезгаданий пакет і виберіть зі списку поле «New» або «Створити» (в залежності від вашої локалізації середовища), після чого виберіть з іншого списку пункт «Package» або «Пакет». Все що вам потрібно — ввести назву вашого майбутнього пакету. Ось кілька прикладів:

com.main.nameofyourmod
com.nameofyourmod.main
com.company.nameofyourmod
com.company.nameofyourmod.main

Можете поекспериментувати з іншими назвами.

Після цих нескладних дій вам буде потрібно створити клас вашої модифікації. Повторіть все те ж саме, але замініть src/main/java на назву вашого пакета і замість «Package»/«Пакет» виберіть «Class»/«Клас».

Я рекомендую називати класи з великих літер: NameOfYourMod.class, але це не приципально.

Отже, ваш мод-пакет і основний мод-клас готові! А тепер найцікавіше…

Урок 2. Мод-клас

Отже, ось що ви повинні написати в кінці цього уроку в вашому основному класі:

@Mod(modid = NameOfYourMod.MODID, version = NameOfYourMod.VERSION)
public class NameOfYourMod
{
  public static final string MODID = "nameofyourmod";
  public static final string VERSION = "1.0";

  @EventHandler
  public void init(FMLInitializationEvent event)
  {
    
  }
}

Давайте розберемо цей код.

@Mod(modid = NameOfYourMod.MODID, version = NameOfYourMod.VERSION)

Рядок вище задає параметри вашого майбутнього мод-файлу (зауважте, не класу і не пакета). Цей файл просто необхідний для ідентифікації вашої модифікації Forg’ем.

Якщо на цій сходинці у вас з'явилася помилка, не поспішайте панікувати, це нормально. Все одно код поки ще не робочий.

public class NameOfYourMod {

Цей рядок означає, що ваш головний клас є публічним або, грубо кажучи — загальнодоступним. Тобто ви можете створити в ньому якусь змінну і отримати до неї доступ з іншого класу. Скоро ми поговоримо про це трохи детальніше.

  public static final string MODID = "nameofyourmod";
  public static final string VERSION = "1.0";

Ці два записи задають значення змінним вашого мод-файлу. Думаю тут коментарі зайві.

  @EventHandler
  public void init(FMLInitializationEvent event)
  {
    
  }
}

І нарешті ці останні рядки є кореневими для вашого мод-класу. Поясню лише те, що функція init() — це основна функція в цьому документі.

Отже, після успішного написання коду просто натисніть Ctrl + ⇧ Shift + O і в ваш клас імпортуються всі відсутні пакети, необхідні для коректної компіляції.

Тепер натискайте на зелено-білу іконку «Play» і радійте тому, що у вас не вилетіла гра. 🙂

Якщо з цього уроку у вас залишилися питання, не переживайте! Скоро ми їх все розберемо.

Урок 3. Блок

Тепер, коли у вас є шаблон основного мод-класу ви можете почати творити.

Для початку створіть змінну типу Block перед викликом основної функції init().

public static Block testBlock;

Далі вам потрібно її описати. Це ми зробимо в init().

  testBlock = (new TestBlock(1400, Material.rock)).setUnlocalizedName("testBlock").
    setTextureName(MODID + testBlock.getUnlocalizedName());

Якщо ви все зробили правильно, то ви побачите помилку, яка буде означати відсутність класу TestBlock. Я думаю ви зрозуміли що вам потрібно зробити. 😉

Тепер замініть в створеному класі все на цей невеликий код (нижче я поясню його роботу).

public class TestBlock extends Block 
{
	public TestBlock(int par1, Material material)
	{
		super(par1, material);
		this.setCreativeTab(CreativeTabs.tabBlock);
		this.setHardness(3.5F);
		this.setLightValue(0.75F);
		this.setResistance(500.0F);
	}
}

Спочатку до public class TestBlock додається extends Block. Це означає, що ви збираєтеся додати до Minecraft-блоків свій блок.

Далі ви створюєте конструктор вашого блок-класу. Не питайте навіщо, це вже ООП. 🙂

Ну а тепер ви задаєте властивості блоку. Насправді їх набагато більше. Ви можете їх побачити, просто написавши «this.» В цій же частині коду.

hardness — це параметр, який відповідає за тривалістю руйнування блоку. Наприклад, у кругляка він дорівнює 2.0F, а у обсидіана 50.0F. Тим самим, щоб зламати кругляк рукою вам буде потрібно 10 секунд, а щоб зламати обсидіан знадобиться вже 250 секунд. Правда вам нічого не випаде, що до речі теж можна поправити... але про це в додаткових уроках.

lightValue — це параметр, який відповідає за світіння блоку.

resistance — це параметр, який визначає стійкість до вибухів. Для прикладу, у обсидіану цей параметр дорівнює 2000.0F.

Ну а тепер, мабуть, поверніться в вашу основну функцію init () і дещо допишіть.

   GameRegistry.registerBlock(testBlock, testBlock.getUnlocalizedName()); // тут ми реєструємо блок в грі, щоб Minecraft міг його визначити
   LanguageRegistry.addName(testBlock, "Test Block"); // це назва блоку в грі (спливаючий напис при наведенні курсору на блок) 

І, нарешті, останній штрих — створіть текстуру вашого блоку. Скачайте Paint.NET або який-небудь інший графічний редактор зі зручним редагуванням маленьких зображень (8x8, 16x16) і намалюйте що-небудь.

ВАЖЛИВО: текстура повинна мати формат .png і перебувати по шляху src/main/resources/assets/nameofyourmod/textures/blocks, інакше вона просто не визначається грою і ви побачите чорно-рожевий кубик. 🙂

Пам'ятайте про Ctrl + ⇧ Shift + O.

Тепер запускайте гру і радійте. Ви створили свій ВЛАСНИЙ блок!

Урок 4. Предмет

Ну ось ми і створили блок. Але ж в майнкрафт присутні не тільки блоки, але і предмети. Такі як їжа, інструменти, в загальному все підряд, що зазвичай не можна поставити на землю. Давайте створимо такий предмет. Наприклад інструмент кирку, чому б і ні?

Перейдемо до головного клас мода. До методу Load () відразу після public static Block bestblockever; допишіть

public static Item bestpickaxe;

Тим самим ми створимо змінну типу Item з кодовою назвою кайла.

У методі Load () для зручності відступіть один рядок від того що вже написано, і пишіть туди наступне: (Я відразу напишу все, що потрібно, багато елементів опису предмета збігаються з описом блоку, особливої різниці немає)

bestpickaxe = new BestPickAxe(1001).setUnlocalizedName("bestpickaxe");
GameRegistry.registerItem(bestpickaxe, "bestpickaxe");
LanguageRegistry.instance().addNameForObject(bestpickaxe, "en_US", "God Like Pickaxe");
LanguageRegistry.instance().addNameForObject(bestpickaxe, "ru_RU", "Божья кирка!!!");

Отже, ми створили кайло з ID 1001, зареєстрували в Forge і локалізували назву. Клацнувши помилково створимо клас цього кайла. Клас створений, але Eclipse не знає, що ми хочемо створити їжу або інструмент, тому зробимо цей клас спадкоємцем класу, де написано про інструмент або їжу або що хочете, головне, що про предмет, а не блок. В рядку public class BestPickAxe{ після BestPickAxe допишіть extends ItemPickaxe і імпортуйте цей самий ItemPickaxe. Тепер, не виправляючи з'явилася помилку вставте в тіло це:

public BestPickAxe(int par1) {
super(par1, EnumToolMaterial.EMERALD);
}

Тоді помилка зникне. Рядок super(par1, EnumToolMaterial.EMERALD); говорить про те, що пошле в супер-клас інформацію про те, що кайло має властивості діамантового кайла а також має ID 1001, яка передається через par1 сюди з головного класу. Ну і також допишемо після цього рядка

this.setCreativeTab(CreativeTabs.tabTools);

тим самим додавши кайла в розділ інструменти в Creative.

Майже готово. залишилося тільки текстуру її придумати, давайте модифікуємо текстуру з Minecraft. Зайдіть в папку c Minecraft\versions\1.6.4, там відкрийте jar-файл за допомогою архіватора, в архіві перейдіть в assets\items і там знайдіть якусь текстуру кайла, витягніть на робочий стіл. Файли текстур МОЖНА редагувати звичайним Paint'ом, так як текстура повинна бути подекуди прозорою, якщо ви не хочете звичайно ідеально квадратну кирку. Загалом відредагуйте текстуру як завгодно, головне щоб була 16x16. Назвіть текстуру BestPickAxe.png Тепер створіть в проекті директорію з текстурами предметів. Для цього ПКМ за src -> New -> package а в назві напишіть assets.mybestmod.textures.items і туди мишею з раб. столу перенесіть готову текстуру і натисніть ОК. Тепер скажімо предмету де його текстура.

@Override
public void registerIcons(IconRegister reg){
this.itemIcon = reg.registerIcon("mybestmod:BestPickAxe");
}

Напишіть це в класі BestPickAxe після методу BestPickAxe () (Тобто перед останньою фігурної дужкою). І можна запускати для перевірки.

Власне ось ми і створили першу предмет — інструмент — кайла, яка за властивостями, як алмазна. В цьому доп. ви можете подивитися, як створити інструмент з особливими властивостями.

Урок 5. Крафт

Власне, у нас є блок і предмет. Ми можемо їх тримати в руках, а блок навіть ставити. Але а якщо ми хочемо дістати їх, граючи в режимі Виживання? Тоді блок або предмет можна тільки знайти або скрафтіть. Додати крафт дуже просто, тому урок короткий. Наприклад я хочу скрафтіть блок, поклавши в усі верхні і нижні клітини залізні злитки, в решту бічні — гравій, а в середину — обсидіан, тоді я запишу ось це в тіло методу Load головного класу:

GameRegistry.addRecipe(new ItemStack(BaseMyBestMod.bestblockever, 1), 
new Object[]{ "###", "XYX", "###",
Character.valueOf('X'), Block.gravel, ('#'), Item.ingotIron, ('Y'), Block.obsidian});

Не забудьте нічого імпортувати (Item в net.minecraft.item).

Давайте розберемо, що тут написано: Отже за допомогою GameRegistry ми додаємо новий рецепт, new itemStack значить, що створиться нова стопка з предметом bestblockever який оголошений в класі BaseMyBestMod в кількості однієї штуки (замість 1 можна вписати будь-яке кількістю до 64). А далі вже записана сітка крафта. Як ми пам'ятаємо в верстаті ми бачимо всього 9 клітин, тут перший рядок верстата це «###», другий рядок — це «XYX», ну і остання — «###». Зрозуміліше буде, якщо подивитися ось так:

"###"
"XYX"
"###"

Кожен предмет в крафті позначається своїм особистим знаком (будь-яким). Далі це записано як Character.valueOf('X'), Block.gravel Тобто це означає, что X — це гравій, який є блоком. Відповідно знак # — це злиток заліза (який є предметом, а не блоком), а Y — це блок обсидіану. Якщо потрібно, щоб в осередку крафта нічого не лежало, то замість знака пишеться пробіл (Наприклад "#" означає що посередині буде злиток заліза, а з боків нічого).

Додати рецепт крафта можна не тільки вашому блоку або предмету. Можна вписувати замість BaseMyBestMod.bestblockever або Block.obsidian що завгодно, головне що б після точки була вказана зареєстрована змінна типу Block або Item. А до точки — це просто шлях до цієї змінної.

Якщо хочете створити крафт, який можна зробити в інвентарі, замість «###», «XYX», «###» використовуйте «AA», «BC» відповідно.

Безформний крафт (тобто крафт, в якому можна розташовувати інгредієнти як завгодно) опишіть так:

GameRegistry.addShapelessRecipe(new ItemStack(Block.grass, 4), new Object[] {Block.gravel, Block.gravel, Item.arrow});

Тобто якщо ви покладете в верстак/інвентар 2 блоки гравію і стрілу, то отримаєте 4 блоки Землі, покритої травою.

Власно, усе.

Урок 6. Компіляція

Ну що ж, ми написали мод. Він працює і все ок, але як же грати з ним поза Eclipse? Для цього потрібно його компілювати. Приступимо.

Зайдіть в папку з MCP, у мене ця папка D:\MCModding. У ній запустіть файл recompile.bat Після того, як він завершить роботу запустіть reobf.bat Якщо все вийшло то в папці reobf ви побачите папку Minecraft а в ній папку platon і так далі. Але ось проблема: при компіляції він не бачить текстури та інше не відноситься до коду. Щоб це виправити, зайдіть в MCP\src\minecraft і скопіюйте звідти папку assets в папку MCP\reobf\Minecraft Увага: в папці assets повинні бути тільки ваші папки з назвою модів (якщо їх декілька). Тобто ніякої папки forge бути не повинно. видаліть її. Власне тепер папки assets і platon обведіть і додайте в zip-архів. Тепер мод можна поміщати в папку mods вашого Minecraft.

Вітаю, мод откомпилірован, повністю створений і готовий до застосування.

Додаткові уроки

Дроп певного предмета при руйнуванні блоку

Все дуже просто. В кінець класу створеного вами блоку (перед останньою фігурної дужкою) вставте це:

    @Override
    public int idDropped(int par1, Random par2Random, int par3)
    {
        return Item.diamond.itemID;
    }

Тобто тепер при руйнуванні вашого блоку з нього випаде діамант. Ви можете написати, щоб випадало що завгодно. просто замість return Item.diamond.itemID; напишіть «return Block.» або «return Item.», а після введення вами точки випаде список можливих предметів або блоків.

Якщо хочете, щоб випадав не один предмет, а кілька, просто вставте

	@Override
    public int quantityDropped(Random par1Random)
    {
        return 20;
    }

Тоді при руйнуванні випаде 20 обраних вами предметів або блоків.

Свій матеріал для інструменту

Припустимо ви хочете, щоб ваш інструмент мав властивостей не залізної/діамантової кайла з Minecraft, а власними.

Тоді десь (ви можете де завгодно написати цей рядок, головне, щоб можна було викликати), наприклад в головному класі поза будь-яких методів (тобто можна перед останньою фігурної дужкою), напишіть:

static EnumToolMaterial NEWMAT = EnumHelper.addToolMaterial("NEWMAT", 2, 564, 5.0F, 4.0F, 50);

Не забудьте про імпорт. Давайте розберемося: static означає, що змінна NEWMAT типу EnumToolMaterial доступна з інших класів. Потім прирівнюється значенням, яке і дасть вашій кирці певні властивості. Тепер про аргументи, перерахованих через кому:

  • Назва матеріалу
  • На скільки кайла крута від 0 до 3, тобто які блоки може ламати (1 — еквівалент кам'яної, 3 — діамантової).
  • Максимальна кількість зламаних блоків (у діамантової — 1561, кам'яної — 131).
  • Швидкість видобутку (у золотий — 12, у діамантової — 8, дерев'яної — 2).
  • Втрати, що наноситься істотам (у дерев'яній/золотий — 0, залізної — 2, діамантової — 3).
  • Зачарованість, тобто який шанс хороших чар (у золотий — 22, діамантової — 10, залізної — 14).

Що ж, тепер можна надати якомусь інструменту ці властивості, для цього в інструменті (наприклад в нашому кайлі) змініть super(par1, EnumToolMaterial.EMERALD); на super(par1, BaseMyBestMod.NEWMAT); В такому випадку ви відправляєте в супер-клас інструменту інформацію про те, що властивості описані змінної NEWMAT типу EnumToolMaterial, яка описана в класі BaseMyBestMod (або будь-який інший клас, де вона написана).

Ось і все, властивості інструмента змінені.

Локалізація назв в грі

Припустимо ви хочете, щоб, коли вибираєте українську мову, показувалися назви предметів російською, а якщо англійська, то англійські назви.

Це зробити досить легко. Ви створюєте пакет mybestmod.assets.mybestmod.lang, по ньому натискаєте ПКМ, вибираєте New -> File. Називаєте його ru_RU.lang, таку ж операцію робите з файлами en_US.lang і en_UK.lang. В файлі en_US напишіть tile.mybestblockever.name=My best block ever! Це код відповідає за назву англійською мовою. Розберемо: tile. це позначення блоку, для предмета буде item., а для вкладки в Творчості. itemGroup., далі назва блоку/предмета/вкладки mybestblockever. і name=, що позначає ім'я. Після одно пишіть ім'я. У цьому файлі можна писати багато імен, головне в стовпчик! У файлі en_UK має бути написано те ж саме що і в en_US, так як обидва ці файлу позначають англійську мову. У українському файлі відповідно будуть українські назви.