package net.minecraft.server; // CraftBukkit start import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.event.inventory.InventoryMoveItemEvent; // CraftBukkit end public class BlockDropper extends BlockDispenser { private static final IDispenseBehavior c = new DispenseBehaviorItem(); public BlockDropper(Block.Info block_info) { super(block_info); } protected IDispenseBehavior a(ItemStack itemstack) { return BlockDropper.c; } public TileEntity a(IBlockAccess iblockaccess) { return new TileEntityDropper(); } public void dispense(World world, BlockPosition blockposition) { SourceBlock sourceblock = new SourceBlock(world, blockposition); TileEntityDispenser tileentitydispenser = (TileEntityDispenser) sourceblock.getTileEntity(); int i = tileentitydispenser.p(); if (i < 0) { world.triggerEffect(1001, blockposition, 0); } else { ItemStack itemstack = tileentitydispenser.getItem(i); if (!itemstack.isEmpty()) { EnumDirection enumdirection = (EnumDirection) world.getType(blockposition).get(BlockDropper.FACING); IInventory iinventory = TileEntityHopper.a(world, blockposition.shift(enumdirection)); ItemStack itemstack1; if (iinventory == null) { itemstack1 = BlockDropper.c.dispense(sourceblock, itemstack); } else { // CraftBukkit start - Fire event when pushing items into other inventories CraftItemStack oitemstack = CraftItemStack.asCraftMirror(itemstack.cloneItemStack().cloneAndSubtract(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); world.getServer().getPluginManager().callEvent(event); if (event.isCancelled()) { return; } itemstack1 = TileEntityHopper.addItem(tileentitydispenser, iinventory, CraftItemStack.asNMSCopy(event.getItem()), enumdirection.opposite()); if (event.getItem().equals(oitemstack) && itemstack1.isEmpty()) { // CraftBukkit end itemstack1 = itemstack.cloneItemStack(); itemstack1.subtract(1); } else { itemstack1 = itemstack.cloneItemStack(); } } tileentitydispenser.setItem(i, itemstack1); } } } }