diff --git a/src/main/java/com/simibubi/create/content/processing/recipe/ProcessingRecipeBuilder.java b/src/main/java/com/simibubi/create/content/processing/recipe/ProcessingRecipeBuilder.java index 7004a95d0..e00b143a4 100644 --- a/src/main/java/com/simibubi/create/content/processing/recipe/ProcessingRecipeBuilder.java +++ b/src/main/java/com/simibubi/create/content/processing/recipe/ProcessingRecipeBuilder.java @@ -7,6 +7,7 @@ import java.util.function.Consumer; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.simibubi.create.foundation.data.SimpleDatagenIngredient; +import com.simibubi.create.foundation.data.recipe.DatagenFluidStack; import com.simibubi.create.foundation.data.recipe.Mods; import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.fluid.FluidIngredient; @@ -129,6 +130,10 @@ public class ProcessingRecipeBuilder> { return this; } + public ProcessingRecipeBuilder require(Mods mod, String fluid, int amount) { + return require(new FluidIngredient.DatagenFluidIngredient(mod.asResource(fluid), amount)); + } + public ProcessingRecipeBuilder require(Fluid fluid, int amount) { return require(FluidIngredient.fromFluid(fluid, amount)); } @@ -183,6 +188,10 @@ public class ProcessingRecipeBuilder> { return this; } + public ProcessingRecipeBuilder output(Mods mod, String fluid, int amount) { + return output(new DatagenFluidStack(mod.asResource(fluid), amount)); + } + public ProcessingRecipeBuilder output(Fluid fluid, int amount) { fluid = FluidHelper.convertToStill(fluid); return output(new FluidStack(fluid, amount)); diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/DatagenFluidStack.java b/src/main/java/com/simibubi/create/foundation/data/recipe/DatagenFluidStack.java new file mode 100644 index 000000000..8d50e1cef --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/DatagenFluidStack.java @@ -0,0 +1,29 @@ +package com.simibubi.create.foundation.data.recipe; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.material.Fluids; +import net.minecraftforge.fluids.FluidStack; + +import org.jetbrains.annotations.ApiStatus; + +/** + * Used to represent fluid outputs in recipe datagen without needing the fluid to exist at runtime. + */ +@ApiStatus.Internal +public final class DatagenFluidStack extends FluidStack { + private final ResourceLocation actualFluid; + + public DatagenFluidStack(ResourceLocation fluid, int amount) { + // This fluid is a farce + super(Fluids.WATER, amount); + actualFluid = fluid; + } + + /** + * Supersedes the result of getFluid() for the purpose of obtaining a string representation of the fluid + * @return String value of the actual fluid's ResourceLocation + */ + public String getActualFluid(){ + return actualFluid.toString(); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java b/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java index e00cbd7d3..c805732bd 100644 --- a/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java +++ b/src/main/java/com/simibubi/create/foundation/fluid/FluidHelper.java @@ -11,6 +11,7 @@ import com.simibubi.create.content.fluids.tank.CreativeFluidTankBlockEntity; import com.simibubi.create.content.fluids.transfer.GenericItemEmptying; import com.simibubi.create.content.fluids.transfer.GenericItemFilling; import com.simibubi.create.foundation.blockEntity.SmartBlockEntity; +import com.simibubi.create.foundation.data.recipe.DatagenFluidStack; import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.RegisteredObjects; @@ -53,11 +54,11 @@ public class FluidHelper { public static boolean isLava(Fluid fluid) { return convertToStill(fluid) == Fluids.LAVA; } - + public static boolean isSame(FluidStack fluidStack, FluidStack fluidStack2) { return fluidStack.getFluid() == fluidStack2.getFluid(); } - + public static boolean isSame(FluidStack fluidStack, Fluid fluid) { return fluidStack.getFluid() == fluid; } @@ -133,8 +134,9 @@ public class FluidHelper { public static JsonElement serializeFluidStack(FluidStack stack) { JsonObject json = new JsonObject(); - json.addProperty("fluid", RegisteredObjects.getKeyOrThrow(stack.getFluid()) - .toString()); + json.addProperty("fluid", stack instanceof DatagenFluidStack datagenFluidStack ? + datagenFluidStack.getActualFluid() : + RegisteredObjects.getKeyOrThrow(stack.getFluid()).toString()); json.addProperty("amount", stack.getAmount()); if (stack.hasTag()) json.addProperty("nbt", stack.getTag() diff --git a/src/main/java/com/simibubi/create/foundation/fluid/FluidIngredient.java b/src/main/java/com/simibubi/create/foundation/fluid/FluidIngredient.java index ce69e7579..0a4a4c37f 100644 --- a/src/main/java/com/simibubi/create/foundation/fluid/FluidIngredient.java +++ b/src/main/java/com/simibubi/create/foundation/fluid/FluidIngredient.java @@ -26,6 +26,8 @@ import net.minecraft.world.level.material.Fluid; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.ApiStatus; + public abstract class FluidIngredient implements Predicate { public static final FluidIngredient EMPTY = new FluidStackIngredient(); @@ -256,4 +258,55 @@ public abstract class FluidIngredient implements Predicate { } + /** + * Used to represent fluid inputs in recipe datagen without needing the fluid to exist at runtime. + */ + @ApiStatus.Internal + public static final class DatagenFluidIngredient extends FluidIngredient{ + + private final ResourceLocation fluid; + + public DatagenFluidIngredient(ResourceLocation fluid, int amountRequired) { + this.fluid = fluid; + this.amountRequired = amountRequired; + } + + @Override + protected boolean testInternal(FluidStack t) { + return false; + } + + @Override + protected void readInternal(FriendlyByteBuf buffer) { + + } + + @Override + protected void writeInternal(FriendlyByteBuf buffer) { + + } + + @Override + protected void readInternal(JsonObject json) { + + } + + @Override + protected void writeInternal(JsonObject json) { + + } + + @Override + protected List determineMatchingFluidStacks() { + return null; + } + + @Override + public JsonObject serialize() { + JsonObject json = super.serialize(); + json.addProperty("fluid", fluid.toString()); + return json; + } + } + }