- Версия(и) Minecraft
- 1.14+
С версии 1.14 (возможно и раньше, но по справке Forge именно с этой версии) появились новый способ регистрации блоков, предметов, сущностей и в вообщем все
Раньше большинство моддеров (знаю из их исходников) делали регистрацию с помощью ивента вот так:
С версии 1.14 делать так тоже можно, но вот новый способ.
Появился класс
И также надо созданный регистр
Чтобы получить этот зарегистрированный предмет, надо воспользоваться методом
Данный способ, в отличии от регистрации с помощью ивентов, имеет следующие преимущества:
Ну вот и всё, конец туториала, надеюсь что Вы узнали что-то новое.
ForgeRegistryEntry
-объекты, которые можно вообще зарегистрировать.Раньше большинство моддеров (знаю из их исходников) делали регистрацию с помощью ивента вот так:
Пример кода использования ивента для регистрации:
@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";
/* До 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
) вместо обычной переменной, - всё работает в статике - не надо создавать дополнительные методы и т.п.,
- не надо думать о порядке регистрации (например, после регистрации блоков, потом идёт регистрация предметов), что снижает шанс ошибок.
Ну вот и всё, конец туториала, надеюсь что Вы узнали что-то новое.