Регистрация в новых версиях 1.14+

Регистрация в новых версиях 1.14+

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

Раньше большинство моддеров (знаю из их исходников) делали регистрацию с помощью ивента вот так:
Пример кода использования ивента для регистрации:
@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";

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

    public MyMod() {

    }
}
И также надо созданный регистр ITEMS зарегистрировать его в FML шину ивентов. Обязательно в FML шину, так как MinecraftForge.EVENT_BUS не будет работать.
Пример кода регистрации регистра в FML шину:
public MyMod() {
    IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus();

    ITEMS.register(bus);
}
Чтобы получить этот зарегистрированный предмет, надо воспользоваться методом get у MY_ITEM. Иногда, конечно, не удобно, но можно будет ещё использовать ObjectHolder, который позволит из своего специального класса доставать уже зарегистрированные объекты.

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

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

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

Сверху