88 lines
3.1 KiB
Java
88 lines
3.1 KiB
Java
package games.dmg.spigottyrant;
|
|
|
|
import java.time.Clock;
|
|
import java.time.Instant;
|
|
import java.util.HashSet;
|
|
import java.util.Set;
|
|
import java.util.UUID;
|
|
import org.bukkit.Server;
|
|
import org.bukkit.attribute.Attribute;
|
|
import org.bukkit.attribute.AttributeInstance;
|
|
import org.bukkit.entity.Player;
|
|
import org.bukkit.potion.PotionEffect;
|
|
import org.bukkit.potion.PotionEffectType;
|
|
|
|
public final class FixerEffectController implements Runnable {
|
|
private static final int EFFECT_TICKS = 30;
|
|
private final TyrantStateManager stateManager;
|
|
private final Server server;
|
|
private final PluginSettings settings;
|
|
private final Clock clock;
|
|
private final Set<UUID> managedPlayers = new HashSet<>();
|
|
|
|
public FixerEffectController(
|
|
TyrantStateManager stateManager,
|
|
Server server,
|
|
PluginSettings settings,
|
|
Clock clock
|
|
) {
|
|
this.stateManager = stateManager;
|
|
this.server = server;
|
|
this.settings = settings;
|
|
this.clock = clock;
|
|
}
|
|
|
|
@Override
|
|
public void run() {
|
|
Instant now = clock.instant();
|
|
for (Player player : server.getOnlinePlayers()) {
|
|
PlayerState state = stateManager.player(player.getUniqueId(), player.getName());
|
|
boolean active = stateManager.game().lifecycle() == GameLifecycle.RUNNING
|
|
&& state.tyrantClass() == TyrantClass.FIXER
|
|
&& state.cooldownEnds().getOrDefault(
|
|
Ability.FIXER_BOOST_ACTIVE, Instant.MIN
|
|
).isAfter(now);
|
|
if (!active) {
|
|
if (managedPlayers.remove(player.getUniqueId())) {
|
|
clear(player);
|
|
}
|
|
continue;
|
|
}
|
|
managedPlayers.add(player.getUniqueId());
|
|
boolean nearTier = state.cooldownEnds().getOrDefault(
|
|
Ability.FIXER_NEAR_TYRANT_ACTIVE, Instant.MIN
|
|
).isAfter(now);
|
|
int rows = nearTier
|
|
? settings.fixerNearTyrantHeartRows() : settings.fixerNormalHeartRows();
|
|
int healthBoostAmplifier = (rows - 1) * 5 - 1;
|
|
player.addPotionEffect(new PotionEffect(
|
|
PotionEffectType.STRENGTH, EFFECT_TICKS,
|
|
settings.fixerStrengthLevel() - 1, false, true, true
|
|
));
|
|
player.addPotionEffect(new PotionEffect(
|
|
PotionEffectType.HEALTH_BOOST, EFFECT_TICKS,
|
|
healthBoostAmplifier, false, true, true
|
|
));
|
|
}
|
|
}
|
|
|
|
public void clearAll() {
|
|
for (UUID playerId : Set.copyOf(managedPlayers)) {
|
|
Player player = server.getPlayer(playerId);
|
|
if (player != null) {
|
|
clear(player);
|
|
}
|
|
}
|
|
managedPlayers.clear();
|
|
}
|
|
|
|
private static void clear(Player player) {
|
|
player.removePotionEffect(PotionEffectType.STRENGTH);
|
|
player.removePotionEffect(PotionEffectType.HEALTH_BOOST);
|
|
AttributeInstance maximumHealth = player.getAttribute(Attribute.MAX_HEALTH);
|
|
if (maximumHealth != null && player.getHealth() > maximumHealth.getValue()) {
|
|
player.setHealth(maximumHealth.getValue());
|
|
}
|
|
}
|
|
}
|