Added updator for TabList

This commit is contained in:
DaTTV 2025-02-20 07:56:07 +01:00
parent 595e3005d7
commit 989079757e
4 changed files with 130 additions and 10 deletions

View file

@ -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!");

View file

@ -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<String, String> messages;
// Map zum Speichern der geladenen Nachrichten (jetzt mit Object als Wert)
private static Map<String, Object> 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<Map<String, String>>() {}.getType());
messages = gson.fromJson(reader, new TypeToken<Map<String, Object>>() {}.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<Object> 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<String> mit den gespeicherten Werten.
*/
public static LinkedList<String> getStringList(String key) {
LinkedList<String> 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;
}
}

View file

@ -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<String> header = new LinkedList<>();
private LinkedList<String> 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("<gray>Error</gray>");
}
if (footer.isEmpty()) {
footer.add("<gray>Error</gray>");
}
}
@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;
}
}
}

View file

@ -116,5 +116,13 @@
"teleport.cancelled": "<red>Teleporting cancelled, you moved!</red>",
"teleport.success": "<green>Teleported!</green>",
"teleport.countdown": "<yellow>Teleporting to home in %s seconds!</yellow>"
"teleport.countdown": "<yellow>Teleporting to home in %s seconds!</yellow>",
"tablist.header": [
"<b><gold>BlazeSMP</gold></b>"
],
"tablist.footer": [
"<aqua>hosted by merged.games</aqua>",
"<c:light_gray>made by BlazeHC Team & Freezy/DaTTV</c>"
]
}