Stage 13: Perks and Totems
This commit is contained in:
parent
d1f854fc79
commit
37e67ce97d
23 changed files with 2070 additions and 25 deletions
120
src/main/java/dev/loki/window/WindowFastVault.java
Normal file
120
src/main/java/dev/loki/window/WindowFastVault.java
Normal 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Вы устали — следующий волт будет медленным!");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue