From fd23bc0fbc7e5f6856369b1d2069a236d5381c2a Mon Sep 17 00:00:00 2001 From: LimeGlass <16087552+TheLimeGlass@users.noreply.github.com> Date: Tue, 26 Sep 2023 15:23:58 -0600 Subject: [PATCH] Add support for InventoryClickEvent cursor (#5308) --- .../skript/expressions/ExprCursorSlot.java | 47 ++++++++++----- .../ch/njol/skript/util/slot/CursorSlot.java | 59 +++++++++++++------ 2 files changed, 74 insertions(+), 32 deletions(-) diff --git a/src/main/java/ch/njol/skript/expressions/ExprCursorSlot.java b/src/main/java/ch/njol/skript/expressions/ExprCursorSlot.java index 493b84c3d6e..c81e738ec53 100644 --- a/src/main/java/ch/njol/skript/expressions/ExprCursorSlot.java +++ b/src/main/java/ch/njol/skript/expressions/ExprCursorSlot.java @@ -19,45 +19,62 @@ package ch.njol.skript.expressions; import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.inventory.InventoryClickEvent; import org.eclipse.jdt.annotation.Nullable; import ch.njol.skript.doc.Description; import ch.njol.skript.doc.Examples; import ch.njol.skript.doc.Name; import ch.njol.skript.doc.Since; -import ch.njol.skript.expressions.base.SimplePropertyExpression; +import ch.njol.skript.expressions.base.PropertyExpression; +import ch.njol.skript.lang.Expression; +import ch.njol.skript.lang.SkriptParser.ParseResult; import ch.njol.skript.util.slot.CursorSlot; import ch.njol.skript.util.slot.Slot; +import ch.njol.util.Kleenean; /** * Cursor item slot is not actually an inventory slot, but an item which the player * has in their cursor when any inventory is open for them. */ @Name("Cursor Slot") -@Description("The item which the player has on their cursor. This slot is always empty if player has no inventories open.") -@Examples({"cursor slot of player is dirt", - "set cursor slot of player to 64 diamonds"}) +@Description("The item which the player has on their inventory cursor. This slot is always empty if player has no inventory open.") +@Examples({ + "cursor slot of player is dirt", + "set cursor slot of player to 64 diamonds" +}) @Since("2.2-dev17") -public class ExprCursorSlot extends SimplePropertyExpression { - +public class ExprCursorSlot extends PropertyExpression { + static { register(ExprCursorSlot.class, Slot.class, "cursor slot", "players"); } @Override - public Class getReturnType() { - return Slot.class; + @SuppressWarnings("unchecked") + public boolean init(Expression[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) { + setExpr((Expression) exprs[0]); + return true; + } + + @Override + protected Slot[] get(Event event, Player[] source) { + return get(source, player -> { + if (event instanceof InventoryClickEvent) + return new CursorSlot(player, ((InventoryClickEvent) event).getCursor()); + return new CursorSlot(player); + }); } - + @Override - protected String getPropertyName() { - return "cursor slot"; + public Class getReturnType() { + return Slot.class; } - + @Override - @Nullable - public Slot convert(final Player player) { - return new CursorSlot(player); + public String toString(@Nullable Event event, boolean debug) { + return "cursor slot of " + getExpr().toString(event, debug); } } diff --git a/src/main/java/ch/njol/skript/util/slot/CursorSlot.java b/src/main/java/ch/njol/skript/util/slot/CursorSlot.java index 97bc44b07fd..387f0603037 100644 --- a/src/main/java/ch/njol/skript/util/slot/CursorSlot.java +++ b/src/main/java/ch/njol/skript/util/slot/CursorSlot.java @@ -20,6 +20,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.Event; +import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.ItemStack; import org.eclipse.jdt.annotation.Nullable; @@ -27,23 +28,42 @@ import ch.njol.skript.registrations.Classes; /** - * Item that is in player's cursor. + * Item that represents a player's inventory cursor. */ public class CursorSlot extends Slot { - + + /** + * Represents the cursor as it was used in an InventoryClickEvent. + */ + @Nullable + private final ItemStack eventItemStack; private final Player player; - - public CursorSlot(Player p) { - this.player = p; + + public CursorSlot(Player player) { + this(player, null); } - + + /** + * Represents the cursor as it was used in an InventoryClickEvent. + * Should use this constructor if the event was an InventoryClickEvent. + * + * @param player The player that this cursor slot belongs to. + * @param eventItemStack The ItemStack from {@link InventoryClickEvent#getCursor()} if event is an InventoryClickEvent. + */ + public CursorSlot(Player player, @Nullable ItemStack eventItemStack) { + this.eventItemStack = eventItemStack; + this.player = player; + } + public Player getPlayer() { return player; } - + @Override @Nullable public ItemStack getItem() { + if (eventItemStack != null) + return eventItemStack; return player.getItemOnCursor(); } @@ -52,27 +72,32 @@ public void setItem(@Nullable ItemStack item) { player.setItemOnCursor(item); PlayerUtils.updateInventory(player); } - + @Override public int getAmount() { - return player.getItemOnCursor().getAmount(); + return getItem().getAmount(); } - + @Override public void setAmount(int amount) { - player.getItemOnCursor().setAmount(amount); + getItem().setAmount(amount); + } + + public boolean isInventoryClick() { + return eventItemStack != null; } - + @Override - public boolean isSameSlot(Slot o) { - if (!(o instanceof CursorSlot)) + public boolean isSameSlot(Slot slot) { + if (!(slot instanceof CursorSlot)) return false; - return ((CursorSlot) o).getPlayer().equals(this.player); + CursorSlot cursor = (CursorSlot) slot; + return cursor.getPlayer().equals(this.player) && cursor.isInventoryClick() == isInventoryClick(); } @Override - public String toString(@Nullable Event e, boolean debug) { + public String toString(@Nullable Event event, boolean debug) { return "cursor slot of " + Classes.toString(player); } - + }