From 042b1a7273c79e8c562606622f384dd0dbd188ba Mon Sep 17 00:00:00 2001 From: Uko Koknevics Date: Sat, 7 Dec 2024 07:23:41 +0200 Subject: Fix a crash when loading without any other mods present. --- .../mc/eris_alchemy/recipe/SimplifiedRecipe.java | 34 +++++++++++++--------- .../mc/eris_alchemy/utils/IngredientProvider.java | 3 +- .../lv/enes/mc/eris_alchemy/utils/ItemUtils.java | 15 ++++++++++ 3 files changed, 37 insertions(+), 15 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/lv/enes/mc/eris_alchemy/recipe/SimplifiedRecipe.java b/src/main/java/lv/enes/mc/eris_alchemy/recipe/SimplifiedRecipe.java index b63e4c5..e1022b2 100644 --- a/src/main/java/lv/enes/mc/eris_alchemy/recipe/SimplifiedRecipe.java +++ b/src/main/java/lv/enes/mc/eris_alchemy/recipe/SimplifiedRecipe.java @@ -16,14 +16,12 @@ import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Recipe; -import net.minecraft.world.item.crafting.ShapedRecipe; import java.lang.reflect.Type; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; +import java.util.*; import java.util.function.Predicate; import java.util.function.Supplier; import java.util.stream.Stream; @@ -113,8 +111,9 @@ public record SimplifiedRecipe( throw new JsonParseException("Recipe must have 'output' and 'input' fields"); } - var output = parseOutputOrRemainder(obj.get("output")); - var remainder = parseRemainders(obj.get("remainder")); + var output = parseOutputOrRemainder(obj.get("output")).orElseGet(Items.AIR::getDefaultInstance); + var remainder = parseRemainders(obj.get("remainder")) + .orElseGet(() -> List.of(Items.AIR.getDefaultInstance())); var input = parseInputs(obj.get("input")); return new SimplifiedRecipe(output, remainder, input, false); } @@ -127,24 +126,33 @@ public record SimplifiedRecipe( return List.of(IngredientProvider.deserialize(el)); } - private ItemStack parseOutputOrRemainder(JsonElement el) { + private Optional parseOutputOrRemainder(JsonElement el) { if (el.isJsonObject()) { - return ShapedRecipe.itemStackFromJson(el.getAsJsonObject()); + return ItemUtils.itemStackFromJson(el.getAsJsonObject()); } else if (el.isJsonPrimitive() && el.getAsJsonPrimitive().isString()) { var id = new ResourceLocation(el.getAsString()); - return BuiltInRegistries.ITEM.get(id).getDefaultInstance(); + return Optional.of(BuiltInRegistries.ITEM.get(id).getDefaultInstance()); } else { throw new JsonParseException("Recipe's output or remainder must be an object or a string"); } } - private List parseRemainders(JsonElement el) { + private Optional> parseRemainders(JsonElement el) { if (el == null) { - return List.of(); + return Optional.of(List.of()); } else if (el.isJsonArray()) { - return el.getAsJsonArray().asList().stream().map(this::parseOutputOrRemainder).toList(); + var optList = el.getAsJsonArray().asList().stream().map(this::parseOutputOrRemainder).toList(); + var retList = new ArrayList(); + for (var opt : optList) { + if (opt.isPresent()) { + retList.add(opt.get()); + } else { + return Optional.empty(); + } + } + return Optional.of(retList); } else { - return List.of(parseOutputOrRemainder(el)); + return parseOutputOrRemainder(el).map(List::of); } } } diff --git a/src/main/java/lv/enes/mc/eris_alchemy/utils/IngredientProvider.java b/src/main/java/lv/enes/mc/eris_alchemy/utils/IngredientProvider.java index e859114..6390c88 100644 --- a/src/main/java/lv/enes/mc/eris_alchemy/utils/IngredientProvider.java +++ b/src/main/java/lv/enes/mc/eris_alchemy/utils/IngredientProvider.java @@ -8,7 +8,6 @@ import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.item.crafting.ShapedRecipe; import java.lang.reflect.Type; import java.util.function.Supplier; @@ -16,7 +15,7 @@ import java.util.function.Supplier; public class IngredientProvider implements JsonDeserializer> { public static Supplier deserialize(JsonElement el) { if (el.isJsonObject()) { - return () -> Ingredient.of(ShapedRecipe.itemStackFromJson(el.getAsJsonObject())); + return () -> ItemUtils.itemStackFromJson(el.getAsJsonObject()).map(Ingredient::of).orElse(Ingredient.EMPTY); } else if (el.isJsonPrimitive() && el.getAsJsonPrimitive().isString()) { return deserialize(el.getAsString().strip()); } else { diff --git a/src/main/java/lv/enes/mc/eris_alchemy/utils/ItemUtils.java b/src/main/java/lv/enes/mc/eris_alchemy/utils/ItemUtils.java index 7ac7358..0801d11 100644 --- a/src/main/java/lv/enes/mc/eris_alchemy/utils/ItemUtils.java +++ b/src/main/java/lv/enes/mc/eris_alchemy/utils/ItemUtils.java @@ -1,12 +1,18 @@ package lv.enes.mc.eris_alchemy.utils; +import com.google.gson.JsonObject; +import com.google.gson.JsonSyntaxException; +import lv.enes.mc.eris_alchemy.ErisAlchemy; import net.minecraft.core.Holder; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.ShapedRecipe; import net.minecraft.world.level.ItemLike; +import java.util.Optional; + public final class ItemUtils { public static Item get(ResourceLocation id) { return BuiltInRegistries.ITEM.get(id); @@ -24,5 +30,14 @@ public final class ItemUtils { return getId(stack.getItem()); } + public static Optional itemStackFromJson(JsonObject json) { + try { + return Optional.of(ShapedRecipe.itemStackFromJson(json)); + } catch (JsonSyntaxException ex) { + ErisAlchemy.LOGGER.error("Exception while trying to parse item stack from JSON", ex); + return Optional.empty(); + } + } + private ItemUtils() {} } -- cgit v1.2.3