From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Aikar Date: Fri, 18 Jan 2019 00:08:15 -0500 Subject: [PATCH] Fix Custom Shapeless Custom Crafting Recipes Mojang implemented Shapeless different than Shaped This made the Bukkit RecipeChoice API not work for Shapeless. This reimplements vanilla logic using the same test logic as Shaped diff --git a/src/main/java/net/minecraft/world/item/crafting/ShapelessRecipes.java b/src/main/java/net/minecraft/world/item/crafting/ShapelessRecipes.java index 9226602691ccbf39835f2dd071f171c2375b0a16..e112d149fc3a7af7f0c9a5280c94c9b03b2aba2d 100644 --- a/src/main/java/net/minecraft/world/item/crafting/ShapelessRecipes.java +++ b/src/main/java/net/minecraft/world/item/crafting/ShapelessRecipes.java @@ -72,16 +72,49 @@ public class ShapelessRecipes implements RecipeCrafting { AutoRecipeStackManager autorecipestackmanager = new AutoRecipeStackManager(); int i = 0; + // Paper start + java.util.List providedItems = new java.util.ArrayList<>(); + co.aikar.util.Counter matchedProvided = new co.aikar.util.Counter<>(); + co.aikar.util.Counter matchedIngredients = new co.aikar.util.Counter<>(); + // Paper end for (int j = 0; j < inventorycrafting.getSize(); ++j) { ItemStack itemstack = inventorycrafting.getItem(j); if (!itemstack.isEmpty()) { - ++i; - autorecipestackmanager.a(itemstack, 1); + // Paper start + itemstack = itemstack.cloneItemStack(); + providedItems.add(itemstack); + for (RecipeItemStack ingredient : ingredients) { + if (ingredient.test(itemstack)) { + matchedProvided.increment(itemstack); + matchedIngredients.increment(ingredient); + } + } + // Paper end } } - return i == this.ingredients.size() && autorecipestackmanager.a(this, (IntList) null); + // Paper start + if (matchedProvided.isEmpty() || matchedIngredients.isEmpty()) { + return false; + } + java.util.List ingredients = new java.util.ArrayList<>(this.ingredients); + providedItems.sort(java.util.Comparator.comparingInt((ItemStack c) -> (int) matchedProvided.getCount(c)).reversed()); + ingredients.sort(java.util.Comparator.comparingInt((RecipeItemStack c) -> (int) matchedIngredients.getCount(c))); + + PROVIDED: + for (ItemStack provided : providedItems) { + for (Iterator itIngredient = ingredients.iterator(); itIngredient.hasNext(); ) { + RecipeItemStack ingredient = itIngredient.next(); + if (ingredient.test(provided)) { + itIngredient.remove(); + continue PROVIDED; + } + } + return false; + } + return ingredients.isEmpty(); + // Paper end } public ItemStack a(InventoryCrafting inventorycrafting) {