--- a/net/minecraft/world/item/crafting/RecipeItemStack.java +++ b/net/minecraft/world/item/crafting/RecipeItemStack.java @@ -21,6 +21,11 @@ import net.minecraft.world.item.crafting.display.SlotDisplay; import net.minecraft.world.level.IMaterial; +// CraftBukkit start +import java.util.List; +import javax.annotation.Nullable; +// CraftBukkit end + public final class RecipeItemStack implements AutoRecipeStackManager.a>, Predicate { public static final StreamCodec CONTENTS_STREAM_CODEC = ByteBufCodecs.holderSet(Registries.ITEM).map(RecipeItemStack::new, (recipeitemstack) -> { @@ -38,6 +43,24 @@ return recipeitemstack.values; }); private final HolderSet values; + // CraftBukkit start + @Nullable + private List itemStacks; + + public boolean isExact() { + return this.itemStacks != null; + } + + public List itemStacks() { + return this.itemStacks; + } + + public static RecipeItemStack ofStacks(List stacks) { + RecipeItemStack recipe = RecipeItemStack.of(stacks.stream().map(ItemStack::getItem)); + recipe.itemStacks = stacks; + return recipe; + } + // CraftBukkit end private RecipeItemStack(HolderSet holderset) { holderset.unwrap().ifRight((list) -> { @@ -70,6 +93,17 @@ } public boolean test(ItemStack itemstack) { + // CraftBukkit start + if (this.isExact()) { + for (ItemStack itemstack1 : this.itemStacks()) { + if (itemstack1.getItem() == itemstack.getItem() && ItemStack.isSameItemSameComponents(itemstack, itemstack1)) { + return true; + } + } + + return false; + } + // CraftBukkit end return itemstack.is(this.values); } @@ -79,7 +113,7 @@ public boolean equals(Object object) { if (object instanceof RecipeItemStack recipeitemstack) { - return Objects.equals(this.values, recipeitemstack.values); + return Objects.equals(this.values, recipeitemstack.values) && Objects.equals(this.itemStacks, recipeitemstack.itemStacks); // CraftBukkit } else { return false; }