diff --git a/src/main/java/de/viper/survivalplus/Manager/AFKManager.java b/src/main/java/de/viper/survivalplus/Manager/AFKManager.java index d787cf1..0ddc15a 100644 --- a/src/main/java/de/viper/survivalplus/Manager/AFKManager.java +++ b/src/main/java/de/viper/survivalplus/Manager/AFKManager.java @@ -1,143 +1,161 @@ -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); - } -} +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 long joinGracePeriodMillis = 5000; // 5 Sekunden Schonfrist + + private final Map lastActivity = new HashMap<>(); + private final Map joinTimes = 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 (!joinTimes.containsKey(uuid)) { + joinTimes.put(uuid, System.currentTimeMillis()); // Join-Zeit speichern + } + + if (afkPlayers.contains(uuid)) { + afkPlayers.remove(uuid); + removeAFKBossBar(player); + } + } + + public void reset(Player player) { + UUID uuid = player.getUniqueId(); + lastActivity.remove(uuid); + joinTimes.remove(uuid); // Join-Zeit entfernen + 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(); + + // AFK-Prüfung überspringen, wenn Spieler in der Schonfrist ist + if (joinTimes.containsKey(uuid) && (currentTime - joinTimes.get(uuid) < joinGracePeriodMillis)) { + return; + } + + // AFK-Prüfung für Kreativ- oder Zuschauermodus überspringen + if (player.getGameMode() == org.bukkit.GameMode.CREATIVE || + player.getGameMode() == org.bukkit.GameMode.SPECTATOR) { + return; + } + + 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); + showAFKBossBar(player, "§cDu bist AFK!"); + } + + if (kickAfterMillis > 0 && diff >= kickAfterMillis) { + plugin.getLogger().info("Spieler " + player.getName() + " wird wegen AFK gekickt. Inaktiv seit: " + (diff / 1000) + " Sekunden"); + 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); + } +} \ No newline at end of file