package dev.loki.window; import dev.loki.player.BasePlayer; import dev.loki.player.Killer; import org.bukkit.Location; import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import org.bukkit.scheduler.BukkitRunnable; import java.util.HashSet; import java.util.Set; import java.util.UUID; public class WindowVault { private final WindowManager windowManager; private final Set vaultingPlayers; public WindowVault(WindowManager windowManager) { this.windowManager = windowManager; this.vaultingPlayers = new HashSet<>(); } public boolean tryVault(BasePlayer player, org.bukkit.plugin.Plugin plugin) { if (isVaulting(player)) return false; Player bukkitPlayer = player.getPlayer(); if (bukkitPlayer == null) return false; Window.PlayerContext ctx = new Window.PlayerContext( player.isKiller(), bukkitPlayer.getLocation() ); Window window = windowManager.findVaultableWindow(ctx, 3.0); if (window == null) { bukkitPlayer.sendMessage("§cНет окна поблизости!"); return false; } double vaultTime = player.isKiller() ? 1.5 : getSurvivorVaultTime(player, window); performVault(player, window, vaultTime, plugin); return true; } public boolean isVaulting(BasePlayer player) { return vaultingPlayers.contains(player.getUuid()); } private double getSurvivorVaultTime(BasePlayer player, Window window) { if (isFastVaultAvailable(player, window)) { return 1.0; } return 1.5; } private boolean isFastVaultAvailable(BasePlayer player, Window window) { return !hasRecentVault(player.getUuid()); } private boolean hasRecentVault(UUID playerId) { return false; } private void performVault(BasePlayer player, Window window, double seconds, org.bukkit.plugin.Plugin plugin) { Player bukkitPlayer = player.getPlayer(); if (bukkitPlayer == null) return; vaultingPlayers.add(player.getUuid()); int ticks = (int) (seconds * 20); Location target = window.getVaultTarget(player.isKiller()); bukkitPlayer.addPotionEffect(new PotionEffect( PotionEffectType.SLOW, ticks, 10, false, false)); bukkitPlayer.addPotionEffect(new PotionEffect( PotionEffectType.JUMP, ticks, -10, false, false)); bukkitPlayer.getWorld().playSound(bukkitPlayer.getLocation(), Sound.BLOCK_LADDER_STEP, 0.5f, 1.0f); new VaultTask(player, target, plugin).runTaskLater(plugin, ticks); } private void completeVault(BasePlayer player, Location target) { vaultingPlayers.remove(player.getUuid()); Player bukkitPlayer = player.getPlayer(); if (bukkitPlayer == null) return; bukkitPlayer.teleport(target); bukkitPlayer.getWorld().playSound(target, Sound.BLOCK_LADDER_STEP, 0.5f, 0.8f); bukkitPlayer.removePotionEffect(PotionEffectType.SLOW); bukkitPlayer.removePotionEffect(PotionEffectType.JUMP); } private class VaultTask extends BukkitRunnable { private final BasePlayer player; private final Location target; VaultTask(BasePlayer player, Location target, org.bukkit.plugin.Plugin plugin) { this.player = player; this.target = target; } @Override public void run() { completeVault(player, target); } } }