94 lines
4.9 KiB
Diff
94 lines
4.9 KiB
Diff
--- a/net/minecraft/world/level/block/CrafterBlock.java
|
|
+++ b/net/minecraft/world/level/block/CrafterBlock.java
|
|
@@ -39,6 +39,15 @@
|
|
import net.minecraft.world.phys.MovingObjectPositionBlock;
|
|
import net.minecraft.world.phys.Vec3D;
|
|
|
|
+// CraftBukkit start
|
|
+import net.minecraft.world.InventoryLargeChest;
|
|
+import org.bukkit.craftbukkit.event.CraftEventFactory;
|
|
+import org.bukkit.craftbukkit.inventory.CraftItemStack;
|
|
+import org.bukkit.event.block.CrafterCraftEvent;
|
|
+import org.bukkit.event.inventory.InventoryMoveItemEvent;
|
|
+import org.bukkit.inventory.Inventory;
|
|
+// CraftBukkit end
|
|
+
|
|
public class CrafterBlock extends BlockTileEntity {
|
|
|
|
public static final MapCodec<CrafterBlock> CODEC = simpleCodec(CrafterBlock::new);
|
|
@@ -187,6 +196,13 @@
|
|
RecipeHolder<RecipeCrafting> recipeholder = (RecipeHolder) optional.get();
|
|
ItemStack itemstack = (recipeholder.value()).assemble(craftinginput, worldserver.registryAccess());
|
|
|
|
+ // CraftBukkit start
|
|
+ CrafterCraftEvent event = CraftEventFactory.callCrafterCraftEvent(blockposition, worldserver, crafterblockentity, itemstack, recipeholder.value().getRemainingItems(craftinginput), recipeholder);
|
|
+ if (event.isCancelled()) {
|
|
+ return;
|
|
+ }
|
|
+ itemstack = CraftItemStack.asNMSCopy(event.getResult());
|
|
+ // CraftBukkit end
|
|
if (itemstack.isEmpty()) {
|
|
worldserver.levelEvent(1050, blockposition, 0);
|
|
} else {
|
|
@@ -195,7 +211,7 @@
|
|
itemstack.onCraftedBySystem(worldserver);
|
|
this.dispenseItem(worldserver, blockposition, crafterblockentity, itemstack, iblockdata, recipeholder);
|
|
|
|
- for (ItemStack itemstack1 : (recipeholder.value()).getRemainingItems(craftinginput)) {
|
|
+ for (ItemStack itemstack1 : event.getRemainingItems().stream().map(CraftItemStack::asNMSCopy).toList()) { // CraftBukkit
|
|
if (!itemstack1.isEmpty()) {
|
|
this.dispenseItem(worldserver, blockposition, crafterblockentity, itemstack1, iblockdata, recipeholder);
|
|
}
|
|
@@ -222,7 +238,25 @@
|
|
ItemStack itemstack1 = itemstack.copy();
|
|
|
|
if (iinventory != null && (iinventory instanceof CrafterBlockEntity || itemstack.getCount() > iinventory.getMaxStackSize(itemstack))) {
|
|
+ // CraftBukkit start - InventoryMoveItemEvent
|
|
+ CraftItemStack oitemstack = CraftItemStack.asCraftMirror(itemstack1);
|
|
+
|
|
+ Inventory destinationInventory;
|
|
+ // Have to special case large chests as they work oddly
|
|
+ if (iinventory instanceof InventoryLargeChest) {
|
|
+ destinationInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) iinventory);
|
|
+ } else {
|
|
+ destinationInventory = iinventory.getOwner().getInventory();
|
|
+ }
|
|
+
|
|
+ InventoryMoveItemEvent event = new InventoryMoveItemEvent(crafterblockentity.getOwner().getInventory(), oitemstack, destinationInventory, true);
|
|
+ worldserver.getCraftServer().getPluginManager().callEvent(event);
|
|
+ itemstack1 = CraftItemStack.asNMSCopy(event.getItem());
|
|
while (!itemstack1.isEmpty()) {
|
|
+ if (event.isCancelled()) {
|
|
+ break;
|
|
+ }
|
|
+ // CraftBukkit end
|
|
ItemStack itemstack2 = itemstack1.copyWithCount(1);
|
|
ItemStack itemstack3 = TileEntityHopper.addItem(crafterblockentity, iinventory, itemstack2, enumdirection.getOpposite());
|
|
|
|
@@ -233,7 +267,25 @@
|
|
itemstack1.shrink(1);
|
|
}
|
|
} else if (iinventory != null) {
|
|
+ // CraftBukkit start - InventoryMoveItemEvent
|
|
+ CraftItemStack oitemstack = CraftItemStack.asCraftMirror(itemstack1);
|
|
+
|
|
+ Inventory destinationInventory;
|
|
+ // Have to special case large chests as they work oddly
|
|
+ if (iinventory instanceof InventoryLargeChest) {
|
|
+ destinationInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) iinventory);
|
|
+ } else {
|
|
+ destinationInventory = iinventory.getOwner().getInventory();
|
|
+ }
|
|
+
|
|
+ InventoryMoveItemEvent event = new InventoryMoveItemEvent(crafterblockentity.getOwner().getInventory(), oitemstack, destinationInventory, true);
|
|
+ worldserver.getCraftServer().getPluginManager().callEvent(event);
|
|
+ itemstack1 = CraftItemStack.asNMSCopy(event.getItem());
|
|
while (!itemstack1.isEmpty()) {
|
|
+ if (event.isCancelled()) {
|
|
+ break;
|
|
+ }
|
|
+ // CraftBukkit end
|
|
int i = itemstack1.getCount();
|
|
|
|
itemstack1 = TileEntityHopper.addItem(crafterblockentity, iinventory, itemstack1, enumdirection.getOpposite());
|