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

В этой статье описывается создание модификаций на основе Minecraft Forge с использованием Eclipse для версий с 1.10.

Подготовка среды

cd <путь к папке> ./gradlew setupDecompWorkspace eclipse --refresh-dependencies 

Уроки

Новая модификация

В левой части экрана располагается меню Package Explorer (если его там нет, в верхнем меню выберите Window/Show View/Package Explorer), в котором находится папка MDKExample. В этой папке присутствуют две основных папки:

Щёлкните ПКМ по папке src/main/java и выберите New/Package. Укажите название каталога в таком формате:

<домен>.<автор модификации>.<название модификации> 

В качестве домена можно использовать любое доменное имя (com, net, ru и т. д.). Например, если ваш никнейм — SomeGuy, а название модификации — SampleMod, полное имя каталога может быть таким:

com.someguy.samplemod 

Это имя будет использоваться в дальнейших уроках.

Создание классов

После создания каталога щёлкните по нему ПКМ и выберите New/Class. Этот класс будет основным. Для удобства назовите его SampleMod. В теле класса (после его названия и фигурной скобки) напишите следующий код:

public static final String MODID = "samplemod"; public static final String VERSION = "1.0"; 

Над названием класса добавьте строку:

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

Обратите внимание, что маркер @Mod выделен красным цветом. Это значит, что для него отсутствует библиотека, в которой он объявлен. Чтобы это исправить, наведите на него курсор и выберите Import 'Mod' (net.minecraftforge.fml.common):

Forge 1.10 Import mod.png

Ещё раз щёлкните ПКМ по каталогу и выберите New/Package. Создайте каталог com.someguy.samplemod.proxy. В новом каталоге создайте два класса — ClientProxy и ServerProxy.

Forge 1.10 Proxy.png

Дважды щёлкните по классу ServerProxy и создайте следующие функции в теле класса:

public void preInit (FMLPreInitializationEvent E) { } public void init (FMLInitializationEvent E) { } public void postInit (FMLPostInitializationEvent E) { } 

Если названия типов в скобках выделены красным цветом, по аналогии с предыдущим случаем наводите курсор и нажимайте Import во всех местах.
Теперь перейдите к классу ClientProxy и унаследуйте его от ServerProxy:

public class ClientProxy extends ServerProxy 

Добавьте те же самые функции с маркером @Override:

@Override public void preInit (FMLPreInitializationEvent E) { } @Override public void init (FMLInitializationEvent E) { } @Override public void postInit (FMLPostInitializationEvent E) { } 

Снова перейдите к классу SampleMod и напишите в теле класса:

@SidedProxy (clientSide = "com.someguy.samplemod.proxy.ClientProxy", serverSide = "com.someguy.samplemod.proxy.ServerProxy") public static ServerProxy proxy; 

Если ваша модификация имеет иное название, напишите его вместо samplemod в обоих местах.
Добавьте уже знакомые вам функции в таком виде:

@EventHandler public void preInit (FMLPreInitializationEvent E) { proxy.preInit (E); } @EventHandler public void init (FMLInitializationEvent E) { proxy.init (E); } @EventHandler public void postInit (FMLPostInitializationEvent E) { proxy.postInit (E); } 

Мета-информация

Основа для вашей модификации готова. Перейдите в папку src/main/java и откройте файл mcmod.info (при его отсутствии - создайте: ПКМ, пункт New/File). Заполните этот файл следующим образом:

[ { "modid": "samplemod", "name": "Sample Mod", "description": "Sample Mod description", "version": "1.0", "mcversion": "", "url": "", "updateUrl": "", "authorList": ["SomeGuy"], "credits": "Sample Mod credits", "logoFile": "", "screenshots": [], "dependencies": [] } ] 

После этого ваша модификация будет отображаться в списке.
Для запуска игрового клиента нажмите зелёную кнопку на верхней панели (Forge 1.10 Green button.png). После загрузки вы можете найти модификацию в списке Mods.

Вкладка в творческом режиме

Щёлкните ПКМ по каталогу com.someguy.samplemod и создайте каталог com.someguy.samplemod.tab. Добавьте в него класс с названием SampleModTab и унаследуйте его от CreativeTabs:

public class SampleModTab extends CreativeTabs 

Название класса стало подчёркнуто красным цветом. Наведите на него курсор и нажмите Add constructor 'SampleModTab(int, String)' и Add unimplemented methods.
Добавьте функцию preInit:

public static void preInit ( ) { } 

Перейдите к классу SampleMod и в самом начале функции preInit напишите следующее:

SampleModTab.preInit ( ); 

