SPIGOT-8014: Add method for getting and setting remaining items in CrafterCraftEvent

This commit is contained in:
md_5 2025-03-09 16:18:32 +11:00
parent 42a4fa96f0
commit 1bd27f7985
No known key found for this signature in database
GPG Key ID: E8E901AC7C617C11
2 changed files with 14 additions and 3 deletions

View File

@ -21,7 +21,7 @@
ItemStack itemstack = ((RecipeCrafting) recipeholder.value()).assemble(craftinginput, worldserver.registryAccess());
+ // CraftBukkit start
+ CrafterCraftEvent event = CraftEventFactory.callCrafterCraftEvent(blockposition, worldserver, crafterblockentity, itemstack, recipeholder);
+ CrafterCraftEvent event = CraftEventFactory.callCrafterCraftEvent(blockposition, worldserver, crafterblockentity, itemstack, recipeholder.value().getRemainingItems(craftinginput), recipeholder);
+ if (event.isCancelled()) {
+ return;
+ }
@ -30,6 +30,15 @@
if (itemstack.isEmpty()) {
worldserver.levelEvent(1050, blockposition, 0);
} else {
@@ -196,7 +212,7 @@
worldserver.setBlock(blockposition, (IBlockData) iblockdata.setValue(CrafterBlock.CRAFTING, true), 2);
itemstack.onCraftedBySystem(worldserver);
this.dispenseItem(worldserver, blockposition, crafterblockentity, itemstack, iblockdata, recipeholder);
- Iterator iterator = ((RecipeCrafting) recipeholder.value()).getRemainingItems(craftinginput).iterator();
+ Iterator<ItemStack> iterator = event.getRemainingItems().stream().map(CraftItemStack::asNMSCopy).iterator(); // CraftBukkit
while (iterator.hasNext()) {
ItemStack itemstack1 = (ItemStack) iterator.next();
@@ -227,7 +243,25 @@
ItemStack itemstack1 = itemstack.copy();

View File

@ -20,6 +20,7 @@ import java.util.stream.Stream;
import javax.annotation.Nullable;
import net.minecraft.core.BlockPosition;
import net.minecraft.core.EnumDirection;
import net.minecraft.core.NonNullList;
import net.minecraft.network.protocol.game.PacketPlayInCloseWindow;
import net.minecraft.resources.MinecraftKey;
import net.minecraft.server.level.EntityPlayer;
@ -1299,12 +1300,13 @@ public class CraftEventFactory {
return CraftItemStack.asNMSCopy(bitem);
}
public static CrafterCraftEvent callCrafterCraftEvent(BlockPosition pos, World world, InventoryCrafting inventoryCrafting, ItemStack result, RecipeHolder<RecipeCrafting> holder) {
public static CrafterCraftEvent callCrafterCraftEvent(BlockPosition pos, World world, InventoryCrafting inventoryCrafting, ItemStack result, NonNullList<ItemStack> remaining, RecipeHolder<RecipeCrafting> holder) {
CraftBlock block = CraftBlock.at(world, pos);
CraftItemStack itemStack = CraftItemStack.asCraftMirror(result);
CraftingRecipe craftingRecipe = (CraftingRecipe) holder.toBukkitRecipe();
List<org.bukkit.inventory.ItemStack> bukkitRemaining = remaining.stream().map(CraftItemStack::asCraftMirror).collect(Collectors.toCollection(ArrayList::new));
CrafterCraftEvent crafterCraftEvent = new CrafterCraftEvent(block, craftingRecipe, itemStack);
CrafterCraftEvent crafterCraftEvent = new CrafterCraftEvent(block, craftingRecipe, itemStack, bukkitRemaining);
Bukkit.getPluginManager().callEvent(crafterCraftEvent);
return crafterCraftEvent;
}