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.PlayerInteractEvent; import org.bukkit.event.player.PlayerToggleSprintEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.Material; import org.bukkit.ChatColor; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import java.util.HashMap; import java.util.Map; import java.util.UUID; import java.util.List; public class HungerManager implements Listener { private final JavaPlugin plugin; private final Map hungerLevels = new HashMap<>(); private final Map deathTimers = new HashMap<>(); private final int maxHunger; private final double decreaseRate; private final double sprintMultiplier; private final double combatMultiplier; private final double nightMultiplier; private final int sleepReduction; private final double damage; private final int criticalThreshold; private final boolean deathEnabled; private final int deathDelay; private final List foodItems; private final int foodRecoveryRate; private final boolean particleEffect; private final int messageCooldown; private final boolean criticalMessageOnly; public HungerManager(JavaPlugin plugin) { this.plugin = plugin; this.maxHunger = plugin.getConfig().getInt("hunger.max", 100); this.decreaseRate = plugin.getConfig().getDouble("hunger.decrease-rate", 0.5); this.sprintMultiplier = plugin.getConfig().getDouble("hunger.sprint-multiplier", 2); this.combatMultiplier = plugin.getConfig().getDouble("hunger.combat-multiplier", 3); this.nightMultiplier = plugin.getConfig().getDouble("hunger.night-multiplier", 1.5); this.sleepReduction = plugin.getConfig().getInt("hunger.sleep-reduction", 50); this.damage = plugin.getConfig().getDouble("hunger.damage", 0.5); this.criticalThreshold = plugin.getConfig().getInt("hunger.critical-threshold", 20); this.deathEnabled = plugin.getConfig().getBoolean("hunger.death-enabled", true); this.deathDelay = plugin.getConfig().getInt("hunger.death-delay", 60); this.foodItems = plugin.getConfig().getStringList("hunger.food-items"); this.foodRecoveryRate = plugin.getConfig().getInt("hunger.food-recovery-rate", 20); this.particleEffect = plugin.getConfig().getBoolean("hunger.particle-effect", true); this.messageCooldown = plugin.getConfig().getInt("hunger.message-cooldown", 60); this.criticalMessageOnly = plugin.getConfig().getBoolean("hunger.critical-message-only", true); plugin.getServer().getPluginManager().registerEvents(this, plugin); } public void startHungerTask() { new BukkitRunnable() { @Override public void run() { for (Player player : plugin.getServer().getOnlinePlayers()) { UUID playerId = player.getUniqueId(); int hunger = hungerLevels.getOrDefault(playerId, maxHunger); double decrease = decreaseRate; long time = player.getWorld().getTime(); boolean isNight = time >= 12000 && time < 24000; if (isNight) { decrease *= nightMultiplier; } hunger = Math.max(0, hunger - (int) decrease); hungerLevels.put(playerId, hunger); if (hunger <= criticalThreshold && hunger > 0) { player.damage(damage); if (canSendMessage(playerId)) { player.sendMessage(ChatColor.translateAlternateColorCodes('&', ((SurvivalMechanics) plugin).getLangConfig().getString("hunger.critical", "§4Dein Körper schwächt durch Hunger!"))); player.getWorld().playSound(player.getLocation(), "entity.player.hurt", 1.0f, 1.0f); setLastMessageTime(playerId); } } else if (hunger == 0 && deathEnabled && !deathTimers.containsKey(playerId)) { player.sendMessage(ChatColor.translateAlternateColorCodes('&', ((SurvivalMechanics) plugin).getLangConfig().getString("hunger.warning", "§4Du bist dem Verhungern nahe!"))); player.getWorld().playSound(player.getLocation(), "entity.player.hurt", 1.0f, 1.0f); deathTimers.put(playerId, new BukkitRunnable() { @Override public void run() { if (hungerLevels.getOrDefault(playerId, maxHunger) == 0) { player.setHealth(0); } deathTimers.remove(playerId); } }.runTaskLater(plugin, 20L * deathDelay)); } else if (hunger >= maxHunger && canSendMessage(playerId) && !criticalMessageOnly) { player.sendMessage(ChatColor.translateAlternateColorCodes('&', ((SurvivalMechanics) plugin).getLangConfig().getString("hunger.fed", "§aDu fühlst dich satt und gestärkt!"))); 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 onPlayerInteract(PlayerInteractEvent event) { Player player = event.getPlayer(); UUID playerId = player.getUniqueId(); if (event.hasItem() && foodItems.contains(event.getItem().getType().toString())) { int hunger = hungerLevels.getOrDefault(playerId, maxHunger); hunger = Math.min(maxHunger, hunger + foodRecoveryRate); hungerLevels.put(playerId, hunger); event.getItem().setAmount(event.getItem().getAmount() - 1); if (particleEffect) { player.getWorld().spawnParticle(org.bukkit.Particle.HEART, player.getLocation().add(0, 1, 0), 5); } if (canSendMessage(playerId) && !criticalMessageOnly) { player.sendMessage(ChatColor.translateAlternateColorCodes('&', ((SurvivalMechanics) plugin).getLangConfig().getString("hunger.fed", "§aDu fühlst dich satt und gestärkt!"))); player.getWorld().playSound(player.getLocation(), "entity.player.levelup", 1.0f, 1.0f); setLastMessageTime(playerId); } if (deathTimers.containsKey(playerId)) { deathTimers.get(playerId).cancel(); deathTimers.remove(playerId); } } } @EventHandler public void onPlayerToggleSprint(PlayerToggleSprintEvent event) { if (event.isSprinting()) { Player player = event.getPlayer(); UUID playerId = player.getUniqueId(); int hunger = hungerLevels.getOrDefault(playerId, maxHunger); hunger = Math.max(0, hunger - (int) (decreaseRate * sprintMultiplier)); hungerLevels.put(playerId, hunger); if (hunger <= criticalThreshold && hunger > 0 && canSendMessage(playerId)) { player.damage(damage); player.sendMessage(ChatColor.translateAlternateColorCodes('&', ((SurvivalMechanics) plugin).getLangConfig().getString("hunger.critical", "§4Dein Körper schwächt durch Hunger!"))); player.getWorld().playSound(player.getLocation(), "entity.player.hurt", 1.0f, 1.0f); setLastMessageTime(playerId); } } } @EventHandler public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { if (event.getEntity() instanceof Player) { Player player = (Player) event.getEntity(); UUID playerId = player.getUniqueId(); int hunger = hungerLevels.getOrDefault(playerId, maxHunger); hunger = Math.max(0, hunger - (int) (decreaseRate * combatMultiplier)); hungerLevels.put(playerId, hunger); if (hunger <= criticalThreshold && hunger > 0 && canSendMessage(playerId)) { player.damage(damage); player.sendMessage(ChatColor.translateAlternateColorCodes('&', ((SurvivalMechanics) plugin).getLangConfig().getString("hunger.critical", "§4Dein Körper schwächt durch Hunger!"))); player.getWorld().playSound(player.getLocation(), "entity.player.hurt", 1.0f, 1.0f); setLastMessageTime(playerId); } } } private boolean canSendMessage(UUID playerId) { return ((SurvivalMechanics) plugin).canSendMessage(playerId, "hunger"); } private void setLastMessageTime(UUID playerId) { ((SurvivalMechanics) plugin).setLastMessageTime(playerId, "hunger"); } public int getHunger(UUID playerId) { return hungerLevels.getOrDefault(playerId, maxHunger); } public void loadHunger(UUID playerId, int hunger) { hungerLevels.put(playerId, hunger); } public List getFoodItems() { return foodItems; } }