diff --git a/src/main/java/org/skriptlang/skript/bukkit/entity/player/PlayerModule.java b/src/main/java/org/skriptlang/skript/bukkit/entity/player/PlayerModule.java index 938a676b539..2689831054b 100644 --- a/src/main/java/org/skriptlang/skript/bukkit/entity/player/PlayerModule.java +++ b/src/main/java/org/skriptlang/skript/bukkit/entity/player/PlayerModule.java @@ -28,6 +28,7 @@ protected void loadSelf(SkriptAddon addon) { ExprOnScreenKickMessage::register, ExprPlayerListHeaderFooter::register, ExprPlayerListName::register, + ExprPlayerListPriority::register, ExprQuitMessage::register ); if (Skript.classExists("io.papermc.paper.event.player.PlayerPickBlockEvent")) { diff --git a/src/main/java/org/skriptlang/skript/bukkit/entity/player/elements/expressions/ExprPlayerListPriority.java b/src/main/java/org/skriptlang/skript/bukkit/entity/player/elements/expressions/ExprPlayerListPriority.java new file mode 100644 index 00000000000..6b292153cd1 --- /dev/null +++ b/src/main/java/org/skriptlang/skript/bukkit/entity/player/elements/expressions/ExprPlayerListPriority.java @@ -0,0 +1,91 @@ +package org.skriptlang.skript.bukkit.entity.player.elements.expressions; + +import ch.njol.skript.classes.Changer.ChangeMode; +import ch.njol.skript.doc.Description; +import ch.njol.skript.doc.Example; +import ch.njol.skript.doc.Keywords; +import ch.njol.skript.doc.Name; +import ch.njol.skript.doc.Since; +import ch.njol.skript.expressions.base.SimplePropertyExpression; +import ch.njol.util.Math2; +import ch.njol.util.coll.CollectionUtils; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.jetbrains.annotations.Nullable; +import org.skriptlang.skript.registration.SyntaxRegistry; + +@Name("Player List Priority") +@Description(""" + The priority of the player in the player list in the tab menu. + Used to sort players on the tab list. Lowest priority is at the bottom of tab and highest priority is at the top. + If 2 players have same priority then they will be sorted A-Z (but still be above those with lower priority). + """) +@Example(""" + on join: + player has permission "group.mod" + set the player's tab list priority to 5 + """) +@Since("INSERT VERSION") +@Keywords({"tablist", "tab list"}) +public class ExprPlayerListPriority extends SimplePropertyExpression { + + public static void register(SyntaxRegistry syntaxRegistry) { + syntaxRegistry.register(SyntaxRegistry.EXPRESSION, infoBuilder(ExprPlayerListPriority.class, Integer.class, + "(player|tab)[ ]list priority", "players", false) + .supplier(ExprPlayerListPriority::new) + .build()); + } + + @Override + public Integer convert(Player player) { + return player.getPlayerListOrder(); + } + + @Override + public Class @Nullable [] acceptChange(ChangeMode mode) { + return switch (mode) { + case ADD, REMOVE, SET, RESET -> CollectionUtils.array(Integer.class); + default -> null; + }; + } + + @Override + public void change(Event event, Object @Nullable [] delta, ChangeMode mode) { + if (delta == null && mode != ChangeMode.RESET) return; + Integer amount = mode == ChangeMode.RESET ? 0 : (Integer) delta[0]; + switch (mode) { + case ADD -> { + for (Player player : getExpr().getArray(event)) { + player.setPlayerListOrder((int) Math.max(0, Math2.addClamped(player.getPlayerListOrder(), amount))); + } + } + case REMOVE -> { + for (Player player : getExpr().getArray(event)) { + player.setPlayerListOrder(Math.max(0,player.getPlayerListOrder() - amount)); + } + } + case SET -> { + amount = Math.max(0, amount); + for (Player player : getExpr().getArray(event)) { + player.setPlayerListOrder(amount); + } + } + case RESET -> { + for (Player player : getExpr().getArray(event)) { + player.setPlayerListOrder(0); + } + } + } + } + + @Override + public Class getReturnType() { + return Integer.class; + } + + @Override + protected String getPropertyName() { + return "player list priority"; + } + +}