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