mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-18 17:07:43 +01:00
Upstream has released updates that appears to apply and compile correctly Paper Changes: b75eeca0 Boost light task priority to ensure it doesnt hold up chunk loads 3d2bc848 Ensure VillagerTrades doesn't load async - fixes #3495 e470f1ef Add more information to Timing Reports f4a47db6 Improve Thread Pool usage to allow single threads for single cpu servers a4fe910f Fix sounds when using worldedit regen command 70ad51a8 Updated Upstream (Bukkit/CraftBukkit) d7cfa4fa Improve legacy format serialization more
95 lines
5.5 KiB
Diff
95 lines
5.5 KiB
Diff
From 0f59e2f777292ba288e3488eae06324d7e5159c7 Mon Sep 17 00:00:00 2001
|
|
From: William Blake Galbreath <blake.galbreath@gmail.com>
|
|
Date: Fri, 11 Oct 2019 00:17:39 -0500
|
|
Subject: [PATCH] Alternative Keepalive Handling
|
|
|
|
---
|
|
.../server/PacketPlayInKeepAlive.java | 1 +
|
|
.../minecraft/server/PlayerConnection.java | 27 +++++++++++++++++++
|
|
.../java/net/pl3x/purpur/PurpurConfig.java | 5 ++++
|
|
3 files changed, 33 insertions(+)
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/PacketPlayInKeepAlive.java b/src/main/java/net/minecraft/server/PacketPlayInKeepAlive.java
|
|
index 8e93f1540b..470f92c4fb 100644
|
|
--- a/src/main/java/net/minecraft/server/PacketPlayInKeepAlive.java
|
|
+++ b/src/main/java/net/minecraft/server/PacketPlayInKeepAlive.java
|
|
@@ -22,6 +22,7 @@ public class PacketPlayInKeepAlive implements Packet<PacketListenerPlayIn> {
|
|
packetdataserializer.writeLong(this.a);
|
|
}
|
|
|
|
+ public long getId() { return b(); } // Purpur - OBFHELPER
|
|
public long b() {
|
|
return this.a;
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java
|
|
index 762aad378c..0cd012dfc3 100644
|
|
--- a/src/main/java/net/minecraft/server/PlayerConnection.java
|
|
+++ b/src/main/java/net/minecraft/server/PlayerConnection.java
|
|
@@ -75,6 +75,7 @@ public class PlayerConnection implements PacketListenerPlayIn {
|
|
private long lastKeepAlive = SystemUtils.getMonotonicMillis(); private void setLastPing(long lastPing) { this.lastKeepAlive = lastPing;}; private long getLastPing() { return this.lastKeepAlive;}; // Paper - OBFHELPER
|
|
private boolean awaitingKeepAlive; private void setPendingPing(boolean isPending) { this.awaitingKeepAlive = isPending;}; private boolean isPendingPing() { return this.awaitingKeepAlive;}; // Paper - OBFHELPER
|
|
private long h; private void setKeepAliveID(long keepAliveID) { this.h = keepAliveID;}; private long getKeepAliveID() {return this.h; }; // Paper - OBFHELPER
|
|
+ private java.util.List<Long> keepAlives = new java.util.ArrayList<>(); // Purpur
|
|
// CraftBukkit start - multithreaded fields
|
|
private volatile int chatThrottle;
|
|
private static final AtomicIntegerFieldUpdater chatSpamField = AtomicIntegerFieldUpdater.newUpdater(PlayerConnection.class, "chatThrottle");
|
|
@@ -201,6 +202,21 @@ public class PlayerConnection implements PacketListenerPlayIn {
|
|
long currentTime = SystemUtils.getMonotonicMillis();
|
|
long elapsedTime = currentTime - this.getLastPing();
|
|
|
|
+ // Purpur start
|
|
+ if (net.pl3x.purpur.PurpurConfig.useAlternateKeepAlive) {
|
|
+ if (elapsedTime >= 1000L) { // 1 second
|
|
+ if (!processedDisconnect && keepAlives.size() > KEEPALIVE_LIMIT) {
|
|
+ PlayerConnection.LOGGER.warn("{} was kicked due to keepalive timeout!", player.getName());
|
|
+ disconnect(new ChatMessage("disconnect.timeout"));
|
|
+ } else {
|
|
+ setLastPing(currentTime); // hijack this field for 1 second intervals
|
|
+ keepAlives.add(currentTime); // currentTime is ID
|
|
+ sendPacket(new PacketPlayOutKeepAlive(currentTime));
|
|
+ }
|
|
+ }
|
|
+ } else
|
|
+ // Purpur end
|
|
+
|
|
if (this.isPendingPing()) {
|
|
if (!this.processedDisconnect && elapsedTime >= KEEPALIVE_LIMIT) { // check keepalive limit, don't fire if already disconnected
|
|
PlayerConnection.LOGGER.warn("{} was kicked due to keepalive timeout!", this.player.getName()); // more info
|
|
@@ -2659,6 +2675,17 @@ public class PlayerConnection implements PacketListenerPlayIn {
|
|
|
|
@Override
|
|
public void a(PacketPlayInKeepAlive packetplayinkeepalive) {
|
|
+ // Purpur start
|
|
+ if (net.pl3x.purpur.PurpurConfig.useAlternateKeepAlive) {
|
|
+ PlayerConnectionUtils.ensureMainThread(packetplayinkeepalive, this, player.getWorldServer()); // This SHOULD be on the main thread...
|
|
+ long id = packetplayinkeepalive.getId();
|
|
+ if (keepAlives.size() > 0 && keepAlives.contains(id)) {
|
|
+ int ping = (int) (SystemUtils.getMonotonicMillis() - id);
|
|
+ player.ping = (player.ping * 3 + ping) / 4;
|
|
+ keepAlives.clear(); // we got a valid response, lets roll with it and forget the rest
|
|
+ }
|
|
+ } else
|
|
+ // Purpur end
|
|
//PlayerConnectionUtils.ensureMainThread(packetplayinkeepalive, this, this.player.getWorldServer()); // CraftBukkit // Paper - This shouldn't be on the main thread
|
|
if (this.awaitingKeepAlive && packetplayinkeepalive.b() == this.h) {
|
|
int i = (int) (SystemUtils.getMonotonicMillis() - this.lastKeepAlive);
|
|
diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java
|
|
index 72ad9dce7d..ed2a312773 100644
|
|
--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java
|
|
+++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java
|
|
@@ -144,6 +144,11 @@ public class PurpurConfig {
|
|
laggingThreshold = getDouble("settings.lagging-threshold", laggingThreshold);
|
|
}
|
|
|
|
+ public static boolean useAlternateKeepAlive = false;
|
|
+ private static void useAlternateKeepAlive() {
|
|
+ useAlternateKeepAlive = getBoolean("settings.use-alternate-keepalive", useAlternateKeepAlive);
|
|
+ }
|
|
+
|
|
public static boolean dontSendUselessEntityPackets = false;
|
|
private static void dontSendUselessEntityPackets() {
|
|
dontSendUselessEntityPackets = getBoolean("settings.dont-send-useless-entity-packets", dontSendUselessEntityPackets);
|
|
--
|
|
2.24.0
|
|
|