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

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