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;
}