Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for InventoryClickEvent cursor #5308

Merged
merged 4 commits into from
Sep 26, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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);
}

}