From ec86f756196aeba7c9b23839519efd9b534427e3 Mon Sep 17 00:00:00 2001 From: JeremyStarTM Date: Wed, 9 Oct 2024 02:33:06 +0200 Subject: [PATCH] Add WIP TabListHandler class --- extension/build.gradle | 3 + .../de/jeremystartm/pickshadow/Extension.java | 1 + .../api/translation/LanguageString.java | 1 + .../pickshadow/misc/TabListHandler.java | 137 ++++++++++++++++++ .../src/main/resources/translations/en.json | 1 + gradle.properties | 1 + 6 files changed, 144 insertions(+) create mode 100644 extension/src/main/java/de/jeremystartm/pickshadow/misc/TabListHandler.java diff --git a/extension/build.gradle b/extension/build.gradle index 3898ce2..75ad362 100644 --- a/extension/build.gradle +++ b/extension/build.gradle @@ -51,6 +51,9 @@ dependencies { // Plugins compileOnly("net.luckperms:api:${dependencyLuckPerms}") + + // Bukkit libraries + implementation("fr.mrmicky:fastboard:${dependencyFastboard}") } // Set Java version diff --git a/extension/src/main/java/de/jeremystartm/pickshadow/Extension.java b/extension/src/main/java/de/jeremystartm/pickshadow/Extension.java index dcf0140..d2bf320 100644 --- a/extension/src/main/java/de/jeremystartm/pickshadow/Extension.java +++ b/extension/src/main/java/de/jeremystartm/pickshadow/Extension.java @@ -89,6 +89,7 @@ public final class Extension extends JavaPlugin { ExtensionInformation.update(); TranslationManager.loadTranslations(); TranslationManager.processTranslations(); + //TabListHandler.initialize(); PlayerDataFactory.initialize(); logger.info("Bootstrapped in " + Miscellaneous.measureExecutionTime(() -> {}) + "ms"); diff --git a/extension/src/main/java/de/jeremystartm/pickshadow/api/translation/LanguageString.java b/extension/src/main/java/de/jeremystartm/pickshadow/api/translation/LanguageString.java index 9c61825..54940e5 100644 --- a/extension/src/main/java/de/jeremystartm/pickshadow/api/translation/LanguageString.java +++ b/extension/src/main/java/de/jeremystartm/pickshadow/api/translation/LanguageString.java @@ -51,6 +51,7 @@ public enum LanguageString { // Connection errors CONNECTION_ERROR_REGISTRATION, + CONNECTION_ERROR_TABLISTHANDLER, // Command /psse EXTENSIONCMD_GREETER, diff --git a/extension/src/main/java/de/jeremystartm/pickshadow/misc/TabListHandler.java b/extension/src/main/java/de/jeremystartm/pickshadow/misc/TabListHandler.java new file mode 100644 index 0000000..e20b508 --- /dev/null +++ b/extension/src/main/java/de/jeremystartm/pickshadow/misc/TabListHandler.java @@ -0,0 +1,137 @@ +/* + * PICKSHADOW SERVER KIT SOURCE FILE + * Copyright (c) 2024 The PickShadow Server Kit authors + * Licensed under the GNU Affero General Public License v3 + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.jeremystartm.pickshadow.misc; + +import de.jeremystartm.pickshadow.Extension; +import de.jeremystartm.pickshadow.api.entity.player.PlayerData; +import de.staropensource.sosengine.base.logging.LoggerInstance; +import fr.mrmicky.fastboard.adventure.FastBoard; +import net.kyori.adventure.text.minimessage.MiniMessage; +import lombok.Getter; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * Handles and manages scoreboards + * and the player tab list. + *

+ * Doesn't work at all and + * should not be used. + * + * @since v1-release0 + */ +@ApiStatus.Experimental +@SuppressWarnings({ "JavadocDeclaration" }) +public final class TabListHandler { + /** + * Contains the global instance of this class. + * + * @since v1-release0 + * -- GETTER -- + * Returns the global instance of this class. + * + * @return global instance + * @since v1-release0 + */ + @Getter + private static TabListHandler instance = null; + + /** + * Contains the logger instance for this class. + * + * @since v1-release0 + */ + private final LoggerInstance logger = new LoggerInstance.Builder().setClazz(getClass()).setOrigin("PSSE").build(); + + /** + * Contains the content of the tab list. + * Each entry represents one line. + * + * @since v1-release0 + */ + private final @NotNull List<@NotNull String> content = List.of( + "Line 1", + "Line 2", + "Line DREI", + "Line 4", + "Line 5" + ); + + /** + * Creates and initializes an instance of this class. + * + * @since v1-release0 + */ + private TabListHandler() {} + + /** + * Initializes the scoreboard handler, + * if it hasn't been already. + * + * @since v1-release0 + */ + public static void initialize() { + if (instance == null) + instance = new TabListHandler(); + } + + /** + * Initializes the tab list for + * some {@link PlayerData} instance. + * + * @since v1-release0 + */ + public void initializeTabList(@NotNull PlayerData playerData) { + logger.verb("Initializing player list for player " + playerData.getPlayer().getName() + " (" + playerData.getPlayer().getUniqueId() + ")"); + + // Initialize FastBoard + FastBoard board = new FastBoard(playerData.getPlayer()); + playerData.setPlayerListScoreboard(board); + + // Configure FastBoard + board.updateTitle(MiniMessage.miniMessage().deserialize("TabList yay")); + + // Schedule update + updateTabList(playerData, true); + } + + /** + * Updates the tab list. + * + * @since v1-release0 + */ + public void updateTabList(@NotNull PlayerData playerData, boolean justSchedule) { + // Schedule next update + playerData.getPlayer().getScheduler().execute(Extension.getInstance(), () -> updateTabList(playerData, false), null, 20); + + // Stop further execution if 'justSchedule' is true + if (justSchedule) + return; + + logger.verb("Updating player list for player " + playerData.getPlayer().getName() + " (" + playerData.getPlayer().getUniqueId() + ")"); + + for (int line = 0; line < content.size(); line++) { + logger.verb("Processing line " + line + " for player " + playerData.getPlayer().getName() + " (" + playerData.getPlayer().getUniqueId() + ")"); + playerData.getPlayerListScoreboard().updateLine(line, MiniMessage.miniMessage().deserialize(content.get(line))); + } + } +} diff --git a/extension/src/main/resources/translations/en.json b/extension/src/main/resources/translations/en.json index a98e982..5cb4ccd 100644 --- a/extension/src/main/resources/translations/en.json +++ b/extension/src/main/resources/translations/en.json @@ -20,6 +20,7 @@ "ERROR_PLAYER_NOT_FOUND": "The player %player% could not be found.", "CONNECTION_ERROR_REGISTRATION": "Unable to process log in", + "CONNECTION_ERROR_TABLISTHANDLER": "TabListHandler failed unexpectedly", "EXTENSIONCMD_GREETER": "This subserver is running <#d60532>PSSE \"%codename%\" @ %version% (%commit%, dirty %dirty%)\nTo view additional information, invoke some subcommands.", "EXTENSIONCMD_KILLJVM": "Bye bye!", diff --git a/gradle.properties b/gradle.properties index 22f94aa..c2530d3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -37,6 +37,7 @@ dependencyGson=2.11.0 dependencyPaper=R0.1 dependencyAdventure=4.17.0 dependencyLuckPerms=5.4 +dependencyFastboard=2.1.3 # Plugins pluginLombok=8.6