diff --git a/xplat/src/main/java/dev/emi/emi/EmiUtil.java b/xplat/src/main/java/dev/emi/emi/EmiUtil.java index 4df1912e..ad19e8b1 100644 --- a/xplat/src/main/java/dev/emi/emi/EmiUtil.java +++ b/xplat/src/main/java/dev/emi/emi/EmiUtil.java @@ -8,6 +8,8 @@ import java.util.Random; import java.util.stream.Stream; +import org.jetbrains.annotations.Nullable; + import dev.emi.emi.api.EmiApi; import dev.emi.emi.api.recipe.EmiPlayerInventory; import dev.emi.emi.api.recipe.EmiRecipe; @@ -136,18 +138,18 @@ public static EmiRecipe getPreferredRecipe(EmiIngredient ingredient, EmiPlayerIn } @SuppressWarnings({"unchecked", "rawtypes"}) - public static EmiRecipe getPreferredRecipe(List recipes, EmiPlayerInventory inventory, boolean requireCraftable) { + public static @Nullable EmiRecipe getPreferredRecipe(List recipes, EmiPlayerInventory inventory, boolean requireCraftable) { EmiRecipe preferred = null; int preferredWeight = -1; HandledScreen hs = EmiApi.getHandledScreen(); - EmiCraftContext context = new EmiCraftContext<>(hs, inventory, EmiCraftContext.Type.CRAFTABLE); + EmiCraftContext context = hs == null ? null : new EmiCraftContext<>(hs, inventory, EmiCraftContext.Type.CRAFTABLE); for (EmiRecipe recipe : recipes) { if (!recipe.supportsRecipeTree()) { continue; } int weight = 0; EmiRecipeHandler handler = EmiRecipeFiller.getFirstValidHandler(recipe, hs); - if (handler != null && handler.canCraft(recipe, context)) { + if (context != null && handler != null && handler.canCraft(recipe, context)) { weight += 16; } else if (requireCraftable) { continue; diff --git a/xplat/src/main/java/dev/emi/emi/api/EmiApi.java b/xplat/src/main/java/dev/emi/emi/api/EmiApi.java index cd88b30f..163725f3 100644 --- a/xplat/src/main/java/dev/emi/emi/api/EmiApi.java +++ b/xplat/src/main/java/dev/emi/emi/api/EmiApi.java @@ -99,14 +99,14 @@ public static EmiStackInteraction getHoveredStack(boolean includeStandard) { return null; } - public static HandledScreen getHandledScreen() { + public static @Nullable HandledScreen getHandledScreen() { Screen s = client.currentScreen; if (s instanceof HandledScreen hs) { return hs; - } else if (s instanceof RecipeScreen rs) { - return rs.old; - } else if (s instanceof BoMScreen bs) { - return bs.old; + } else if (s instanceof RecipeScreen rs && rs.old instanceof HandledScreen hs) { + return hs; + } else if (s instanceof BoMScreen bs && bs.old instanceof HandledScreen hs) { + return hs; } return null; } @@ -123,7 +123,7 @@ public static void displayRecipeCategory(EmiRecipeCategory category) { public static void displayRecipe(EmiRecipe recipe) { setPages(Map.of(recipe.getCategory(), List.of(recipe)), EmiStack.EMPTY); } - + public static void displayRecipes(EmiIngredient stack) { if (stack instanceof EmiFavorite fav) { stack = fav.getStack(); @@ -239,13 +239,7 @@ private static void setPages(Map> recipes, Em .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue())); if (!recipes.isEmpty()) { EmiSidebars.lookup(stack); - if (getHandledScreen() == null) { - client.setScreen(new InventoryScreen(client.player)); - } - if (client.currentScreen instanceof HandledScreen hs) { - push(); - client.setScreen(new RecipeScreen(hs, recipes)); - } else if (client.currentScreen instanceof BoMScreen bs) { + if (client.currentScreen instanceof BoMScreen bs) { push(); client.setScreen(new RecipeScreen(bs.old, recipes)); } else if (client.currentScreen instanceof RecipeScreen rs) { @@ -253,6 +247,9 @@ private static void setPages(Map> recipes, Em RecipeScreen n = new RecipeScreen(rs.old, recipes); client.setScreen(n); n.focusCategory(rs.getFocusedCategory()); + } else { + push(); + client.setScreen(new RecipeScreen(client.currentScreen, recipes)); } } } diff --git a/xplat/src/main/java/dev/emi/emi/registry/EmiRecipeFiller.java b/xplat/src/main/java/dev/emi/emi/registry/EmiRecipeFiller.java index 8bdb32dc..b20f71e5 100644 --- a/xplat/src/main/java/dev/emi/emi/registry/EmiRecipeFiller.java +++ b/xplat/src/main/java/dev/emi/emi/registry/EmiRecipeFiller.java @@ -4,6 +4,7 @@ import java.util.Map; import java.util.function.BiFunction; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Nullable; import com.google.common.collect.Lists; @@ -94,8 +95,10 @@ public static List> getAllHandlers return List.of(); } + @Contract("_, null -> null") @SuppressWarnings("unchecked") - public static @Nullable EmiRecipeHandler getFirstValidHandler(EmiRecipe recipe, HandledScreen screen) { + public static @Nullable EmiRecipeHandler getFirstValidHandler(EmiRecipe recipe, @Nullable HandledScreen screen) { + if (screen == null) return null; EmiRecipeHandler ret = null; for (EmiRecipeHandler handler : getAllHandlers(screen)) { if (handler.supportsRecipe(recipe)) { @@ -112,7 +115,8 @@ public static List> getAllHandlers return ret; } - public static boolean performFill(EmiRecipe recipe, HandledScreen screen, + @Contract("_,null,_,_,_->false") + public static boolean performFill(EmiRecipe recipe, @Nullable HandledScreen screen, EmiCraftContext.Type type, EmiCraftContext.Destination destination, int amount) { EmiRecipeHandler handler = getFirstValidHandler(recipe, screen); if (handler != null && handler.supportsRecipe(recipe)) { diff --git a/xplat/src/main/java/dev/emi/emi/screen/BoMScreen.java b/xplat/src/main/java/dev/emi/emi/screen/BoMScreen.java index 9b6da3cc..042dfd5a 100644 --- a/xplat/src/main/java/dev/emi/emi/screen/BoMScreen.java +++ b/xplat/src/main/java/dev/emi/emi/screen/BoMScreen.java @@ -46,7 +46,6 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.client.gui.tooltip.TooltipComponent; import net.minecraft.client.sound.PositionedSoundInstance; import net.minecraft.client.util.InputUtil; @@ -73,13 +72,13 @@ public class BoMScreen extends Screen { private List costs = Lists.newArrayList(); private EmiPlayerInventory playerInv; private boolean hasRemainders = false;; - public HandledScreen old; + public Screen old; private int nodeWidth = 0; private int nodeHeight = 0; private int lastMouseX, lastMouseY; private double scrollAcc = 0; - public BoMScreen(HandledScreen old) { + public BoMScreen(Screen old) { super(EmiPort.translatable("screen.emi.recipe_tree")); this.old = old; } diff --git a/xplat/src/main/java/dev/emi/emi/screen/RecipeScreen.java b/xplat/src/main/java/dev/emi/emi/screen/RecipeScreen.java index c9727fc3..b3a930a3 100644 --- a/xplat/src/main/java/dev/emi/emi/screen/RecipeScreen.java +++ b/xplat/src/main/java/dev/emi/emi/screen/RecipeScreen.java @@ -46,7 +46,7 @@ public class RecipeScreen extends Screen { private static final Identifier TEXTURE = new Identifier("emi", "textures/gui/background.png"); public static @Nullable EmiIngredient resolve = null; private Map> recipes; - public HandledScreen old; + public Screen old; private List tabs = Lists.newArrayList(); private int tabPageSize = 6; private int tabPage = 0, tab = 0, page = 0; @@ -62,7 +62,7 @@ public class RecipeScreen extends Screen { int x = (this.width - backgroundWidth) / 2; int y = (this.height - backgroundHeight) / 2; - public RecipeScreen(HandledScreen old, Map> recipes) { + public RecipeScreen(Screen old, Map> recipes) { super(EmiPort.translatable("screen.emi.recipe")); this.old = old; arrows = List.of(