- Версия(и) Minecraft
- 1.10+
Чтобы в игре появились ваши предметы, блоки и т.д, их нужно зарегистрировать.
В старых версиях для регистрации использовался объект GameRegistry, который остается в апи до сих пор.
Однако в новых версиях появился способ регистрации при помощи событий.
Почему это нужно?
Регистрация при помощи GameRegistry описывается в документации forge как не рекомендуемое.
По сравнению с ним RegistryEvent позволяет нам не задумываться о правильном времени для регистрации наших объектов, т.к. forge сам вызывает событие в подходящий момент
Каждому типу объекта(предметам, блокам, звукам...) соответствует свой реестр который будет использован для регистрации и хранения этих объектов
Использование событий
Для начала создадим класс, содержащий обработчики событий.
В версиях 1.10-1.11 события регистрации вызываются до preInit, поэтому мы будем использовать
На момент написания статьи forge позволяет регистрировать при помощи событий следующие классы объектов:
Иногда бывает удобно иметь индекс регистрируемых объектов, чтобы обращаться к ним из любого места
Поля будут заполнены значениями сразу после обработки соответствующего события регистрации.
Собственные реестры регистрации
Например, у нас есть некоторый класс Rune и нам нужно регать его подклассы что-бы как-то дальше с ними работать. И при этом мы хотим, чтобы другие моды тоже имели возможность регать свои руны.
Для этого нам нужно использовать событие
При этом требуется, чтобы класс
Мы можем сами реализовать методы, которые от нас требуют при расширении интерфейса
Теперь мы можем регистрировать руны при помощи обработчика события
Надеюсь, этот ресурс помог вам)
P.S. полные исходники на гитхаб залью чуть позже
В старых версиях для регистрации использовался объект GameRegistry, который остается в апи до сих пор.
Однако в новых версиях появился способ регистрации при помощи событий.
Почему это нужно?
Регистрация при помощи GameRegistry описывается в документации forge как не рекомендуемое.
По сравнению с ним RegistryEvent позволяет нам не задумываться о правильном времени для регистрации наших объектов, т.к. forge сам вызывает событие в подходящий момент
Каждому типу объекта(предметам, блокам, звукам...) соответствует свой реестр который будет использован для регистрации и хранения этих объектов
Использование событий
Для начала создадим класс, содержащий обработчики событий.
В версиях 1.10-1.11 события регистрации вызываются до preInit, поэтому мы будем использовать
@Mod.EventBusSubscriber
Java:
@Mod.EventBusSubscriber(modid = "<modid>")
public class Registration{
@SubscribeEvent
public static void registerBlocks(RegistryEvent.Register<Block> event) {//Чтобы зарегистрировать объекты определенного типа мы должны уточнить полиморфный тип события
event.getRegistry().registerAll(block1, block2, ...);
}
}
Block
, Item
, Potion
, PotionType
, Biome
, SoundEvent
, Enchantment
, IRecipe
, VillagerProfession
, EntityEntry
Иногда бывает удобно иметь индекс регистрируемых объектов, чтобы обращаться к ним из любого места
Java:
@ObjectHolder("<modid>") // пространство имен, используется если явно не указано другое
class ItemsAndBlocks {
public static final Block our_block; //Блок с регистрационным именем "<modid>:our_block"
@ObjectHolder("our_item")
public static final Item ourItem; //Предмет с регистрационным именем "<modid>:our_item"
@ObjectHolder("minecraft:diamond")
public static final Item diamond; //Предмет с регистрационным именем "minecraft:diamond"
}
Собственные реестры регистрации
Например, у нас есть некоторый класс Rune и нам нужно регать его подклассы что-бы как-то дальше с ними работать. И при этом мы хотим, чтобы другие моды тоже имели возможность регать свои руны.
Для этого нам нужно использовать событие
NewRegistry
и вспомогательный класс RegistryBuilder
Java:
@SubscribeEvent
public void onRegistryNewRegistry(RegistryEvent.NewRegistry event) {
new RegistryBuilder<Rune>()
.setName(new ResourceLocation( "<modid>", "rune"))
.setType(Rune.class)
.add((IForgeRegistry.AddCallback<Rune>) (owner, stage, id, rune, oldObj) -> {
/[I]register rune logic[/I]/
})
.create();
}
Rune
являлся IForgeRegistryEntry<Rune>
Мы можем сами реализовать методы, которые от нас требуют при расширении интерфейса
IForgeRegistryEntry
. Однако, forge любезно предоставляет нам готовый вариант реализации
Java:
public class Rune extends IForgeRegistryEntry.Impl<RuneEffect>{
}
Java:
@SubscribeEvent
public static void registerRunes(RegistryEvent.Register<Rune> event) {
event.getRegistry().registerAll(rune1, rune2, ...);
}
Надеюсь, этот ресурс помог вам)
P.S. полные исходники на гитхаб залью чуть позже