--- a/net/minecraft/world/inventory/CrafterMenu.java +++ b/net/minecraft/world/inventory/CrafterMenu.java @@ -10,8 +10,35 @@ 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 + public class CrafterMenu extends Container implements ICrafting { + // CraftBukkit start + private CraftCrafterView bukkitEntity = null; + + @Override + public CraftCrafterView getBukkitView() { + if (bukkitEntity != null) { + return bukkitEntity; + } + + CraftInventoryCrafter inventory = new CraftInventoryCrafter(this.container, this.resultContainer); + bukkitEntity = new CraftCrafterView(this.player.getBukkitEntity(), inventory, this); + return bukkitEntity; + } + + @Override + public void startOpen() { + super.startOpen(); + this.refreshRecipeResult(); + } + // CraftBukkit end protected static final int SLOT_COUNT = 9; private static final int INV_SLOT_START = 9; private static final int INV_SLOT_END = 36; @@ -106,18 +133,24 @@ @Override public boolean stillValid(EntityHuman entityhuman) { + if (!this.checkReachable) return true; // CraftBukkit return this.container.stillValid(entityhuman); } private void refreshRecipeResult() { + if (!this.opened) return; // CraftBukkit - SPIGOT-8005: don't refresh until opened EntityHuman entityhuman = this.player; 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); }