diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/BlazeSMP.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/BlazeSMP.java index b5fdf41..3d29a3d 100644 --- a/src/main/java/me/freezy/plugins/papermc/blazesmp/BlazeSMP.java +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/BlazeSMP.java @@ -12,6 +12,7 @@ import me.freezy.plugins.papermc.blazesmp.module.manager.Homes; import me.freezy.plugins.papermc.blazesmp.module.manager.L4M4; import me.freezy.plugins.papermc.blazesmp.module.manager.ProtectedBlocks; import me.freezy.plugins.papermc.blazesmp.tasks.PlayerNameUpdate; +import me.freezy.plugins.papermc.blazesmp.tasks.TabListTimer; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; @@ -26,6 +27,7 @@ public final class BlazeSMP extends JavaPlugin { @Getter private FileConfiguration configuration; @Getter private Logger log; @Getter private BukkitTask nameUpdateTask; + @Getter private BukkitTask tabListUpdateTask; @Override public void onLoad() { @@ -87,6 +89,7 @@ public final class BlazeSMP extends JavaPlugin { this.log.info("Starting Timer tasks..."); this.nameUpdateTask = new PlayerNameUpdate().runTaskTimer(this, 0L, 20L); + this.tabListUpdateTask = new TabListTimer().runTaskTimer(this, 0L, 20L); this.log.info("Started Timer tasks!"); this.log.info("Enabled BlazeSMP!"); diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/module/manager/L4M4.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/module/manager/L4M4.java index ece8289..7dce624 100644 --- a/src/main/java/me/freezy/plugins/papermc/blazesmp/module/manager/L4M4.java +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/module/manager/L4M4.java @@ -10,15 +10,15 @@ import java.io.InputStream; import java.io.Reader; import java.nio.file.Files; import java.nio.file.StandardCopyOption; -import java.util.Map; +import java.util.*; import java.util.logging.Logger; public class L4M4 { private static final Logger LOGGER = Logger.getLogger("L4M4"); private static final String MESSAGES_STORAGE_PATH = "plugins/BlazeSMP/storage/messages.json"; - // Map zum Speichern der geladenen Nachrichten - private static Map messages; + // Map zum Speichern der geladenen Nachrichten (jetzt mit Object als Wert) + private static Map messages; /** * Initialisiert die messages.json und lädt anschließend die Nachrichten. @@ -36,7 +36,6 @@ public class L4M4 { private static void initializeMessages() { File messagesFile = new File(MESSAGES_STORAGE_PATH); if (!messagesFile.exists()) { - // Erstelle die notwendigen Verzeichnisse if (messagesFile.getParentFile() != null && !messagesFile.getParentFile().exists()) { if (messagesFile.getParentFile().mkdirs()) { LOGGER.info("Verzeichnis für messages.json erstellt: " + messagesFile.getParentFile().getAbsolutePath()); @@ -45,13 +44,11 @@ public class L4M4 { return; } } - // Lade die Ressource als Stream try (InputStream in = L4M4.class.getClassLoader().getResourceAsStream("storage/messages.json")) { if (in == null) { LOGGER.severe("Resource 'storage/messages.json' nicht gefunden!"); return; } - // Kopiere den Inhalt der Ressource in die Zieldatei Files.copy(in, messagesFile.toPath(), StandardCopyOption.REPLACE_EXISTING); LOGGER.info("Default messages.json wurde kopiert nach: " + MESSAGES_STORAGE_PATH); } catch (IOException e) { @@ -73,7 +70,7 @@ public class L4M4 { } try (Reader reader = new FileReader(messagesFile)) { Gson gson = new Gson(); - messages = gson.fromJson(reader, new TypeToken>() {}.getType()); + messages = gson.fromJson(reader, new TypeToken>() {}.getType()); LOGGER.info("messages.json wurde erfolgreich geladen."); } catch (IOException e) { LOGGER.severe("Fehler beim Laden von messages.json: " + e.getMessage()); @@ -84,17 +81,71 @@ public class L4M4 { * Gibt den Wert zum gegebenen Schlüssel zurück. * * @param key der Schlüssel - * @return der Wert, falls vorhanden, ansonsten null. + * @return der Wert als Object, falls vorhanden, ansonsten "404 not found". */ public static String get(String key) { if (messages == null) { LOGGER.warning("Messages wurden nicht geladen. Bitte init() aufrufen."); return "404 not found"; } - String value = messages.get(key); + String value = (String) messages.get(key); if (value == null) { LOGGER.warning("Key '" + key + "' nicht in messages.json gefunden."); + return "404 not found"; } return value; } + + /** + * Gibt eine Liste aller Nachrichtenwerte zurück. + * + * @return LinkedList mit allen gespeicherten Werten aus messages.json. + */ + public static LinkedList getStringList() { + if (messages == null) { + LOGGER.warning("Messages wurden nicht geladen. Bitte init() aufrufen."); + return new LinkedList<>(); + } + return new LinkedList<>(messages.values()); + } + + /** + * Gibt eine Liste von Strings für einen bestimmten Key zurück. + * Falls der Wert ein Array ist, wird es als Liste zurückgegeben. + * Falls der Wert ein einzelner String ist, wird eine Liste mit einem Element zurückgegeben. + * Falls der Key nicht existiert, wird eine leere Liste zurückgegeben. + * + * @param key der Schlüssel, dessen Werte als Liste zurückgegeben werden sollen. + * @return LinkedList mit den gespeicherten Werten. + */ + public static LinkedList getStringList(String key) { + LinkedList result = new LinkedList<>(); + + if (messages == null) { + LOGGER.warning("Messages wurden nicht geladen. Bitte init() aufrufen."); + return result; + } + + Object value = messages.get(key); + switch (value) { + case null -> { + LOGGER.warning("Key '" + key + "' nicht in messages.json gefunden."); + return result; + } + case List objects -> { + // Falls es eine Liste ist, konvertiere sie zu einer Liste von Strings + for (Object obj : objects) { + if (obj instanceof String) { + result.add((String) obj); + } + } + } + case String s -> + // Falls der Wert nur ein einzelner String ist, füge ihn zur Liste hinzu + result.add(s); + default -> LOGGER.warning("Key '" + key + "' enthält keine Liste oder String in messages.json."); + } + + return result; + } } diff --git a/src/main/java/me/freezy/plugins/papermc/blazesmp/tasks/TabListTimer.java b/src/main/java/me/freezy/plugins/papermc/blazesmp/tasks/TabListTimer.java new file mode 100644 index 0000000..a6a0a17 --- /dev/null +++ b/src/main/java/me/freezy/plugins/papermc/blazesmp/tasks/TabListTimer.java @@ -0,0 +1,58 @@ +package me.freezy.plugins.papermc.blazesmp.tasks; + +import me.freezy.plugins.papermc.blazesmp.module.manager.L4M4; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Bukkit; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.LinkedList; + +public class TabListTimer extends BukkitRunnable { + private LinkedList header = new LinkedList<>(); + private LinkedList footer = new LinkedList<>(); + private int index = 0; + + public TabListTimer() { + reloadData(); + } + + /** + * Lädt die Header- und Footer-Daten neu. + * Falls eine Liste leer ist, wird ein Standardwert gesetzt, um Fehler zu vermeiden. + */ + private void reloadData() { + header = L4M4.getStringList("tablist.header"); + footer = L4M4.getStringList("tablist.footer"); + + // Falls eine Liste leer ist, setzen wir eine Fallback-Nachricht + if (header.isEmpty()) { + header.add("Error"); + } + if (footer.isEmpty()) { + footer.add("Error"); + } + } + + @Override + public void run() { + if (header.isEmpty() || footer.isEmpty()) { + reloadData(); + } + + int headerIndex = index % header.size(); + int footerIndex = index % footer.size(); + + Bukkit.getOnlinePlayers().forEach(player -> { + player.sendPlayerListHeaderAndFooter( + MiniMessage.miniMessage().deserialize(header.get(headerIndex)), + MiniMessage.miniMessage().deserialize(footer.get(footerIndex)) + ); + }); + + index++; + + if (index >= Math.max(header.size(), footer.size())) { + index = 0; + } + } +} diff --git a/src/main/resources/storage/messages.json b/src/main/resources/storage/messages.json index 975cbf9..dda198b 100644 --- a/src/main/resources/storage/messages.json +++ b/src/main/resources/storage/messages.json @@ -116,5 +116,13 @@ "teleport.cancelled": "Teleporting cancelled, you moved!", "teleport.success": "Teleported!", - "teleport.countdown": "Teleporting to home in %s seconds!" + "teleport.countdown": "Teleporting to home in %s seconds!", + + "tablist.header": [ + "BlazeSMP" + ], + "tablist.footer": [ + "hosted by merged.games", + "made by BlazeHC Team & Freezy/DaTTV" + ] }