[Bleeding] Handle custom furnace recipes separately. Fixes BUKKIT-1657, BUKKIT-3846

Due to vanilla blanket comparing data values, and the unspecified
order of hashmap iterators, we need to run through custom recipes
first, and therefore separately, to ensure that they are actually
used. By not adding the custom results to the experience table, we do
not override the experience gains from vanilla smelting recipes.
This commit is contained in:
t00thpick1 2013-12-20 18:44:13 -05:00 committed by feildmaster
parent 3c209a9884
commit 1ecc59d4d9
3 changed files with 22 additions and 3 deletions

View File

@ -10,6 +10,7 @@ public class RecipesFurnace {
private static final RecipesFurnace a = new RecipesFurnace();
public Map recipes = new HashMap(); // CraftBukkit - private -> public
private Map c = new HashMap();
public Map customRecipes = new HashMap(); // CraftBukkit
public static RecipesFurnace getInstance() {
return a;
@ -62,15 +63,31 @@ public class RecipesFurnace {
this.c.put(itemstack1, Float.valueOf(f));
}
// CraftBukkit start
public void registerRecipe(ItemStack itemstack, ItemStack itemstack1) {
this.customRecipes.put(itemstack, itemstack1);
}
// CraftBukkit end
public ItemStack getResult(ItemStack itemstack) {
Iterator iterator = this.recipes.entrySet().iterator();
// CraftBukkit start
boolean vanilla = false;
Iterator iterator = this.customRecipes.entrySet().iterator();
// CraftBukkit end
Entry entry;
do {
if (!iterator.hasNext()) {
// CraftBukkit start
if (!vanilla) {
iterator = this.recipes.entrySet().iterator();
vanilla = true;
} else {
return null;
}
// CraftBukkit end
}
entry = (Entry) iterator.next();
} while (!this.a(itemstack, (ItemStack) entry.getKey()));

View File

@ -961,11 +961,13 @@ public final class CraftServer implements Server {
public void clearRecipes() {
CraftingManager.getInstance().recipes.clear();
RecipesFurnace.getInstance().recipes.clear();
RecipesFurnace.getInstance().customRecipes.clear();
}
public void resetRecipes() {
CraftingManager.getInstance().recipes = new CraftingManager().recipes;
RecipesFurnace.getInstance().recipes = new RecipesFurnace().recipes;
RecipesFurnace.getInstance().customRecipes.clear();
}
public Map<String, String[]> getCommandAliases() {

View File

@ -22,6 +22,6 @@ public class CraftFurnaceRecipe extends FurnaceRecipe implements CraftRecipe {
public void addToCraftingManager() {
ItemStack result = this.getResult();
ItemStack input = this.getInput();
RecipesFurnace.getInstance().a(CraftMagicNumbers.getItem(input.getTypeId()), CraftItemStack.asNMSCopy(result), 0.1f);
RecipesFurnace.getInstance().registerRecipe(CraftItemStack.asNMSCopy(input), CraftItemStack.asNMSCopy(result));
}
}