Основы структуры и жизненного цикла мода Forge

published on 08 June 2024

Моды Forge позволяют расширить возможности игры Minecraft. Это руководство научит вас создавать стабильные и качественные моды, понимая их структуру и жизненный цикл.

Ключевые моменты:

  • Настройка среды разработки: Установите Java Development Kit (JDK), Integrated Development Environment (IDE) и Forge Mod Loader.
  • Структура мода: Организуйте пакеты по функциональности, используйте соглашения об именовании классов и изолируйте клиентский код.
  • Жизненный цикл мода: Обработайте события регистрации, генерации данных, настройки клиента/сервера и взаимодействия между модами.
  • Регистрация объектов: Используйте DeferredRegister, RegistryObject и @ObjectHolder для регистрации блоков, предметов и сущностей.
  • Обработка событий: Создавайте слушатели событий с помощью @EventBusSubscriber и IEventBus#addListener.
  • Межмодульная коммуникация: Отправляйте и получайте сообщения между модами с использованием InterModEnqueueEvent и InterModProcessEvent.

Дополнительные ресурсы:

Требования Описание
Java Язык программирования для модов Forge
Minecraft Игра, для которой создаются моды
Forge mod loader Программа для загрузки и использования модов

Настройка среды разработки

Установка Java Development Kit (JDK)

Для начала работы с модами Forge вам нужно установить Java Development Kit (JDK). JDK - это набор программ, позволяющий создавать приложения на языке Java. Minecraft и Forge mod loader написаны на Java, поэтому JDK обязателен для разработки модов.

Чтобы установить JDK:

1. Перейдите на сайт Oracle и скачайте последнюю версию JDK для вашей операционной системы.

2. Следуйте инструкциям по установке JDK на сайте Oracle.

Настройка Integrated Development Environment (IDE)

После установки JDK вам нужно настроить Integrated Development Environment (IDE). IDE - это программа, в которой разработчики пишут, компилируют и отлаживают код. Популярные IDE для разработки модов Forge - IntelliJ IDEA и Eclipse.

Чтобы настроить IntelliJ IDEA:

1. Скачайте и установите IntelliJ IDEA с официального сайта JetBrains.

2. Создайте новый проект в IntelliJ IDEA и выберите тип проекта "Java".

3. Настройте проект для работы с Forge mod loader.

Получение Forge Mod Loader

Forge Mod Loader

Чтобы начать работу с модами Forge, вам нужно скачать и установить Forge mod loader. Forge mod loader - это программа, позволяющая загружать и использовать моды в Minecraft.

Чтобы скачать Forge mod loader:

1. Перейдите на официальный сайт Forge.

2. Выберите версию mod loader, соответствующую вашей версии Minecraft.

3. Скачайте и установите mod loader, следуя инструкциям на сайте Forge.

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

В этом разделе мы рассмотрим, как организовать и структурировать мод Forge для лучшей поддержки и функциональности.

Организация пакетов

При создании мода Forge рекомендуется использовать уникальное имя верхнего уровня пакета, основанное на домене, который вы владеете. Это поможет избежать конфликтов с другими модами. Например, если ваш домен - example.com, вы можете использовать пакет com.example.modname. Организуйте подпакеты по функциональности или логическим единицам, чтобы упростить навигацию и обслуживание вашего мода.

Именование классов

Для классов рекомендуется использовать последовательные соглашения об именовании, такие как добавление суффикса к имени класса, указывающего на его тип. Например, ItemInit или ModNameMain. Это поможет вам и другим разработчикам легко понять назначение каждого класса.

Код только для клиента

Чтобы изолировать клиентский код, поместите его в отдельный подпакет client. Это поможет вам управлять клиентским кодом отдельно от серверного кода и упростит обслуживание вашего мода.

Вот пример структуры мода:

src/main    - resources/assets/modid/        - lang/            - en_us.json        - models/            - item                - item_name.json        - textures/            - items/                - item_name.png    - java/com/name/modname/        - ModNameMain.java        - init/            - ItemInit.java

В этой структуре:

  • resources/assets/modid/ содержит ресурсы мода, такие как языковые файлы, модели и текстуры.
  • java/com/name/modname/ содержит исходный код Java вашего мода.
    • ModNameMain.java - главный класс мода.
    • init/ItemInit.java - класс для инициализации предметов мода.

Жизненный цикл мода

