RyanHub – file viewer
filename: common/src/main/java/rearth/oritech/api/recipe/OritechRecipeBuilder.java
branch: 1.21
back to repo
package rearth.oritech.api.recipe;

import dev.architectury.hooks.fluid.FluidStackHooks;
import rearth.oritech.Oritech;
import rearth.oritech.init.recipes.OritechRecipe;
import rearth.oritech.init.recipes.OritechRecipeType;
import net.minecraft.data.server.recipe.RecipeExporter;
import net.minecraft.fluid.Fluid;
import net.minecraft.item.Item;
import net.minecraft.item.ItemConvertible;
import net.minecraft.item.ItemStack;
import net.minecraft.recipe.Ingredient;
import net.minecraft.registry.tag.TagKey;
import net.minecraft.util.Identifier;

import java.util.ArrayList;
import java.util.List;

import com.google.common.base.Optional;

import dev.architectury.fluid.FluidStack;

public abstract class OritechRecipeBuilder {

    protected final OritechRecipeType type;
    protected List<Ingredient> inputs;
    protected List<ItemStack> results;
    protected FluidStack fluidInput;
    protected FluidStack fluidOutput;
    protected int time = 200;
    protected float timeMultiplier = 1f;
    protected boolean addToGrinder;
    private final String resourcePath;

    protected OritechRecipeBuilder(OritechRecipeType type, String resourcePath) {
        this.type = type;
        this.resourcePath = resourcePath;
    }

    public OritechRecipeBuilder input(List<Ingredient> in) {
        if (inputs == null)
            inputs = new ArrayList<>();
        inputs.addAll(in);
        return this;
    }

    public OritechRecipeBuilder input(Ingredient in) {
        if (inputs == null)
            inputs = new ArrayList<>();
        inputs.add(in);
        return this;
    }

    public OritechRecipeBuilder input(ItemConvertible in) {
        return input(Ingredient.ofItems(in));
    }

    public OritechRecipeBuilder input(TagKey<Item> in) {
        return input(Ingredient.fromTag(in));
    }

    public OritechRecipeBuilder fluidInput(FluidStack in) {
        fluidInput = in;
        return this;
    }

    public OritechRecipeBuilder fluidInput(Fluid in, float bucketAmount) {
        return fluidInput(FluidStack.create(in, (long)(bucketAmount * FluidStackHooks.bucketAmount())));
    }

    public OritechRecipeBuilder fluidInput(Fluid in) {
        return fluidInput(FluidStack.create(in, FluidStackHooks.bucketAmount()));
    }

    public OritechRecipeBuilder fluidOutput(FluidStack out) {
        fluidOutput = out;
        return this;
    }

    public OritechRecipeBuilder fluidOutput(Fluid out, float bucketAmount) {
        return fluidOutput(FluidStack.create(out, (long)(bucketAmount * FluidStackHooks.bucketAmount())));
    }

    public OritechRecipeBuilder fluidOutput(Fluid out) {
        return fluidOutput(FluidStack.create(out, FluidStackHooks.bucketAmount()));
    }

    public OritechRecipeBuilder result(ItemStack out) {
        if (results == null)
            results = new ArrayList<>();
        results.add(out);
        return this;
    }

    public OritechRecipeBuilder result(List<ItemStack> out) {
        if (results == null)
            results = new ArrayList<>();
        results.addAll(out);
        return this;
    }

    public OritechRecipeBuilder result(Item out, int count) {

        return result(new ItemStack(out, count));
    }

    public OritechRecipeBuilder result(Item out) {
        return result(out, 1);
    }

    public OritechRecipeBuilder result(Optional<Item> out, int count) {
        if (out.isPresent())
            return result(out.get(), count);
        return this;
    }

    public OritechRecipeBuilder result(Optional<Item> out) {
        return result(out, 1);
    }

    public OritechRecipeBuilder time(int time) {
        this.time = time;
        return this;
    }

    public OritechRecipeBuilder timeInSeconds(int time) {
        return time(time * 20);
    }

    public OritechRecipeBuilder timeMultiplier(float timeMultiplier) {
        this.timeMultiplier = timeMultiplier;
        return this;
    }

    public OritechRecipeBuilder addToGrinder() {
        this.addToGrinder = true;
        return this;
    }

    public abstract void validate(Identifier id) throws IllegalStateException;

    public void export(RecipeExporter exporter, String suffix) {
        var id = Oritech.id(resourcePath + "/" + suffix);
        validate(id);
        
        exporter.accept(
            id,
            new OritechRecipe(
                (int)(time * timeMultiplier),
                inputs != null ? inputs : List.of(),
                results != null ? results : List.of(),
                type,
                fluidInput != null ? fluidInput : FluidStack.empty(),
                fluidOutput != null ? fluidOutput : FluidStack.empty()),
            null);
    }
}