001 package org.bukkit.event.inventory; 002 003 import org.apache.commons.lang.Validate; 004 import org.bukkit.event.Cancellable; 005 import org.bukkit.event.Event; 006 import org.bukkit.event.HandlerList; 007 import org.bukkit.inventory.Inventory; 008 import org.bukkit.inventory.ItemStack; 009 010 /** 011 * Called when some entity or block (e.g. hopper) tries to move items directly 012 * from one inventory to another. 013 * <p> 014 * When this event is called, the initiator may already have removed the item 015 * from the source inventory and is ready to move it into the destination 016 * inventory. 017 * <p> 018 * If this event is cancelled, the items will be returned to the source 019 * inventory, if needed. 020 * <p> 021 * If this event is not cancelled, the initiator will try to put the ItemStack 022 * into the destination inventory. If this is not possible and the ItemStack 023 * has not been modified, the source inventory slot will be restored to its 024 * former state. Otherwise any additional items will be discarded. 025 */ 026 public class InventoryMoveItemEvent extends Event implements Cancellable { 027 private static final HandlerList handlers = new HandlerList(); 028 private boolean cancelled; 029 private final Inventory sourceInventory; 030 private final Inventory destinationInventory; 031 private ItemStack itemStack; 032 private final boolean didSourceInitiate; 033 034 public InventoryMoveItemEvent(final Inventory sourceInventory, final ItemStack itemStack, final Inventory destinationInventory, final boolean didSourceInitiate) { 035 Validate.notNull(itemStack, "ItemStack cannot be null"); 036 this.sourceInventory = sourceInventory; 037 this.itemStack = itemStack; 038 this.destinationInventory = destinationInventory; 039 this.didSourceInitiate = didSourceInitiate; 040 } 041 042 /** 043 * Gets the Inventory that the ItemStack is being taken from 044 * 045 * @return Inventory that the ItemStack is being taken from 046 */ 047 public Inventory getSource() { 048 return sourceInventory; 049 } 050 051 /** 052 * Gets the ItemStack being moved; if modified, the original item will not 053 * be removed from the source inventory. 054 * 055 * @return ItemStack 056 */ 057 public ItemStack getItem() { 058 return itemStack.clone(); 059 } 060 061 /** 062 * Sets the ItemStack being moved; if this is different from the original 063 * ItemStack, the original item will not be removed from the source 064 * inventory. 065 * 066 * @param itemStack The ItemStack 067 */ 068 public void setItem(ItemStack itemStack) { 069 Validate.notNull(itemStack, "ItemStack cannot be null. Cancel the event if you want nothing to be transferred."); 070 this.itemStack = itemStack.clone(); 071 } 072 073 /** 074 * Gets the Inventory that the ItemStack is being put into 075 * 076 * @return Inventory that the ItemStack is being put into 077 */ 078 public Inventory getDestination() { 079 return destinationInventory; 080 } 081 082 /** 083 * Gets the Inventory that initiated the transfer. This will always be 084 * either the destination or source Inventory. 085 * 086 * @return Inventory that initiated the transfer 087 */ 088 public Inventory getInitiator() { 089 return didSourceInitiate ? sourceInventory : destinationInventory; 090 } 091 092 public boolean isCancelled() { 093 return cancelled; 094 } 095 096 public void setCancelled(boolean cancel) { 097 this.cancelled = cancel; 098 } 099 100 @Override 101 public HandlerList getHandlers() { 102 return handlers; 103 } 104 105 public static HandlerList getHandlerList() { 106 return handlers; 107 } 108 }