--- a/net/minecraft/world/level/block/CrafterBlock.java +++ b/net/minecraft/world/level/block/CrafterBlock.java @@ -39,6 +39,15 @@ import net.minecraft.world.phys.MovingObjectPositionBlock; import net.minecraft.world.phys.Vec3D; +// CraftBukkit start +import net.minecraft.world.InventoryLargeChest; +import org.bukkit.craftbukkit.event.CraftEventFactory; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.event.block.CrafterCraftEvent; +import org.bukkit.event.inventory.InventoryMoveItemEvent; +import org.bukkit.inventory.Inventory; +// CraftBukkit end + public class CrafterBlock extends BlockTileEntity { public static final MapCodec CODEC = simpleCodec(CrafterBlock::new); @@ -187,6 +196,13 @@ RecipeHolder recipeholder = (RecipeHolder) optional.get(); ItemStack itemstack = (recipeholder.value()).assemble(craftinginput, worldserver.registryAccess()); + // CraftBukkit start + CrafterCraftEvent event = CraftEventFactory.callCrafterCraftEvent(blockposition, worldserver, crafterblockentity, itemstack, recipeholder.value().getRemainingItems(craftinginput), recipeholder); + if (event.isCancelled()) { + return; + } + itemstack = CraftItemStack.asNMSCopy(event.getResult()); + // CraftBukkit end if (itemstack.isEmpty()) { worldserver.levelEvent(1050, blockposition, 0); } else { @@ -195,7 +211,7 @@ itemstack.onCraftedBySystem(worldserver); this.dispenseItem(worldserver, blockposition, crafterblockentity, itemstack, iblockdata, recipeholder); - for (ItemStack itemstack1 : (recipeholder.value()).getRemainingItems(craftinginput)) { + for (ItemStack itemstack1 : event.getRemainingItems().stream().map(CraftItemStack::asNMSCopy).toList()) { // CraftBukkit if (!itemstack1.isEmpty()) { this.dispenseItem(worldserver, blockposition, crafterblockentity, itemstack1, iblockdata, recipeholder); } @@ -222,7 +238,25 @@ ItemStack itemstack1 = itemstack.copy(); if (iinventory != null && (iinventory instanceof CrafterBlockEntity || itemstack.getCount() > iinventory.getMaxStackSize(itemstack))) { + // CraftBukkit start - InventoryMoveItemEvent + CraftItemStack oitemstack = CraftItemStack.asCraftMirror(itemstack1); + + Inventory destinationInventory; + // Have to special case large chests as they work oddly + if (iinventory instanceof InventoryLargeChest) { + destinationInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) iinventory); + } else { + destinationInventory = iinventory.getOwner().getInventory(); + } + + InventoryMoveItemEvent event = new InventoryMoveItemEvent(crafterblockentity.getOwner().getInventory(), oitemstack, destinationInventory, true); + worldserver.getCraftServer().getPluginManager().callEvent(event); + itemstack1 = CraftItemStack.asNMSCopy(event.getItem()); while (!itemstack1.isEmpty()) { + if (event.isCancelled()) { + break; + } + // CraftBukkit end ItemStack itemstack2 = itemstack1.copyWithCount(1); ItemStack itemstack3 = TileEntityHopper.addItem(crafterblockentity, iinventory, itemstack2, enumdirection.getOpposite()); @@ -233,7 +267,25 @@ itemstack1.shrink(1); } } else if (iinventory != null) { + // CraftBukkit start - InventoryMoveItemEvent + CraftItemStack oitemstack = CraftItemStack.asCraftMirror(itemstack1); + + Inventory destinationInventory; + // Have to special case large chests as they work oddly + if (iinventory instanceof InventoryLargeChest) { + destinationInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) iinventory); + } else { + destinationInventory = iinventory.getOwner().getInventory(); + } + + InventoryMoveItemEvent event = new InventoryMoveItemEvent(crafterblockentity.getOwner().getInventory(), oitemstack, destinationInventory, true); + worldserver.getCraftServer().getPluginManager().callEvent(event); + itemstack1 = CraftItemStack.asNMSCopy(event.getItem()); while (!itemstack1.isEmpty()) { + if (event.isCancelled()) { + break; + } + // CraftBukkit end int i = itemstack1.getCount(); itemstack1 = TileEntityHopper.addItem(crafterblockentity, iinventory, itemstack1, enumdirection.getOpposite());