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
+ * 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("