В этой статье описывается создание модификаций на основе Minecraft Forge с использованием Eclipse для версий с 1.10.
gradlew.bat setupDecompWorkspace eclipse
cd <путь к папке> ./gradlew setupDecompWorkspace eclipse --refresh-dependencies
В левой части экрана располагается меню Package Explorer (если его там нет, в верхнем меню выберите Window/Show View/Package Explorer), в котором находится папка MDKExample. В этой папке присутствуют две основных папки:
src/main/java
— папка с кодом модификации.scr/main/resources
— папка для файлов ресурсов (текстуры, звуки, модели и JSON-файлы).Щёлкните ПКМ по папке 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)
:
Ещё раз щёлкните ПКМ по каталогу и выберите New/Package. Создайте каталог com.someguy.samplemod.proxy
. В новом каталоге создайте два класса — ClientProxy
и ServerProxy
.
Дважды щёлкните по классу 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": [] } ]
После этого ваша модификация будет отображаться в списке.
Для запуска игрового клиента нажмите зелёную кнопку на верхней панели (). После загрузки вы можете найти модификацию в списке 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
и разместите в нём вашу текстуру. Пример текстуры: .
Щёлкните ПКМ по каталогу 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 в скомпилированном виде.