Обработка события регистрации после загрузки определенного мода

Версия Minecraft
1.18.1
API
Forge
647
74
187
всем привет. у меня есть метод-обработчик эвента RegistryEvent.Register<Item>, который должен итератором прогонять все предметы в реестре и тягать их только из нужного мне мода, но проблема в том, что мой метод срабатывает раньше, чем игра начинает видеть мод, из которого мне нужно достать предметы. вопрос: как я могу понизить приоритет своего обработчика, чтобы он срабатывал после загрузки ВСЕХ модов в FML? класс регистрирую через аннотацию @Mod.EventBusSubscriber и шину Mod. EventPriority.LOWEST никак не повлиял на очередь загрузки.
Java:
    @SubscribeEvent
        public static void onItemsRegistry(RegistryEvent.Register<Item> event) {
            try {
                loadDependencies(event.getRegistry(), "vanillahammers"); // предметы из vanillahammers загружаются до моего мода и нормально используются
                loadDependencies(event.getRegistry(), "vanillaexcavators"); // предметы из vanillaexcavators на момент вызова метода не загружены
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
 
Последнее редактирование:
Решение
Проблема решена. Легко исправляется добавлением в mods.toml зависимостей от нужных модов с параметром ordering="AFTER".
mods.toml:
[[dependencies."modid"]]
    modId="vanillaexcavators"
    #mandatory=false если зависимость необязательна, как в моём случае
    mandatory=false
    versionRange="[1.18,1.19)"
    ordering="AFTER"
    side="BOTH"
Проблема решена. Легко исправляется добавлением в mods.toml зависимостей от нужных модов с параметром ordering="AFTER".
mods.toml:
[[dependencies."modid"]]
    modId="vanillaexcavators"
    #mandatory=false если зависимость необязательна, как в моём случае
    mandatory=false
    versionRange="[1.18,1.19)"
    ordering="AFTER"
    side="BOTH"
 
А ничего, что в RegistryEvent.Register<Item> надо регистрировать итемы?
А уже после, когда все моды прогнались через этот ивент, можно итерировать по тому реестру сколько влезет.

Если тебе вообще надо только несколько одиночных предметов вытащить, то @ObjectHolder или RegistryObject<> для этого есть, а если именно пройтись по всем, то корректно делать так:
Java:
@SubscribeEvent
public static void on(FMLCommonSetupEvent e) {
    e.enqueueWork(() -> {
        for (var item : ForgeRegistries.ITEMS) {
            System.out.println("one of all the items: " + item.getRegistryName());
        }
    });
}
 
А ничего, что в RegistryEvent.Register<Item> надо регистрировать итемы?
я и регистрирую. просто мне нужны объекты определенных предметов (определяю их находя соответствия рег. имени с regex'ом) из реестра т.к я рефлексией тяну из них нужные данные для МОИХ предметов. мой ответ в целом помог, никаких проблем не возникло
 
Не интересно зачем тебе те предметы, интересно почему через одно место сделано.
Вот решит завтра фордж, что нельзя из реестров ничего брать, пока они не заморозятся, и это сломается
Или другие какие-то проблемы возникнут
В любом случае банально некрасиво, это то, до чего я докопался-то, и правильный вариант вон есть, ладно бы не было другой возможности
Ну в общем как скажешь

А, стоп, дошло, ты что, динамически регистрируешь предметы, в зависимости от предметов другого мода?
Типа единственное, что нельзя в предметы засетить потом в ините, это их имя в реестре, и может ещё пару финальных полей типа блока в итемблоке
Ну тогда ок, наверное, хотя конечно сомнительно всё ещё
 
Назад
Сверху