В этой статье описывается создание модификаций на основе Minecraft Forge с использованием Eclipse для версий Minecraft с 1.12.
Установка Forge Gradle
Для установки перейдите на официальный сайт Forge и скачайте версию с пометкой MDK. Из загруженного архива извлеките папку gradle и файл build.gradle в папку с названием вашей модификации, остальные файлы сохранены для совместимости и попросту не нужны. Далее импортируйте в Eclipse Gradle проект указав на нашу папку. Затем в колонке Gradle tasks поочерёдно выполните setupDecompWorkspace из набора forgegradle и eclipse из набора ide. Теперь достаточно обновить проект и удалить два файла с расширением .launch, так как они создаются для совместимости, что нам не к чему. Для настройки папок ресурсов создайте в корне проекта папку src, в ней main, а в ней две папки: java и resources. Далее выделите две последние папки и нажмите в контекстном меню Build path > Use as sourse folder.
Примечание! Для установки потребуется компьютер с минимальным объёмом ОЗУ от 6Гб! Если у вас недостаточно ОЗУ, добавьте необходимый объём из файла подкачки, но такой метод работает лишь на 64-битных системах.
Создание модификации
build.gradle
Это файл, который определяет свойства нашей модификации как проекта и его нужно немного подправить:
buildscript { repositories { jcenter() maven { url = "http://files.minecraftforge.net/maven" } } dependencies { classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT' } } apply plugin: 'net.minecraftforge.gradle.forge' version = "версия" group = "домен.автор.идентификатор" archivesBaseName = "идентификатор" sourceCompatibility = targetCompatibility = '1.8' compileJava { sourceCompatibility = targetCompatibility = '1.8' } minecraft { version = "1.12.2-14.23.5.2768" runDir = "run" mappings = "snapshot_20171003" } dependencies { } processResources { inputs.property "Версия модификации", project.version inputs.property "Версия Minecraft", project.minecraft.version from(sourceSets.main.resources.srcDirs) { include 'mcmod.info' expand 'version':project.version, 'mcversion':project.minecraft.version } from(sourceSets.main.resources.srcDirs) { exclude 'mcmod.info' } } runClient { args = ["--username=Автор"] jvmArgs "-Xmx1G", "-XX:+UnlockExperimentalVMOptions", "-XX:+UseG1GC", "-XX:G1NewSizePercent=20", "-XX:G1ReservePercent=20", "-XX:MaxGCPauseMillis=50", "-XX:G1HeapRegionSize=32M" } runServer { jvmArgs "-Xmx1G", "-XX:+UnlockExperimentalVMOptions", "-XX:+UseG1GC", "-XX:G1NewSizePercent=20", "-XX:G1ReservePercent=20", "-XX:MaxGCPauseMillis=50", "-XX:G1HeapRegionSize=32M" }
pack.mcmeta
Этот файл нужно создать в папке ресурсов и нужен для корректной работы локализации. Заполнять его нужно следующим образом:
{ "pack": { "pack_format": 3, "description": "любой текст, нигде не отображается" } }
mcmod.info
Этот файл содержит информацию о модификации и заполняется следующим образом:
[ { "modid": "Идентификатор модификации", "name": "Название", "description": "Описание", "version": "${version}", "mcversion": "${mcversion}", "logoFile": "Путь к логотипу", "url": "Сайт модификации", "updateJSON": "Ссылка на файл с информацией о обновлениях", "authorList": ["Автор"], "credits": "Благодарности кому либо" } ]
Класс модификации
Cоздайте пакет, который указали родительским в build.gradle и в нём класс модификации. Заполните следующим образом:
@Mod(modid = "идентификатор", name = "название", version = "версия", useMetadata = true, acceptedMinecraftVersions = "[на каких версиях Minecraft модификация запустится]", modLanguage = "язык программирования, на котором написана модификация", updateJSON = "ссылка на файл с версиями")
public class IndustryExpansion {
@Instance
public static ИмяФайлаМода instance;
@EventHandler
public void preInit(FMLPreInitializationEvent event) {
}
@EventHandler
public void init(FMLInitializationEvent event) {
}
@EventHandler
public void postInit(FMLPostInitializationEvent event) {
}
}
Блок
Класс блока
Для создания блока создайте пакет домен.автор.мод.blocks
, а в нём класс TileНазваниеБлока
и заполните его следующим образом:
public class TileИмяБлока extends Block {
public BlockBestStone() {
super(Material.Материал); //Отвечает за звук разрушения, звук ходьбы по блоку и его общие свойства такие как возможность добыть рукой
this.setCreativeTab(CreativeTabs.Вкладка); //Устанавливает вкладку в творческом режиме
this.setMaxStackSize(количество в стопке);
this.setHardness(время_добычи); //Например 2.0F
this.setResistance(взрывоустойчивость); //Например 15.0F
this.setHarvestLevel("инструмент", уровень);
this.setRegistryName("регистрируемое_имя"); //На него регистрируется локализация и текстура а также в команде /give
this.setUnlocalizedName("ключ_локализации"); //Используется в файлах локализации
}
}
Примечание регистрируемое имя и ключ локализации указывать только в нижнем регистре, используя при надобности нижнее подчёркивание!
Модель
Чтобы блок корректно отображался нужна модель. Для блоков модель подгружается через состояние блока, blockstate
. Создадим пакет assets.мод.blockstates
и в нём файл регистрируемое_имя.json
и заполним его данным образом:
{
"variants": {
"normal": { "model": "мод:регистрируемое_имя" }
}
}
Теперь подключим модельки. Для этого в пакете assets.мод.models.block
создайте файл регистрируемое_имя.json
со следующим содержимым:
{
"parent": "block/cube_all",
"textures": {
"all": "мод:blocks/регистрируемое имя"
}
}
Эта модель для правильного отображения блока поставленного в мире. Для блока в инвентаре нужна вторая модель по адресу assets.мод.models.item
с таким же именем как и у предыдущей, только немного другое содержание:
{
"parent": "мод:block/регистрируемое_имя"
}
Важно Все ресурсы создавайте в папке ресурсов (resources)!
Регистрация
Наш блок имеет текстуры и свойства, но его нужно зарегистрировать в игре. Создадим в пакете домен.автор.мод.init
класс BlocksInit
:
public static Block ВАШ_БЛОК = new BlockИмяБлока();
public static void registerBlocks() {
setRegister(ВАШ_БЛОК);
}
@SideOnly(Side.CLIENT)
public static void registerBlocksRender() {
setRender(ВАШ_БЛОК);
}
private static void setRegister(Block block) {
ForgeRegistries.BLOCKS.register(block);
ForgeRegistries.ITEMS.register(new ItemBlock(block).setRegistryName(block.getRegistryName()));
}
@SideOnly(Side.CLIENT)
private static void setRender(Block block) {
Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(Item.getItemFromBlock(block), 0, new ModelResourceLocation(block.getRegistryName(), "inventory"));
}
Теперь в главном классе в методе preInit
добавьте инструкцию BlocksInit.registerBlocks
а в методе init
BlocksInit.registerBlocksRender
.