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

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

В этой статье описывается создание модификаций на основе 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.