From a0eeff00cac2d589f6e08435c81be9885eeeef3e Mon Sep 17 00:00:00 2001 From: M_Viper Date: Thu, 22 Jan 2026 14:58:36 +0000 Subject: [PATCH] Dateien nach "src/main/java/de/nexuslobby/modules/tablist" hochladen --- .../modules/tablist/TablistModule.java | 156 ++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 src/main/java/de/nexuslobby/modules/tablist/TablistModule.java diff --git a/src/main/java/de/nexuslobby/modules/tablist/TablistModule.java b/src/main/java/de/nexuslobby/modules/tablist/TablistModule.java new file mode 100644 index 0000000..21141f4 --- /dev/null +++ b/src/main/java/de/nexuslobby/modules/tablist/TablistModule.java @@ -0,0 +1,156 @@ +package de.nexuslobby.modules.tablist; + +import de.nexuslobby.NexusLobby; +import de.nexuslobby.api.Module; +import net.luckperms.api.LuckPerms; +import net.luckperms.api.LuckPermsProvider; +import net.luckperms.api.model.user.User; +import me.clip.placeholderapi.PlaceholderAPI; +import org.bukkit.Bukkit; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitTask; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +import java.util.List; + +public class TablistModule implements Module { + + private BukkitTask refreshTask; + private int currentHeaderIndex = 0; + private int currentFooterIndex = 0; + private LuckPerms luckPerms; + private boolean placeholderAPIEnabled; + + @Override + public String getName() { return "Tablist"; } + + @Override + public void onEnable() { + FileConfiguration vConfig = NexusLobby.getInstance().getVisualsConfig(); + if (!vConfig.getBoolean("tablist.enabled", true)) return; + + if (Bukkit.getPluginManager().getPlugin("LuckPerms") != null) luckPerms = LuckPermsProvider.get(); + placeholderAPIEnabled = Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null; + + // Nutzt jetzt das Intervall aus der visuals.yml + long interval = vConfig.getLong("tablist.interval-ticks", 40L); + refreshTask = Bukkit.getScheduler().runTaskTimer(NexusLobby.getInstance(), this::refreshAll, 10L, interval); + } + + private void refreshAll() { + updateAnimationIndices(); + for (Player viewer : Bukkit.getOnlinePlayers()) { + viewer.setPlayerListHeader(getHeader(viewer)); + viewer.setPlayerListFooter(getFooter(viewer)); + updateTeams(viewer); + } + } + + private void updateTeams(Player viewer) { + FileConfiguration vConfig = NexusLobby.getInstance().getVisualsConfig(); + if (!vConfig.getBoolean("tablist.show-prefix-in-playerlist", true)) return; + + Scoreboard sb = viewer.getScoreboard(); + if (sb == Bukkit.getScoreboardManager().getMainScoreboard()) return; + + for (Player target : Bukkit.getOnlinePlayers()) { + String teamName = "tab_" + target.getName(); + if (teamName.length() > 16) teamName = teamName.substring(0, 16); + + Team team = sb.getTeam(teamName); + if (team == null) team = sb.registerNewTeam(teamName); + + String prefix = getPlayerPrefix(target); + String suffix = getPlayerSuffix(target); + + if (!team.getPrefix().equals(prefix)) team.setPrefix(prefix); + if (!team.getSuffix().equals(suffix)) team.setSuffix(suffix); + + if (!team.hasEntry(target.getName())) { + team.addEntry(target.getName()); + } + } + } + + private String getPlayerPrefix(Player player) { + String prefix = ""; + if (luckPerms != null) { + User user = luckPerms.getUserManager().getUser(player.getUniqueId()); + if (user != null && user.getCachedData().getMetaData().getPrefix() != null) { + prefix = user.getCachedData().getMetaData().getPrefix(); + } + } + if (prefix.isEmpty() && placeholderAPIEnabled) { + prefix = PlaceholderAPI.setPlaceholders(player, "%luckperms_prefix%"); + } + return colorize(prefix.isEmpty() ? "&7" : prefix + " "); + } + + private String getPlayerSuffix(Player player) { + // Hier könnte man später auch Suffixe aus der Config laden + return colorize(" &8[&a" + player.getPing() + "ms&8]"); + } + + private void updateAnimationIndices() { + FileConfiguration vConfig = NexusLobby.getInstance().getVisualsConfig(); + List h = vConfig.getStringList("tablist.header-animations"); + List f = vConfig.getStringList("tablist.footer-animations"); + if (!h.isEmpty()) currentHeaderIndex = (currentHeaderIndex + 1) % h.size(); + if (!f.isEmpty()) currentFooterIndex = (currentFooterIndex + 1) % f.size(); + } + + private String getHeader(Player p) { + FileConfiguration vConfig = NexusLobby.getInstance().getVisualsConfig(); + List list = vConfig.getStringList("tablist.header-animations"); + if (list.isEmpty()) return "§6NexusLobby"; + return replacePlaceholders(list.get(currentHeaderIndex), p); + } + + private String getFooter(Player p) { + FileConfiguration vConfig = NexusLobby.getInstance().getVisualsConfig(); + List list = vConfig.getStringList("tablist.footer-animations"); + if (list.isEmpty()) return "§7Willkommen"; + return replacePlaceholders(list.get(currentFooterIndex), p); + } + + private String replacePlaceholders(String text, Player p) { + FileConfiguration vConfig = NexusLobby.getInstance().getVisualsConfig(); + + text = text.replace("{server}", vConfig.getString("tablist.server-name", "NexusLobby")); + text = text.replace("{player}", p.getName()); + text = text.replace("{online}", String.valueOf(Bukkit.getOnlinePlayers().size())); + text = text.replace("{staff}", String.valueOf(getOnlineStaffCount())); + text = text.replace("{separator}", vConfig.getString("tablist.separator-line", "")); + + text = text.replace("{website}", vConfig.getBoolean("tablist.show-website") ? vConfig.getString("tablist.website", "") : ""); + text = text.replace("{teamspeak}", vConfig.getBoolean("tablist.show-teamspeak") ? vConfig.getString("tablist.teamspeak-address", "") : ""); + text = text.replace("{discord}", vConfig.getBoolean("tablist.show-discord") ? vConfig.getString("tablist.discord-address", "") : ""); + + if (placeholderAPIEnabled) { + text = PlaceholderAPI.setPlaceholders(p, text); + } + + return colorize(text); + } + + private int getOnlineStaffCount() { + FileConfiguration vConfig = NexusLobby.getInstance().getVisualsConfig(); + String permission = vConfig.getString("tablist.staff-permission", "nexuslobby.staff"); + int count = 0; + for (Player p : Bukkit.getOnlinePlayers()) { + if (p.hasPermission(permission)) count++; + } + return count; + } + + private String colorize(String s) { + return s == null ? "" : s.replace("&", "§"); + } + + @Override + public void onDisable() { + if (refreshTask != null) refreshTask.cancel(); + } +} \ No newline at end of file