From 7a6c8f4cef871114011c02d9765995caa71cc782 Mon Sep 17 00:00:00 2001 From: Micle Date: Sun, 5 Jun 2022 13:50:43 +0100 Subject: [PATCH] Created a new packet for sending the last input tick to the server and deciding whether the player is afk or not. --- .../network/client/LastInputTickPacket.java | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/main/java/dev/micle/loginprotection/network/client/LastInputTickPacket.java diff --git a/src/main/java/dev/micle/loginprotection/network/client/LastInputTickPacket.java b/src/main/java/dev/micle/loginprotection/network/client/LastInputTickPacket.java new file mode 100644 index 0000000..069b64e --- /dev/null +++ b/src/main/java/dev/micle/loginprotection/network/client/LastInputTickPacket.java @@ -0,0 +1,59 @@ +package dev.micle.loginprotection.network.client; + +import dev.micle.loginprotection.data.ProtectedPlayer; +import dev.micle.loginprotection.data.ProtectedPlayerManager; +import dev.micle.loginprotection.network.NetworkManager; +import dev.micle.loginprotection.proxy.Proxy; +import dev.micle.loginprotection.setup.Config; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraftforge.network.NetworkEvent; + +import java.util.function.Supplier; + +public class LastInputTickPacket { + private final int lastInputTick; + + public LastInputTickPacket() { + this(Proxy.Client.getLastInputTick()); + } + public LastInputTickPacket(int lastInputTick) { + this.lastInputTick = lastInputTick; + } + + public static void encode(final LastInputTickPacket packet, final FriendlyByteBuf buffer) { + NetworkManager.writeVersionInfo(buffer, false); + buffer.writeInt(packet.lastInputTick); + } + + public static LastInputTickPacket decode(final FriendlyByteBuf buffer) { + NetworkManager.checkVersion(buffer); + return new LastInputTickPacket(buffer.readInt()); + } + + public static void handle(final LastInputTickPacket packet, final Supplier contextSupplier) { + final NetworkEvent.Context context = contextSupplier.get(); + context.enqueueWork(() -> { + // Get sender + ServerPlayer sender = context.getSender(); + if (sender == null) { + return; + } + + // Get protected player + ProtectedPlayer protectedPlayer = ProtectedPlayerManager.getPlayer(sender.getUUID()); + if (protectedPlayer == null) { + return; + } + + // Check if player is afk + if (sender.tickCount - packet.lastInputTick >= Config.Server.AFK_TIME_THRESHOLD.get() * 20) { + ProtectedPlayerManager.updateState(sender.getUUID()); // Update state + } else { + ProtectedPlayerManager.startAfkTimer(sender.getUUID(), (long) ((Config.Server.AFK_TIME_THRESHOLD.get() - + ((sender.tickCount - packet.lastInputTick) / 20.0)) * 1000)); // Start new afk timer + } + }); + context.setPacketHandled(true); + } +}