From 7d00b03d2065dba1a31237a3e79f65d43b1c6e37 Mon Sep 17 00:00:00 2001 From: Cryptite Date: Fri, 16 Jan 2026 16:52:35 -0600 Subject: [PATCH] Super actually hopefully fix PR --- .../main/java/org/bukkit/entity/Player.java | 10 ++++++++++ .../0024-Improve-keepalive-ping-system.patch | 18 +++++++++++------- .../ServerCommonPacketListenerImpl.java.patch | 12 +++++++++--- .../bukkit/craftbukkit/entity/CraftPlayer.java | 6 ++++++ 4 files changed, 36 insertions(+), 10 deletions(-) diff --git a/paper-api/src/main/java/org/bukkit/entity/Player.java b/paper-api/src/main/java/org/bukkit/entity/Player.java index 3eef8d533c2a..07191932c153 100644 --- a/paper-api/src/main/java/org/bukkit/entity/Player.java +++ b/paper-api/src/main/java/org/bukkit/entity/Player.java @@ -3374,6 +3374,16 @@ default void spawnParticle(Particle particle, Location location, int count, */ public int getPing(); + /** + * Gets the player's most recent measured ping. + * + * This differs from {@link #getPing()} as it represents an average of ping over time, + * whereas this represents simply the most recent ping. + * + * @return player's most recent ping + */ + public int getLastPing(); + /** * Gets the player's current locale. * diff --git a/paper-server/patches/features/0024-Improve-keepalive-ping-system.patch b/paper-server/patches/features/0024-Improve-keepalive-ping-system.patch index f046496ff6a4..5f260ebf6138 100644 --- a/paper-server/patches/features/0024-Improve-keepalive-ping-system.patch +++ b/paper-server/patches/features/0024-Improve-keepalive-ping-system.patch @@ -100,10 +100,10 @@ index 21d50675bfe90c2276890779eb23de58ac915b9a..7be34e37562875313b8e43357921b5fe } } diff --git a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java -index 079ab378920c0e52ef4e42ef20b37bd389f40870..b8a4b4cc02a2fc6b70f4b840796eed501aad6239 100644 +index 0fd13e18902991d7ad4cbed0222d91cb71229d7a..a3768425e63722c8b0a99579a680f4cd9a9055c2 100644 --- a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java +++ b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java -@@ -39,12 +39,13 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack +@@ -39,13 +39,14 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack protected final MinecraftServer server; public final Connection connection; // Paper private final boolean transferred; @@ -117,19 +117,21 @@ index 079ab378920c0e52ef4e42ef20b37bd389f40870..b8a4b4cc02a2fc6b70f4b840796eed50 private boolean closed = false; - private int latency; + private volatile int latency; // Paper - improve keepalives - make volatile + public int lastLatency; // Paper - Keep most recent latency in millis + private final io.papermc.paper.util.KeepAlive keepAlive; // Paper - improve keepalives private volatile boolean suspendFlushingOnServerThread = false; // CraftBukkit start public final org.bukkit.craftbukkit.CraftServer cserver; -@@ -61,13 +62,14 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack +@@ -62,7 +63,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack public ServerCommonPacketListenerImpl(MinecraftServer server, Connection connection, CommonListenerCookie cookie) { this.server = server; this.connection = connection; - this.keepAliveTime = Util.getMillis(); + //this.keepAliveTime = Util.getMillis(); // Paper - improve keepalives this.latency = cookie.latency(); + this.lastLatency = this.latency; // Paper - Keep most recent latency in millis this.transferred = cookie.transferred(); - // Paper start +@@ -70,6 +71,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack this.playerBrand = cookie.brandName(); this.cserver = server.server; this.pluginMessagerChannels = cookie.channels(); @@ -137,13 +139,14 @@ index 079ab378920c0e52ef4e42ef20b37bd389f40870..b8a4b4cc02a2fc6b70f4b840796eed50 // Paper end } -@@ -100,13 +102,41 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack +@@ -102,14 +104,42 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack @Override public void handleKeepAlive(ServerboundKeepAlivePacket packet) { - if (this.keepAlivePending && packet.getId() == this.keepAliveChallenge) { - int i = (int)(Util.getMillis() - this.keepAliveTime); - this.latency = (this.latency * 3 + i) / 4; +- this.lastLatency = i; // Paper - Keep most recent latency in millis - this.keepAlivePending = false; - } else if (!this.isSingleplayerOwner()) { - this.disconnectAsync(TIMEOUT_DISCONNECTION_MESSAGE, io.papermc.paper.connection.DisconnectionReason.TIMEOUT); // Paper - add proper async disconnect @@ -159,6 +162,7 @@ index 079ab378920c0e52ef4e42ef20b37bd389f40870..b8a4b4cc02a2fc6b70f4b840796eed50 + this.keepAlive.pingCalculator5s.update(response); + + this.latency = this.keepAlive.pingCalculator5s.getAvgLatencyMS(); ++ this.lastLatency = (int) java.util.concurrent.TimeUnit.NANOSECONDS.toMillis(response.latencyNS()); // Paper - Keep most recent latency in millis + return; + } + @@ -185,7 +189,7 @@ index 079ab378920c0e52ef4e42ef20b37bd389f40870..b8a4b4cc02a2fc6b70f4b840796eed50 } @Override -@@ -233,20 +263,23 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack +@@ -236,20 +266,23 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack protected void keepConnectionAlive() { Profiler.get().push("keepAlive"); long millis = Util.getMillis(); @@ -223,7 +227,7 @@ index 079ab378920c0e52ef4e42ef20b37bd389f40870..b8a4b4cc02a2fc6b70f4b840796eed50 } } -@@ -427,6 +460,6 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack +@@ -430,6 +463,6 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack } protected CommonListenerCookie createCookie(ClientInformation clientInformation) { diff --git a/paper-server/patches/sources/net/minecraft/server/network/ServerCommonPacketListenerImpl.java.patch b/paper-server/patches/sources/net/minecraft/server/network/ServerCommonPacketListenerImpl.java.patch index 0f41a4c322e1..0f681a201d16 100644 --- a/paper-server/patches/sources/net/minecraft/server/network/ServerCommonPacketListenerImpl.java.patch +++ b/paper-server/patches/sources/net/minecraft/server/network/ServerCommonPacketListenerImpl.java.patch @@ -9,9 +9,11 @@ private final boolean transferred; private long keepAliveTime; private boolean keepAlivePending; -@@ -46,6 +_,17 @@ +@@ -45,15 +_,39 @@ + private long closedListenerTime; private boolean closed = false; private int latency; ++ public int lastLatency; // Paper - Keep most recent latency in millis private volatile boolean suspendFlushingOnServerThread = false; + // CraftBukkit start + public final org.bukkit.craftbukkit.CraftServer cserver; @@ -27,9 +29,10 @@ public ServerCommonPacketListenerImpl(MinecraftServer server, Connection connection, CommonListenerCookie cookie) { this.server = server; -@@ -53,7 +_,18 @@ + this.connection = connection; this.keepAliveTime = Util.getMillis(); this.latency = cookie.latency(); ++ this.lastLatency = this.latency; // Paper - Keep most recent latency in millis this.transferred = cookie.transferred(); + // Paper start + this.playerBrand = cookie.brandName(); @@ -46,8 +49,11 @@ private void close() { if (!this.closed) { -@@ -83,7 +_,7 @@ +@@ -81,9 +_,10 @@ + if (this.keepAlivePending && packet.getId() == this.keepAliveChallenge) { + int i = (int)(Util.getMillis() - this.keepAliveTime); this.latency = (this.latency * 3 + i) / 4; ++ this.lastLatency = i; // Paper - Keep most recent latency in millis this.keepAlivePending = false; } else if (!this.isSingleplayerOwner()) { - this.disconnect(TIMEOUT_DISCONNECTION_MESSAGE); diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index d86ebc4cd182..b4b71bf98e70 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -2705,6 +2705,12 @@ public int getPing() { return this.getHandle().connection.latency(); } + @Override + public int getLastPing() { + if (this.getHandle().connection == null) throw new UnsupportedOperationException("Too early to call this method at this stage"); + return this.getHandle().connection.lastLatency; + } + @Override public String getLocale() { // Paper start - Locale change event