Stage 13: Perks and Totems

This commit is contained in:
loki5512344 2026-05-31 20:49:37 +02:00
parent d1f854fc79
commit 37e67ce97d
23 changed files with 2070 additions and 25 deletions

View file

@ -0,0 +1,120 @@
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Вы устали — следующий волт будет медленным!");
}
}
}
}