112 lines
3.5 KiB
Java
112 lines
3.5 KiB
Java
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<UUID> 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);
|
||
}
|
||
}
|
||
}
|