blob: 64985bf791e70fe012b1fa9ae60486d7395e03de [file] [log] [blame] [raw]
/**
* 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<Recipe> recipes = new TreeSet<Recipe>();
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<Recipe> 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<Recipe> {
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);
}
}
}