Renamed and rewrote the manager for protected players. Most protected player logic should now be handled by the manager.

This commit is contained in:
2022-05-21 20:57:32 +01:00
parent c756ad9fa8
commit babc73a8dc
2 changed files with 153 additions and 58 deletions

View File

@ -0,0 +1,153 @@
package dev.micle.loginprotection.data;
import dev.micle.loginprotection.LoginProtection;
import dev.micle.loginprotection.setup.Config;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.player.Player;
import java.util.ArrayList;
import java.util.List;
import java.util.TimerTask;
import java.util.UUID;
public class ProtectedPlayerManager {
// Initialize variables
private static final List<ProtectedPlayer> protectedPlayers = new ArrayList<>();
/**
* Method for initializing the ProtectedPlayerManager.
*/
public static void init() {
for (ProtectedPlayer protectedPlayer : protectedPlayers) {
removePlayer(protectedPlayer.getPlayerUUID());
}
}
/**
* Adds a player to be protected.
* @param playerUUID UUID of player to protect.
*/
public static void addPlayer(UUID playerUUID) {
if (getPlayer(playerUUID) != null) {
return;
}
protectedPlayers.add(new ProtectedPlayer(playerUUID, ProtectedPlayer.State.JOINING));
}
/**
* Gets a protected player from the list of protected players.
* @param playerUUID UUID of player to get.
* @return ProtectedPlayer instance if player is present, otherwise null.
*/
public static ProtectedPlayer getPlayer(UUID playerUUID) {
for (ProtectedPlayer protectedPlayer : protectedPlayers) {
if (protectedPlayer.getPlayerUUID().equals(playerUUID)) {
return protectedPlayer;
}
}
return null;
}
/**
* Removes a player from the list of protected players.
* @param playerUUID UUID of player to remove.
*/
public static void removePlayer(UUID playerUUID) {
ProtectedPlayer player = getPlayer(playerUUID);
if (player == null) {
return;
}
player.getGracePeriodTimer().cancel();
protectedPlayers.remove(player);
}
/**
* Updates a player's state appropriately.
* @param playerUUID UUID of player to update the state of.
*/
public static void updateState(UUID playerUUID) {
ProtectedPlayer player = getPlayer(playerUUID);
if (player == null) {
addPlayer(playerUUID);
} else {
ProtectedPlayer.State currentState = player.getState();
if (currentState.equals(ProtectedPlayer.State.JOINING) || currentState.equals(ProtectedPlayer.State.AFK)) {
// JOINING, AFK -> ACTIVE
player.setState(ProtectedPlayer.State.ACTIVE);
if (Config.Server.POST_GRACE_ENABLED.get()) {
startGracePeriod(playerUUID);
} else {
applyPostEffects(playerUUID);
}
} else {
// ACTIVE -> AFK
if (Config.Server.AFK_PROTECTION_ENABLED.get()) {
player.setState(ProtectedPlayer.State.AFK);
}
}
}
}
/**
* Starts the grace period counter for a player.
* @param playerUUID UUID of player to start the grace period for.
*/
private static void startGracePeriod(UUID playerUUID) {
ProtectedPlayer player = getPlayer(playerUUID);
if (player == null) return;
// Set grace period length
player.setGracePeriod(Config.Server.POST_GRACE_DURATION.get());
// Create scheduled task
player.getGracePeriodTimer().schedule(new TimerTask() {
@Override
public void run() {
player.setGracePeriod(player.getGracePeriodTimeRemaining() - 1);
if (player.getGracePeriodTimeRemaining() == 0) {
applyPostEffects(playerUUID);
player.getGracePeriodTimer().cancel();
}
}
}, 1000, 1000);
}
/**
* Applies effects to the player.
* @param playerUUID UUID of player to apply effects to.
*/
private static void applyPostEffects(UUID playerUUID) {
// Get player entity
Player player = LoginProtection.getProxy().getServer().getPlayerList().getPlayer(playerUUID);
if (player == null) {
removePlayer(playerUUID);
return;
}
// Apply effects
if (player.isInWater()) {
if (Config.Server.POST_REFILL_AIR_ENABLED.get()) {
player.setAirSupply(player.getMaxAirSupply());
}
if (Config.Server.POST_WATER_ENABLED.get()) {
player.addEffect(new MobEffectInstance(MobEffects.WATER_BREATHING,
Config.Server.POST_WATER_DURATION.get() * 20, 0));
}
}
if (player.isInLava()) {
if (Config.Server.POST_LAVA_ENABLED.get()) {
player.addEffect(new MobEffectInstance(MobEffects.FIRE_RESISTANCE,
Config.Server.POST_LAVA_DURATION.get()*20, 0));
}
}
if (player.isOnFire()) {
if (Config.Server.POST_FIRE_ENABLED.get()) {
player.addEffect(new MobEffectInstance(MobEffects.FIRE_RESISTANCE,
Config.Server.POST_FIRE_DURATION.get()*20, 0));
}
}
}
}