From 3ecd31e80c00c53320ad81afb6f6203cb223cb05 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Tue, 5 Mar 2024 12:13:30 +0100 Subject: [PATCH] Update ScoreboardLib --- .../script/lua/libs/ScoreboardLib.java | 16 +++++++---- .../features/world/BauScoreboard.java | 28 +++++++++++-------- SCRIPT.md | 9 +++--- sw.def.lua | 6 ++++ 4 files changed, 37 insertions(+), 22 deletions(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/ScoreboardLib.java b/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/ScoreboardLib.java index af061ac3..af9c67ae 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/ScoreboardLib.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/ScoreboardLib.java @@ -47,19 +47,23 @@ public class ScoreboardLib implements LuaLib { } luaTable.set("group", groups); - luaTable.set("element", new TwoArgFunction() { + luaTable.set("element", new VarArgFunction() { @Override - public LuaValue call(LuaValue key, LuaValue group) { - String elementKey = key.checkjstring(); - ScoreboardElement.ScoreboardGroup elementGroup = ScoreboardElement.ScoreboardGroup.values()[group.checkint()]; + public Varargs invoke(Varargs varargs) { + if (varargs.narg() < 2) { + return NIL; + } + String elementKey = varargs.arg(1).checkjstring(); + ScoreboardElement.ScoreboardGroup elementGroup = ScoreboardElement.ScoreboardGroup.values()[varargs.arg(2).checkint()]; + int priority = varargs.narg() > 2 ? varargs.arg(2).checkint() : Integer.MAX_VALUE; return new VarArgFunction() { @Override public Varargs invoke(Varargs args) { if (args.narg() == 0) { - BauScoreboard.setAdditionalElement(player, elementKey, elementGroup, null); + BauScoreboard.setAdditionalElement(player, elementKey, elementGroup, priority, null); } else { - BauScoreboard.setAdditionalElement(player, elementKey, elementGroup, args.arg1().checkjstring()); + BauScoreboard.setAdditionalElement(player, elementKey, elementGroup, priority, args.arg1().checkjstring()); } return NIL; } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/world/BauScoreboard.java b/BauSystem_Main/src/de/steamwar/bausystem/features/world/BauScoreboard.java index cce4ea38..0961499e 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/world/BauScoreboard.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/world/BauScoreboard.java @@ -9,6 +9,8 @@ import de.steamwar.bausystem.utils.ScoreboardElement; import de.steamwar.linkage.Linked; import de.steamwar.scoreboard.SWScoreboard; import de.steamwar.scoreboard.ScoreboardCallback; +import org.apache.commons.lang3.tuple.MutableTriple; +import org.apache.commons.lang3.tuple.Triple; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -21,7 +23,7 @@ import java.util.*; public class BauScoreboard implements Listener { private static final Map> ELEMENTS = new HashMap<>(); - private static final Map>> ADDITIONAL_SCOREBOARD_LINES = new HashMap<>(); + private static final Map>> ADDITIONAL_SCOREBOARD_LINES = new HashMap<>(); public static void addElement(ScoreboardElement scoreboardElement) { List elements = ELEMENTS.computeIfAbsent(scoreboardElement.getGroup(), scoreboardGroup -> new ArrayList<>()); @@ -29,15 +31,16 @@ public class BauScoreboard implements Listener { elements.sort(Comparator.comparingInt(ScoreboardElement::order)); } - public static void setAdditionalElement(Player player, String key, ScoreboardElement.ScoreboardGroup group, String value) { - Map> playerElements = ADDITIONAL_SCOREBOARD_LINES.computeIfAbsent(player, player1 -> new HashMap<>()); + public static void setAdditionalElement(Player player, String key, ScoreboardElement.ScoreboardGroup group, int priority, String value) { + Map> playerElements = ADDITIONAL_SCOREBOARD_LINES.computeIfAbsent(player, player1 -> new HashMap<>()); if (value == null || value.isBlank()) { playerElements.remove(key); return; } - Pair element = playerElements.computeIfAbsent(key, s -> new Pair<>(null, null)); - element.setKey(group); - element.setValue(value); + MutableTriple element = playerElements.computeIfAbsent(key, s -> new MutableTriple<>(null, null, null)); + element.setLeft(group); + element.setMiddle(priority); + element.setRight(value); } @EventHandler @@ -76,12 +79,13 @@ public class BauScoreboard implements Listener { } } if (ADDITIONAL_SCOREBOARD_LINES.containsKey(player)) { - ADDITIONAL_SCOREBOARD_LINES.get(player).values().forEach(scoreboardGroupStringPair -> { - if (scoreboardGroupStringPair.getKey() != group) { - return; - } - elements.add(scoreboardGroupStringPair.getValue()); - }); + ADDITIONAL_SCOREBOARD_LINES.get(player).values() + .stream() + .filter(triple -> triple.getLeft() == group) + .sorted(Comparator.comparing(triple -> triple.getMiddle())) + .forEach(triple -> { + elements.add(triple.getRight()); + }); } } diff --git a/SCRIPT.md b/SCRIPT.md index 3ac69cb7..a4f742d8 100644 --- a/SCRIPT.md +++ b/SCRIPT.md @@ -260,10 +260,11 @@ Wenn eine Barrier statt des richtigen Items angezeigt wird, dann ist das angegeb Das `scoreboard`-Modul stellt Funktionen zur Verfügung, um Zeilen im Scoreboard hinzuzufügen. Es gibt folgende Funktionen: -| Name | Signature | Beschreibung | -|-----------|-------------------------------------------|----------------------------------------------------------------------| -| `group` | | Siehe: [Scoreboardgroups](#scoreboardgroups) | -| `element` | element(String, Group): ScoreboardElement | Erstellt ein ScoreboardElement, welche man nachfolgend befüllen kann | +| Name | Signature | Beschreibung | +|-----------|----------------------------------------------------|-------------------------------------------------------------------------------------------| +| `group` | | Siehe: [Scoreboardgroups](#scoreboardgroups) | +| `element` | element(String, Group): ScoreboardElement | Erstellt ein ScoreboardElement, welche man nachfolgend befüllen kann | +| `element` | element(String, Group, Integer): ScoreboardElement | Erstellt ein ScoreboardElement, welche man nachfolgend befüllen kann mit einer Sortierung | Ein ScoreboardElement ist ein Objekt, womit du direkt auf einen Wert zugreifen kannst und es ändern kannst. Es geht wie folgt: diff --git a/sw.def.lua b/sw.def.lua index e4faf43c..d3128595 100644 --- a/sw.def.lua +++ b/sw.def.lua @@ -28,6 +28,12 @@ scoreboard = {} ---@return ScoreboardElement function scoreboard.element(key, group) return nil end +---@param key string +---@param group ScoreboardGroup +---@param order number +---@return ScoreboardElement +function scoreboard.element(key, group, order) return nil end + ---@class ScoreboardElement ---@overload fun(): void ---@overload fun(value: string): void