package mekanism.common.recipe.inputs; import mekanism.api.gas.GasStack; import mekanism.api.gas.GasTank; import net.minecraft.nbt.NBTTagCompound; /** * An input of gasses for recipe use. * @author aidancbrady * */ public class ChemicalPairInput extends MachineInput<ChemicalPairInput> { /** The left gas of this chemical input */ public GasStack leftGas; /** The right gas of this chemical input */ public GasStack rightGas; /** * Creates a chemical input with two defined gasses. * @param left - left gas * @param right - right gas */ public ChemicalPairInput(GasStack left, GasStack right) { leftGas = left; rightGas = right; } @Override public void load(NBTTagCompound nbtTags) { leftGas = GasStack.readFromNBT(nbtTags.getCompoundTag("leftInput")); rightGas = GasStack.readFromNBT(nbtTags.getCompoundTag("rightInput")); } public ChemicalPairInput() {} public boolean useGas(GasTank leftTank, GasTank rightTank, boolean deplete, int scale) { int leftAmount = leftGas.amount * scale; int rightAmount = rightGas.amount * scale; if(leftTank.canDraw(leftGas.getGas()) && rightTank.canDraw(rightGas.getGas())) { if(leftTank.getStored() >= leftAmount && rightTank.getStored() >= rightAmount) { leftTank.draw(leftAmount, deplete); rightTank.draw(rightAmount, deplete); return true; } } else if(leftTank.canDraw(rightGas.getGas()) && rightTank.canDraw(leftGas.getGas())) { if(leftTank.getStored() >= rightAmount && rightTank.getStored() >= leftAmount) { leftTank.draw(rightAmount, deplete); rightTank.draw(leftAmount, deplete); return true; } } return false; } /** * If this is a valid ChemicalPair * @return */ @Override public boolean isValid() { return leftGas != null && rightGas != null; } /** * Whether or not the defined input contains the same gasses and at least the required amount of the defined gasses as this input. * @param input - input to check * @return if the input meets this input's requirements */ public boolean meetsInput(ChemicalPairInput input) { return meets(input) || meets(input.swap()); } /** * Swaps the right gas and left gas of this input. * @return a swapped ChemicalInput */ public ChemicalPairInput swap() { return new ChemicalPairInput(rightGas, leftGas); } /** * Draws the needed amount of gas from each tank. * @param leftTank - left tank to draw from * @param rightTank - right tank to draw from */ public void draw(GasTank leftTank, GasTank rightTank) { if(meets(new ChemicalPairInput(leftTank.getGas(), rightTank.getGas()))) { leftTank.draw(leftGas.amount, true); rightTank.draw(rightGas.amount, true); } else if(meets(new ChemicalPairInput(rightTank.getGas(), leftTank.getGas()))) { leftTank.draw(rightGas.amount, true); rightTank.draw(leftGas.amount, true); } } /** * Whether or not one of this ChemicalInput's GasStack entry's gas type is equal to the gas type of the given gas. * @param stack - stack to check * @return if the stack's gas type is contained in this ChemicalInput */ public boolean containsType(GasStack stack) { if(stack == null || stack.amount == 0) { return false; } return stack.isGasEqual(leftGas) || stack.isGasEqual(rightGas); } /** * Actual implementation of meetsInput(), performs the checks. * @param input - input to check * @return if the input meets this input's requirements */ private boolean meets(ChemicalPairInput input) { if(input == null || !input.isValid()) { return false; } if(input.leftGas.getGas() != leftGas.getGas() || input.rightGas.getGas() != rightGas.getGas()) { return false; } return input.leftGas.amount >= leftGas.amount && input.rightGas.amount >= rightGas.amount; } @Override public ChemicalPairInput copy() { return new ChemicalPairInput(leftGas.copy(), rightGas.copy()); } @Override public int hashIngredients() { return (leftGas.hashCode() << 8 | rightGas.hashCode()) + (rightGas.hashCode() << 8 | leftGas.hashCode()); } @Override public boolean testEquality(ChemicalPairInput other) { if(!isValid()) { return !other.isValid(); } return (other.leftGas.hashCode() == leftGas.hashCode() && other.rightGas.hashCode() == rightGas.hashCode()) || (other.leftGas.hashCode() == rightGas.hashCode() && other.rightGas.hashCode() == leftGas.hashCode()); } @Override public boolean isInstance(Object other) { return other instanceof ChemicalPairInput; } }