From 5a1367dacca9c405167fe8191b541994e0bb8392 Mon Sep 17 00:00:00 2001 From: TheLimeGlass Date: Mon, 2 Jan 2023 09:17:27 -0700 Subject: [PATCH 1/3] Add support for InventoryClickEvent cursor --- .../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..8d785082cbe 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, 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); } - + } From faed21ee75b8731454b9188cb590fbfa44b3f6d8 Mon Sep 17 00:00:00 2001 From: LimeGlass <16087552+TheLimeGlass@users.noreply.github.com> Date: Tue, 21 Feb 2023 20:11:17 -0700 Subject: [PATCH 2/3] Update src/main/java/ch/njol/skript/util/slot/CursorSlot.java Co-authored-by: Kiip <25848425+kiip1@users.noreply.github.com> --- src/main/java/ch/njol/skript/util/slot/CursorSlot.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 8d785082cbe..0b134f105cf 100644 --- a/src/main/java/ch/njol/skript/util/slot/CursorSlot.java +++ b/src/main/java/ch/njol/skript/util/slot/CursorSlot.java @@ -92,7 +92,7 @@ public boolean isSameSlot(Slot slot) { if (!(slot instanceof CursorSlot)) return false; CursorSlot cursor = (CursorSlot) slot; - return cursor.getPlayer().equals(this.player) && (cursor.isInventoryClick() == isInventoryClick()) ; + return cursor.getPlayer().equals(this.player) && cursor.isInventoryClick() == isInventoryClick(); } @Override From e158e622f3dd1c5449f9f7c5239592ef7bdb2823 Mon Sep 17 00:00:00 2001 From: LimeGlass <16087552+TheLimeGlass@users.noreply.github.com> Date: Tue, 21 Feb 2023 20:11:42 -0700 Subject: [PATCH 3/3] Update src/main/java/ch/njol/skript/util/slot/CursorSlot.java Co-authored-by: Kiip <25848425+kiip1@users.noreply.github.com> --- src/main/java/ch/njol/skript/util/slot/CursorSlot.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 0b134f105cf..387f0603037 100644 --- a/src/main/java/ch/njol/skript/util/slot/CursorSlot.java +++ b/src/main/java/ch/njol/skript/util/slot/CursorSlot.java @@ -50,7 +50,7 @@ public CursorSlot(Player player) { * @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, ItemStack eventItemStack) { + public CursorSlot(Player player, @Nullable ItemStack eventItemStack) { this.eventItemStack = eventItemStack; this.player = player; }