/* * Copyright (c) CovertJaguar, 2014 http://railcraft.info * * This code is the property of CovertJaguar * and may only be used with explicit written * permission unless otherwise specified on the * license page at http://railcraft.info/wiki/info:license. */ package mods.railcraft.common.util.crafting; import com.google.common.collect.Maps; import java.util.ArrayList; import java.util.List; import java.util.Map; import net.minecraft.item.ItemStack; import mods.railcraft.api.crafting.IRockCrusherCraftingManager; import mods.railcraft.api.crafting.IRockCrusherRecipe; import mods.railcraft.api.crafting.RailcraftCraftingManager; import mods.railcraft.common.util.inventory.InvTools; import mods.railcraft.common.util.misc.MiscTools; public class RockCrusherCraftingManager implements IRockCrusherCraftingManager { private final List<CrusherRecipe> recipes = new ArrayList<CrusherRecipe>(); public static IRockCrusherCraftingManager getInstance() { return RailcraftCraftingManager.rockCrusher; } @Override public List<? extends IRockCrusherRecipe> getRecipes() { return recipes; } public static class CrusherRecipe implements IRockCrusherRecipe { private final ItemStack input; private final boolean matchDamage; private final boolean matchNBT; private final List<Map.Entry<ItemStack, Float>> outputs = new ArrayList<Map.Entry<ItemStack, Float>>(); public CrusherRecipe(ItemStack input, boolean matchDamage, boolean matchNBT) { this.input = input.copy(); this.matchDamage = matchDamage; this.matchNBT = matchNBT; } @Override public ItemStack getInput() { return input.copy(); } @Override public void addOutput(ItemStack output, float chance) { if (output == null) return; outputs.add(Maps.immutableEntry(output, chance)); } @Override public List<Map.Entry<ItemStack, Float>> getOutputs() { return outputs; } @Override public List<ItemStack> getPossibleOuputs() { List<ItemStack> list = new ArrayList<ItemStack>(); for (Map.Entry<ItemStack, Float> entry : outputs) { ItemStack output = entry.getKey(); for (ItemStack saved : list) { if (InvTools.isItemEqual(saved, output)) { if (saved.stackSize + output.stackSize <= saved.getMaxStackSize()) { saved.stackSize += output.stackSize; output = null; } else { int diff = saved.getMaxStackSize() - saved.stackSize; saved.stackSize = saved.getMaxStackSize(); output.stackSize -= diff; } break; } } if (output != null) { list.add(output.copy()); } } return list; } @Override public List<ItemStack> getRandomizedOuputs() { List<ItemStack> list = new ArrayList<ItemStack>(); for (Map.Entry<ItemStack, Float> entry : outputs) { if (MiscTools.getRand().nextFloat() <= entry.getValue()) { list.add(entry.getKey().copy()); } } return list; } public int getNumberOfOutputs() { return outputs.size(); } } /** * * @param input * @param matchDamage * @param matchNBT * @return */ @Override public IRockCrusherRecipe createNewRecipe(ItemStack input, boolean matchDamage, boolean matchNBT) { CrusherRecipe recipe = new CrusherRecipe(input, matchDamage, matchNBT); recipes.add(recipe); return recipe; } @Override public CrusherRecipe getRecipe(ItemStack input) { if (input == null) return null; for (CrusherRecipe r : recipes) { if (!r.matchDamage || InvTools.isWildcard(r.input)) continue; if (InvTools.isItemEqual(input, r.input, true, r.matchNBT)) return r; } for (CrusherRecipe r : recipes) { if (InvTools.isItemEqual(input, r.input, r.matchDamage, r.matchNBT)) return r; } return null; } }