summaryrefslogtreecommitdiff
path: root/src/main/java/lv/enes/mc/eris_alchemy/recipe/SimplifiedRecipe.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/lv/enes/mc/eris_alchemy/recipe/SimplifiedRecipe.java')
-rw-r--r--src/main/java/lv/enes/mc/eris_alchemy/recipe/SimplifiedRecipe.java34
1 files changed, 21 insertions, 13 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 }