From abb1f29dda7ce5c1e72d22d08fcb5a85c5bca145 Mon Sep 17 00:00:00 2001 From: TeamSpen210 Date: Mon, 30 Dec 2019 11:02:48 +1000 Subject: [PATCH] Add ability to build recipes with a different serialiser This makes generating several special recipes easily. --- .../common/datagen/CondRecipe.java | 95 ++++++++++++++++--- 1 file changed, 81 insertions(+), 14 deletions(-) diff --git a/src/main/java/knightminer/inspirations/common/datagen/CondRecipe.java b/src/main/java/knightminer/inspirations/common/datagen/CondRecipe.java index 8c4a635f..6c960c24 100644 --- a/src/main/java/knightminer/inspirations/common/datagen/CondRecipe.java +++ b/src/main/java/knightminer/inspirations/common/datagen/CondRecipe.java @@ -4,6 +4,7 @@ import com.google.gson.JsonObject; import knightminer.inspirations.library.Util; import knightminer.inspirations.library.recipe.TextureRecipe; +import net.minecraft.data.CustomRecipeBuilder; import net.minecraft.data.IFinishedRecipe; import net.minecraft.data.ShapedRecipeBuilder; import net.minecraft.data.ShapelessRecipeBuilder; @@ -11,6 +12,7 @@ import net.minecraft.item.crafting.IRecipeSerializer; import net.minecraft.item.crafting.Ingredient; import net.minecraft.item.crafting.ShapedRecipe; +import net.minecraft.item.crafting.SpecialRecipeSerializer; import net.minecraft.tags.Tag; import net.minecraft.util.IItemProvider; import net.minecraft.util.ResourceLocation; @@ -41,6 +43,10 @@ public static ShapelessBuilder shapeless(IItemProvider result, int count) { return new ShapelessBuilder(result, count); } + public static CustomBuilder custom(SpecialRecipeSerializer serializer) { + return new CustomBuilder(serializer); + } + /** * Recipe wrapper which adds conditions when serialized. */ @@ -49,19 +55,29 @@ private static class Finished implements IFinishedRecipe { private final boolean mirror; private final List condList; private final ResourceLocation id; - - private Finished(ResourceLocation id, IFinishedRecipe recipe, boolean mirror, List cond) { + @Nullable + private IRecipeSerializer custSerial; + + private Finished( + ResourceLocation id, + IFinishedRecipe recipe, + @Nullable IRecipeSerializer custSerial, + boolean mirror, + List cond + ) { this.recipe = recipe; this.mirror = mirror; this.condList = cond; this.id = id; + this.custSerial = custSerial; } + @Nonnull @Override public JsonObject getRecipeJson() { JsonObject json = new JsonObject(); serialize(json); - json.addProperty("type", Registry.RECIPE_SERIALIZER.getKey(recipe.getSerializer()).toString()); + json.addProperty("type", Registry.RECIPE_SERIALIZER.getKey(getSerializer()).toString()); return json; } @@ -76,6 +92,9 @@ public void serialize(@Nonnull JsonObject json) { json.addProperty("mirrored", true); } recipe.serialize(json); + if (custSerial != null) { + json.addProperty("type", Registry.RECIPE_SERIALIZER.getKey(getSerializer()).toString()); + } } @Nonnull @@ -84,12 +103,12 @@ public ResourceLocation getID() { return id; } - /** - * This is never used, so we can just return a dummy value. - */ @Nonnull @Override public IRecipeSerializer getSerializer() { + if (custSerial != null) { + return custSerial; + } return recipe.getSerializer(); } @@ -115,19 +134,18 @@ private static class FinishedTexture extends Finished { private final boolean matchFirst; private FinishedTexture(ResourceLocation id, IFinishedRecipe recipe, boolean mirror, Ingredient texSource, boolean matchFirst, List cond) { - super(id, recipe, mirror, cond); + super(id, recipe, TextureRecipe.SERIALIZER, mirror, cond); + assert recipe.getSerializer() == ShapedRecipe.Serializer.CRAFTING_SHAPED; this.texSource = texSource; this.matchFirst = matchFirst; - assert recipe.getSerializer() == ShapedRecipe.Serializer.CRAFTING_SHAPED; } + @Nonnull @Override public JsonObject getRecipeJson() { - JsonObject json = new JsonObject(); - json.addProperty("type", TextureRecipe.SERIALIZER.getRegistryName().toString()); + JsonObject json = super.getRecipeJson(); json.add("texture", texSource.serialize()); json.addProperty("match_first", matchFirst); - serialize(json); return json; } } @@ -135,6 +153,8 @@ public JsonObject getRecipeJson() { public static class ShapedBuilder extends ShapedRecipeBuilder { private ArrayList conditions; @Nullable + private IRecipeSerializer custSerial; + @Nullable private Ingredient textureSource; private boolean textureMatchFirst; private boolean mirror; @@ -160,6 +180,11 @@ public ShapedBuilder addCondition(ICondition cond) { return this; } + public ShapedBuilder custom(IRecipeSerializer serializer) { + custSerial = serializer; + return this; + } + public ShapedBuilder textureSource(Ingredient ingredient) { textureSource = ingredient; return this; @@ -189,7 +214,7 @@ public void build(Consumer consumer, ResourceLocation recipeLoc // Then wrap. consumer.accept(textureSource != null ? new FinishedTexture(recipeLoc, output[0], mirror, textureSource, textureMatchFirst, conditions) : - new Finished(recipeLoc, output[0], mirror, conditions) + new Finished(recipeLoc, output[0], custSerial, mirror, conditions) ); } @@ -209,13 +234,15 @@ public void build(Consumer consumer) { // Then wrap. consumer.accept(textureSource != null ? new FinishedTexture(output[0].getID(), output[0], mirror, textureSource, textureMatchFirst, conditions) : - new Finished(output[0].getID(), output[0], mirror, conditions) + new Finished(output[0].getID(), output[0], custSerial, mirror, conditions) ); } } public static class ShapelessBuilder extends ShapelessRecipeBuilder { private ArrayList conditions; + @Nullable + private IRecipeSerializer custSerial; private ShapelessBuilder(IItemProvider result, int count) { super(result, count); @@ -227,6 +254,11 @@ public ShapelessBuilder addCondition(ICondition cond) { return this; } + public ShapelessBuilder custom(IRecipeSerializer serializer) { + custSerial = serializer; + return this; + } + @Override public void build(Consumer consumer, ResourceLocation recipeLoc) { // Capture the finished recipe which will be sent to the consumer. @@ -236,7 +268,7 @@ public void build(Consumer consumer, ResourceLocation recipeLoc // It should have been called immediately. assert output[0] != null; // Then wrap. - consumer.accept(new Finished(recipeLoc, output[0], false, conditions)); + consumer.accept(new Finished(recipeLoc, output[0], custSerial, false, conditions)); } @Override @@ -244,4 +276,39 @@ public void build(@Nonnull Consumer consumer, String path) { build(consumer, Util.getResource(path)); } } + + public static class CustomBuilder { + private final SpecialRecipeSerializer serializer; + private ArrayList conditions; + + private CustomBuilder(SpecialRecipeSerializer serializer) { + this.serializer = serializer; + conditions = new ArrayList<>(); + } + + public CustomBuilder addCondition(ICondition cond) { + conditions.add(cond); + return this; + } + + public void build(@Nonnull Consumer consumer, ResourceLocation path) { + // Capture the finished recipe which will be sent to the consumer. + CustomRecipeBuilder builder = CustomRecipeBuilder.func_218656_a(serializer); + final IFinishedRecipe[] output = {null}; + builder.build((res) -> output[0] = res, path.toString()); + + // It should have been called immediately. + assert output[0] != null; + // Then wrap. + consumer.accept(new Finished(path, output[0], serializer, false, conditions)); + } + + public void build(@Nonnull Consumer consumer, String path) { + build(consumer, Util.getResource(path)); + } + + public void build(@Nonnull Consumer consumer) { + build(consumer, serializer.getRegistryName()); + } + } }