/** * Copyright (c) SpaceToad, 2011 http://www.mod-buildcraft.com * * BuildCraft is distributed under the terms of the Minecraft Mod Public License * 1.0, or MMPL. Please check the contents of the license located in * http://www.mod-buildcraft.com/MMPL-1.0.txt */ package buildcraft.api.recipes; import com.google.common.base.Objects; import java.util.Collections; import java.util.SortedSet; import java.util.TreeSet; import net.minecraftforge.fluids.FluidStack; public final class RefineryRecipes { private static SortedSet recipes = new TreeSet(); public static void addRecipe(FluidStack ingredient, FluidStack result, int energy, int delay) { addRecipe(ingredient, null, result, energy, delay); } public static void addRecipe(FluidStack ingredient1, FluidStack ingredient2, FluidStack result, int energy, int delay) { Recipe recipe = new Recipe(ingredient1, ingredient2, result, energy, delay); recipes.add(recipe); } public static SortedSet getRecipes() { return Collections.unmodifiableSortedSet(recipes); } public static Recipe findRefineryRecipe(FluidStack liquid1, FluidStack liquid2) { for (Recipe recipe : recipes) { if (recipe.matches(liquid1, liquid2)) return recipe; } return null; } private RefineryRecipes() { } public static final class Recipe implements Comparable { public final FluidStack ingredient1; public final FluidStack ingredient2; public final FluidStack result; public final int energy; public final int delay; private Recipe(FluidStack ingredient1, FluidStack ingredient2, FluidStack result, int energy, int delay) { if (ingredient1 == null) throw new IllegalArgumentException("First Ingredient cannot be null!"); this.ingredient1 = ingredient1; this.ingredient2 = ingredient2; this.result = result; this.energy = energy; this.delay = delay; } public boolean matches(FluidStack liquid1, FluidStack liquid2) { // No inputs, return. if (liquid1 == null && liquid2 == null) return false; // Return if two ingredients are required but only one was supplied. if ((ingredient1 != null && ingredient2 != null) && (liquid1 == null || liquid2 == null)) return false; if (liquid1 != null && liquid2 != null) { if (liquid1.containsFluid(ingredient1) && liquid1.containsFluid(ingredient2)) return true; if (liquid1.containsFluid(ingredient2) && liquid1.containsFluid(ingredient1)) return true; } if (liquid1 != null) return liquid1.containsFluid(ingredient1) || liquid1.containsFluid(ingredient2); if (liquid2 != null) return liquid2.containsFluid(ingredient1) || liquid2.containsFluid(ingredient2); return false; } // Compares to only the types of source materials. // We consider non-null < null in order that one-ingredient recipe is checked after // the failure of matching two-ingredient recipes which include that liquid. @Override public int compareTo(Recipe other) { if (other == null) return -1; else if (ingredient1.getFluid() != other.ingredient1.getFluid()) return ingredient1.getFluid().getName().compareTo(other.ingredient1.getFluid().getName()); else if (ingredient1.amount != other.ingredient1.amount) return other.ingredient1.amount - ingredient1.amount; else if (ingredient2 == null) return other.ingredient2 == null ? 0 : 1; else if (other.ingredient2 == null) return -1; else if (ingredient2.getFluid() != other.ingredient2.getFluid()) return ingredient2.getFluid().getName().compareTo(other.ingredient2.getFluid().getName()); else if (ingredient2.amount != other.ingredient2.amount) return other.ingredient2.amount - ingredient2.amount; return 0; } // equals() should be consistent with compareTo(). @Override public boolean equals(Object obj) { return obj instanceof Recipe && Objects.equal(ingredient1, ((Recipe) obj).ingredient1) && Objects.equal(ingredient2, ((Recipe) obj).ingredient2); } // hashCode() should be overridden because equals() was overridden. @Override public int hashCode() { return Objects.hashCode(ingredient1, ingredient2); } } }