Грузим json или же не доверяйте нейросетям

Версия Minecraft
1.20.1
API
Forge
38
2
1
Доброго дня! Я поглощен созданием класса, который должен подгружать данные такого формата:
Java:
{
  "minecraft:apple": {
    "carbohydrates": 3,
    "minerals": 10,
    "vitamins": 5,
    "water": 3
  }
}
В мапу самого класса. Пару дней мучаю нейросеть и, увы, спотыкаюсь на этапе применения класса, потому что дипсик не знает событий, которые имплементируют IModEventBus и, соответственно, никак не помогает сделать адекватный @SubscribeEvent.

Класс:
public class FoodDietValuesManager {
    private static final Map<ResourceLocation, DietValuesHolder> DIET_VALUES = new HashMap<>();

    public static void load(ResourceManager manager) {
        DIET_VALUES.clear();
        
        try {
            Optional<Resource> optionalResource = manager.getResource(new ResourceLocation("tmcfm", "food_nutrition.json"));
            if(optionalResource.isEmpty()) {
                LogManager.getLogger().warn("Diet values are not present!");
                return;
            }

            Resource resource = optionalResource.get();
            JsonObject json = JsonParser.parseReader(resource.openAsReader()).getAsJsonObject();

            for (Map.Entry<String, JsonElement> entry : json.entrySet()) {
                ResourceLocation itemId = new ResourceLocation(entry.getKey());
                DietValuesHolder data = parseDietValues(entry.getValue().getAsJsonObject());
                DIET_VALUES.put(itemId, data);
            }
        } catch (IOException e) {
            LogManager.getLogger().error("Failed to load food data values!", e);
        }
    }

    private static DietValuesHolder parseDietValues(JsonObject json) {
        DietValuesHolder data = new DietValuesHolder();
        ...
        return data;
    }

}


Событие для обработки json'а:
@SubscribeEvent
public void onDataLoad(AddReloadListenerEvent event) {
    event.addListener(new ResourceManagerReloadListener() {
        @Override
        public void onResourceManagerReload(ResourceManager manager) {
            FoodNutritionManager.load(manager);
        }
    });
}

Разумеется, из-за того, что событие не реализует нужный интерфейс, майнкрафт у меня не запускается, выдавая соответствующую ошибку. Вопрос один: как фиксить? Может быть, нужно делать что-то совсем другое? Буду рад примеру правильного кода или релевантной документации, заранее благодарю душевно.
 
Решение
Показывай ошибку. У тебя AddReloadListenerEvent реализует Event, тут должно быть всё ок. По парсингу Json на первый взгляд тоже ничего плохого нет, кроме отсутствия закрытия реадера ресурса, это плохо.
Показывай ошибку. У тебя AddReloadListenerEvent реализует Event, тут должно быть всё ок. По парсингу Json на первый взгляд тоже ничего плохого нет, кроме отсутствия закрытия реадера ресурса, это плохо.
 
Мне сейчас неловко это говорить, но я после поста решил заново переписать все, что сделал, и теперь не могу воспроизвести ошибку не просто тем же кодом, а совсем. Грубо говоря, при старте клиента вместо главного меню выводилось сообщение на фоне блоков земли с примерным содержанием: "Объект класса N, переданный в качестве аргумента в метод с аннотацией @SubscribeEvent не реализует интерфейс IModBusEvent." И три кнопки, предлагающие открыть latest.log и тп. Почему так случилось, я не знаю, но зато теперь ловлю новую ошибку при запуске клиента:
CompileJava error:
E:\FORGE\Рабочая (с модами)\the-most-complete-food-mod-1_20_1\src\main\java\net\shawdy\themostcompletefoodmod\mixin\FoodDataMixin.java:330: error: Unable to locate obfuscation mapping for @Inject target eat
    @Inject(method = "eat(Lnet/minecraft/world/item/Item;Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/entity/LivingEntity;)V", at = @At(value = "TAIL"))
Я использую маппинги парчмента, поэтому залез в build/createSrgToMcp и заметил, что методаа eat() с нужной сигнатурой нет, зато есть два других: вспомогательный с (float, int) и устаревший с (Item, ItemStack). Ошибка вряд ли связана с предыдущей, но получил я ее только сейчас, поэтому, наверное, поделюсь ей в этой же теме
 
Если метод из ванильного Minecraft, то это странно, хотя для среды разработки на новых версиях может быть и норм. Обычно это не мешает компиляции и запуску, но ты всегда можешь передать в Inject remap = false.
 
Да, remap = false помог, теперь этой ошибки нет. Я снова покопался в коде и понял, что подписчик событий у меня не вызывался в отдельном классе, и начал работать только когда я перенес его в главный класс мода. А затем я вернул его на место и добавил модификатор static, с чем получил упомянутый краш:1753266081257.pngВпрочем, в теле главного класса мода оно работает, так что, наверное, там я его и оставлю.
Если что, вот аннотация исходного класса:
ModEvents:
@Mod.EventBusSubscriber(
        modid = TheMostCompleteFoodMod.MOD_ID,
        bus = Mod.EventBusSubscriber.Bus.MOD
)
Ну и аннотация главного класса:
@Mod(TheMostCompleteFoodMod.MOD_ID)
 
Назад
Сверху