Теперь вы можете добавлять новые вкладки в творческом режиме.

Простая вкладка

Снова выберите класс SampleModTab и напишите эту строку в начале:

public static SampleModTab SAMPLE_MOD; 

Дополните функцию preInit данной строкой:

SAMPLE_MOD = new SampleModTab (getNextID ( ), "sample_mod"); 

Функция getNextID ( ) автоматически определяет свободный ID вкладки, представленной переменной SAMPLE_MOD.

Обратите внимание на функцию getTabIconItem. Данная функция определяет, какой предмет или блок отображается на вашей вкладке в творческом режиме. Если эта функция выглядит так:

public Item getTabIconItem ( ) { return null; } 

Вы можете указать в качестве предмета, например, яблоко, таким образом:

public Item getTabIconItem ( ) { return Items.APPLE; } 

Если же вместо Item перед названием указано ItemStack, это делается несколько иначе:

public ItemStack getTabIconItem ( ) { return new ItemStack (Items.APPLE); } 

Создание нескольких вкладок

Если вам необходимо более одной вкладки, добавьте их по аналогии с первой, инициализируя в функции preInit:

SAMPLE_MOD = new SampleModTab (getNextID ( ), "sample_mod"); SAMPLE_MOD_NEW = new SampleModTab (getNextID ( ), "sample_mod_new"); 

Во вкладке SAMPLE_MOD_NEW, как и в SAMPLE_MOD, будет отображаться тот предмет, который указан в функции getTabIconItem. Ниже приведён код этой вкладки с нестандартным предметом (в данном случае — с блоком железа):

SAMPLE_MOD_NEW = new SampleModTab (getNextID ( ), "sample_mod_new") { public ItemStack getTabIconItem ( ) { return new ItemStack (Blocks.IRON_BLOCK); } }; 

Оформление

Возможно, вы заметили, что имя вашей вкладки отображается некорректно. В папке src/main/resources создайте каталог assets.samplemod.lang. В этом каталоге вы можете размещать локализации для любого языка, поддерживаемого в текущей версии.

Создайте файл en_us.lang и напишите следующую строку:

itemGroup.sample_mod=Sample Mod 

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

Предмет

Щёлкните ПКМ по каталогу com.someguy.samplemod и создайте каталог com.someguy.samplemod.item. Создайте в этом каталоге класс SampleModItem и добавьте в него несколько методов:

public static void preInit ( ) { addItems ( ); } public static void addItems ( ) { } public static void addRenders ( ) { } public static void addItem (Item item, String name) { GameRegistry.register (item, new ResourceLocation (SampleMod.MODID, name)); } public static void addRender (Item item, String name) { Minecraft.getMinecraft ( ).getRenderItem ( ).getItemModelMesher ( ).register (item, 0, new ModelResourceLocation (SampleMod.MODID + ":" + name, "inventory")); } 

Перейдите к классу SampleMod и добавьте данную строку в функцию preInit:

SampleModItem.preInit ( ); 

В классе ClientProxy добавьте строку в функцию init:

SampleModItem.addRenders ( ); 

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

Простой предмет

Создайте переменную в классе SampleModItem, представляющую предмет, который вы хотите добавить. К примеру, для предмета с названием "Test Item" напишите в начале класса:

public static Item TEST_ITEM; 

В функции preInit перед вызовом функции addItems добавьте следующую строку:

TEST_ITEM = new Item ( ).setUnlocalizedName ("test_item").setCreativeTab (SampleModTab.SAMPLE_MOD); 

Вместо SAMPLE_MOD вы можете установить любую другую вкладку в творческом режиме, обращаясь к ней через SampleModTab или CreativeTabs.
Дополните функцию addItems этой строкой:

addItem (TEST_ITEM, "test_item"); 

Добавьте ещё одну строку в функцию addRenders:

addRender (TEST_ITEM, "test_item"); 

Оформление

Добавьте в файл en_us.lang и другие файлы локализации следующую строку:

item.test_item.name=Test Item 

Кроме того, вашему предмету нужна текстура. В папке src/main/resources создайте каталог assets.samplemod.models.item и добавьте в него файл test_item.json. Скопируйте данный текст в этот файл:

{ "parent": "item/generated", "textures": { "layer0": "samplemod:items/test_item" } } 

В этой же папке создайте каталог assets.samplemod.textures.items и разместите в нём вашу текстуру. Пример текстуры: Forge 1.10 Texture.png.

Блок

Щёлкните ПКМ по каталогу com.someguy.samplemod и создайте каталог com.someguy.samplemod.block. Создайте в этом каталоге класс SampleModBlock и добавьте в него несколько методов:

