From babc73a8dc3abf3ed98152e323ea69d0dbf9f968 Mon Sep 17 00:00:00 2001 From: Micle Date: Sat, 21 May 2022 20:57:32 +0100 Subject: [PATCH] Renamed and rewrote the manager for protected players. Most protected player logic should now be handled by the manager. --- .../data/ProtectedPlayerManager.java | 153 ++++++++++++++++++ .../data/ProtectedPlayers.java | 58 ------- 2 files changed, 153 insertions(+), 58 deletions(-) create mode 100755 src/main/java/dev/micle/loginprotection/data/ProtectedPlayerManager.java delete mode 100755 src/main/java/dev/micle/loginprotection/data/ProtectedPlayers.java diff --git a/src/main/java/dev/micle/loginprotection/data/ProtectedPlayerManager.java b/src/main/java/dev/micle/loginprotection/data/ProtectedPlayerManager.java new file mode 100755 index 0000000..fea7351 --- /dev/null +++ b/src/main/java/dev/micle/loginprotection/data/ProtectedPlayerManager.java @@ -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 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)); + } + } + } +} diff --git a/src/main/java/dev/micle/loginprotection/data/ProtectedPlayers.java b/src/main/java/dev/micle/loginprotection/data/ProtectedPlayers.java deleted file mode 100755 index be4bbfb..0000000 --- a/src/main/java/dev/micle/loginprotection/data/ProtectedPlayers.java +++ /dev/null @@ -1,58 +0,0 @@ -package dev.micle.loginprotection.data; - -import dev.micle.loginprotection.setup.Config; -import net.minecraft.network.chat.TextComponent; -import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.server.ServerLifecycleHooks; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -public class ProtectedPlayers { - private final List protected_players = new ArrayList<>(); - - public ProtectedPlayers() { } - - public int size() { - return protected_players.size(); - } - - public void addPlayer(UUID player_uuid) { - protected_players.add(new ProtectedPlayer(player_uuid)); - } - - public ProtectedPlayer getPlayer(UUID player_uuid) { - ProtectedPlayer player; - for (ProtectedPlayer protected_player : protected_players) { - player = protected_player; - if (player.getPlayerUUID() == player_uuid) { - return player; - } - } - return null; - } - - public void removePlayer(UUID player_uuid) { - ProtectedPlayer protected_player = getPlayer(player_uuid); - if (protected_player == null) { return; } - protected_players.remove(protected_player); - - ServerPlayer player = ServerLifecycleHooks.getCurrentServer().getPlayerList().getPlayer(player_uuid); - if (player == null) { return; } - - if (!Config.Server.POST_GRACE_ENABLED.get()) { return; } - player.sendMessage(new TextComponent("[LoginProtection] Grace period ended!"), player_uuid); - } - - public void updateGracePeriod(UUID player_uuid) { - ProtectedPlayer protected_player = getPlayer(player_uuid); - if (protected_player.isLoading()) { return; } - - int grace_period = protected_player.getGracePeriod()-1; - protected_player.setGracePeriod(grace_period); - if (grace_period <= 0) { - removePlayer(player_uuid); - } - } -}