Создание модификаций с помощью Forge/1.6+

Здесь находятся инструкции по созданию модификаций, работающие для версии 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-файл c помощью архиватора, в архиве перейдите в 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 доступна из других классов. Затем приравнивается значению, которое и даст вашей кирке определенные свойства. Теперь об аргументах, перечисленных через запятую:

Что ж, теперь можно придать какому-нибудь инструменту эти свойства, для этого в инструменте (например в нашей кирке) измените 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, так как оба эти файла обозначают английский язык. В русском файле соответственно будут русские названия.

В данной статье используются материалы из статьи «Создание модификаций с помощью Forge/1.6+» с вики-сайта Minecraft Wiki, расположенного на Фэндоме, и они распространяются согласно лицензии Creative Commons Attribution-NonCommercial-ShareAlike 3.0. Авторы статьи.