public static void preInit ( ) { addBlocks ( ); } public static void addBlocks ( ) { } public static void addRenders ( ) { } public static void addBlock (Block block, String name) { GameRegistry.register (block, new ResourceLocation (SampleMod.MODID, name)); GameRegistry.register (new ItemBlock (block), new ResourceLocation (SampleMod.MODID, name)); } public static void addRender (Block block, String name) { Minecraft.getMinecraft ( ).getRenderItem ( ).getItemModelMesher ( ).register (Item.getItemFromBlock (block), 0, new ModelResourceLocation (SampleMod.MODID + ":" + name, "inventory")); } 

Перейдите к классу SampleMod и добавьте данную строку в функцию preInit:

SampleModBlock.preInit ( ); 

В классе ClientProxy добавьте строку в функцию init:

SampleModBlock.addRenders ( ); 

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

Простой блок

Создайте переменную в классе SampleModBlock, представляющую блок, который вы хотите добавить. К примеру, для блока с названием "Test Block" напишите в начале класса:

public static Block TEST_BLOCK; 

В каталоге com.someguy.samplemod.block создайте класс BlockTestBlock и унаследуйте его от класса Block:

public class BlockTestBlock extends Block 

Добавьте конструктор в таком виде:

public BlockTestBlock ( ) { super (Material.ROCK); setUnlocalizedName ("test_block"); setCreativeTab (SampleModTab.SAMPLE_MOD); setHardness (2); setResistance (1); } 

Функция setHardness устанавливает прочность, а setResistance — взрывоустойчивость блока.
Вернитесь к классу SampleModBlock и добавьте строку в функцию preInit перед функцией addBlocks:

TEST_BLOCK = new BlockTestBlock ( ); 

Дополните функцию addBlocks этой строкой:

addBlock (TEST_BLOCK, "test_block"); 

Добавьте ещё одну строку в функцию addRenders:

addRender (TEST_BLOCK, "test_block"); 

Сыпучий блок

Если вам необходимо сделать блок сыпучим, перейдите к его классу и просто унаследуйте его от BlockFalling:

public class BlockTestBlock extends BlockFalling 

При необходимости вы можете изменить звучание блока, делая его схожим с песком или другим материалом. Для этого добавьте в конструктор следующую строку:

setSoundType (SoundType.SAND); 

Оформление

Добавьте в файл en_us.lang и другие файлы локализации следующую строку:

tile.test_block.name=Test Block 

В папке src/main/resources создайте каталог assets.samplemod.models.block и добавьте в него файл test_block.json. Скопируйте данный текст в этот файл:

{ "parent": "block/cube_all", "textures": { "all": "samplemod:blocks/test_block" } } 

В каталоге assets.samplemod.models.item также создайте файл test_block.json следующего содержания:

{ "parent": "samplemod:block/test_block" } 

Создайте каталог assets.samplemod.blockstates и добавьте в него файл с таким же названием. Скопируйте данный текст в этот файл:

{ "variants": { "normal": { "model": "samplemod:test_block" } } } 

В этой же папке создайте каталог assets.samplemod.textures.blocks и разместите в нём вашу текстуру.

Рецепт

Щёлкните ПКМ по каталогу com.someguy.samplemod и создайте каталог com.someguy.samplemod.recipe. Создайте в этом каталоге класс SampleModRecipe:

public static void preInit ( ) { } 

По аналогии с предыдущими классами, добавьте строку в функцию preInit класса SampleMod:

SampleModRecipe.preInit ( ); 

Рецепт крафта

Добавьте в функцию preInit класса SampleModRecipe следующий код:

GameRegistry.addRecipe (new ItemStack (Blocks.STONE, 1), new Object [ ] { " A ", "ABA", " A ", 'A', Blocks.CLAY, 'B', Blocks.BEDROCK }); 

Эта строка добавляет в игру такой рецепт:

Ингредиенты Рецепты крафта
Глиняный блок +
Коренная порода





Каждая буква соответствует указанному блоку или предмету, а в пустых местах ставится пробел. Тип и количество выходного ресурса обозначены в скобках после ItemStack.
Этот код добавляет бесформенный рецепт крафта:

GameRegistry.addShapedRecipe (new ItemStack (Blocks.STONE, 1), new Object [ ] { Blocks.CLAY, Blocks.BEDROCK }); 
Ингредиенты Рецепты крафта
Глиняный блок +
Коренная порода









Компиляция

Откройте папку с Forge, запустите терминал и введите команду gradlew.bat build. По окончанию процесса ваша модификация появится в папке build/libs в скомпилированном виде.

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