diff options
Diffstat (limited to 'patch-remap/og/net/minecraft/world/level/block/BlockDropper.patch')
-rw-r--r-- | patch-remap/og/net/minecraft/world/level/block/BlockDropper.patch | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/patch-remap/og/net/minecraft/world/level/block/BlockDropper.patch b/patch-remap/og/net/minecraft/world/level/block/BlockDropper.patch new file mode 100644 index 0000000000..1a97f33a5c --- /dev/null +++ b/patch-remap/og/net/minecraft/world/level/block/BlockDropper.patch @@ -0,0 +1,58 @@ +--- a/net/minecraft/world/level/block/BlockDropper.java ++++ b/net/minecraft/world/level/block/BlockDropper.java +@@ -19,11 +19,17 @@ + import net.minecraft.world.level.block.state.IBlockData; + import org.slf4j.Logger; + ++// CraftBukkit start ++import net.minecraft.world.InventoryLargeChest; ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.inventory.InventoryMoveItemEvent; ++// CraftBukkit end ++ + public class BlockDropper extends BlockDispenser { + + private static final Logger LOGGER = LogUtils.getLogger(); + public static final MapCodec<BlockDropper> CODEC = simpleCodec(BlockDropper::new); +- private static final IDispenseBehavior DISPENSE_BEHAVIOUR = new DispenseBehaviorItem(); ++ private static final IDispenseBehavior DISPENSE_BEHAVIOUR = new DispenseBehaviorItem(true); // CraftBukkit + + @Override + public MapCodec<BlockDropper> codec() { +@@ -46,7 +52,7 @@ + + @Override + public void dispenseFrom(WorldServer worldserver, IBlockData iblockdata, BlockPosition blockposition) { +- TileEntityDispenser tileentitydispenser = (TileEntityDispenser) worldserver.getBlockEntity(blockposition, TileEntityTypes.DROPPER).orElse((Object) null); ++ TileEntityDispenser tileentitydispenser = (TileEntityDispenser) worldserver.getBlockEntity(blockposition, TileEntityTypes.DROPPER).orElse(null); // CraftBukkit - decompile error + + if (tileentitydispenser == null) { + BlockDropper.LOGGER.warn("Ignoring dispensing attempt for Dropper without matching block entity at {}", blockposition); +@@ -67,8 +73,25 @@ + if (iinventory == null) { + itemstack1 = BlockDropper.DISPENSE_BEHAVIOUR.dispense(sourceblock, itemstack); + } else { +- itemstack1 = TileEntityHopper.addItem(tileentitydispenser, iinventory, itemstack.copy().split(1), enumdirection.getOpposite()); +- if (itemstack1.isEmpty()) { ++ // CraftBukkit start - Fire event when pushing items into other inventories ++ CraftItemStack oitemstack = CraftItemStack.asCraftMirror(itemstack.copy().split(1)); ++ ++ org.bukkit.inventory.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(tileentitydispenser.getOwner().getInventory(), oitemstack.clone(), destinationInventory, true); ++ worldserver.getCraftServer().getPluginManager().callEvent(event); ++ if (event.isCancelled()) { ++ return; ++ } ++ itemstack1 = TileEntityHopper.addItem(tileentitydispenser, iinventory, CraftItemStack.asNMSCopy(event.getItem()), enumdirection.getOpposite()); ++ if (event.getItem().equals(oitemstack) && itemstack1.isEmpty()) { ++ // CraftBukkit end + itemstack1 = itemstack.copy(); + itemstack1.shrink(1); + } else { |