ActuallyAdditions/src/main/java/de/ellpeck/actuallyadditions/mod/crafting/FermentingRecipe.java

231 lines
7.8 KiB
Java
Raw Normal View History

2022-01-15 19:38:00 +01:00
package de.ellpeck.actuallyadditions.mod.crafting;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
2022-01-16 19:54:17 +01:00
import de.ellpeck.actuallyadditions.mod.inventory.gui.FluidDisplay;
2024-03-03 01:20:53 +01:00
import net.minecraft.core.RegistryAccess;
2024-03-02 21:23:08 +01:00
import net.minecraft.data.recipes.FinishedRecipe;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.GsonHelper;
import net.minecraft.world.Container;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.item.crafting.RecipeSerializer;
import net.minecraft.world.item.crafting.RecipeType;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.material.Fluid;
2022-01-15 19:38:00 +01:00
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.registries.ForgeRegistries;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
2022-01-16 19:54:17 +01:00
import java.util.Optional;
2022-01-15 19:38:00 +01:00
2024-03-02 21:23:08 +01:00
public class FermentingRecipe implements Recipe<Container> {
2022-01-15 19:38:00 +01:00
public static final String NAME = "fermenting";
private final ResourceLocation ID;
private final FluidStack input;
private final FluidStack output;
2022-01-16 19:54:17 +01:00
private final int time;
private Optional<FluidDisplay> inputDisplay;
private Optional<FluidDisplay> outputDisplay;
2022-01-15 19:38:00 +01:00
public FermentingRecipe(ResourceLocation ID, FluidStack input, FluidStack output, int timeIn) {
this.ID = ID;
this.input = input;
this.output = output;
this.time = timeIn;
}
public boolean matches(FluidStack stack) {
return stack.isFluidEqual(this.input);
}
public boolean matches(FluidStack input, FluidStack output) {
return input.isFluidEqual(this.input) && (output.isEmpty() || output.isFluidEqual(this.output) && input.getAmount() >= this.input.getAmount());
}
2022-01-16 19:54:17 +01:00
public Optional<FluidDisplay> getInputDisplay() {
return inputDisplay;
}
public void setInputDisplay(FluidDisplay inputDisplay) {
this.inputDisplay = Optional.of(inputDisplay);
}
public Optional<FluidDisplay> getOutputDisplay() {
return outputDisplay;
}
public void setOutputDisplay(FluidDisplay outputDisplay) {
this.outputDisplay = Optional.of(outputDisplay);
}
2022-01-15 19:38:00 +01:00
public int getTime() {
return this.time;
}
public FluidStack getOutput() {
return output;
}
public FluidStack getInput() {
return input;
}
@Override
2024-03-02 21:23:08 +01:00
public boolean matches(Container pInv, Level pLevel) {
2022-01-15 19:38:00 +01:00
return false;
}
@Override
public boolean isSpecial() {
return true;
}
@Nonnull
2022-01-15 19:38:00 +01:00
@Override
2024-03-03 01:20:53 +01:00
public ItemStack assemble(Container pInv, RegistryAccess pRegistryAccess) {
2022-01-15 19:38:00 +01:00
return ItemStack.EMPTY;
}
@Override
public boolean canCraftInDimensions(int pWidth, int pHeight) {
return false;
}
@Nonnull
2022-01-15 19:38:00 +01:00
@Override
2024-03-03 01:20:53 +01:00
public ItemStack getResultItem(RegistryAccess pRegistryAccess) {
2022-01-15 19:38:00 +01:00
return ItemStack.EMPTY;
}
@Nonnull
2022-01-15 19:38:00 +01:00
@Override
public ResourceLocation getId() {
return ID;
}
@Nonnull
2022-01-15 19:38:00 +01:00
@Override
2024-03-02 21:23:08 +01:00
public RecipeSerializer<?> getSerializer() {
2022-01-15 19:38:00 +01:00
return ActuallyRecipes.FERMENTING_RECIPE.get();
}
@Nonnull
2022-01-15 19:38:00 +01:00
@Override
2024-03-02 21:23:08 +01:00
public RecipeType<?> getType() {
2022-01-15 19:38:00 +01:00
return ActuallyRecipes.Types.FERMENTING;
}
2024-03-03 01:20:53 +01:00
public static class Serializer implements RecipeSerializer<FermentingRecipe> {
2022-01-15 19:38:00 +01:00
@Nonnull
@Override
public FermentingRecipe fromJson(@Nonnull ResourceLocation pRecipeId, @Nonnull JsonObject pJson) {
JsonObject ingredient = pJson.getAsJsonObject("ingredient");
2024-03-02 21:23:08 +01:00
ResourceLocation fluidRes = new ResourceLocation(GsonHelper.getAsString(ingredient, "fluid"));
2022-01-15 19:38:00 +01:00
Fluid fluid = ForgeRegistries.FLUIDS.getValue(fluidRes);
if (fluid == null)
throw new JsonParseException("Unknown fluid '" + fluidRes + "'");
2024-03-02 21:23:08 +01:00
int inputAmount = GsonHelper.getAsInt(ingredient, "amount", 80);
2022-01-15 19:38:00 +01:00
FluidStack input = new FluidStack(fluid, inputAmount);
JsonObject result = pJson.getAsJsonObject("result");
2024-03-02 21:23:08 +01:00
ResourceLocation fluidOutputRes = new ResourceLocation(GsonHelper.getAsString(result, "fluid"));
int outputAmount = GsonHelper.getAsInt(result, "amount");
2022-01-15 19:38:00 +01:00
Fluid fluidOutput = ForgeRegistries.FLUIDS.getValue(fluidOutputRes);
if(fluidOutput == null)
throw new JsonParseException("Unknown fluid '" + fluidRes + "'");
FluidStack output = new FluidStack(fluidOutput, outputAmount);
2024-03-02 21:23:08 +01:00
int time = GsonHelper.getAsInt(pJson, "time", 100);
2022-01-15 19:38:00 +01:00
return new FermentingRecipe(pRecipeId, input, output, time);
}
@Nullable
@Override
2024-03-02 21:23:08 +01:00
public FermentingRecipe fromNetwork(@Nonnull ResourceLocation pRecipeId, @Nonnull FriendlyByteBuf pBuffer) {
2022-01-15 19:38:00 +01:00
ResourceLocation inputRes = new ResourceLocation(pBuffer.readUtf());
int inputAmount = pBuffer.readInt();
Fluid inputFluid = ForgeRegistries.FLUIDS.getValue(inputRes);
if(inputFluid == null)
throw new JsonParseException("Unknown input fluid '" + inputRes + "'");
FluidStack input = new FluidStack(inputFluid, inputAmount);
ResourceLocation outputRes = new ResourceLocation(pBuffer.readUtf());
int outputAmount = pBuffer.readInt();
Fluid outputFluid = ForgeRegistries.FLUIDS.getValue(outputRes);
if(outputFluid == null)
throw new JsonParseException("Unknown output fluid '" + outputRes + "'");
FluidStack output = new FluidStack(outputFluid, outputAmount);
int time = pBuffer.readInt();
return new FermentingRecipe(pRecipeId, input, output, time);
}
@Override
2024-03-02 21:23:08 +01:00
public void toNetwork(@Nonnull FriendlyByteBuf pBuffer, @Nonnull FermentingRecipe pRecipe) {
2024-03-03 01:20:53 +01:00
pBuffer.writeUtf(ForgeRegistries.FLUIDS.getKey(pRecipe.input.getFluid()).toString());
2022-01-15 19:38:00 +01:00
pBuffer.writeInt(pRecipe.input.getAmount());
2024-03-03 01:20:53 +01:00
pBuffer.writeUtf(ForgeRegistries.FLUIDS.getKey(pRecipe.output.getFluid()).toString());
2022-01-15 19:38:00 +01:00
pBuffer.writeInt(pRecipe.output.getAmount());
pBuffer.writeInt(pRecipe.time);
}
}
2024-03-02 21:23:08 +01:00
public static class Result implements FinishedRecipe {
2022-01-15 19:38:00 +01:00
private final ResourceLocation ID;
private final FluidStack input;
private final FluidStack output;
private final int time;
2024-03-02 21:23:08 +01:00
public Result(ResourceLocation ID, FluidStack input, FluidStack output, int timeIn) {
2022-01-15 19:38:00 +01:00
this.ID = ID;
this.input = input;
this.output = output;
this.time = timeIn;
}
@Override
public void serializeRecipeData(JsonObject pJson) {
JsonObject ingredient = new JsonObject();
2024-03-03 01:20:53 +01:00
ingredient.addProperty("fluid", ForgeRegistries.FLUIDS.getKey(input.getFluid()).toString());
2022-01-15 19:38:00 +01:00
ingredient.addProperty("amount", input.getAmount());
JsonObject result = new JsonObject();
2024-03-03 01:20:53 +01:00
result.addProperty("fluid", ForgeRegistries.FLUIDS.getKey(output.getFluid()).toString());
2022-01-15 19:38:00 +01:00
result.addProperty("amount", output.getAmount());
pJson.add("ingredient", ingredient);
pJson.add("result", result);
pJson.addProperty("time", time);
}
@Override
public ResourceLocation getId() {
return ID;
}
@Override
2024-03-02 21:23:08 +01:00
public RecipeSerializer<?> getType() {
2022-01-15 19:38:00 +01:00
return ActuallyRecipes.FERMENTING_RECIPE.get();
}
@Nullable
@Override
public JsonObject serializeAdvancement() {
return null;
}
@Nullable
@Override
public ResourceLocation getAdvancementId() {
return null;
}
}
}