120 lines
3.7 KiB
Java
120 lines
3.7 KiB
Java
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Вы устали — следующий волт будет медленным!");
|
||
}
|
||
}
|
||
}
|
||
}
|