mdbd/src/main/java/dev/loki/window/WindowFastVault.java

120 lines
3.7 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package dev.loki.window;
import dev.loki.player.BasePlayer;
import org.bukkit.Location;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class WindowFastVault {
private static final double FAST_VAULT_TIME = 1.0;
private static final double SLOW_VAULT_TIME = 1.5;
private static final long VAULT_COOLDOWN_MS = 3000;
private final Map<UUID, Long> lastVaultTimes;
private final Map<UUID, Integer> vaultCounts;
public WindowFastVault() {
this.lastVaultTimes = new HashMap<>();
this.vaultCounts = new HashMap<>();
}
public double getVaultTime(BasePlayer player, Window window, boolean isChasing) {
if (player.isKiller()) {
return 1.5;
}
if (isFastVaultEligible(player, isChasing)) {
return FAST_VAULT_TIME;
}
return SLOW_VAULT_TIME;
}
private boolean isFastVaultEligible(BasePlayer player, boolean isChasing) {
UUID id = player.getUuid();
long now = System.currentTimeMillis();
Long lastVault = lastVaultTimes.get(id);
if (lastVault == null) {
return true;
}
if (now - lastVault > VAULT_COOLDOWN_MS) {
vaultCounts.remove(id);
return true;
}
int count = vaultCounts.getOrDefault(id, 0);
return count < 2 && isChasing;
}
public void recordVault(BasePlayer player) {
UUID id = player.getUuid();
long now = System.currentTimeMillis();
lastVaultTimes.put(id, now);
vaultCounts.merge(id, 1, Integer::sum);
}
public void resetForPlayer(BasePlayer player) {
UUID id = player.getUuid();
lastVaultTimes.remove(id);
vaultCounts.remove(id);
}
public void resetAll() {
lastVaultTimes.clear();
vaultCounts.clear();
}
public boolean performFastVault(BasePlayer player, Window window,
org.bukkit.plugin.Plugin plugin, boolean isChasing) {
Player bukkitPlayer = player.getPlayer();
if (bukkitPlayer == null) return false;
double vaultTime = getVaultTime(player, window, isChasing);
int ticks = (int) (vaultTime * 20);
Location target = window.getVaultTarget(false);
bukkitPlayer.sendMessage(vaultTime <= FAST_VAULT_TIME
? "§aБыстрый волт!"
: "§7Медленный волт...");
new FastVaultTask(player, target, vaultTime, this, plugin).runTaskLater(plugin, ticks);
return true;
}
private static class FastVaultTask extends BukkitRunnable {
private final BasePlayer player;
private final Location target;
private final double vaultTime;
private final WindowFastVault vaultSystem;
FastVaultTask(BasePlayer player, Location target, double vaultTime,
WindowFastVault vaultSystem, org.bukkit.plugin.Plugin plugin) {
this.player = player;
this.target = target;
this.vaultTime = vaultTime;
this.vaultSystem = vaultSystem;
}
@Override
public void run() {
Player bukkitPlayer = player.getPlayer();
if (bukkitPlayer == null) return;
bukkitPlayer.teleport(target);
bukkitPlayer.getWorld().playSound(target, Sound.BLOCK_LADDER_STEP, 0.5f, 0.8f);
vaultSystem.recordVault(player);
if (vaultTime > FAST_VAULT_TIME) {
bukkitPlayer.sendMessage("§cВы устали — следующий волт будет медленным!");
}
}
}
}