diff --git a/src/main/java/org/spongepowered/common/item/recipe/crafting/shapeless/SpongeShapelessRecipe.java b/src/main/java/org/spongepowered/common/item/recipe/crafting/shapeless/SpongeShapelessRecipe.java index 8090a7189f6..f103a729ca0 100644 --- a/src/main/java/org/spongepowered/common/item/recipe/crafting/shapeless/SpongeShapelessRecipe.java +++ b/src/main/java/org/spongepowered/common/item/recipe/crafting/shapeless/SpongeShapelessRecipe.java @@ -129,7 +129,7 @@ public boolean matches(final CraftingInput $$0, final Level $$1) { if (this.onlyVanillaIngredients) { return super.matches($$0, $$1); } - return SpongeShapelessRecipe.matches($$0.items(), this.getIngredients()); + return SpongeShapelessRecipe.matches($$0, this.getIngredients()); } @Override @@ -158,19 +158,22 @@ public ItemStack getResultItem(final HolderLookup.Provider $$1) { } private static boolean - matches(List stacks, List ingredients) { + matches(CraftingInput input, List ingredients) { final int elements = ingredients.size(); - if (stacks.size() < elements) { + if (input.ingredientCount() != elements) { + // The amount of non-empty stacks doesn't match the amount of ingredients return false; } + final List stacks = input.items(); // find matched stack -> ingredient list final Map> matchesMap = new HashMap<>(); for (int i = 0; i < ingredients.size(); i++) { Ingredient ingredient = ingredients.get(i); boolean noMatch = true; for (int j = 0; j < stacks.size(); j++) { - if (ingredient.test(stacks.get(j))) { + final ItemStack stack = stacks.get(j); + if (!stack.isEmpty() && ingredient.test(stack)) { matchesMap.computeIfAbsent(j, k -> new ArrayList<>()).add(i);; noMatch = false; } @@ -181,7 +184,8 @@ public ItemStack getResultItem(final HolderLookup.Provider $$1) { } } - if (matchesMap.isEmpty()) { + if (matchesMap.size() != elements) { + // At least one stack had no matching ingredient return false; }