package de.viper.survivalplus.tasks; import org.bukkit.Bukkit; import org.bukkit.boss.BarColor; import org.bukkit.boss.BarFlag; import org.bukkit.boss.BarStyle; import org.bukkit.boss.BossBar; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; import org.bukkit.scheduler.BukkitRunnable; import java.util.*; public class AFKManager { private final Plugin plugin; private final long afkAfterMillis; private final long kickAfterMillis; private final Map lastActivity = new HashMap<>(); private final Set afkPlayers = new HashSet<>(); private final Map bossBars = new WeakHashMap<>(); private final Map colorIndex = new HashMap<>(); private final Map colorTasks = new HashMap<>(); private final List colorCycle = List.of( BarColor.RED, BarColor.YELLOW, BarColor.GREEN, BarColor.BLUE, BarColor.PURPLE, BarColor.PINK ); public AFKManager(Plugin plugin, long afkAfterSeconds, long kickAfterSeconds) { this.plugin = plugin; this.afkAfterMillis = afkAfterSeconds * 1000; this.kickAfterMillis = kickAfterSeconds * 1000; } public void updateActivity(Player player) { UUID uuid = player.getUniqueId(); lastActivity.put(uuid, System.currentTimeMillis()); if (afkPlayers.contains(uuid)) { afkPlayers.remove(uuid); removeAFKBossBar(player); } } public void reset(Player player) { UUID uuid = player.getUniqueId(); lastActivity.remove(uuid); afkPlayers.remove(uuid); removeAFKBossBar(player); } public boolean isAFK(Player player) { return afkPlayers.contains(player.getUniqueId()); } public void checkAFKStatus(Player player) { UUID uuid = player.getUniqueId(); long currentTime = System.currentTimeMillis(); if (!lastActivity.containsKey(uuid)) { lastActivity.put(uuid, currentTime); return; } long last = lastActivity.get(uuid); long diff = currentTime - last; if (diff >= afkAfterMillis) { if (!afkPlayers.contains(uuid)) { afkPlayers.add(uuid); // BossBar wird im Listener angezeigt } if (kickAfterMillis > 0 && diff >= kickAfterMillis) { player.kickPlayer("§cDu wurdest wegen AFK gekickt."); } } else { if (afkPlayers.contains(uuid)) { afkPlayers.remove(uuid); removeAFKBossBar(player); } } } public void showAFKBossBar(Player player, String message) { UUID uuid = player.getUniqueId(); removeAFKBossBar(player); // sicherstellen, dass nur eine BossBar aktiv ist BossBar bar = Bukkit.createBossBar(message, BarColor.YELLOW, BarStyle.SOLID, BarFlag.CREATE_FOG); bar.addPlayer(player); bar.setVisible(true); bossBars.put(uuid, bar); colorIndex.put(uuid, 0); // Alten Farbwechsel-Task stoppen, falls vorhanden if (colorTasks.containsKey(uuid)) { colorTasks.get(uuid).cancel(); colorTasks.remove(uuid); } BukkitRunnable task = new BukkitRunnable() { @Override public void run() { if (!bossBars.containsKey(uuid)) { this.cancel(); colorTasks.remove(uuid); return; } int index = colorIndex.getOrDefault(uuid, 0); BarColor color = colorCycle.get(index); BossBar activeBar = bossBars.get(uuid); if (activeBar != null) { activeBar.setColor(color); } colorIndex.put(uuid, (index + 1) % colorCycle.size()); } }; task.runTaskTimer(plugin, 0L, 20L); // alle 20 Ticks (1 Sekunde) colorTasks.put(uuid, task); } public void removeAFKBossBar(Player player) { UUID uuid = player.getUniqueId(); // Farbwechsel-Task stoppen if (colorTasks.containsKey(uuid)) { colorTasks.get(uuid).cancel(); colorTasks.remove(uuid); } BossBar bar = bossBars.remove(uuid); if (bar != null) { bar.removeAll(); } colorIndex.remove(uuid); } }