В этом разделе мы рассмотрим различные этапы жизненного цикла мода и их значение в процессе загрузки.

События регистрации

События регистрации, такие как NewRegistryEvent и RegisterEvent, используются для регистрации объектов в реестрах. Эти события важны для инициализации мода и регистрации его составляющих частей.

Генерация данных

Событие GatherDataEvent играет ключевую роль в регистрации провайдеров данных. Это событие происходит после регистрации объектов и позволяет модам зарегистрировать свои провайдеры данных.

Общая настройка

Событие FMLCommonSetupEvent используется для действий, которые являются общими для клиента и сервера. Это событие происходит после регистрации объектов и провайдеров данных и позволяет модам выполнить общую настройку.

Настройка клиента и сервера

События FMLClientSetupEvent и FMLDedicatedServerSetupEvent используются для инициализации клиента и сервера соответственно. Эти события важны для настройки мода для работы на клиенте или сервере.

Взаимодействие между модами

События InterModEnqueueEvent и InterModProcessEvent используются для отправки и приема сообщений между модами. Эти события важны для обеспечения взаимодействия между модами.

Потокобезопасность и параллелизм

Важно помнить, что процесс загрузки мода происходит параллельно, и поэтому написание потокобезопасного кода является обязательным. Событие ParallelDispatchEvent#enqueueWork позволяет отложить выполнение работы до тех пор, пока она не будет безопасной для выполнения.

sbb-itb-b1cf51d

Регистрация объектов

Регистрация объектов, таких как блоки, предметы и сущности, - важный шаг при создании модов для Forge. Для этого используются два основных способа: DeferredRegister и RegisterEvent.

Использование DeferredRegister

DeferredRegister - рекомендуемый способ регистрации объектов. Он позволяет использовать удобство статической инициализации, избегая связанных с ней проблем. DeferredRegister хранит список поставщиков записей и регистрирует объекты из этих поставщиков во время события RegisterEvent.

Пример регистрации пользовательского блока:

private static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, MODID);
public static final RegistryObject<Block> ROCK_BLOCK = BLOCKS.register("rock", () -> new Block(BlockBehaviour.Properties.of().mapColor(MapColor.STONE)));

public ExampleMod() {
  BLOCKS.register(FMLJavaModLoadingContext.get().getModEventBus());
}

Управление зарегистрированными объектами

Не следует хранить зарегистрированные объекты в полях при их создании и регистрации. Они должны создаваться и регистрироваться заново при каждом вызове события RegisterEvent для соответствующего реестра. Это позволит в будущем динамически загружать и выгружать моды.

Для получения ссылок на зарегистрированные объекты используйте RegistryObject или поле с аннотацией @ObjectHolder.

Использование RegistryObjects

RegistryObject позволяет получить ссылку на зарегистрированный объект после его регистрации. Для создания RegistryObject вызовите RegistryObject#create с ResourceLocation и IForgeRegistry регистрируемого объекта. Сохраните RegistryObject в поле public static final и вызывайте #get при необходимости получить зарегистрированный объект.

Пример использования RegistryObject:

public static final RegistryObject<Item> BOW = RegistryObject.create(new ResourceLocation("minecraft:bow"), ForgeRegistries.ITEMS);

Использование @ObjectHolder

Зарегистрированные объекты из реестров также можно внедрить в поля public static с помощью аннотации @ObjectHolder. Для этого необходимо предоставить достаточно информации для создания ResourceLocation, идентифицирующего конкретный объект в конкретном реестре.

Способ Описание
DeferredRegister Рекомендуемый способ регистрации объектов. Позволяет использовать удобство статической инициализации, избегая связанных с ней проблем.
RegistryObject Позволяет получить ссылку на зарегистрированный объект после его регистрации.
@ObjectHolder Внедряет зарегистрированные объекты из реестров в поля public static.

Обработка событий

События позволяют модам реагировать на различные действия в игре. Есть несколько типов событий:

Типы событий

  • Отменяемые события: другие моды или игра могут отменить эти события. Пример: BlockEvent.HarvestDropsEvent - событие, когда игрок собирает ресурсы из блока.
  • События с результатами: эти события возвращают результат, который может быть изменен другими модами или игрой. Пример: BlockEvent.GetDropsEvent возвращает список предметов, которые должны выпасть из блока.
  • Общие события: эти события не имеют конкретного результата и уведомляют моды о различных событиях в игре. Пример: WorldEvent.LoadEvent происходит при загрузке мира.

