From 1931f491a0374b0c3e83f8739346cb8505d9c08d Mon Sep 17 00:00:00 2001 From: Micle Date: Sun, 5 Jun 2022 13:47:36 +0100 Subject: [PATCH] ProtectedPlayerManager adjustments and AFK timer. - No longer adding a player that might not exist to then instantly remove them if they don't. - Updated method calls to match new ones in ProtectedPlayer. - Updated packet names to new ones. - Grace period timer no longer cancels the timer but itself instead. - Created new method for starting the afk timer for a player, starting a new afk timer whenever a player becomes active. --- .../data/ProtectedPlayerManager.java | 55 ++++++++++++++----- 1 file changed, 42 insertions(+), 13 deletions(-) diff --git a/src/main/java/dev/micle/loginprotection/data/ProtectedPlayerManager.java b/src/main/java/dev/micle/loginprotection/data/ProtectedPlayerManager.java index 79bcd60..6ff08c6 100755 --- a/src/main/java/dev/micle/loginprotection/data/ProtectedPlayerManager.java +++ b/src/main/java/dev/micle/loginprotection/data/ProtectedPlayerManager.java @@ -2,7 +2,8 @@ package dev.micle.loginprotection.data; import dev.micle.loginprotection.LoginProtection; import dev.micle.loginprotection.network.NetworkManager; -import dev.micle.loginprotection.network.ServerPlayerStatePacket; +import dev.micle.loginprotection.network.server.PlayerStatePacket; +import dev.micle.loginprotection.network.server.RequestLastInputTickPacket; import dev.micle.loginprotection.setup.Config; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.effect.MobEffectInstance; @@ -36,14 +37,12 @@ public class ProtectedPlayerManager { if (getPlayer(playerUUID) != null) { return; } - protectedPlayers.add(new ProtectedPlayer(playerUUID, ProtectedPlayer.State.JOINING)); try { - NetworkManager.getChannel().sendTo(new ServerPlayerStatePacket(ProtectedPlayer.State.JOINING), + protectedPlayers.add(new ProtectedPlayer(playerUUID, ProtectedPlayer.State.JOINING)); + NetworkManager.getChannel().sendTo(new PlayerStatePacket(ProtectedPlayer.State.JOINING), LoginProtection.getProxy().getServer().getPlayerList().getPlayer(playerUUID).connection.getConnection(), NetworkDirection.PLAY_TO_CLIENT); - } catch (NullPointerException e) { - removePlayer(playerUUID); - } + } catch (NullPointerException ignored) {} } /** @@ -70,7 +69,7 @@ public class ProtectedPlayerManager { return; } - player.getGracePeriodTimer().cancel(); + player.getTimer().cancel(); protectedPlayers.remove(player); } @@ -93,49 +92,79 @@ public class ProtectedPlayerManager { if (currentState.equals(ProtectedPlayer.State.JOINING) || currentState.equals(ProtectedPlayer.State.AFK)) { // JOINING, AFK -> ACTIVE protectedPlayer.setState(ProtectedPlayer.State.ACTIVE); - protectedPlayer.setLastInputTick(player.tickCount); if (Config.Server.POST_GRACE_ENABLED.get()) { startGracePeriod(playerUUID); } else { applyPostEffects(playerUUID); } + startAfkTimer(playerUUID, Config.Server.AFK_TIME_THRESHOLD.get() * 1000); } else { // ACTIVE -> AFK protectedPlayer.setState(ProtectedPlayer.State.AFK); } // Send state packet to player - NetworkManager.getChannel().sendTo(new ServerPlayerStatePacket(protectedPlayer.getState()), + NetworkManager.getChannel().sendTo(new PlayerStatePacket(protectedPlayer.getState()), player.connection.getConnection(), NetworkDirection.PLAY_TO_CLIENT); } } + public static void startAfkTimer(UUID playerUUID, long delay) { + ProtectedPlayer player = getPlayer(playerUUID); + if (player == null) { + return; + } + + // Create scheduled task + // Todo: Make task period change according to the last input tick of a player + player.setAfkTimerTask(new TimerTask() { + @Override + public void run() { + if (!player.getState().equals(ProtectedPlayer.State.ACTIVE)) { + this.cancel(); + return; + } + + try { + // Send request for list input tick packet to player + NetworkManager.getChannel().sendTo(new RequestLastInputTickPacket(), + LoginProtection.getProxy().getServer().getPlayerList().getPlayer(playerUUID).connection.getConnection(), + NetworkDirection.PLAY_TO_CLIENT); + } catch (NullPointerException e) { + removePlayer(playerUUID); + } + } + }, delay); + } + /** * 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; + if (player == null) { + return; + } // Set grace period length player.setGracePeriod(Config.Server.POST_GRACE_DURATION.get()); // Create scheduled task - player.getGracePeriodTimer().schedule(new TimerTask() { + player.setGracePeriodTimerTask(new TimerTask() { @Override public void run() { player.setGracePeriod(player.getGracePeriodTimeRemaining() - 1); if (player.getGracePeriodTimeRemaining() == 0) { applyPostEffects(playerUUID); - player.getGracePeriodTimer().cancel(); + this.cancel(); if (!Config.Server.AFK_PROTECTION_ENABLED.get()) { ProtectedPlayerManager.removePlayer(playerUUID); } } } - }, 1000, 1000); + }); } /**