/* * 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.blocks.machine.beta; import java.util.EnumMap; import java.util.Map; import mods.railcraft.api.core.items.IStackFilter; import mods.railcraft.common.blocks.machine.IEnumMachine; import mods.railcraft.common.items.Metal; import mods.railcraft.common.util.inventory.InvTools; import mods.railcraft.common.util.inventory.filters.ComplexStackFilter; import mods.railcraft.common.util.inventory.filters.ExclusionStackFilter; import mods.railcraft.common.util.inventory.manipulators.InventoryManipulator; import mods.railcraft.common.util.misc.Game; import net.minecraft.inventory.IInventory; /** * * @author CovertJaguar <http://www.railcraft.info> */ public class TileChestMetals extends TileChestRailcraft { private static final int TICK_PER_CONDENSE = 16; private static final Map<Metal, IStackFilter> nuggetFilters = new EnumMap<Metal, IStackFilter>(Metal.class); private static final Map<Metal, IStackFilter> ingotFilters = new EnumMap<Metal, IStackFilter>(Metal.class); private static final Map<Metal, IStackFilter> blockFilters = new EnumMap<Metal, IStackFilter>(Metal.class); static { for (Metal m : Metal.VALUES) { nuggetFilters.put(m, ComplexStackFilter.and(new ExclusionStackFilter(m.getNugget()), m.nuggetFilter)); ingotFilters.put(m, ComplexStackFilter.and(new ExclusionStackFilter(m.getIngot()), m.ingotFilter)); blockFilters.put(m, ComplexStackFilter.and(new ExclusionStackFilter(m.getBlock()), m.blockFilter)); } } enum Target { NUGGET_CONDENSE { @Override public boolean evaluate(IInventory inv) { InventoryManipulator im = InventoryManipulator.get(inv); for (Metal metal : Metal.VALUES) { if (metal.getIngot() != null && im.canRemoveItems(metal.nuggetFilter, 9) && im.canAddStack(metal.getIngot())) { im.removeItems(metal.nuggetFilter, 9); im.addStack(metal.getIngot()); return true; } } return false; } }, INGOT_CONDENSE { @Override public boolean evaluate(IInventory inv) { InventoryManipulator im = InventoryManipulator.get(inv); for (Metal metal : Metal.VALUES) { if (metal.getBlock() != null && im.canRemoveItems(metal.ingotFilter, 9) && im.canAddStack(metal.getBlock())) { im.removeItems(metal.ingotFilter, 9); im.addStack(metal.getBlock()); return true; } } return false; } }, NUGGET_SWAP { @Override public boolean evaluate(IInventory inv) { InventoryManipulator im = InventoryManipulator.get(inv); for (Metal metal : Metal.VALUES) { IStackFilter filter = nuggetFilters.get(metal); if (metal.getNugget() != null && im.canRemoveItems(filter, 1) && im.canAddStack(metal.getNugget())) { im.removeItems(filter, 1); im.addStack(metal.getNugget()); return true; } } return false; } }, INGOT_SWAP { @Override public boolean evaluate(IInventory inv) { InventoryManipulator im = InventoryManipulator.get(inv); for (Metal metal : Metal.VALUES) { IStackFilter filter = ingotFilters.get(metal); if (metal.getIngot() != null && im.canRemoveItems(filter, 1) && im.canAddStack(metal.getIngot())) { im.removeItems(filter, 1); im.addStack(metal.getIngot()); return true; } } return false; } }, BLOCK_SWAP { @Override public boolean evaluate(IInventory inv) { InventoryManipulator im = InventoryManipulator.get(inv); for (Metal metal : Metal.VALUES) { IStackFilter filter = blockFilters.get(metal); if (metal.getBlock() != null && im.canRemoveItems(filter, 1) && im.canAddStack(metal.getBlock())) { im.removeItems(filter, 1); im.addStack(metal.getBlock()); return true; } } return false; } }; public final static Target[] VALUES = values(); public abstract boolean evaluate(IInventory inv); public Target next() { Target next = VALUES[(ordinal() + 1) % VALUES.length]; return next; } } private Target target = Target.NUGGET_CONDENSE; @Override public IEnumMachine getMachineType() { return EnumMachineBeta.METALS_CHEST; } @Override public void updateEntity() { super.updateEntity(); if (clock % TICK_PER_CONDENSE == 0 && Game.isHost(worldObj)) if (!target.evaluate(this)) target = target.next(); } }