vazkii.botania.api.recipe.RecipePetals.java Source code

Java tutorial

Introduction

Here is the source code for vazkii.botania.api.recipe.RecipePetals.java

Source

/**
 * This class was created by <Vazkii>. It's distributed as
 * part of the Botania Mod. Get the Source Code in github:
 * https://github.com/Vazkii/Botania
 *
 * Botania is Open Source and distributed under the
 * Botania License: http://botaniamod.net/license.php
 *
 * File Created @ [Jan 22, 2014, 2:02:44 PM (GMT)]
 */
package vazkii.botania.api.recipe;

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

import com.google.common.collect.ImmutableList;

import net.minecraft.item.ItemStack;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.oredict.OreDictionary;

public class RecipePetals {

    private final ItemStack output;
    private final ImmutableList<Object> inputs;

    public RecipePetals(ItemStack output, Object... inputs) {
        this.output = output;

        ImmutableList.Builder<Object> inputsToSet = ImmutableList.builder();
        for (Object obj : inputs) {
            if (obj instanceof String || obj instanceof ItemStack)
                inputsToSet.add(obj);
            else
                throw new IllegalArgumentException("Invalid input");
        }

        this.inputs = inputsToSet.build();
    }

    public boolean matches(IItemHandler inv) {
        List<Object> inputsMissing = new ArrayList<>(inputs);

        for (int i = 0; i < inv.getSlots(); i++) {
            ItemStack stack = inv.getStackInSlot(i);
            if (stack == null)
                break;

            int stackIndex = -1, oredictIndex = -1;

            for (int j = 0; j < inputsMissing.size(); j++) {
                Object input = inputsMissing.get(j);
                if (input instanceof String) {
                    List<ItemStack> validStacks = OreDictionary.getOres((String) input);
                    boolean found = false;
                    for (ItemStack ostack : validStacks) {
                        ItemStack cstack = ostack.copy();
                        if (cstack.getItemDamage() == Short.MAX_VALUE)
                            cstack.setItemDamage(stack.getItemDamage());

                        if (stack.isItemEqual(cstack)) {
                            oredictIndex = j;
                            found = true;
                            break;
                        }
                    }

                    if (found)
                        break;
                } else if (input instanceof ItemStack && simpleAreStacksEqual((ItemStack) input, stack)) {
                    stackIndex = j;
                    break;
                }
            }

            if (stackIndex != -1)
                inputsMissing.remove(stackIndex);
            else if (oredictIndex != -1)
                inputsMissing.remove(oredictIndex);
            else
                return false;
        }

        return inputsMissing.isEmpty();
    }

    private boolean simpleAreStacksEqual(ItemStack stack, ItemStack stack2) {
        return stack.getItem() == stack2.getItem() && stack.getItemDamage() == stack2.getItemDamage();
    }

    public List<Object> getInputs() {
        return inputs;
    }

    public ItemStack getOutput() {
        return output;
    }

}