From 972d58f5c8dfabfa497962be3fcb49c84ea1224c Mon Sep 17 00:00:00 2001 From: NotAlexNoyle Date: Thu, 11 Dec 2025 00:26:02 -0500 Subject: [PATCH] New library --- build.gradle.kts | 18 +- src/main/java/plugin/ScoreboardOG.java | 219 +++++++++++++++++++------ src/main/resources/plugin.yml | 6 +- 3 files changed, 188 insertions(+), 55 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index eaeb772..cd1f081 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -34,6 +34,8 @@ version = "1.0" // Declare plugin version (will be in .jar). val apiVersion = "1.19" // Declare minecraft server target version. +val scoreboardLibraryVersion = "2.4.3" + /* ----------------------------- Resources ----------------------------- */ tasks.named("processResources") { val props = mapOf("version" to version, "apiVersion" to apiVersion) @@ -47,7 +49,8 @@ repositories { mavenCentral() // Import the Maven Central Maven Repository. gradlePluginPortal() // Import the Gradle Plugin Portal Maven Repository. maven { url = uri("https://repo.purpurmc.org/snapshots") } // Import the PurpurMC Maven Repository. - maven { url = uri("https://repo.hotten.cloud/snapshots") } // Import the ScoreboardLib library. + maven { url = uri("https://repo.codemc.io/repository/maven-releases/") } + maven { url = uri("https://repo.codemc.io/repository/maven-snapshots/") } maven { url = uri("file://${System.getProperty("user.home")}/.m2/repository") } System.getProperty("SELF_MAVEN_LOCAL_REPO")?.let { // TrueOG Bootstrap mavenLocal(). val dir = file(it) @@ -70,7 +73,16 @@ dependencies { compileOnlyApi(project(":libs:DiamondBank-OG")) { attributes { attribute(kotlinAttribute, true) } } // Import TrueOG network DiamondBank-OG Kotlin API (from source). - implementation("me.tigerhix.lib:scoreboard:1.0.1-SNAPSHOT") + implementation("net.megavex:scoreboard-library-api:$scoreboardLibraryVersion") // Import scoreboard library API. + runtimeOnly( + "net.megavex:scoreboard-library-implementation:$scoreboardLibraryVersion" + ) // Import scoreboard library implementation. + implementation( + "net.megavex:scoreboard-library-extra-kotlin:$scoreboardLibraryVersion" + ) // Kotlin specific extensions. + runtimeOnly( + "net.megavex:scoreboard-library-packetevents:$scoreboardLibraryVersion" + ) // PacketEvents version supports 1.8+ } apply(from = "eclipse.gradle.kts") // Import eclipse classpath support script. @@ -85,6 +97,8 @@ tasks.withType().configureEach { // Ensure reproducible .ja tasks.shadowJar { exclude("io.github.miniplaceholders.*") // Exclude the MiniPlaceholders package from being shadowed. archiveClassifier.set("") // Use empty string instead of null. + isEnableRelocation = true + relocationPrefix = "${project.group}.shadow" minimize() } diff --git a/src/main/java/plugin/ScoreboardOG.java b/src/main/java/plugin/ScoreboardOG.java index e2b8e06..7df4851 100644 --- a/src/main/java/plugin/ScoreboardOG.java +++ b/src/main/java/plugin/ScoreboardOG.java @@ -6,6 +6,16 @@ import java.util.HashMap; import java.util.Map; import java.util.UUID; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import net.luckperms.api.LuckPerms; +import net.luckperms.api.cacheddata.CachedMetaData; +import net.luckperms.api.model.user.User; +import net.megavex.scoreboardlibrary.api.ScoreboardLibrary; +import net.megavex.scoreboardlibrary.api.sidebar.Sidebar; +import net.megavex.scoreboardlibrary.api.sidebar.component.ComponentSidebarLayout; +import net.megavex.scoreboardlibrary.api.sidebar.component.SidebarComponent; +import net.trueog.utilitiesog.UtilitiesOG; import org.apache.commons.lang3.StringUtils; import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; @@ -13,24 +23,18 @@ import org.bukkit.entity.Player; import org.bukkit.plugin.RegisteredServiceProvider; import org.bukkit.plugin.java.JavaPlugin; -import me.tigerhix.lib.scoreboard.ScoreboardLib; -import me.tigerhix.lib.scoreboard.common.EntryBuilder; -import me.tigerhix.lib.scoreboard.type.Entry; -import me.tigerhix.lib.scoreboard.type.Scoreboard; -import me.tigerhix.lib.scoreboard.type.ScoreboardHandler; -import net.luckperms.api.LuckPerms; -import net.luckperms.api.cacheddata.CachedMetaData; -import net.luckperms.api.model.user.User; -import net.trueog.utilitiesog.UtilitiesOG; - public class ScoreboardOG extends JavaPlugin { + private static final LegacyComponentSerializer LEGACY_SERIALIZER = LegacyComponentSerializer.legacyAmpersand(); + private static ScoreboardOG instance; private FileConfiguration config; - private final Map boards = new HashMap<>(); + private final Map sidebars = new HashMap<>(); private LuckPerms luckPerms; + private ScoreboardLibrary scoreboardLibrary; + private int updateTaskId = -1; public static ScoreboardOG getInstance() { @@ -50,7 +54,17 @@ public class ScoreboardOG extends JavaPlugin { saveDefaultConfig(); this.config = getConfig(); - ScoreboardLib.setPluginInstance(this); + + try { + + this.scoreboardLibrary = ScoreboardLibrary.loadScoreboardLibrary(this); + + } catch (Exception e) { + + this.scoreboardLibrary = null; + getLogger().warning("No scoreboard packet adapter available, disabling scoreboards."); + + } // Hook LuckPerms API. final RegisteredServiceProvider provider = Bukkit.getServicesManager() @@ -68,13 +82,41 @@ public class ScoreboardOG extends JavaPlugin { getServer().getPluginManager().registerEvents(new Listeners(), this); Bukkit.getOnlinePlayers().forEach(this::openBoard); + this.updateTaskId = Bukkit.getScheduler().scheduleSyncRepeatingTask(this, () -> { + + for (Player online : Bukkit.getOnlinePlayers()) { + + PlayerSidebar sidebar = sidebars.get(online.getUniqueId()); + if (sidebar != null) { + + sidebar.tick(); + + } + + } + + }, 0L, 10L); + } @Override public void onDisable() { - boards.values().forEach(Scoreboard::deactivate); - boards.clear(); + if (updateTaskId != -1) { + + Bukkit.getScheduler().cancelTask(updateTaskId); + updateTaskId = -1; + + } + + sidebars.values().forEach(PlayerSidebar::close); + sidebars.clear(); + + if (scoreboardLibrary != null) { + + scoreboardLibrary.close(); + + } } @@ -86,55 +128,86 @@ public class ScoreboardOG extends JavaPlugin { public void openBoard(Player player) { - final Scoreboard board = ScoreboardLib.createScoreboard(player).setHandler(new ScoreboardHandler() { + if (scoreboardLibrary == null) { - @Override - public String getTitle(Player p) { + return; - return "&4♥ &a&lTrue&c&lOG&r&e Network &4♥"; + } - } + closeBoard(player); - @Override - public java.util.List getEntries(Player p) { - - // Fetch LuckPerms prefix with formatting. - String lpPrefix = getLuckPermsPrefixLegacy(p); - lpPrefix = stripLeadingReset(stripTrailingReset(lpPrefix)); - - // Bleed formatting from prefix into name. - final String youTail = joinSpace(lpPrefix, p.getName()); - final String youLine = "&aYou:&r " + youTail + "&r"; - - // Independently formatted Union tag. - final String unionTag = expandMM(p, ""); - final String unionLine = "&cUnion: &r" + unionTag + "&r"; - - return new EntryBuilder().next("&c&m----&6&m----&e&m----&2&m----&9&m----&5&m----").next(youLine).blank() - .next("&bDiamonds: " + expandMM(p, "")).blank().next(unionLine).blank() - .next("&2Kills: " + expandMM(p, "")).blank() - .next("&4Deaths: " + expandMM(p, "")).blank() - .next("&4&m--&0&m--&4> &etrue-og.net &4<&0&m--&4&m--").build(); - - } - - }).setUpdateInterval(10L); - board.activate(); - boards.put(player.getUniqueId(), board); + PlayerSidebar sidebar = new PlayerSidebar(player); + sidebars.put(player.getUniqueId(), sidebar); } public void closeBoard(Player player) { - final Scoreboard board = boards.remove(player.getUniqueId()); - if (board != null) { + final PlayerSidebar sidebar = sidebars.remove(player.getUniqueId()); + if (sidebar != null) { - board.deactivate(); + sidebar.close(); } } + private Component createYouLine(Player p) { + + String lpPrefix = getLuckPermsPrefixLegacy(p); + lpPrefix = stripLeadingReset(stripTrailingReset(lpPrefix)); + + final String youTail = joinSpace(lpPrefix, p.getName()); + final Component label = legacyText("&aYou:&r "); + final Component tail = legacyText(youTail); + return label.append(tail); + + } + + private Component createUnionLine(Player p) { + + final Component label = legacyText("&cUnion: &r"); + final Component unionTag = expandMM(p, ""); + return label.append(unionTag); + + } + + private Component createDiamondsLine(Player p) { + + final Component label = legacyText("&bDiamonds: "); + final Component value = expandMM(p, ""); + return label.append(value); + + } + + private Component createKillsLine(Player p) { + + final Component label = legacyText("&2Kills: &r"); + final Component value = expandMM(p, ""); + return label.append(value); + + } + + private Component createDeathsLine(Player p) { + + final Component label = legacyText("&4Deaths: &r"); + final Component value = expandMM(p, ""); + return label.append(value); + + } + + private static Component legacyText(String input) { + + if (input == null || StringUtils.isEmpty(input)) { + + return Component.empty(); + + } + + return LEGACY_SERIALIZER.deserialize(input); + + } + // Resolve the player's LuckPerms prefix as legacy color codes with any // serializing. private String getLuckPermsPrefixLegacy(Player p) { @@ -170,10 +243,10 @@ public class ScoreboardOG extends JavaPlugin { } /// Return expanded text or null depending on if the String is populated. - private static String expandMM(Player p, String miniMsg) { + private static Component expandMM(Player p, String miniMsg) { - final String out = UtilitiesOG.trueogExpand(miniMsg, p).content(); - return out == null ? "" : out; + final Component out = UtilitiesOG.trueogExpand(miniMsg, p); + return out == null ? Component.empty() : out; } @@ -238,4 +311,46 @@ public class ScoreboardOG extends JavaPlugin { } -} \ No newline at end of file + private final class PlayerSidebar { + + private final Player player; + private final Sidebar sidebar; + private final ComponentSidebarLayout layout; + + private PlayerSidebar(Player player) { + + this.player = player; + this.sidebar = scoreboardLibrary.createSidebar(); + + SidebarComponent titleComponent = SidebarComponent + .staticLine(legacyText("&4♥ &a&lTrue&c&lOG&r&e Network &4♥")); + + SidebarComponent lines = SidebarComponent.builder() + .addStaticLine(legacyText("&c&m----&6&m----&e&m----&2&m----&9&m----&5&m----")) + .addDynamicLine(() -> createYouLine(this.player)).addBlankLine() + .addDynamicLine(() -> createDiamondsLine(this.player)).addBlankLine() + .addDynamicLine(() -> createUnionLine(this.player)).addBlankLine() + .addDynamicLine(() -> createKillsLine(this.player)).addBlankLine() + .addDynamicLine(() -> createDeathsLine(this.player)).addBlankLine() + .addStaticLine(legacyText("&4&m--&0&m--&4> &etrue-og.net &4<&0&m--&4&m--")).build(); + + this.layout = new ComponentSidebarLayout(titleComponent, lines); + this.sidebar.addPlayer(player); + + } + + private void tick() { + + layout.apply(sidebar); + + } + + private void close() { + + sidebar.close(); + + } + + } + +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index b40c0fc..6d4c3e2 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -8,6 +8,10 @@ main: plugin.ScoreboardOG depend: - DiamondBank-OG - Utilities-OG + - PacketEvents-OG - LuckPerms softdepend: - - PlaceholderAPI + - ProtocolLib + - ViaVersion + - ViaBackwards + - ViaRewind