blob: d4039dde4ffdd34b4c7c97cb91c8a4ef5b14cf10 [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 java.util.Collections;
import java.util.SortedSet;
import java.util.TreeSet;
import net.minecraftforge.liquids.LiquidStack;
public class RefineryRecipe implements Comparable<RefineryRecipe> {
private static SortedSet<RefineryRecipe> recipes = new TreeSet<RefineryRecipe>();
public static void registerRefineryRecipe(RefineryRecipe recipe) {
if (!recipes.contains(recipe)) {
recipes.add(recipe);
}
}
public static SortedSet<RefineryRecipe> getRecipes() {
return Collections.unmodifiableSortedSet(recipes);
}
public static RefineryRecipe findRefineryRecipe(LiquidStack liquid1, LiquidStack liquid2) {
for (RefineryRecipe recipe : recipes)
if (recipe.matches(liquid1, liquid2))
return recipe;
return null;
}
public final LiquidStack ingredient1;
public final LiquidStack ingredient2;
public final LiquidStack result;
public final int energy;
public final int delay;
public RefineryRecipe(int ingredientId1, int ingredientQty1, int ingredientId2, int ingredientQty2, int resultId, int resultQty, int energy, int delay) {
this(new LiquidStack(ingredientId1, ingredientQty1, 0), new LiquidStack(ingredientId2, ingredientQty2, 0), new LiquidStack(resultId, resultQty, 0),
energy, delay);
}
public RefineryRecipe(LiquidStack ingredient1, LiquidStack ingredient2, LiquidStack result, int energy, int delay) {
// Sort starting materials.
if (ingredient1 != null && ingredient2 != null) {
if ((ingredient1.itemID > ingredient2.itemID) || (ingredient1.itemID == ingredient2.itemID && ingredient1.itemMeta > ingredient2.itemMeta)) {
this.ingredient1 = ingredient2;
this.ingredient2 = ingredient1;
} else {
this.ingredient1 = ingredient1;
this.ingredient2 = ingredient2;
}
} else if (ingredient2 != null) {
this.ingredient1 = ingredient2;
this.ingredient2 = ingredient1;
} else {
this.ingredient1 = ingredient1;
this.ingredient2 = ingredient2;
}
this.result = result;
this.energy = energy;
this.delay = delay;
}
public boolean matches(LiquidStack liquid1, LiquidStack 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 (ingredient1 != null) {
if (ingredient2 == null)
return ingredient1.isLiquidEqual(liquid1) || ingredient1.isLiquidEqual(liquid2);
else
return (ingredient1.isLiquidEqual(liquid1) && ingredient2.isLiquidEqual(liquid2))
|| (ingredient2.isLiquidEqual(liquid1) && ingredient1.isLiquidEqual(liquid2));
} else if (ingredient2 != null)
return ingredient2.isLiquidEqual(liquid1) || ingredient2.isLiquidEqual(liquid2);
else
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(RefineryRecipe other) {
if (other == null)
return -1;
else if (ingredient1 == null) {
if (other.ingredient1 == null)
return 0;
else
return 1;
} else if (other.ingredient1 == null)
return -1;
else if (ingredient1.itemID != other.ingredient1.itemID)
return ingredient1.itemID - other.ingredient1.itemID;
else if (ingredient1.itemMeta != other.ingredient1.itemMeta)
return ingredient1.itemMeta - other.ingredient1.itemMeta;
else if (ingredient2 == null) {
if (other.ingredient2 == null)
return 0;
else
return 1;
} else if (other.ingredient2 == null)
return -1;
else if (ingredient2.itemID != other.ingredient2.itemID)
return ingredient2.itemID - other.ingredient2.itemID;
else if (ingredient2.itemMeta != other.ingredient2.itemMeta)
return ingredient2.itemMeta - other.ingredient2.itemMeta;
return 0;
}
// equals() should be consistent with compareTo().
@Override
public boolean equals(Object obj) {
if (obj != null && obj instanceof RefineryRecipe)
return this.compareTo((RefineryRecipe) obj) == 0;
return false;
}
// hashCode() should be overridden because equals() was overridden.
@Override
public int hashCode() {
if (ingredient1 == null)
return 0;
else if (ingredient2 == null)
return ingredient1.itemID ^ ingredient1.itemMeta;
return ingredient1.itemID ^ ingredient1.itemMeta ^ ingredient2.itemID ^ ingredient2.itemMeta;
}
}