namespace Minecraft.Server.FourKit.Event.Inventory; using Minecraft.Server.FourKit.Entity; using Minecraft.Server.FourKit.Inventory; /// /// This event is called when a player clicks a slot in an inventory. /// /// Because InventoryClickEvent occurs within a modification of the Inventory, /// not all Inventory related methods are safe to use. /// /// /// The following should never be invoked by an EventHandler for /// InventoryClickEvent using the HumanEntity or InventoryView associated /// with this event: /// /// /// /// /// /// /// public class InventoryClickEvent : InventoryInteractEvent { private readonly SlotType _slotType; private readonly int _rawSlot; private readonly int _whichSlot; private readonly ClickType _click; private readonly InventoryAction _action; private readonly int _hotbarKey; private ItemStack? _currentItem; internal InventoryClickEvent(InventoryView view, SlotType type, int slot, ClickType click, InventoryAction action) : this(view, type, slot, click, action, -1) { } internal InventoryClickEvent(InventoryView view, SlotType type, int slot, ClickType click, InventoryAction action, int key) : base(view) { _slotType = type; _rawSlot = slot; _click = click; _action = action; _hotbarKey = key; _currentItem = view.getItem(slot); _whichSlot = view.convertSlot(slot); } /// /// Gets the inventory that was clicked, or null if outside of window. /// /// The clicked inventory. public Inventory? getClickedInventory() { if (_rawSlot == InventoryView.OUTSIDE) return null; int topSize = getView().getTopInventory().getSize(); if (_rawSlot < topSize) return getView().getTopInventory(); return getView().getBottomInventory(); } /// /// Gets the type of slot that was clicked. /// /// The slot type. public SlotType getSlotType() => _slotType; /// /// Gets the current ItemStack on the cursor. /// /// The cursor ItemStack. public ItemStack? getCursor() => getView().getCursor(); /// /// Gets the ItemStack currently in the clicked slot. /// /// The item in the clicked slot. public ItemStack? getCurrentItem() => _currentItem; /// /// Gets whether or not the ClickType for this event represents a right click. /// /// true if the ClickType uses the right mouse button. public bool isRightClick() => _click.isRightClick(); /// /// Gets whether or not the ClickType for this event represents a left click. /// /// true if the ClickType uses the left mouse button. public bool isLeftClick() => _click.isLeftClick(); /// /// Gets whether the ClickType for this event indicates that the key was /// pressed down when the click was made. /// /// true if the ClickType uses Shift or Ctrl. public bool isShiftClick() => _click.isShiftClick(); /// /// Sets the item on the cursor. /// /// The new cursor item. [Obsolete("This changes the ItemStack in their hand before any calculations are applied to the Inventory.")] public void setCursor(ItemStack? stack) => getView().setCursor(stack); /// /// Sets the ItemStack currently in the clicked slot. /// /// The item to be placed in the current slot. public void setCurrentItem(ItemStack? stack) { _currentItem = stack; if (_rawSlot >= 0) getView().setItem(_rawSlot, stack); } /// /// The slot number that was clicked, ready for passing to /// . Note that there may be two slots /// with the same slot number, since a view links two different inventories. /// /// The slot number. public int getSlot() => _whichSlot; /// /// The raw slot number clicked, ready for passing to /// . This slot number is unique /// for the view. /// /// The raw slot number. public int getRawSlot() => _rawSlot; /// /// If the ClickType is NUMBER_KEY, this method will return the index of /// the pressed key (0-8). /// /// The number on the key minus 1 (range 0-8); or -1 if not a NUMBER_KEY action. public int getHotbarButton() => _hotbarKey; /// /// Gets the InventoryAction that triggered this event. /// This action cannot be changed, and represents what the normal outcome /// of the event will be. To change the behavior of this InventoryClickEvent, /// changes must be manually applied. /// /// The InventoryAction that triggered this event. public InventoryAction getAction() => _action; /// /// Gets the ClickType for this event. /// This is insulated against changes to the inventory by other plugins. /// /// The type of inventory click. public ClickType getClick() => _click; }