Initial commit
This commit is contained in:
@@ -0,0 +1,147 @@
|
||||
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<UUID, Integer> fatigueLevels = new HashMap<>();
|
||||
private final Map<UUID, BukkitTask> 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);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user