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.
This commit is contained in:
2022-06-05 13:47:36 +01:00
parent f46109e1cb
commit 1931f491a0

View File

@ -2,7 +2,8 @@ package dev.micle.loginprotection.data;
import dev.micle.loginprotection.LoginProtection; import dev.micle.loginprotection.LoginProtection;
import dev.micle.loginprotection.network.NetworkManager; 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 dev.micle.loginprotection.setup.Config;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffectInstance;
@ -36,14 +37,12 @@ public class ProtectedPlayerManager {
if (getPlayer(playerUUID) != null) { if (getPlayer(playerUUID) != null) {
return; return;
} }
protectedPlayers.add(new ProtectedPlayer(playerUUID, ProtectedPlayer.State.JOINING));
try { 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(), LoginProtection.getProxy().getServer().getPlayerList().getPlayer(playerUUID).connection.getConnection(),
NetworkDirection.PLAY_TO_CLIENT); NetworkDirection.PLAY_TO_CLIENT);
} catch (NullPointerException e) { } catch (NullPointerException ignored) {}
removePlayer(playerUUID);
}
} }
/** /**
@ -70,7 +69,7 @@ public class ProtectedPlayerManager {
return; return;
} }
player.getGracePeriodTimer().cancel(); player.getTimer().cancel();
protectedPlayers.remove(player); protectedPlayers.remove(player);
} }
@ -93,49 +92,79 @@ public class ProtectedPlayerManager {
if (currentState.equals(ProtectedPlayer.State.JOINING) || currentState.equals(ProtectedPlayer.State.AFK)) { if (currentState.equals(ProtectedPlayer.State.JOINING) || currentState.equals(ProtectedPlayer.State.AFK)) {
// JOINING, AFK -> ACTIVE // JOINING, AFK -> ACTIVE
protectedPlayer.setState(ProtectedPlayer.State.ACTIVE); protectedPlayer.setState(ProtectedPlayer.State.ACTIVE);
protectedPlayer.setLastInputTick(player.tickCount);
if (Config.Server.POST_GRACE_ENABLED.get()) { if (Config.Server.POST_GRACE_ENABLED.get()) {
startGracePeriod(playerUUID); startGracePeriod(playerUUID);
} else { } else {
applyPostEffects(playerUUID); applyPostEffects(playerUUID);
} }
startAfkTimer(playerUUID, Config.Server.AFK_TIME_THRESHOLD.get() * 1000);
} else { } else {
// ACTIVE -> AFK // ACTIVE -> AFK
protectedPlayer.setState(ProtectedPlayer.State.AFK); protectedPlayer.setState(ProtectedPlayer.State.AFK);
} }
// Send state packet to player // Send state packet to player
NetworkManager.getChannel().sendTo(new ServerPlayerStatePacket(protectedPlayer.getState()), NetworkManager.getChannel().sendTo(new PlayerStatePacket(protectedPlayer.getState()),
player.connection.getConnection(), player.connection.getConnection(),
NetworkDirection.PLAY_TO_CLIENT); 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. * Starts the grace period counter for a player.
* @param playerUUID UUID of player to start the grace period for. * @param playerUUID UUID of player to start the grace period for.
*/ */
private static void startGracePeriod(UUID playerUUID) { private static void startGracePeriod(UUID playerUUID) {
ProtectedPlayer player = getPlayer(playerUUID); ProtectedPlayer player = getPlayer(playerUUID);
if (player == null) return; if (player == null) {
return;
}
// Set grace period length // Set grace period length
player.setGracePeriod(Config.Server.POST_GRACE_DURATION.get()); player.setGracePeriod(Config.Server.POST_GRACE_DURATION.get());
// Create scheduled task // Create scheduled task
player.getGracePeriodTimer().schedule(new TimerTask() { player.setGracePeriodTimerTask(new TimerTask() {
@Override @Override
public void run() { public void run() {
player.setGracePeriod(player.getGracePeriodTimeRemaining() - 1); player.setGracePeriod(player.getGracePeriodTimeRemaining() - 1);
if (player.getGracePeriodTimeRemaining() == 0) { if (player.getGracePeriodTimeRemaining() == 0) {
applyPostEffects(playerUUID); applyPostEffects(playerUUID);
player.getGracePeriodTimer().cancel(); this.cancel();
if (!Config.Server.AFK_PROTECTION_ENABLED.get()) { if (!Config.Server.AFK_PROTECTION_ENABLED.get()) {
ProtectedPlayerManager.removePlayer(playerUUID); ProtectedPlayerManager.removePlayer(playerUUID);
} }
} }
} }
}, 1000, 1000); });
} }
/** /**