Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JEI method deprecation causes NPE in RegisterCategoriesEventJS.wrap #12

Open
omgimanerd opened this issue Oct 11, 2024 · 1 comment
Open

Comments

@omgimanerd
Copy link

I have some code along the lines of the following:

Minecraft Version: 1.20.1
Forge: 47.3.0
KJS Additions: v4.3.2
JEI: v15.20.0.104

JEIAddedEvents.registerCategories((e) => {
  // The vanilla Anvil recipe category, contains the code that performs the
  // actual rendering of the recipe inputs and outputs in JEI.
  const $AnvilRecipeCategory = Java.loadClass(
    'mezz.jei.library.plugins.vanilla.anvil.AnvilRecipeCategory'
  )

  // RecipeType and the actual underlying processing recipe. Needed to create a
  // RecipeType for the custom category registration.
  const $RecipeType = Java.loadClass('mezz.jei.api.recipe.RecipeType')
  const $IJeiAnvilRecipe = Java.loadClass(
    'mezz.jei.api.recipe.vanilla.IJeiAnvilRecipe'
  )
  const nutrientInfusionRecipeType = $RecipeType.create(
    'kubejs',
    'nutrient_infusion',
    $IJeiAnvilRecipe
  )

  const guiHelper = e.data.jeiHelpers.guiHelper
  // Create an concrete instance of the anvil recipe category and defer our
  // custom category to use its render code.
  const anvilRecipeCategory = new $AnvilRecipeCategory(guiHelper)

  e.wrap(nutrientInfusionRecipeType, anvilRecipeCategory, (category) => {
    category
      .title('Nutrient Infusion')
      .icon(
        doubleItemIcon('minecraft:anvil', 'minecraft:enchanted_golden_apple')
      )
      .isRecipeHandled(() => true) // Only relevant recipes are registered
  })
})

which causes the following NPE:

[04:04:31] [ERROR] ! Error in 'JEIAddedEvents.registerCategories': Cannot invoke "mezz.jei.api.gui.drawable.IDrawable.getWidth()" because "background" is null
[04:04:31] [ERROR] ! java.lang.NullPointerException: Cannot invoke "mezz.jei.api.gui.drawable.IDrawable.getWidth()" because "background" is null
[04:04:31] [ERROR] !   at pie.ilikepiefoo.compat.jei.builder.RecipeCategoryBuilder.background(RecipeCategoryBuilder.java:81)
[04:04:31] [ERROR] !   at pie.ilikepiefoo.compat.jei.builder.RecipeCategoryWrapperBuilder.<init>(RecipeCategoryWrapperBuilder.java:27)
[04:04:31] [ERROR] !   at pie.ilikepiefoo.compat.jei.events.RegisterCategoriesEventJS.wrap(RegisterCategoriesEventJS.java:28)

It looks like AnvilRecipeCategory.background is considered deprecated now, it calls IRecipeCategory.getBackground:

https://github.com/mezz/JustEnoughItems/blob/1.20.1/CommonApi/src/main/java/mezz/jei/api/recipe/category/IRecipeCategory.java#L59

Seems like it is complaining here:

Basically, I think you can no longer depend on calls to IRecipeCategory.getBackground

@omgimanerd omgimanerd changed the title JEI method deprecation calls NPE in RegisterCategoriesEventJS.wrap JEI method deprecation causes NPE in RegisterCategoriesEventJS.wrap Oct 11, 2024
@omgimanerd
Copy link
Author

I reopened the relevant ticket again on the kubejs discord too. Using my original workaround of this:

  e.custom('kubejs:nutrient_infusion', (category) => {
    category
      .title('Nutrient Infusion')
      .background(
        guiHelper.createBlankDrawable(
          anvilRecipeCategory.getWidth(),
          anvilRecipeCategory.getHeight()
        )
      )
      .icon(
        doubleItemIcon('minecraft:anvil', 'minecraft:enchanted_golden_apple')
      )
      .isRecipeHandled(() => true)
      .handleLookup((builder, recipe, focuses) => {
        // TODO currently broken: anvilRecipeCategory.createRecipeExtras needs
        // to be called in order to draw the arrow and experience costs.
        anvilRecipeCategory.setRecipe(builder, recipe, focuses)
      })
      .setDrawHandler((recipe, slots, graphics, mouseX, mouseY) => {
        anvilRecipeCategory.draw(recipe, slots, graphics, mouseX, mouseY)
      })
  })

Where I call all the handlers and defer the draw/handler methods to the AnvilRecipeCategory no longer works because there is now a createRecipeExtras method which is called to draw the arrows and experience cost in the recipe category. I don't see an easy way to call it since I can't get access to a IRecipeExtrasBuilder instance.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant