127 lines
4.1 KiB
Java
127 lines
4.1 KiB
Java
|
/**
|
||
|
* 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);
|
||
|
}
|
||
|
}
|
||
|
}
|