Skip to content

Commit 7b3a7d5

Browse files
committed
Back ProcessingRecipe#validate with Codec#validate
1 parent 604e437 commit 7b3a7d5

6 files changed

Lines changed: 26 additions & 116 deletions

File tree

src/main/java/com/simibubi/create/content/processing/recipe/ProcessingRecipe.java

Lines changed: 19 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,21 @@
22

33
import java.util.ArrayList;
44
import java.util.List;
5-
import java.util.Optional;
6-
import java.util.function.Function;
75
import java.util.function.Supplier;
86
import java.util.stream.Collectors;
97

108
import javax.annotation.ParametersAreNonnullByDefault;
119

10+
import com.google.common.base.Joiner;
1211
import com.mojang.serialization.DataResult;
1312
import com.mojang.serialization.MapCodec;
1413

15-
import com.mojang.serialization.codecs.RecordCodecBuilder;
16-
import com.simibubi.create.foundation.codec.ResourceLocationAwareOps;
17-
18-
import net.minecraft.util.ExtraCodecs;
19-
20-
import org.slf4j.Logger;
21-
22-
import com.simibubi.create.Create;
2314
import com.simibubi.create.foundation.fluid.FluidIngredient;
2415
import com.simibubi.create.foundation.recipe.IRecipeTypeInfo;
2516

2617
import net.minecraft.MethodsReturnNonnullByDefault;
2718
import net.minecraft.core.HolderLookup;
2819
import net.minecraft.core.NonNullList;
29-
import net.minecraft.resources.ResourceLocation;
3020
import net.minecraft.world.item.ItemStack;
3121
import net.minecraft.world.item.crafting.Ingredient;
3222
import net.minecraft.world.item.crafting.Recipe;
@@ -89,40 +79,37 @@ protected int getMaxFluidOutputCount() {
8979
return 0;
9080
}
9181

