Регистрация в новых версиях 1.14+ (Forge, NeoForge, Architectury API)

Регистрация в новых версиях 1.14+ (Forge, NeoForge, Architectury API)

Версия(и) Minecraft
1.14+
С версии Forge для 1.14 появились новый способ регистрации блоков, предметов, сущностей и в вообщем все ForgeRegistryEntry-объекты, которые можно вообще зарегистрировать.
Также эквивалент этих классов есть и на Architectury API. Для создания мода на Forge и Fabric без копирования кода.

Раньше большинство моддеров (знаю из их исходников) делали регистрацию с помощью ивента вот так:
Пример кода использования ивента для регистрации:
@SubscribeEvent
public static void registerBlocks(RegistryEvent.Register<Block> event) {
    event.getRegistry().registerAll(...);
}
С версии 1.14 делать так тоже можно, но вот новый способ.

Появился класс DeferredRegister, с помощью которого можно регистрировать указанный тип объектов. При регистрации возвращает объект типа RegistryObject<?>, который будет хранить в себе этот объект регистрации. Преимущества этого метода в том, что не надо больше указывать, например, предметам его registryName, он указывается автоматически в методе register. Вот пример:
Пример кода новой регистрации:
@Mod(MyMod.MODID)
public class MyMod {
    public static final String MODID = "mymod";

    /* Forge - до 1.16 */
    private static final DeferredRegister<Item> ITEMS = new DeferredRegister(ForgeRegistries.ITEMS, MODID);
    /* Forge - после и 1.16 */
    public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MODID);
    /* Architectury API */
    public static final DeferredRegister<Item> ITEMS = DeferredRegister.create(MODID, Registries.ITEMS);
 
    public static final RegistryObject<Item> MY_ITEM = ITEMS.register("my_item", () -> new Item(new Item.Properties()));

    public MyMod() {

    }
}
И также надо созданный регистр ITEMS зарегистрировать.
Регистрация регистрации:
public MyMod() {
    /* Forge и NeoForge */
    IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus();
    ITEMS.register(bus);

    /* Architectury API */
    ITEMS.register();
}
Чтобы получить этот зарегистрированный предмет, надо воспользоваться методом get у MY_ITEM.

Также пример одновременной регистрации блока и предмета на этот блок:
Java:
public static final RegistrySupplier<Block> MY_BLOCK = registerBlock("my_block", () -> new Block());

public static RegistrySupplier<Block> registerBlock(String id, Supplier<Block> block) {
    RegistrySupplier<Block> registeredBlock = BLOCKS.register(id, block);
    ITEMS.register(id, () -> new BlockItem(registeredBlock.get(), new Item.Properties()));
    return registeredBlock;
}

Данный способ, в отличии от регистрации с помощью ивентов, имеет следующие преимущества:
  • не надо вызывать метод setRegistryName у самого объекта,
  • не надо вписывать эту же переменную в ивент, чтобы он зарегистрировался,
  • иногда полезно использовать Supplier(когда есть метод get) вместо обычной переменной,
  • всё работает в статике - не надо создавать дополнительные методы и т.п.,
  • не надо думать о порядке регистрации (например, после регистрации блоков, потом идёт регистрация предметов), что снижает шанс ошибок.

Ну вот и всё, конец туториала, надеюсь что Вы узнали что-то новое.
Автор
MaximPixel
Просмотры
2,248
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок

Другие ресурсы пользователя MaximPixel

Последние обновления

  1. Добавил информацию о NeoForge и Architectury API

    Добавил информацию о NeoForge и Architectury API
Назад
Сверху