summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/lv/enes/mc/eris_alchemy/recipe/SimplifiedRecipe.java34
-rw-r--r--src/main/java/lv/enes/mc/eris_alchemy/utils/IngredientProvider.java3
-rw-r--r--src/main/java/lv/enes/mc/eris_alchemy/utils/ItemUtils.java15
3 files changed, 37 insertions, 15 deletions
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;
16import net.minecraft.resources.ResourceLocation; 16import net.minecraft.resources.ResourceLocation;
17import net.minecraft.world.item.Item; 17import net.minecraft.world.item.Item;
18import net.minecraft.world.item.ItemStack; 18import net.minecraft.world.item.ItemStack;
19import net.minecraft.world.item.Items;
19import net.minecraft.world.item.crafting.Ingredient; 20import net.minecraft.world.item.crafting.Ingredient;
20import net.minecraft.world.item.crafting.Recipe; 21import net.minecraft.world.item.crafting.Recipe;
21import net.minecraft.world.item.crafting.ShapedRecipe;
22 22
23import java.lang.reflect.Type; 23import java.lang.reflect.Type;
24import java.util.Arrays; 24import java.util.*;
25import java.util.Collection;
26import java.util.List;
27import java.util.function.Predicate; 25import java.util.function.Predicate;
28import java.util.function.Supplier; 26import java.util.function.Supplier;
29import java.util.stream.Stream; 27import java.util.stream.Stream;
@@ -113,8 +111,9 @@ public record SimplifiedRecipe(
113 throw new JsonParseException("Recipe must have 'output' and 'input' fields"); 111 throw new JsonParseException("Recipe must have 'output' and 'input' fields");
114 } 112 }
115 113
116 var output = parseOutputOrRemainder(obj.get("output")); 114 var output = parseOutputOrRemainder(obj.get("output")).orElseGet(Items.AIR::getDefaultInstance);
117 var remainder = parseRemainders(obj.get("remainder")); 115 var remainder = parseRemainders(obj.get("remainder"))
116 .orElseGet(() -> List.of(Items.AIR.getDefaultInstance()));
118 var input = parseInputs(obj.get("input")); 117 var input = parseInputs(obj.get("input"));
119 return new SimplifiedRecipe(output, remainder, input, false); 118 return new SimplifiedRecipe(output, remainder, input, false);
120 } 119 }
@@ -127,24 +126,33 @@ public record SimplifiedRecipe(
127 return List.of(IngredientProvider.deserialize(el)); 126 return List.of(IngredientProvider.deserialize(el));
128 } 127 }
129 128
130 private ItemStack parseOutputOrRemainder(JsonElement el) { 129 private Optional<ItemStack> parseOutputOrRemainder(JsonElement el) {
131 if (el.isJsonObject()) { 130 if (el.isJsonObject()) {
132 return ShapedRecipe.itemStackFromJson(el.getAsJsonObject()); 131 return ItemUtils.itemStackFromJson(el.getAsJsonObject());
133 } else if (el.isJsonPrimitive() && el.getAsJsonPrimitive().isString()) { 132 } else if (el.isJsonPrimitive() && el.getAsJsonPrimitive().isString()) {
134 var id = new ResourceLocation(el.getAsString()); 133 var id = new ResourceLocation(el.getAsString());
135 return BuiltInRegistries.ITEM.get(id).getDefaultInstance(); 134 return Optional.of(BuiltInRegistries.ITEM.get(id).getDefaultInstance());
136 } else { 135 } else {
137 throw new JsonParseException("Recipe's output or remainder must be an object or a string"); 136 throw new JsonParseException("Recipe's output or remainder must be an object or a string");
138 } 137 }
139 } 138 }
140 139
141 private List<ItemStack> parseRemainders(JsonElement el) { 140 private Optional<List<ItemStack>> parseRemainders(JsonElement el) {
142 if (el == null) { 141 if (el == null) {
143 return List.of(); 142 return Optional.of(List.of());
144 } else if (el.isJsonArray()) { 143 } else if (el.isJsonArray()) {
145 return el.getAsJsonArray().asList().stream().map(this::parseOutputOrRemainder).toList(); 144 var optList = el.getAsJsonArray().asList().stream().map(this::parseOutputOrRemainder).toList();
145 var retList = new ArrayList<ItemStack>();
146 for (var opt : optList) {
147 if (opt.isPresent()) {
148 retList.add(opt.get());
149 } else {
150 return Optional.empty();
151 }
152 }
153 return Optional.of(retList);
146 } else { 154 } else {
147 return List.of(parseOutputOrRemainder(el)); 155 return parseOutputOrRemainder(el).map(List::of);
148 } 156 }
149 } 157 }
150 } 158 }
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;
8import net.minecraft.resources.ResourceLocation; 8import net.minecraft.resources.ResourceLocation;
9import net.minecraft.tags.TagKey; 9import net.minecraft.tags.TagKey;
10import net.minecraft.world.item.crafting.Ingredient; 10import net.minecraft.world.item.crafting.Ingredient;
11import net.minecraft.world.item.crafting.ShapedRecipe;
12 11
13import java.lang.reflect.Type; 12import java.lang.reflect.Type;
14import java.util.function.Supplier; 13import java.util.function.Supplier;
@@ -16,7 +15,7 @@ import java.util.function.Supplier;
16public class IngredientProvider implements JsonDeserializer<Supplier<Ingredient>> { 15public class IngredientProvider implements JsonDeserializer<Supplier<Ingredient>> {
17 public static Supplier<Ingredient> deserialize(JsonElement el) { 16 public static Supplier<Ingredient> deserialize(JsonElement el) {
18 if (el.isJsonObject()) { 17 if (el.isJsonObject()) {
19 return () -> Ingredient.of(ShapedRecipe.itemStackFromJson(el.getAsJsonObject())); 18 return () -> ItemUtils.itemStackFromJson(el.getAsJsonObject()).map(Ingredient::of).orElse(Ingredient.EMPTY);
20 } else if (el.isJsonPrimitive() && el.getAsJsonPrimitive().isString()) { 19 } else if (el.isJsonPrimitive() && el.getAsJsonPrimitive().isString()) {
21 return deserialize(el.getAsString().strip()); 20 return deserialize(el.getAsString().strip());
22 } else { 21 } 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 @@
1package lv.enes.mc.eris_alchemy.utils; 1package lv.enes.mc.eris_alchemy.utils;
2 2
3import com.google.gson.JsonObject;
4import com.google.gson.JsonSyntaxException;
5import lv.enes.mc.eris_alchemy.ErisAlchemy;
3import net.minecraft.core.Holder; 6import net.minecraft.core.Holder;
4import net.minecraft.core.registries.BuiltInRegistries; 7import net.minecraft.core.registries.BuiltInRegistries;
5import net.minecraft.resources.ResourceLocation; 8import net.minecraft.resources.ResourceLocation;
6import net.minecraft.world.item.Item; 9import net.minecraft.world.item.Item;
7import net.minecraft.world.item.ItemStack; 10import net.minecraft.world.item.ItemStack;
11import net.minecraft.world.item.crafting.ShapedRecipe;
8import net.minecraft.world.level.ItemLike; 12import net.minecraft.world.level.ItemLike;
9 13
14import java.util.Optional;
15
10public final class ItemUtils { 16public final class ItemUtils {
11 public static Item get(ResourceLocation id) { 17 public static Item get(ResourceLocation id) {
12 return BuiltInRegistries.ITEM.get(id); 18 return BuiltInRegistries.ITEM.get(id);
@@ -24,5 +30,14 @@ public final class ItemUtils {
24 return getId(stack.getItem()); 30 return getId(stack.getItem());
25 } 31 }
26 32
33 public static Optional<ItemStack> itemStackFromJson(JsonObject json) {
34 try {
35 return Optional.of(ShapedRecipe.itemStackFromJson(json));
36 } catch (JsonSyntaxException ex) {
37 ErisAlchemy.LOGGER.error("Exception while trying to parse item stack from JSON", ex);
38 return Optional.empty();
39 }
40 }
41
27 private ItemUtils() {} 42 private ItemUtils() {}
28} 43}