92-
//TODO: Recipe id is no longer avcailable on construct,
93-
// validation should be called in a reload listener after RecipeManager if needed,
94-
// currently only validates recipes created from builder for datagen
95-
public void validate(ResourceLocation id) {
96-
Logger logger = Create.LOGGER;
97-
String messageHeader = "Your custom " + typeInfo.getId() + " recipe (" + id + ")";
82+
public List<String> validate() {
83+
List<String> errors = new ArrayList<>();
9884
int ingredientCount = ingredients.size();
9985
int outputCount = results.size();
10086

10187
if (ingredientCount > getMaxInputCount())
102-
logger.warn(messageHeader + " has more item inputs (" + ingredientCount + ") than supported ("
88+
errors.add("Recipe has more item inputs (" + ingredientCount + ") than supported ("
10389
+ getMaxInputCount() + ").");
10490

10591
if (outputCount > getMaxOutputCount())
106-
logger.warn(messageHeader + " has more item outputs (" + outputCount + ") than supported ("
92+
errors.add("Recipe has more item outputs (" + outputCount + ") than supported ("
10793
+ getMaxOutputCount() + ").");
10894

10995
ingredientCount = fluidIngredients.size();
11096
outputCount = fluidResults.size();
11197

11298
if (ingredientCount > getMaxFluidInputCount())
113-
logger.warn(messageHeader + " has more fluid inputs (" + ingredientCount + ") than supported ("
99+
errors.add("Recipe has more fluid inputs (" + ingredientCount + ") than supported ("
114100
+ getMaxFluidInputCount() + ").");
115101

116102
if (outputCount > getMaxFluidOutputCount())
117-
logger.warn(messageHeader + " has more fluid outputs (" + outputCount + ") than supported ("
103+
errors.add("Recipe has more fluid outputs (" + outputCount + ") than supported ("
118104
+ getMaxFluidOutputCount() + ").");
119105

120106
if (processingDuration > 0 && !canSpecifyDuration())
121-
logger.warn(messageHeader + " specified a duration. Durations have no impact on this type of recipe.");
107+
errors.add("Recipe specified a duration. Durations have no impact on this type of recipe.");
122108

123109
if (requiredHeat != HeatCondition.NONE && !canRequireHeat())
124-
logger.warn(
125-
messageHeader + " specified a heat condition. Heat conditions have no impact on this type of recipe.");
110+
errors.add("Recipe specified a heat condition. Heat conditions have no impact on this type of recipe.");
111+
112+
return errors;
126113
}
127114

128115
public P getParams() {
@@ -226,16 +213,14 @@ public IRecipeTypeInfo getTypeInfo() {
226213
public static <P extends ProcessingRecipeParams, R extends ProcessingRecipe<?, P>> MapCodec<R> codec(
227214
Factory<P, R> factory, MapCodec<P> paramsCodec
228215
) {
229-
return RecordCodecBuilder.mapCodec(instance -> instance.group(
230-
paramsCodec.xmap(factory::create, recipe -> recipe.getParams()).forGetter(Function.identity()),
231-
ExtraCodecs.retrieveContext(ops -> ops instanceof ResourceLocationAwareOps awareOps
232-
? DataResult.success(Optional.ofNullable(awareOps.getResourceLocation()))
233-
: DataResult.success(Optional.<ResourceLocation>empty())
234-
).forGetter(recipe -> Optional.empty())
235-
).apply(instance, (recipe, id) -> {
236-
id.ifPresent(recipe::validate);
237-
return recipe;
238-
}));
216+
return paramsCodec.xmap(factory::create, recipe -> recipe.getParams())
217+
.validate(recipe -> {
218+
var errors = recipe.validate();
219+
if (errors.isEmpty())
220+
return DataResult.success(recipe);
221+
errors.add(recipe.getClass().getSimpleName() + " failed validation:");
222+
return DataResult.error(() -> Joiner.on('\n').join(errors), recipe);
223+
});
239224
}
240225

241226
@FunctionalInterface

src/main/java/com/simibubi/create/content/processing/recipe/ProcessingRecipeBuilder.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import java.util.ArrayList;
44
import java.util.List;
55

6+
import com.google.common.base.Joiner;
7+
import com.simibubi.create.Create;
68
import com.simibubi.create.content.processing.recipe.ProcessingRecipe.Factory;
79
import com.simibubi.create.foundation.data.SimpleDatagenIngredient;
810
import com.simibubi.create.foundation.data.recipe.Mods;
@@ -106,7 +108,11 @@ public void build(RecipeOutput consumer) {
106108
IRecipeTypeInfo recipeType = recipe.getTypeInfo();
107109
ResourceLocation typeId = recipeType.getId();
108110
ResourceLocation id = recipeId.withPrefix(typeId.getPath() + "/");
109-
recipe.validate(id);
111+
var errors = recipe.validate();
112+
if (!errors.isEmpty()) {
113+
errors.add(recipe.getClass().getSimpleName() + "with id " + id + " failed validation:");
114+
Create.LOGGER.warn(Joiner.on('\n').join(errors));
115+
}
110116
consumer.accept(id, recipe, null, recipeConditions.toArray(new ICondition[0]));
111117
}
112118

@@ -130,11 +136,6 @@ public S require(Mods mod, String id) {
130136
return self();
131137
}
132138

133-
public S require(ResourceLocation ingredient) {
134-
params.ingredients.add(DataIngredient.ingredient(null, ingredient).toVanilla());
135-
return self();
136-
}
137-
138139
public S require(Fluid fluid, int amount) {
139140
return require(FluidIngredient.fromFluid(fluid, amount));
140141
}

src/main/java/com/simibubi/create/foundation/codec/ResourceLocationAwareOps.java

Lines changed: 0 additions & 11 deletions
This file was deleted.

src/main/java/com/simibubi/create/foundation/mixin/RecipeManagerMixin.java

Lines changed: 0 additions & 36 deletions
This file was deleted.

src/main/java/com/simibubi/create/foundation/mixin/RegistryOpsMixin.java

Lines changed: 0 additions & 27 deletions
This file was deleted.

src/main/resources/create.mixins.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
"MobMixin",
1919
"PlayerMixin",
2020
"ProjectileUtilMixin",
21-
"RecipeManagerMixin",
22-
"RegistryOpsMixin",
2321
"ShulkerBoxBlockMixin",
2422
"SmithingMenuMixin",
2523
"SmithingTrimRecipeMixin",

0 commit comments

Comments
 (0)