Skip to content

Commit

Permalink
Add ability to build recipes with a different serialiser
Browse files Browse the repository at this point in the history
This makes generating several special recipes easily.
  • Loading branch information
TeamSpen210 committed Dec 30, 2019
1 parent ecd47e6 commit abb1f29
Showing 1 changed file with 81 additions and 14 deletions.
Expand Up @@ -4,13 +4,15 @@
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;
import net.minecraft.item.Item;
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;
Expand Down Expand Up @@ -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.
*/
Expand All @@ -49,19 +55,29 @@ private static class Finished implements IFinishedRecipe {
private final boolean mirror;
private final List<ICondition> condList;
private final ResourceLocation id;

private Finished(ResourceLocation id, IFinishedRecipe recipe, boolean mirror, List<ICondition> cond) {
@Nullable
private IRecipeSerializer<?> custSerial;

private Finished(
ResourceLocation id,
IFinishedRecipe recipe,
@Nullable IRecipeSerializer<?> custSerial,
boolean mirror,
List<ICondition> 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;
}

Expand All @@ -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
Expand All @@ -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();
}

Expand All @@ -115,26 +134,27 @@ private static class FinishedTexture extends Finished {
private final boolean matchFirst;

private FinishedTexture(ResourceLocation id, IFinishedRecipe recipe, boolean mirror, Ingredient texSource, boolean matchFirst, List<ICondition> 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;
}
}

public static class ShapedBuilder extends ShapedRecipeBuilder {
private ArrayList<ICondition> conditions;
@Nullable
private IRecipeSerializer<?> custSerial;
@Nullable
private Ingredient textureSource;
private boolean textureMatchFirst;
private boolean mirror;
Expand All @@ -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;
Expand Down Expand Up @@ -189,7 +214,7 @@ public void build(Consumer<IFinishedRecipe> 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)
);
}

Expand All @@ -209,13 +234,15 @@ public void build(Consumer<IFinishedRecipe> 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<ICondition> conditions;
@Nullable
private IRecipeSerializer<?> custSerial;

private ShapelessBuilder(IItemProvider result, int count) {
super(result, count);
Expand All @@ -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<IFinishedRecipe> consumer, ResourceLocation recipeLoc) {
// Capture the finished recipe which will be sent to the consumer.
Expand All @@ -236,12 +268,47 @@ public void build(Consumer<IFinishedRecipe> 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
public void build(@Nonnull Consumer<IFinishedRecipe> consumer, String path) {
build(consumer, Util.getResource(path));
}
}

public static class CustomBuilder {
private final SpecialRecipeSerializer<?> serializer;
private ArrayList<ICondition> 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<IFinishedRecipe> 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<IFinishedRecipe> consumer, String path) {
build(consumer, Util.getResource(path));
}

public void build(@Nonnull Consumer<IFinishedRecipe> consumer) {
build(consumer, serializer.getRegistryName());
}
}
}

0 comments on commit abb1f29

Please sign in to comment.