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 lastVaultTimes; private final Map 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Вы устали — следующий волт будет медленным!"); } } } }