src/main/java/de/viper/survivalplus/Manager/AFKManager.java aktualisiert

This commit is contained in:
2025-08-04 05:09:19 +00:00
parent bc801863e1
commit f22052e5f2

View File

@@ -1,143 +1,161 @@
package de.viper.survivalplus.tasks; package de.viper.survivalplus.tasks;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.boss.BarColor; import org.bukkit.boss.BarColor;
import org.bukkit.boss.BarFlag; import org.bukkit.boss.BarFlag;
import org.bukkit.boss.BarStyle; import org.bukkit.boss.BarStyle;
import org.bukkit.boss.BossBar; import org.bukkit.boss.BossBar;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import java.util.*; import java.util.*;
public class AFKManager { public class AFKManager {
private final Plugin plugin; private final Plugin plugin;
private final long afkAfterMillis; private final long afkAfterMillis;
private final long kickAfterMillis; private final long kickAfterMillis;
private final long joinGracePeriodMillis = 5000; // 5 Sekunden Schonfrist
private final Map<UUID, Long> lastActivity = new HashMap<>();
private final Set<UUID> afkPlayers = new HashSet<>(); private final Map<UUID, Long> lastActivity = new HashMap<>();
private final Map<UUID, BossBar> bossBars = new WeakHashMap<>(); private final Map<UUID, Long> joinTimes = new HashMap<>();
private final Map<UUID, Integer> colorIndex = new HashMap<>(); private final Set<UUID> afkPlayers = new HashSet<>();
private final Map<UUID, BukkitRunnable> colorTasks = new HashMap<>(); private final Map<UUID, BossBar> bossBars = new WeakHashMap<>();
private final Map<UUID, Integer> colorIndex = new HashMap<>();
private final List<BarColor> colorCycle = List.of( private final Map<UUID, BukkitRunnable> colorTasks = new HashMap<>();
BarColor.RED, BarColor.YELLOW, BarColor.GREEN,
BarColor.BLUE, BarColor.PURPLE, BarColor.PINK private final List<BarColor> 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; public AFKManager(Plugin plugin, long afkAfterSeconds, long kickAfterSeconds) {
this.kickAfterMillis = kickAfterSeconds * 1000; 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()); public void updateActivity(Player player) {
UUID uuid = player.getUniqueId();
if (afkPlayers.contains(uuid)) { lastActivity.put(uuid, System.currentTimeMillis());
afkPlayers.remove(uuid); if (!joinTimes.containsKey(uuid)) {
removeAFKBossBar(player); joinTimes.put(uuid, System.currentTimeMillis()); // Join-Zeit speichern
} }
}
if (afkPlayers.contains(uuid)) {
public void reset(Player player) { afkPlayers.remove(uuid);
UUID uuid = player.getUniqueId(); removeAFKBossBar(player);
lastActivity.remove(uuid); }
afkPlayers.remove(uuid); }
removeAFKBossBar(player);
} public void reset(Player player) {
UUID uuid = player.getUniqueId();
public boolean isAFK(Player player) { lastActivity.remove(uuid);
return afkPlayers.contains(player.getUniqueId()); joinTimes.remove(uuid); // Join-Zeit entfernen
} afkPlayers.remove(uuid);
removeAFKBossBar(player);
public void checkAFKStatus(Player player) { }
UUID uuid = player.getUniqueId();
long currentTime = System.currentTimeMillis(); public boolean isAFK(Player player) {
return afkPlayers.contains(player.getUniqueId());
if (!lastActivity.containsKey(uuid)) { }
lastActivity.put(uuid, currentTime);
return; public void checkAFKStatus(Player player) {
} UUID uuid = player.getUniqueId();
long currentTime = System.currentTimeMillis();
long last = lastActivity.get(uuid);
long diff = currentTime - last; // AFK-Prüfung überspringen, wenn Spieler in der Schonfrist ist
if (joinTimes.containsKey(uuid) && (currentTime - joinTimes.get(uuid) < joinGracePeriodMillis)) {
if (diff >= afkAfterMillis) { return;
if (!afkPlayers.contains(uuid)) { }
afkPlayers.add(uuid);
// BossBar wird im Listener angezeigt // AFK-Prüfung für Kreativ- oder Zuschauermodus überspringen
} if (player.getGameMode() == org.bukkit.GameMode.CREATIVE ||
player.getGameMode() == org.bukkit.GameMode.SPECTATOR) {
if (kickAfterMillis > 0 && diff >= kickAfterMillis) { return;
player.kickPlayer("§cDu wurdest wegen AFK gekickt."); }
}
} else { if (!lastActivity.containsKey(uuid)) {
if (afkPlayers.contains(uuid)) { lastActivity.put(uuid, currentTime);
afkPlayers.remove(uuid); return;
removeAFKBossBar(player); }
}
} long last = lastActivity.get(uuid);
} long diff = currentTime - last;
public void showAFKBossBar(Player player, String message) { if (diff >= afkAfterMillis) {
UUID uuid = player.getUniqueId(); if (!afkPlayers.contains(uuid)) {
removeAFKBossBar(player); // sicherstellen, dass nur eine BossBar aktiv ist afkPlayers.add(uuid);
showAFKBossBar(player, "§cDu bist AFK!");
BossBar bar = Bukkit.createBossBar(message, BarColor.YELLOW, BarStyle.SOLID, BarFlag.CREATE_FOG); }
bar.addPlayer(player);
bar.setVisible(true); if (kickAfterMillis > 0 && diff >= kickAfterMillis) {
plugin.getLogger().info("Spieler " + player.getName() + " wird wegen AFK gekickt. Inaktiv seit: " + (diff / 1000) + " Sekunden");
bossBars.put(uuid, bar); player.kickPlayer("§cDu wurdest wegen AFK gekickt.");
colorIndex.put(uuid, 0); }
} else {
// Alten Farbwechsel-Task stoppen, falls vorhanden if (afkPlayers.contains(uuid)) {
if (colorTasks.containsKey(uuid)) { afkPlayers.remove(uuid);
colorTasks.get(uuid).cancel(); removeAFKBossBar(player);
colorTasks.remove(uuid); }
} }
}
BukkitRunnable task = new BukkitRunnable() {
@Override public void showAFKBossBar(Player player, String message) {
public void run() { UUID uuid = player.getUniqueId();
if (!bossBars.containsKey(uuid)) { removeAFKBossBar(player); // Sicherstellen, dass nur eine BossBar aktiv ist
this.cancel();
colorTasks.remove(uuid); BossBar bar = Bukkit.createBossBar(message, BarColor.YELLOW, BarStyle.SOLID, BarFlag.CREATE_FOG);
return; bar.addPlayer(player);
} bar.setVisible(true);
int index = colorIndex.getOrDefault(uuid, 0); bossBars.put(uuid, bar);
BarColor color = colorCycle.get(index); colorIndex.put(uuid, 0);
BossBar activeBar = bossBars.get(uuid); // Alten Farbwechsel-Task stoppen, falls vorhanden
if (activeBar != null) { if (colorTasks.containsKey(uuid)) {
activeBar.setColor(color); colorTasks.get(uuid).cancel();
} colorTasks.remove(uuid);
}
colorIndex.put(uuid, (index + 1) % colorCycle.size());
} BukkitRunnable task = new BukkitRunnable() {
}; @Override
task.runTaskTimer(plugin, 0L, 20L); // alle 20 Ticks (1 Sekunde) public void run() {
colorTasks.put(uuid, task); if (!bossBars.containsKey(uuid)) {
} this.cancel();
colorTasks.remove(uuid);
public void removeAFKBossBar(Player player) { return;
UUID uuid = player.getUniqueId(); }
// Farbwechsel-Task stoppen int index = colorIndex.getOrDefault(uuid, 0);
if (colorTasks.containsKey(uuid)) { BarColor color = colorCycle.get(index);
colorTasks.get(uuid).cancel();
colorTasks.remove(uuid); BossBar activeBar = bossBars.get(uuid);
} if (activeBar != null) {
activeBar.setColor(color);
BossBar bar = bossBars.remove(uuid); }
if (bar != null) {
bar.removeAll(); colorIndex.put(uuid, (index + 1) % colorCycle.size());
} }
colorIndex.remove(uuid); };
} 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);
}
}