diff --git a/src/main/java/de/viper/survivalplus/Manager/AFKManager.java b/src/main/java/de/viper/survivalplus/Manager/AFKManager.java new file mode 100644 index 0000000..d787cf1 --- /dev/null +++ b/src/main/java/de/viper/survivalplus/Manager/AFKManager.java @@ -0,0 +1,143 @@ +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); + } +} diff --git a/src/main/java/de/viper/survivalplus/Manager/StatsManager.java b/src/main/java/de/viper/survivalplus/Manager/StatsManager.java new file mode 100644 index 0000000..1557677 --- /dev/null +++ b/src/main/java/de/viper/survivalplus/Manager/StatsManager.java @@ -0,0 +1,92 @@ +package de.viper.survivalplus.Manager; + +import de.viper.survivalplus.SurvivalPlus; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; +import java.io.IOException; +import java.util.UUID; + +public class StatsManager { + + private final SurvivalPlus plugin; + private File statsFile; + private FileConfiguration statsConfig; + + public StatsManager(SurvivalPlus plugin) { + this.plugin = plugin; + createStatsFile(); + } + + private void createStatsFile() { + statsFile = new File(plugin.getDataFolder(), "stats.yml"); + if (!statsFile.exists()) { + plugin.saveResource("stats.yml", false); + } + statsConfig = YamlConfiguration.loadConfiguration(statsFile); + } + + public void saveStats() { + try { + statsConfig.save(statsFile); + } catch (IOException e) { + plugin.getLogger().severe("Fehler beim Speichern der stats.yml: " + e.getMessage()); + } + } + + // Spielzeit in Sekunden addieren + public void addPlayTime(UUID playerUUID, long seconds) { + long current = statsConfig.getLong(playerUUID + ".playtime", 0); + statsConfig.set(playerUUID + ".playtime", current + seconds); + } + + // Kills addieren + public void addKills(UUID playerUUID, int amount) { + int current = statsConfig.getInt(playerUUID + ".kills", 0); + statsConfig.set(playerUUID + ".kills", current + amount); + } + + // Tode addieren + public void addDeaths(UUID playerUUID, int amount) { + int current = statsConfig.getInt(playerUUID + ".deaths", 0); + statsConfig.set(playerUUID + ".deaths", current + amount); + } + + // Abgebaute Blöcke addieren + public void addBlocksBroken(UUID playerUUID, int amount) { + int current = statsConfig.getInt(playerUUID + ".blocks_broken", 0); + statsConfig.set(playerUUID + ".blocks_broken", current + amount); + } + + // Platzierte Blöcke addieren + public void addBlocksPlaced(UUID playerUUID, int amount) { + int current = statsConfig.getInt(playerUUID + ".blocks_placed", 0); + statsConfig.set(playerUUID + ".blocks_placed", current + amount); + } + + // Getter für Statistikwerte + + public long getPlayTime(UUID playerUUID) { + return statsConfig.getLong(playerUUID + ".playtime", 0); + } + + public int getKills(UUID playerUUID) { + return statsConfig.getInt(playerUUID + ".kills", 0); + } + + public int getDeaths(UUID playerUUID) { + return statsConfig.getInt(playerUUID + ".deaths", 0); + } + + public int getBlocksBroken(UUID playerUUID) { + return statsConfig.getInt(playerUUID + ".blocks_broken", 0); + } + + public int getBlocksPlaced(UUID playerUUID) { + return statsConfig.getInt(playerUUID + ".blocks_placed", 0); + } + +}