From 1bd27f7985212a460341380e556afa3f88c1b6bb Mon Sep 17 00:00:00 2001 From: md_5 Date: Sun, 9 Mar 2025 16:18:32 +1100 Subject: [PATCH] SPIGOT-8014: Add method for getting and setting remaining items in CrafterCraftEvent --- .../minecraft/world/level/block/CrafterBlock.patch | 11 ++++++++++- .../bukkit/craftbukkit/event/CraftEventFactory.java | 6 ++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/nms-patches/net/minecraft/world/level/block/CrafterBlock.patch b/nms-patches/net/minecraft/world/level/block/CrafterBlock.patch index fb402f84d..10808668b 100644 --- a/nms-patches/net/minecraft/world/level/block/CrafterBlock.patch +++ b/nms-patches/net/minecraft/world/level/block/CrafterBlock.patch @@ -21,7 +21,7 @@ ItemStack itemstack = ((RecipeCrafting) recipeholder.value()).assemble(craftinginput, worldserver.registryAccess()); + // CraftBukkit start -+ CrafterCraftEvent event = CraftEventFactory.callCrafterCraftEvent(blockposition, worldserver, crafterblockentity, itemstack, recipeholder); ++ CrafterCraftEvent event = CraftEventFactory.callCrafterCraftEvent(blockposition, worldserver, crafterblockentity, itemstack, recipeholder.value().getRemainingItems(craftinginput), recipeholder); + if (event.isCancelled()) { + return; + } @@ -30,6 +30,15 @@ if (itemstack.isEmpty()) { worldserver.levelEvent(1050, blockposition, 0); } else { +@@ -196,7 +212,7 @@ + worldserver.setBlock(blockposition, (IBlockData) iblockdata.setValue(CrafterBlock.CRAFTING, true), 2); + itemstack.onCraftedBySystem(worldserver); + this.dispenseItem(worldserver, blockposition, crafterblockentity, itemstack, iblockdata, recipeholder); +- Iterator iterator = ((RecipeCrafting) recipeholder.value()).getRemainingItems(craftinginput).iterator(); ++ Iterator iterator = event.getRemainingItems().stream().map(CraftItemStack::asNMSCopy).iterator(); // CraftBukkit + + while (iterator.hasNext()) { + ItemStack itemstack1 = (ItemStack) iterator.next(); @@ -227,7 +243,25 @@ ItemStack itemstack1 = itemstack.copy(); diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java index 407bfe64a..ddbdaa33d 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -20,6 +20,7 @@ import java.util.stream.Stream; import javax.annotation.Nullable; import net.minecraft.core.BlockPosition; import net.minecraft.core.EnumDirection; +import net.minecraft.core.NonNullList; import net.minecraft.network.protocol.game.PacketPlayInCloseWindow; import net.minecraft.resources.MinecraftKey; import net.minecraft.server.level.EntityPlayer; @@ -1299,12 +1300,13 @@ public class CraftEventFactory { return CraftItemStack.asNMSCopy(bitem); } - public static CrafterCraftEvent callCrafterCraftEvent(BlockPosition pos, World world, InventoryCrafting inventoryCrafting, ItemStack result, RecipeHolder holder) { + public static CrafterCraftEvent callCrafterCraftEvent(BlockPosition pos, World world, InventoryCrafting inventoryCrafting, ItemStack result, NonNullList remaining, RecipeHolder holder) { CraftBlock block = CraftBlock.at(world, pos); CraftItemStack itemStack = CraftItemStack.asCraftMirror(result); CraftingRecipe craftingRecipe = (CraftingRecipe) holder.toBukkitRecipe(); + List bukkitRemaining = remaining.stream().map(CraftItemStack::asCraftMirror).collect(Collectors.toCollection(ArrayList::new)); - CrafterCraftEvent crafterCraftEvent = new CrafterCraftEvent(block, craftingRecipe, itemStack); + CrafterCraftEvent crafterCraftEvent = new CrafterCraftEvent(block, craftingRecipe, itemStack, bukkitRemaining); Bukkit.getPluginManager().callEvent(crafterCraftEvent); return crafterCraftEvent; }