Dateien nach "src/main/java/de/nexuslobby/modules/tablist" hochladen

This commit is contained in:
2026-01-22 14:58:36 +00:00
parent 5ebed56418
commit a0eeff00ca

View File

@@ -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<String> h = vConfig.getStringList("tablist.header-animations");
List<String> 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<String> 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<String> 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();
}
}