FurnaceRecipe.java

package it.fulminazzo.yagl.items.recipes;

import it.fulminazzo.yagl.Constants;
import it.fulminazzo.yagl.items.Item;
import it.fulminazzo.yagl.wrappers.Range;
import it.fulminazzo.yagl.wrappers.Wrapper;
import lombok.AccessLevel;
import lombok.Getter;
import org.jetbrains.annotations.NotNull;

import java.util.Collections;
import java.util.List;

/**
 * An implementation of {@link Recipe} to express any recipe in the furnace in Minecraft.
 */
@Getter
public class FurnaceRecipe extends RecipeImpl {
    @Getter(AccessLevel.NONE)
    private Item ingredient;
    @Range(min = 0)
    private float experience;
    @Range(min = 0)
    private double cookingTime;

    private FurnaceRecipe() {
        this("pending");
    }

    /**
     * Instantiates a new Furnace recipe.
     *
     * @param id the id
     */
    public FurnaceRecipe(final @NotNull String id) {
        super(id);
    }

    /**
     * Sets ingredient.
     *
     * @param ingredient the ingredient
     * @return this recipe
     */
    public @NotNull FurnaceRecipe setIngredient(final @NotNull Item ingredient) {
        this.ingredient = ingredient.copy(Item.class);
        return this;
    }

    /**
     * Sets experience.
     *
     * @param experience the experience
     * @return this recipe
     */
    public @NotNull FurnaceRecipe setExperience(final float experience) {
        this.experience = Wrapper.check(this, experience);
        return this;
    }

    /**
     * Gets cooking time in ticks.
     *
     * @return the cooking time
     */
    public long getCookingTimeInTicks() {
        return (long) (this.cookingTime * Constants.TICKS_IN_SECOND);
    }

    /**
     * Sets cooking time in seconds.
     *
     * @param cookingTime the cooking time
     * @return this recipe
     */
    public @NotNull FurnaceRecipe setCookingTime(final double cookingTime) {
        this.cookingTime = Wrapper.check(this, cookingTime);
        return this;
    }

    @Override
    public @NotNull FurnaceRecipe setOutput(final @NotNull Item output) {
        this.output = output.copy(Item.class);
        return this;
    }

    @Override
    public @NotNull List<Item> getIngredients() {
        return Collections.singletonList(this.ingredient);
    }
}