Регистрация слушателей событий

Чтобы зарегистрировать слушатель события, создайте класс, который будет слушать событие, и зарегистрируйте его в шине событий. Есть два способа:

  1. С помощью аннотации @EventBusSubscriber:
@EventBusSubscriber
public class EventHandler {
    @SubscribeEvent
    public void onBlockDropItems(BlockEvent.HarvestDropsEvent event) {
        // Обработка события
    }
}
  1. С помощью метода IEventBus#addListener:
public class EventHandler {
    public EventHandler() {
        MinecraftForge.EVENT_BUS.addListener(this);
    }

    @SubscribeEvent
    public void onBlockDropItems(BlockEvent.HarvestDropsEvent event) {
        // Обработка события
    }
}

Приоритеты событий и отмененные события

Приоритеты событий определяют порядок вызова слушателей событий. Слушатели с более высоким приоритетом вызываются раньше.

Отмененные события - это события, которые были отменены другими модами или игрой. Если событие отменено, его слушатели не будут вызваны.

Межмодульная коммуникация

Межмодульная коммуникация - это процесс обмена данными между модами. В Forge есть система InterModComms, которая позволяет модам отправлять и получать сообщения друг от друга.

Отправка сообщений

Чтобы отправить сообщение другому моду, используйте событие InterModEnqueueEvent. Это событие позволяет вам помещать сообщения в очередь, где они будут обработаны другими модами.

@Mod.EventBusSubscriber
public class МодКоммуникация {
    @SubscribeEvent
    public void onInterModEnqueue(InterModEnqueueEvent event) {
        // Создаем сообщение
        IMCMessage сообщение = new IMCMessage("мой_мод", "Привет, мир!");
        // Отправляем сообщение
        event.enqueueIMC(сообщение);
    }
}

Получение сообщений

Чтобы получать сообщения от других модов, используйте событие InterModProcessEvent. Это событие позволяет вам обрабатывать сообщения из очереди.

@Mod.EventBusSubscriber
public class МодКоммуникация {
    @SubscribeEvent
    public void onInterModProcess(InterModProcessEvent event) {
        // Получаем сообщение
        IMCMessage сообщение = event.getMessage();
        // Обрабатываем сообщение
        if (сообщение.getMessage().equals("Привет, мир!")) {
            // Действие при получении сообщения
        }
    }
}

В этом разделе мы рассмотрели основы межмодульной коммуникации в Forge с использованием системы InterModComms. Мы узнали, как отправлять и получать сообщения между модами, используя события InterModEnqueueEvent и InterModProcessEvent.

Заключение

Основные моменты

В этом руководстве мы рассмотрели структуру и жизненный цикл модов Forge. Вы узнали:

  • Как настроить среду разработки для создания модов
  • Как организовать пакеты и классы в вашем моде
  • Как регистрировать объекты, такие как блоки и предметы
  • Как обрабатывать события в игре
  • Как настроить взаимодействие между модами

Дополнительные ресурсы

Для дальнейшего изучения моддинга Minecraft с использованием Forge рекомендуем ознакомиться со следующими ресурсами:

  • Официальная документация Forge
  • Руководства от Shadowfacts
  • Руководства от McJty
  • Пример мода от Cadiboo

Эти ресурсы содержат подробные инструкции и примеры кода, которые помогут вам создавать собственные моды.

Часто задаваемые вопросы

Как зарегистрировать обработчик событий в Forge?

Forge

Чтобы зарегистрировать обработчик событий, используйте MinecraftForge.EVENT_BUS.register() и передайте ему экземпляр вашего класса обработчика. Если вы хотите зарегистрировать обработчик в шине событий конкретного мода, используйте FMLJavaModLoadingContext.

Как создать мод с помощью Forge?

  1. Создайте папку для проекта.
  2. Получите "источник распространения" и скопируйте ключевые файлы в папку проекта.
  3. Импортируйте проект Gradle.
  4. Назначьте JDK и настройте параметры запуска.

Какой язык программирования используют моды Forge?

Моды Forge используют Java. Вам потребуется установить Java 17 Development Kit (JDK) и 64-битную виртуальную машину Java (JVM). Forge рекомендует и официально поддерживает Eclipse Temurin. Убедитесь, что вы используете 64-битную JVM, запустив java -version в терминале.

Related posts

Read more

Built on Unicorn Platform