Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Data Compat for the Aether & Major Addons #7084

Open
wants to merge 6 commits into
base: mc1.20.1/dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
feat: fluids in datagen without compile-time existence
  • Loading branch information
VoidLeech committed Dec 12, 2024
commit e002d68dc2a5f0088230f3a34b060b932e9f409e
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
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;
Expand Down Expand Up @@ -129,6 +130,10 @@ public ProcessingRecipeBuilder<T> require(ResourceLocation ingredient) {
return this;
}

public ProcessingRecipeBuilder<T> require(Mods mod, String fluid, int amount) {
return require(new FluidIngredient.DatagenFluidIngredient(mod.asResource(fluid), amount));
}

public ProcessingRecipeBuilder<T> require(Fluid fluid, int amount) {
return require(FluidIngredient.fromFluid(fluid, amount));
}
Expand Down Expand Up @@ -183,6 +188,10 @@ public ProcessingRecipeBuilder<T> output(ProcessingOutput output) {
return this;
}

public ProcessingRecipeBuilder<T> output(Mods mod, String fluid, int amount) {
return output(new DatagenFluidStack(mod.asResource(fluid), amount));
}

public ProcessingRecipeBuilder<T> output(Fluid fluid, int amount) {
fluid = FluidHelper.convertToStill(fluid);
return output(new FluidStack(fluid, amount));
Expand Down
Original file line number Diff line number Diff line change
@@ -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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
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;

Expand Down Expand Up @@ -53,11 +54,11 @@ public static boolean isWater(Fluid fluid) {
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;
}
Expand Down Expand Up @@ -133,8 +134,9 @@ public static Fluid convertToStill(Fluid fluid) {

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()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.registries.ForgeRegistries;

import org.jetbrains.annotations.ApiStatus;

public abstract class FluidIngredient implements Predicate<FluidStack> {

public static final FluidIngredient EMPTY = new FluidStackIngredient();
Expand Down Expand Up @@ -256,4 +258,55 @@ protected List<FluidStack> determineMatchingFluidStacks() {

}

/**
* 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<FluidStack> determineMatchingFluidStacks() {
return null;
}

@Override
public JsonObject serialize() {
JsonObject json = super.serialize();
json.addProperty("fluid", fluid.toString());
return json;
}
}

}