Структура мода#
Так как используемое нами Forge API использует автоматический сборщик Gradle, то мы должны придерживаться определенной структуры папок.
└── src
└── main
├── java
└── resources
- В "java" хранится исходный код нашего мода
- В "resources" хранятся все остальные доп. файлы: картинки, звуки, модели и так далее
mods.toml#
В папке "resources/META-INF" располагается файл mods.toml
.
Этот файл определяет метаданные нашего мода: идентификатор, название, авторов, зависимости и так далее.
В файле обязательные поля обозначены как "mandatory" их необходимо заполнить т.к. у них нет значения по умолчанию, что будет вызывать ошибку, остальные поля являются опциональными.
Минимально правильный mods.toml файл должен содержать следующее:
modLoader="javafml"
loaderVersion="[34,)"
[[mods]]
modId="tut"
version="1.16.3-1.0.0"
displayName="Tutorial Mod"
[[dependencies.examplemod]]
modId="forge"
mandatory=true
versionRange="[34,)"
ordering="NONE"
side="BOTH"
[[dependencies.examplemod]]
modId="minecraft"
mandatory=true
versionRange="[1.16.3]"
ordering="NONE"
side="BOTH"
Где modid
— идентификатор мода. Не используйте заглавные буквы, пробелы, подчеркивания и т.д. Только английские буквы
в нижнем регистре.
Параметр name
отвечает за красивое название вашего мода. Тут можно использовать все что угодно. Работать будут и коды
форматирования текста.
Параметр | Описание |
---|---|
modId | Идентификатор мода. |
displayName | Название мода |
description | Описание мода в 1-2 абзаца |
version | Версия мода. Это должны быть просто числа, разделенные точками, в идеале, соответствующие семантическому управлению версиями |
displayURL | Ссылка на сайт мода |
updateJSONURL | Ссылка на JSON файл с данными обновлений мода |
authors | Строка с авторами |
credits | Строка с выражением благодарности кому-то |
logoFile | Путь к логотипу мода |
dependencies | зависимости мода |
Вот пример умеренно заполненного файла:
modLoader="javafml"
loaderVersion="[34,)"
license="All rights reserved"
[[mods]]
modId="tut"
version="1.16.3-1.0.0"
displayName="Tutorial Mod"
logoFile="logo.png"
credits="My fantasy"
authors="Me and that guy in the mirror"
description='''
Bla-bla-bla...
'''
[[dependencies.tut]]
modId="forge"
mandatory=true
versionRange="[34,)"
ordering="NONE"
side="BOTH"
[[dependencies.tut]]
modId="minecraft"
mandatory=true
versionRange="[1.16.3]"
ordering="NONE"
side="BOTH"
Более подробно о настройке этого файла вы можете прочитать в отдельной статье. Рекомендую обязательно выделить время для этого, так как там есть несколько полезных хитростей.
Главный файл мода#
В предыдущем разделе мы изменили файл mods.toml
. Но игра всё ещё не запустится, в чем можно убедиться, запустив
клиент. Вам выдаст ошибку. Для того чтобы все заработало, нам нужно перейти в главный файл мода.
Он располагается в папке "java/com/examplemod/examplemod".
Имя директорий строится так: URL/ваш никнейм/название мода
.
Если у вас есть URL-адрес, связанный с вашим проектом, вы можете использовать его в качестве пакета верхнего уровня.
Например, аккаунт GitHub.com, вы можете использовать com.github в качестве пакета верхнего уровня. При отсутствии домена вполне подойдет использование вашего никнейма, как название пакета верхнего уровня: IgorDejavu.tutorial
.
В моем случае пакет будет называться так: com.IgorDejavu.tutorial
.
Теперь создадим в нем файл Tutorial.java
. Это и будет главным файлом нашего мода.
Для того чтобы Forge понял, что данный файл действительно является главным, мы должны добавить к определению класса
аннотацию @Mod
. Значение аннотации @Mod должно соответствовать идентификатору мода в файле mods.toml
.
В противном случае выведется сообщение о том, что в mods.toml отсутствуют метаданные на modid
. И не позволит вам запуститься.
package com.IgorDejavu.tutorial;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@Mod("tut")
public class Tutorial {
private static final Logger LOGGER = LogManager.getLogger();
public Tutorial () {
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup);
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::doClientStuff);
MinecraftForge.EVENT_BUS.register(this);
}
private void setup(final FMLCommonSetupEvent event) {}
private void doClientStuff(final FMLClientSetupEvent event) {}
}
Итог#
Мы изучили базовую структуру любого мода для Minecraft. Выглядит она следующим образом:
└── src
└── main
├── java
│ └── url
└── никнейм
└── мод
│ └── ФайлМода.java
└── resources
└── META-INF
└── mods.toml