Перейти к содержанию

Структура мода#

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": {"minecraft": "1.16.4"} | | recommends | Рекомендации для мода. То же, что и зависимости, но не остановят игру, а покажут предупреждение
Тип: массив пар строка-строка (ID - Версия) | Нет | "recommends:" {"mycoollib": "0.1.4"} | | conflicts | Конфликты модификаций. При запуске Вашего мода с конфликтным будет предупреждение о несовместимости
Тип: массив пар строка-строка (ID - Версия) | Нет | "conflicts": {"conflictmod": ""} | | breaks | Конфликты модификаций, которые не дадут запустить игру.
Тип: массив пар строка-строка (ID - Версия) | Нет | "breaks": {"somethingelse": "
"} | | entrypoints | Точки входа для мода | Да | "entrypoints": {"client": ["ru.author.modid"]} | | 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
Не забывайте, что указанные тут имена классов и пакетов - всего лишь пример для туториала.