Структура мода#
Fabric использует автоматический сборщик Gradle, поэтому нам стоит придерживаться определенной структуры папок:
└── src
└── main
├── java
└── resources
В java
хранится весь Ваш исходный код. В resources
хранятся текстуры, модели, звуки, рецепты и прочее.
fabric.mod.json#
Fabric использует файл fabric.mod.json
для обнаружения и загрузки Вашего мода. Он должен обязательно находится по пути src/main/resources
.
Файл определяет данные Вашего мода: ModId, название, зависимости, точки входа, Mixins, авторов и так далее.
Примерный fabric.mod.json
выглядит так:
{
"schemaVersion": 1,
"id": "fabrictut",
"version": "1.0-SNAPSHOT",
"name": "FabricTutorial",
"description": "My awesome mode!",
"authors": [
"jjigem"
],
"contact": {},
"license": "MIT",
"icon": "assets/fabrictut/icon.png",
"environment": "*",
"entrypoints": {
"main": [
"ru.mcmodding.fabrictut.FabricTutorial"
]
},
"mixins": [
"fabrictut.mixins.json"
],
"depends": {
"fabricloader": ">=0.10.8",
"fabric": "*",
"minecraft": "1.16.3"
}
}
Параметры name
, description
и authors
могут содержать коды цветового форматирования.
Параметр | Описание | Обязательный? | Пример |
---|---|---|---|
schemaVersion | Обозначает версию формата json-файла Тип: число |
Нет (0 если не указано) | "schemaVersion": 1 |
id | Обозначает идентификатор мода (MOD_ID) Тип: строка |
Да | "id": "myawesomemod" |
version | Версия Вашего мода Тип: строка |
Да | "version": "1.0-SNAPSHOT" |
name | Имя Вашего мода Тип: строка |
Нет | "name": "More Food" |
description | Описание Вашего мода Тип: строка |
Нет | "description": "Супер мод на еду из медных слитков" |
authors | Авторы мода Тип: массив строк или объектов Person |
Нет | "authors": ["jjigem", "Notch"] |
contributors | Внесшие вклад в мод Тип: массив строк или объектов Person |
Нет | "contributors": ["Mumfey"] |
license | Лицензия для Вашего мода Тип: строка |
Нет | "license": "MIT" |
icon | Путь к иконке для Вашего мода. Иконка должна быть в формате PNG. Тип: строка |
Нет | "icon": "assets/myawesomemod/icon.png" |
depends | Зависимости мода Тип: массив пар строка-строка (ID - Версия) |
Нет | "depends": |
recommends | Рекомендации для мода. То же, что и зависимости, но не остановят игру, а покажут предупреждение Тип: массив пар строка-строка (ID - Версия) |
Нет | "recommends:" |
conflicts | Конфликты модификаций. При запуске Вашего мода с конфликтным будет предупреждение о несовместимости Тип: массив пар строка-строка (ID - Версия) |
Нет | "conflicts": |
breaks | Конфликты модификаций, которые не дадут запустить игру. Тип: массив пар строка-строка (ID - Версия) |
Нет | "breaks": |
entrypoints | Точки входа для мода | Да | "entrypoints": |
environment | Игровое окружение | Да | "environment": "*" |
mixins | Файлы Mixins для мода Тип: массив строк |
Нет | "mixins": ["modid.mixins.json"] |
accessWidener | Файл accessWidener для мода. О нем подробнее позже Тип: строка |
Нет | "accessWidener": "modid.accesswidener" |
Это далеко не все параметры, а лишь основные из них.
Главный класс мода#
Мы знаем как правильно выглядит файл fabric.mod.json
, создали его и заполнили, как нам нужно, но мод все еще не будет инициализирован.
Точки входа#
Fabric использует точки входа для разделения клиента и сервера.
Допустимые точки входа: client
, server
, main
.
main
используется для инициализации вещей, которые могут происходить как на клиенте, так и на сервере, например, регистрация предметов и существ.
client
используется для всего того, что не может происходить на сервере, например, регистрация рендера существ. client
ни за что не будет использован на сервере.
server
используется для сервера, и не будет использоваться на клиенте.
Вы наверное спросите, зачем нужен server
, если можно использовать main
? Дело в том, что server
используется для выделенного (Dedicated) сервера, а не для встроенного (Integrated).
Итак, как создать точку входа: создаем класс в пакете нашего мода, реализуем нужный интерфейс и переопределяем метод.
Интерфейс | Метод | Сторона |
---|---|---|
ModInitializer | onInitialize() | Клиент-сервер |
ClientModInitializer | onInitializeClient() | Клиент |
DedicatedServerModInitializer | onInitializeServer() | Сервер |
Обычно моды содержат либо реализацию ModInitializer
и ClientModInitializer
, либо только ModInitializer
.
Для начала мы сделаем самый простой мод, реализовав ModInitializer
. В отличие от Forge, нам не нужны никакие дополнительные аннотации вроде "@Mod", достаточно лишь указать, что мы реализуем интерфейс.
Создаем класс нашего мода по пути наш_домен/никнейм/ID_мода
, например ru/mcmodding/fabrictut
. Конечно, можно использовать абсолютно любой путь, но это не очень правильно.
Назовем класс FabricTutorial
и укажем, что мы реализуем интерфейс ModInitializer
. Затем нам нужно переопределить метод onInitialize()
, иначе будет ошибка.
В итоге у нас получится такой класс:
package ru.mcmodding.fabrictut;
import net.fabricmc.api.ModInitializer;
public class FabricTutorial implements ModInitializer {
@Override
public void onInitialize() {
}
}
Структура файлов при этом будет выглядеть так:
└── src
└── main
├── java
│ └── ru
│ └── mcmodding
│ └── fabrictut
│ └── FaricTutorial.java
└── resources
└── fabric.mod.json
Не забывайте, что указанные тут имена классов и пакетов - всего лишь пример для урока.