Files
spigot-base/src/main/java/games/dmg/spigotbase/TeleportPolicy.java
T
dmg 3be3e43072
Release / release (push) Successful in 2m28s
CI / build (push) Successful in 1m3s
fix(teleport): enforce visitor warm-up
2026-08-21 22:28:34 -04:00

57 lines
2.1 KiB
Java

package games.dmg.spigotbase;
import java.time.Duration;
import java.time.Instant;
import java.util.Optional;
public final class TeleportPolicy {
private final PluginSettingsProvider settings;
public TeleportPolicy(PluginSettings settings) {
this(new PluginSettingsProvider(settings));
}
public TeleportPolicy(PluginSettingsProvider settings) {
this.settings = settings;
}
public Duration warmup(PlayerState player) {
return switch (player.warmupLevel()) {
case 0 -> Duration.ofSeconds(settings.current().initialWarmupSeconds());
case 1 -> Duration.ofSeconds(settings.current().secondWarmupSeconds());
case 2 -> Duration.ofSeconds(settings.current().thirdWarmupSeconds());
case 3 -> Duration.ZERO;
default -> throw new IllegalArgumentException("unknown warm-up level");
};
}
public Duration visitorWarmup(PlayerState owner) {
Duration warmup = warmup(owner);
return warmup.compareTo(Duration.ofSeconds(1)) < 0
? Duration.ofSeconds(1)
: warmup;
}
public Duration cooldown(PlayerState player) {
return switch (player.cooldownLevel()) {
case 0 -> Duration.ofSeconds(settings.current().initialTeleportCooldownSeconds());
case 1 -> Duration.ofSeconds(settings.current().secondTeleportCooldownSeconds());
case 2 -> Duration.ofSeconds(settings.current().thirdTeleportCooldownSeconds());
case 3 -> Duration.ofSeconds(settings.current().fourthTeleportCooldownSeconds());
case 4 -> Duration.ZERO;
default -> throw new IllegalArgumentException("unknown cooldown level");
};
}
public Optional<Duration> remainingCooldown(PlayerState player, Instant now) {
if (player.lastBaseTeleport().isEmpty()) {
return Optional.empty();
}
Instant availableAt = player.lastBaseTeleport().orElseThrow().plus(cooldown(player));
if (!now.isBefore(availableAt)) {
return Optional.empty();
}
return Optional.of(Duration.between(now, availableAt));
}
}