SPIGOT-8003: Fire PrepareItemCraftEvent for Crafter preview

This commit is contained in:
md_5 2025-02-02 15:12:05 +11:00
parent d20d4c1c3b
commit 4f3946f7ac
No known key found for this signature in database
GPG Key ID: E8E901AC7C617C11
4 changed files with 31 additions and 14 deletions

View File

@ -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<RecipeHolder<RecipeCrafting>> optional = worldserver.getServer().getRecipeManager().getRecipeFor(Recipes.CRAFTING, craftinginput, worldserver, recipeholder);
@ -39,15 +38,15 @@
if (optional.isPresent()) {
RecipeHolder<RecipeCrafting> 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;
}

View File

@ -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<RecipeHolder<RecipeCrafting>> 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);
}

View File

@ -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());
}

View File

@ -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<RecipeHolder<RecipeCrafting>> 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();