Dateien nach "src/main/java/de/viper/survivalplus/Manager" hochladen
This commit is contained in:
143
src/main/java/de/viper/survivalplus/Manager/AFKManager.java
Normal file
143
src/main/java/de/viper/survivalplus/Manager/AFKManager.java
Normal file
@@ -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<UUID, Long> lastActivity = new HashMap<>();
|
||||||
|
private final Set<UUID> afkPlayers = new HashSet<>();
|
||||||
|
private final Map<UUID, BossBar> bossBars = new WeakHashMap<>();
|
||||||
|
private final Map<UUID, Integer> colorIndex = new HashMap<>();
|
||||||
|
private final Map<UUID, BukkitRunnable> colorTasks = new HashMap<>();
|
||||||
|
|
||||||
|
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;
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Reference in New Issue
Block a user