185 lines
9.4 KiB
Java
185 lines
9.4 KiB
Java
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<UUID, Integer> hungerLevels = new HashMap<>();
|
|
private final Map<UUID, BukkitTask> 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<String> 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<String> getFoodItems() {
|
|
return foodItems;
|
|
}
|
|
} |