From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: MrPowerGamerBR Date: Tue, 25 Jun 2024 02:52:32 -0300 Subject: [PATCH] Add CraftItemRecipeEvent Used when a player OR a crafter block crafts an item, as an alternative to PrepareItemCraftEvent and CraftItemEvent, because both events are not triggered when a item is crafted from a crafter diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java index 882dbb1276c548316938bbc50f5f7e01f8547ff8..01d526cef9c0aa2d5b6b1ea1c93f8a277bfac8c2 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java @@ -3163,6 +3163,21 @@ public class ServerGamePacketListenerImpl } else { event = new CraftItemEvent(recipe, inventory, type, slotNum, click, action); } + // SparklyPaper start - add CraftItemRecipeEvent + // We will pigback a bit on the current implementation + net.sparklypower.sparklypaper.event.inventory.CraftItemRecipeEvent craftItemRecipeEvent = new net.sparklypower.sparklypaper.event.inventory.CraftItemRecipeEvent( + ((CraftingInventory) top).getMatrix(), // We cannot use the top inventory directly because (it seems) that the first slot is the "result" slot + recipe, + event.getCurrentItem() + ); + if (craftItemRecipeEvent.callEvent()) { + event.setCurrentItem(craftItemRecipeEvent.getResult()); + } else { + event.setCancelled(true); + cancelled = true; + event.setCurrentItem(craftItemRecipeEvent.getResult()); + } + // SparklyPaper end } } diff --git a/net/minecraft/world/level/block/CrafterBlock.java b/net/minecraft/world/level/block/CrafterBlock.java index 5f5966278faf86ed9b28955c80ba845c0cb75595..751969d28951f59f381aa6bf7ad42d55d3e84d57 100644 --- a/net/minecraft/world/level/block/CrafterBlock.java +++ b/net/minecraft/world/level/block/CrafterBlock.java @@ -167,6 +167,13 @@ public class CrafterBlock extends BaseEntityBlock { } itemStack = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(event.getResult()); // CraftBukkit end + // SparklyPaper - add CraftItemRecipeEvent + net.sparklypower.sparklypaper.event.inventory.CraftItemRecipeEvent sparklyEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callCraftItemRecipeEvent(crafterBlockEntity, recipeHolder.toBukkitRecipe(), itemStack); + if (sparklyEvent.isCancelled()) { + return; + } + itemStack = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(sparklyEvent.getResult()); + // SparklyPaper end if (itemStack.isEmpty()) { level.levelEvent(1050, pos, 0); } else {