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:
@ -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);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user