From 4f3946f7ac2f925b71b285bd1122afcd3b544f71 Mon Sep 17 00:00:00 2001 From: md_5 Date: Sun, 2 Feb 2025 15:12:05 +1100 Subject: [PATCH] SPIGOT-8003: Fire PrepareItemCraftEvent for Crafter preview --- .../world/inventory/ContainerWorkbench.patch | 15 +++++++------ .../world/inventory/CrafterMenu.patch | 21 +++++++++++++++++-- .../org/bukkit/craftbukkit/CraftServer.java | 3 +-- .../craftbukkit/event/CraftEventFactory.java | 6 ++++-- 4 files changed, 31 insertions(+), 14 deletions(-) diff --git a/nms-patches/net/minecraft/world/inventory/ContainerWorkbench.patch b/nms-patches/net/minecraft/world/inventory/ContainerWorkbench.patch index 4e456f854..ccbef3da8 100644 --- a/nms-patches/net/minecraft/world/inventory/ContainerWorkbench.patch +++ b/nms-patches/net/minecraft/world/inventory/ContainerWorkbench.patch @@ -1,11 +1,10 @@ --- a/net/minecraft/world/inventory/ContainerWorkbench.java +++ b/net/minecraft/world/inventory/ContainerWorkbench.java -@@ -16,6 +16,12 @@ +@@ -16,6 +16,11 @@ import net.minecraft.world.item.crafting.Recipes; import net.minecraft.world.level.block.Blocks; +// CraftBukkit start -+import net.minecraft.world.item.crafting.RecipeRepair; +import org.bukkit.craftbukkit.inventory.CraftInventoryCrafting; +import org.bukkit.craftbukkit.inventory.CraftInventoryView; +// CraftBukkit end @@ -13,7 +12,7 @@ public class ContainerWorkbench extends AbstractCraftingMenu { private static final int CRAFTING_GRID_WIDTH = 3; -@@ -31,13 +37,16 @@ +@@ -31,13 +36,16 @@ public final ContainerAccess access; private final EntityHuman player; private boolean placingRecipe; @@ -31,7 +30,7 @@ this.access = containeraccess; this.player = playerinventory.player; this.addResultSlot(this.player, 124, 35); -@@ -50,6 +59,7 @@ +@@ -50,6 +58,7 @@ EntityPlayer entityplayer = (EntityPlayer) entityhuman; ItemStack itemstack = ItemStack.EMPTY; Optional> optional = worldserver.getServer().getRecipeManager().getRecipeFor(Recipes.CRAFTING, craftinginput, worldserver, recipeholder); @@ -39,15 +38,15 @@ if (optional.isPresent()) { RecipeHolder recipeholder1 = (RecipeHolder) optional.get(); -@@ -63,6 +73,7 @@ +@@ -63,6 +72,7 @@ } } } -+ itemstack = org.bukkit.craftbukkit.event.CraftEventFactory.callPreCraftEvent(inventorycrafting, inventorycraftresult, itemstack, container.getBukkitView(), optional.map(RecipeHolder::value).orElse(null) instanceof RecipeRepair); // CraftBukkit ++ itemstack = org.bukkit.craftbukkit.event.CraftEventFactory.callPreCraftEvent(inventorycrafting, inventorycraftresult, itemstack, container.getBukkitView(), optional); // CraftBukkit inventorycraftresult.setItem(0, itemstack); container.setRemoteSlot(0, itemstack); -@@ -103,6 +114,7 @@ +@@ -103,6 +113,7 @@ @Override public boolean stillValid(EntityHuman entityhuman) { @@ -55,7 +54,7 @@ return stillValid(this.access, entityhuman, Blocks.CRAFTING_TABLE); } -@@ -181,4 +193,17 @@ +@@ -181,4 +192,17 @@ protected EntityHuman owner() { return this.player; } diff --git a/nms-patches/net/minecraft/world/inventory/CrafterMenu.patch b/nms-patches/net/minecraft/world/inventory/CrafterMenu.patch index 0f552abaa..b72a478f7 100644 --- a/nms-patches/net/minecraft/world/inventory/CrafterMenu.patch +++ b/nms-patches/net/minecraft/world/inventory/CrafterMenu.patch @@ -1,10 +1,12 @@ --- a/net/minecraft/world/inventory/CrafterMenu.java +++ b/net/minecraft/world/inventory/CrafterMenu.java -@@ -10,8 +10,27 @@ +@@ -10,8 +10,29 @@ import net.minecraft.world.item.crafting.RecipeCrafting; import net.minecraft.world.level.block.CrafterBlock; +// CraftBukkit start ++import java.util.Optional; ++import net.minecraft.world.item.crafting.RecipeHolder; +import org.bukkit.craftbukkit.inventory.CraftInventoryCrafter; +import org.bukkit.craftbukkit.inventory.view.CraftCrafterView; +// CraftBukkit end @@ -28,7 +30,7 @@ protected static final int SLOT_COUNT = 9; private static final int INV_SLOT_START = 9; private static final int INV_SLOT_END = 36; -@@ -106,6 +125,7 @@ +@@ -106,6 +127,7 @@ @Override public boolean stillValid(EntityHuman entityhuman) { @@ -36,3 +38,18 @@ return this.container.stillValid(entityhuman); } +@@ -115,9 +137,13 @@ + if (entityhuman instanceof EntityPlayer entityplayer) { + WorldServer worldserver = entityplayer.serverLevel(); + CraftingInput craftinginput = this.container.asCraftInput(); +- ItemStack itemstack = (ItemStack) CrafterBlock.getPotentialResults(worldserver, craftinginput).map((recipeholder) -> { ++ // CraftBukkit start ++ Optional> recipe = CrafterBlock.getPotentialResults(worldserver, craftinginput); ++ ItemStack itemstack = (ItemStack) recipe.map((recipeholder) -> { ++ // CraftBukkit end + return ((RecipeCrafting) recipeholder.value()).assemble(craftinginput, worldserver.registryAccess()); + }).orElse(ItemStack.EMPTY); ++ itemstack = org.bukkit.craftbukkit.event.CraftEventFactory.callPreCraftEvent(this.container, this.resultContainer, itemstack, this.getBukkitView(), recipe); // CraftBukkit + + this.resultContainer.setItem(0, itemstack); + } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java index 0687a1618..15aadc35e 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -94,7 +94,6 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemWorldMap; import net.minecraft.world.item.crafting.RecipeCrafting; import net.minecraft.world.item.crafting.RecipeHolder; -import net.minecraft.world.item.crafting.RecipeRepair; import net.minecraft.world.item.crafting.Recipes; import net.minecraft.world.level.EnumGamemode; import net.minecraft.world.level.GameRules; @@ -1475,7 +1474,7 @@ public final class CraftServer implements Server { } // Call Bukkit event to check for matrix/result changes. - net.minecraft.world.item.ItemStack result = CraftEventFactory.callPreCraftEvent(inventoryCrafting, craftResult, itemstack, container.getBukkitView(), recipe.map(RecipeHolder::value).orElse(null) instanceof RecipeRepair); + net.minecraft.world.item.ItemStack result = CraftEventFactory.callPreCraftEvent(inventoryCrafting, craftResult, itemstack, container.getBukkitView(), recipe); return createItemCraftResult(recipe, CraftItemStack.asBukkitCopy(result), inventoryCrafting, craftWorld.getHandle()); } diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java index d6fec9ba3..407bfe64a 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -13,6 +13,7 @@ import java.util.Collections; import java.util.EnumMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -64,6 +65,7 @@ import net.minecraft.world.item.Items; import net.minecraft.world.item.context.ItemActionContext; import net.minecraft.world.item.crafting.RecipeCrafting; import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.item.crafting.RecipeRepair; import net.minecraft.world.level.ChunkCoordIntPair; import net.minecraft.world.level.Explosion; import net.minecraft.world.level.GeneratorAccess; @@ -1285,11 +1287,11 @@ public class CraftEventFactory { return container; } - public static ItemStack callPreCraftEvent(InventoryCrafting matrix, IInventory resultInventory, ItemStack result, InventoryView lastCraftView, boolean isRepair) { + public static ItemStack callPreCraftEvent(InventoryCrafting matrix, IInventory resultInventory, ItemStack result, InventoryView lastCraftView, Optional> recipe) { CraftInventoryCrafting inventory = new CraftInventoryCrafting(matrix, resultInventory); inventory.setResult(CraftItemStack.asCraftMirror(result)); - PrepareItemCraftEvent event = new PrepareItemCraftEvent(inventory, lastCraftView, isRepair); + PrepareItemCraftEvent event = new PrepareItemCraftEvent(inventory, lastCraftView, recipe.map(RecipeHolder::value).orElse(null) instanceof RecipeRepair); Bukkit.getPluginManager().callEvent(event); org.bukkit.inventory.ItemStack bitem = event.getInventory().getResult();