Skip to content

Commit

Permalink
Add support for InventoryClickEvent cursor (#5308)
Browse files Browse the repository at this point in the history
  • Loading branch information
TheLimeGlass committed Sep 26, 2023
1 parent d77ca01 commit fd23bc0
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 32 deletions.
47 changes: 32 additions & 15 deletions src/main/java/ch/njol/skript/expressions/ExprCursorSlot.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<Player, Slot> {
public class ExprCursorSlot extends PropertyExpression<Player, Slot> {

static {
register(ExprCursorSlot.class, Slot.class, "cursor slot", "players");
}

@Override
public Class<? extends Slot> getReturnType() {
return Slot.class;
@SuppressWarnings("unchecked")
public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
setExpr((Expression<? extends Player>) 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<? extends Slot> 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);
}

}
59 changes: 42 additions & 17 deletions src/main/java/ch/njol/skript/util/slot/CursorSlot.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,30 +20,50 @@

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;

import ch.njol.skript.bukkitutil.PlayerUtils;
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();
}

Expand All @@ -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);
}

}

0 comments on commit fd23bc0

Please sign in to comment.