From 28d735c9127be8461c2e922db1b5e4d49ea5c037 Mon Sep 17 00:00:00 2001 From: Zhyren-git Date: Wed, 17 Dec 2025 18:58:15 -0400 Subject: [PATCH] Fixed player getting "Timed out" while standing still due to Keep-Alive not being sent correctly. --- .../loohp/limbo/network/ClientConnection.java | 92 +++++++++++++++++-- 1 file changed, 86 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/loohp/limbo/network/ClientConnection.java b/src/main/java/com/loohp/limbo/network/ClientConnection.java index d8aa9ec..9b65287 100644 --- a/src/main/java/com/loohp/limbo/network/ClientConnection.java +++ b/src/main/java/com/loohp/limbo/network/ClientConnection.java @@ -25,7 +25,16 @@ import com.loohp.limbo.events.connection.ConnectionEstablishedEvent; import com.loohp.limbo.events.inventory.AnvilRenameInputEvent; import com.loohp.limbo.events.inventory.InventoryCloseEvent; import com.loohp.limbo.events.inventory.InventoryCreativeEvent; -import com.loohp.limbo.events.player.*; +import com.loohp.limbo.events.player.PlayerInteractEvent; +import com.loohp.limbo.events.player.PlayerJoinEvent; +import com.loohp.limbo.events.player.PlayerLoginEvent; +import com.loohp.limbo.events.player.PlayerMoveEvent; +import com.loohp.limbo.events.player.PlayerQuitEvent; +import com.loohp.limbo.events.player.PlayerResourcePackStatusEvent; +import com.loohp.limbo.events.player.PlayerSelectedSlotChangeEvent; +import com.loohp.limbo.events.player.PlayerSpawnEvent; +import com.loohp.limbo.events.player.PlayerSwapHandItemsEvent; +import com.loohp.limbo.events.player.PluginMessageEvent; import com.loohp.limbo.events.status.StatusPingEvent; import com.loohp.limbo.file.ServerProperties; import com.loohp.limbo.inventory.AnvilInventory; @@ -33,19 +42,74 @@ import com.loohp.limbo.inventory.Inventory; import com.loohp.limbo.inventory.ItemStack; import com.loohp.limbo.location.GlobalPos; import com.loohp.limbo.location.Location; -import com.loohp.limbo.network.protocol.packets.*; +import com.loohp.limbo.network.protocol.packets.ClientboundFinishConfigurationPacket; +import com.loohp.limbo.network.protocol.packets.ClientboundRegistryDataPacket; +import com.loohp.limbo.network.protocol.packets.PacketHandshakingIn; +import com.loohp.limbo.network.protocol.packets.PacketIn; +import com.loohp.limbo.network.protocol.packets.PacketLoginInLoginStart; +import com.loohp.limbo.network.protocol.packets.PacketLoginInPluginMessaging; +import com.loohp.limbo.network.protocol.packets.PacketLoginOutDisconnect; +import com.loohp.limbo.network.protocol.packets.PacketLoginOutLoginSuccess; +import com.loohp.limbo.network.protocol.packets.PacketLoginOutPluginMessaging; +import com.loohp.limbo.network.protocol.packets.PacketOut; +import com.loohp.limbo.network.protocol.packets.PacketPlayInBlockDig; +import com.loohp.limbo.network.protocol.packets.PacketPlayInBlockPlace; +import com.loohp.limbo.network.protocol.packets.PacketPlayInChat; +import com.loohp.limbo.network.protocol.packets.PacketPlayInCloseWindow; +import com.loohp.limbo.network.protocol.packets.PacketPlayInHeldItemChange; +import com.loohp.limbo.network.protocol.packets.PacketPlayInItemName; +import com.loohp.limbo.network.protocol.packets.PacketPlayInKeepAlive; +import com.loohp.limbo.network.protocol.packets.PacketPlayInPickItem; +import com.loohp.limbo.network.protocol.packets.PacketPlayInPluginMessaging; +import com.loohp.limbo.network.protocol.packets.PacketPlayInPosition; +import com.loohp.limbo.network.protocol.packets.PacketPlayInPositionAndLook; +import com.loohp.limbo.network.protocol.packets.PacketPlayInRotation; +import com.loohp.limbo.network.protocol.packets.PacketPlayInSetCreativeSlot; +import com.loohp.limbo.network.protocol.packets.PacketPlayInTabComplete; +import com.loohp.limbo.network.protocol.packets.PacketPlayInUseItem; +import com.loohp.limbo.network.protocol.packets.PacketPlayInWindowClick; +import com.loohp.limbo.network.protocol.packets.PacketPlayOutDeclareCommands; +import com.loohp.limbo.network.protocol.packets.PacketPlayOutDisconnect; +import com.loohp.limbo.network.protocol.packets.PacketPlayOutEntityMetadata; +import com.loohp.limbo.network.protocol.packets.PacketPlayOutGameStateChange; +import com.loohp.limbo.network.protocol.packets.PacketPlayOutHeldItemChange; +import com.loohp.limbo.network.protocol.packets.PacketPlayOutKeepAlive; +import com.loohp.limbo.network.protocol.packets.PacketPlayOutLogin; +import com.loohp.limbo.network.protocol.packets.PacketPlayOutPlayerAbilities; import com.loohp.limbo.network.protocol.packets.PacketPlayOutPlayerAbilities.PlayerAbilityFlags; +import com.loohp.limbo.network.protocol.packets.PacketPlayOutPlayerInfo; import com.loohp.limbo.network.protocol.packets.PacketPlayOutPlayerInfo.PlayerInfoAction; import com.loohp.limbo.network.protocol.packets.PacketPlayOutPlayerInfo.PlayerInfoData; import com.loohp.limbo.network.protocol.packets.PacketPlayOutPlayerInfo.PlayerInfoData.PlayerInfoDataAddPlayer.PlayerSkinProperty; +import com.loohp.limbo.network.protocol.packets.PacketPlayOutPluginMessaging; +import com.loohp.limbo.network.protocol.packets.PacketPlayOutPositionAndLook; +import com.loohp.limbo.network.protocol.packets.PacketPlayOutSpawnPosition; +import com.loohp.limbo.network.protocol.packets.PacketPlayOutTabComplete; import com.loohp.limbo.network.protocol.packets.PacketPlayOutTabComplete.TabCompleteMatches; +import com.loohp.limbo.network.protocol.packets.PacketPlayOutUpdateViewPosition; +import com.loohp.limbo.network.protocol.packets.PacketStatusInPing; +import com.loohp.limbo.network.protocol.packets.PacketStatusInRequest; +import com.loohp.limbo.network.protocol.packets.PacketStatusOutPong; +import com.loohp.limbo.network.protocol.packets.PacketStatusOutResponse; +import com.loohp.limbo.network.protocol.packets.ServerboundChatCommandPacket; +import com.loohp.limbo.network.protocol.packets.ServerboundFinishConfigurationPacket; +import com.loohp.limbo.network.protocol.packets.ServerboundLoginAcknowledgedPacket; +import com.loohp.limbo.network.protocol.packets.ServerboundResourcePackPacket; import com.loohp.limbo.network.protocol.packets.ServerboundResourcePackPacket.Action; import com.loohp.limbo.player.Player; import com.loohp.limbo.player.PlayerInteractManager; import com.loohp.limbo.player.PlayerInventory; import com.loohp.limbo.registry.PacketRegistry; import com.loohp.limbo.registry.RegistryCustom; -import com.loohp.limbo.utils.*; +import com.loohp.limbo.utils.BungeecordAdventureConversionUtils; +import com.loohp.limbo.utils.CheckedBiConsumer; +import com.loohp.limbo.utils.CustomStringUtils; +import com.loohp.limbo.utils.DataTypeIO; +import com.loohp.limbo.utils.DeclareCommands; +import com.loohp.limbo.utils.ForwardingUtils; +import com.loohp.limbo.utils.GameMode; +import com.loohp.limbo.utils.InventoryClickUtils; +import com.loohp.limbo.utils.MojangAPIUtils; import com.loohp.limbo.utils.MojangAPIUtils.SkinResponse; import com.loohp.limbo.world.BlockState; import com.loohp.limbo.world.World; @@ -61,12 +125,28 @@ import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; -import java.io.*; +import java.io.ByteArrayOutputStream; +import java.io.DataInput; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; import java.lang.reflect.Constructor; import java.net.InetAddress; import java.net.Socket; import java.nio.charset.StandardCharsets; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.EnumSet; +import java.util.HashSet; +import java.util.List; +import java.util.Optional; +import java.util.Random; +import java.util.Set; +import java.util.Timer; +import java.util.TimerTask; +import java.util.UUID; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; import java.util.stream.Collectors; @@ -569,7 +649,7 @@ public class ClientConnection extends Thread { keepAliveTask = new TimerTask() { @Override public void run() { - if (state != ClientState.PLAY || !ready) this.cancel(); // oops + if (state != ClientState.PLAY || !ready) this.cancel(); long now = System.currentTimeMillis(); PacketPlayOutKeepAlive keepAlive = new PacketPlayOutKeepAlive(now);