57 lines
2.1 KiB
Java
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));
|
|
}
|
|
}
|