- Версия(и) Minecraft
- 1.14+
С версии Forge для 1.14 появились новый способ регистрации блоков, предметов, сущностей и в вообщем все
Также эквивалент этих классов есть и на Architectury API. Для создания мода на Forge и Fabric без копирования кода.
Раньше большинство моддеров (знаю из их исходников) делали регистрацию с помощью ивента вот так:
С версии 1.14 делать так тоже можно, но вот новый способ.
Появился класс
И также надо созданный регистр
Чтобы получить этот зарегистрированный предмет, надо воспользоваться методом
Также пример одновременной регистрации блока и предмета на этот блок:
Данный способ, в отличии от регистрации с помощью ивентов, имеет следующие преимущества:
Ну вот и всё, конец туториала, надеюсь что Вы узнали что-то новое.
ForgeRegistryEntry-объекты, которые можно вообще зарегистрировать.Также эквивалент этих классов есть и на Architectury API. Для создания мода на Forge и Fabric без копирования кода.
Раньше большинство моддеров (знаю из их исходников) делали регистрацию с помощью ивента вот так:
Пример кода использования ивента для регистрации:
@SubscribeEvent
public static void registerBlocks(RegistryEvent.Register<Block> event) {
event.getRegistry().registerAll(...);
}
Появился класс
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) вместо обычной переменной, - всё работает в статике - не надо создавать дополнительные методы и т.п.,
- не надо думать о порядке регистрации (например, после регистрации блоков, потом идёт регистрация предметов), что снижает шанс ошибок.
Ну вот и всё, конец туториала, надеюсь что Вы узнали что-то новое.