Использование событий регистрации

Использование событий регистрации

Нет прав для скачивания
Версия(и) Minecraft
1.10+
Чтобы в игре появились ваши предметы, блоки и т.д, их нужно зарегистрировать.
В старых версиях для регистрации использовался объект 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, ...);
    }
}
На момент написания статьи forge позволяет регистрировать при помощи событий следующие классы объектов:
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. полные исходники на гитхаб залью чуть позже
  • Like
Реакции: GoogleTan
Автор
hohserg
Скачивания
1
Просмотры
1,411
Первый выпуск
Обновление
Оценка
4.00 звёзд 1 оценок

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

Последние рецензии

Начало как-то подозрительно похоже на документацию Forge.
hohserg
hohserg
Там другая формулировка, хотя смысл тот же. В любом случае, это не перевод, я сочинял текст с нуля, имея знания о предмете
Сверху