package me.viper.survivalmechanics.mechanics; import me.viper.survivalmechanics.SurvivalMechanics; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitTask; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.ChatColor; import java.util.HashMap; import java.util.Map; import java.util.UUID; public class FatigueManager implements Listener { private final JavaPlugin plugin; private final Map fatigueLevels = new HashMap<>(); private final Map deathTimers = new HashMap<>(); private final int maxFatigue; private final double decreaseRate; private final double activityMultiplier; private final double nightMultiplier; private final double climbingMultiplier; private final int climbingHeightThreshold; private final double climbingHeightScaling; private final int slownessDuration; private final int slownessAmplifier; private final int blurDuration; private final int blurAmplifier; private final double staminaPenalty; private final int criticalThreshold; private final boolean deathEnabled; private final int deathDelay; private final int messageCooldown; private final boolean criticalMessageOnly; public FatigueManager(JavaPlugin plugin) { this.plugin = plugin; this.maxFatigue = plugin.getConfig().getInt("fatigue.max", 100); this.decreaseRate = plugin.getConfig().getDouble("fatigue.decrease-rate", 0.5); this.activityMultiplier = plugin.getConfig().getDouble("fatigue.activity-multiplier", 2); this.nightMultiplier = plugin.getConfig().getDouble("fatigue.night-multiplier", 2); this.climbingMultiplier = plugin.getConfig().getDouble("fatigue.climbing-multiplier", 2); this.climbingHeightThreshold = plugin.getConfig().getInt("fatigue.climbing-height-threshold", 100); this.climbingHeightScaling = plugin.getConfig().getDouble("fatigue.climbing-height-scaling", 0.01); this.slownessDuration = plugin.getConfig().getInt("fatigue.slowness-duration", 200); this.slownessAmplifier = plugin.getConfig().getInt("fatigue.slowness-amplifier", 1); this.blurDuration = plugin.getConfig().getInt("fatigue.blur-duration", 100); this.blurAmplifier = plugin.getConfig().getInt("fatigue.blur-amplifier", 1); this.staminaPenalty = plugin.getConfig().getDouble("fatigue.stamina-penalty", 1.5); this.criticalThreshold = plugin.getConfig().getInt("fatigue.critical-threshold", 20); this.deathEnabled = plugin.getConfig().getBoolean("fatigue.death-enabled", true); this.deathDelay = plugin.getConfig().getInt("fatigue.death-delay", 60); this.messageCooldown = plugin.getConfig().getInt("fatigue.message-cooldown", 60); this.criticalMessageOnly = plugin.getConfig().getBoolean("fatigue.critical-message-only", true); plugin.getServer().getPluginManager().registerEvents(this, plugin); } public void startFatigueTask() { new BukkitRunnable() { @Override public void run() { for (Player player : plugin.getServer().getOnlinePlayers()) { UUID playerId = player.getUniqueId(); int fatigue = fatigueLevels.getOrDefault(playerId, maxFatigue); double decrease = decreaseRate; long time = player.getWorld().getTime(); boolean isNight = time >= 12000 && time < 24000; if (isNight) { decrease *= nightMultiplier; } if (player.isSprinting() || player.isSwimming()) { decrease *= activityMultiplier; } fatigue = Math.max(0, fatigue - (int) decrease); fatigueLevels.put(playerId, fatigue); if (fatigue <= criticalThreshold && fatigue > 0) { player.addPotionEffect(new PotionEffect(PotionEffectType.SLOWNESS, slownessDuration, slownessAmplifier)); player.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, blurDuration, blurAmplifier)); if (canSendMessage(playerId)) { player.sendMessage(ChatColor.translateAlternateColorCodes('&', ((SurvivalMechanics) plugin).getLangConfig().getString("fatigue.critical", "§7Du kannst dich kaum wach halten!"))); player.getWorld().playSound(player.getLocation(), "entity.player.hurt", 1.0f, 1.0f); setLastMessageTime(playerId); } } else if (fatigue == 0 && deathEnabled && !deathTimers.containsKey(playerId)) { player.sendMessage(ChatColor.translateAlternateColorCodes('&', ((SurvivalMechanics) plugin).getLangConfig().getString("fatigue.warning", "§4Deine Erschöpfung wird dich umbringen!"))); player.getWorld().playSound(player.getLocation(), "entity.player.hurt", 1.0f, 1.0f); deathTimers.put(playerId, new BukkitRunnable() { @Override public void run() { if (fatigueLevels.getOrDefault(playerId, maxFatigue) == 0) { player.setHealth(0); } deathTimers.remove(playerId); } }.runTaskLater(plugin, 20L * deathDelay)); } else if (fatigue >= maxFatigue && canSendMessage(playerId) && !criticalMessageOnly) { player.sendMessage(ChatColor.translateAlternateColorCodes('&', ((SurvivalMechanics) plugin).getLangConfig().getString("fatigue.rested", "§aDu erwachst erholt und voller Kraft!"))); player.getWorld().playSound(player.getLocation(), "entity.player.levelup", 1.0f, 1.0f); setLastMessageTime(playerId); } } } }.runTaskTimer(plugin, 0L, 20L * 60); // Alle 60 Sekunden } @EventHandler public void onPlayerMove(PlayerMoveEvent event) { Player player = event.getPlayer(); UUID playerId = player.getUniqueId(); int fatigue = fatigueLevels.getOrDefault(playerId, maxFatigue); if (player.isClimbing() && player.getLocation().getY() > climbingHeightThreshold) { double heightFactor = 1 + ((player.getLocation().getY() - climbingHeightThreshold) * climbingHeightScaling); fatigue = Math.max(0, fatigue - (int) (decreaseRate * climbingMultiplier * heightFactor)); fatigueLevels.put(playerId, fatigue); if (fatigue <= criticalThreshold && fatigue > 0 && canSendMessage(playerId)) { player.addPotionEffect(new PotionEffect(PotionEffectType.SLOWNESS, slownessDuration, slownessAmplifier)); player.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, blurDuration, blurAmplifier)); player.sendMessage(ChatColor.translateAlternateColorCodes('&', ((SurvivalMechanics) plugin).getLangConfig().getString("fatigue.critical", "§7Du kannst dich kaum wach halten!"))); player.getWorld().playSound(player.getLocation(), "entity.player.hurt", 1.0f, 1.0f); setLastMessageTime(playerId); } } ((SurvivalMechanics) plugin).getStaminaManager().applyFatiguePenalty(playerId, staminaPenalty); } private boolean canSendMessage(UUID playerId) { return ((SurvivalMechanics) plugin).canSendMessage(playerId, "fatigue"); } private void setLastMessageTime(UUID playerId) { ((SurvivalMechanics) plugin).setLastMessageTime(playerId, "fatigue"); } public int getFatigue(UUID playerId) { return fatigueLevels.getOrDefault(playerId, maxFatigue); } public void loadFatigue(UUID playerId, int fatigue) { fatigueLevels.put(playerId, fatigue); } }