diff --git a/patches/server/0037-Try-fixing-folia-spector-teleportation.patch b/patches/server/0037-Try-fixing-folia-spector-teleportation.patch index 4216733..8b20125 100644 --- a/patches/server/0037-Try-fixing-folia-spector-teleportation.patch +++ b/patches/server/0037-Try-fixing-folia-spector-teleportation.patch @@ -25,7 +25,7 @@ index d032786938db9725e1be72dae63a1387bcb69d79..dcc52141b34b87a67c3d6070b68b58af if (tpsbarEnabled){ initTpsbar(); diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java -index 97bfb92e52c3c5ef1cd22afe2b97c204eb45025a..710e87e388095f28af4983a04cb89ddb6be61986 100644 +index d7a280427442bac8cc8ccb542d24d4e0901df70a..755294e3f5b3fbcfbdc0cc85627b2487663ce591 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java +++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java @@ -18,6 +18,9 @@ import java.util.Optional; @@ -38,7 +38,7 @@ index 97bfb92e52c3c5ef1cd22afe2b97c204eb45025a..710e87e388095f28af4983a04cb89ddb import net.minecraft.BlockUtil; import net.minecraft.ChatFormatting; import net.minecraft.CrashReport; -@@ -835,18 +838,7 @@ public class ServerPlayer extends Player { +@@ -836,18 +839,7 @@ public class ServerPlayer extends Player { Entity entity = this.getCamera(); @@ -58,7 +58,7 @@ index 97bfb92e52c3c5ef1cd22afe2b97c204eb45025a..710e87e388095f28af4983a04cb89ddb CriteriaTriggers.TICK.trigger(this); if (this.levitationStartPos != null) { CriteriaTriggers.LEVITATION.trigger(this, this.levitationStartPos, this.tickCount - this.levitationStartTime); -@@ -855,6 +847,38 @@ public class ServerPlayer extends Player { +@@ -856,6 +848,38 @@ public class ServerPlayer extends Player { this.trackStartFallingPosition(); this.trackEnteredOrExitedLavaOnVehicle(); this.advancements.flushDirty(this); diff --git a/patches/server/0043-Purpur-use-alternative-keep-alive.patch b/patches/server/0043-Purpur-use-alternative-keep-alive.patch new file mode 100644 index 0000000..763970b --- /dev/null +++ b/patches/server/0043-Purpur-use-alternative-keep-alive.patch @@ -0,0 +1,77 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: M2ke4U <79621885+MrHua269@users.noreply.github.com> +Date: Sun, 17 Dec 2023 20:32:49 +0800 +Subject: [PATCH] Purpur use alternative keep alive + + +diff --git a/src/main/java/me/earthme/luminol/LuminolConfig.java b/src/main/java/me/earthme/luminol/LuminolConfig.java +index 6edafcdbc188cd6c78e4c4237363e41d927a665e..a62680768068b611fe723fedeb617d42c643e59e 100644 +--- a/src/main/java/me/earthme/luminol/LuminolConfig.java ++++ b/src/main/java/me/earthme/luminol/LuminolConfig.java +@@ -64,6 +64,7 @@ public class LuminolConfig { + public static int asyncPathProcessingMaxThreads = 0; + public static int asyncPathProcessingKeepalive = 60; + public static boolean enableAsyncMobSpawning = false; ++ public static boolean useAlternateKeepAlive = false; + + public static void init() throws IOException { + PARENT_FOLDER.mkdir(); +@@ -192,6 +193,7 @@ public class LuminolConfig { + asyncPathProcessingMaxThreads = 0; + enableAsyncMobSpawning = get("optimizations.enable_async_mob_spawning",enableAsyncMobSpawning); + RegionizedWorldData.initMobSpawningExecutor(); ++ useAlternateKeepAlive = get("optimizations.enable_alternative_keep_alive_handling",useAlternateKeepAlive,"Enabling this sends a keepalive packet once per second to a player, and only kicks for timeout if none of them were responded to in 30 seconds. Responding to any of them in any order will keep the player connected. AKA, it won't kick your players because one packet gets dropped somewhere along the lines(From purpur)"); + } + + public static T get(String key,T def){ +diff --git a/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java +index 2bb944cef9bc8c5e56023ef20921ef13509d4823..9d23285f97ac5d90eb177ddc325281fa197d7f76 100644 +--- a/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java ++++ b/src/main/java/net/minecraft/server/network/ServerCommonPacketListenerImpl.java +@@ -51,6 +51,7 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack + private long keepAliveTime = Util.getMillis(); // Paper + private boolean keepAlivePending; + private long keepAliveChallenge; ++ private it.unimi.dsi.fastutil.longs.LongList keepAlives = new it.unimi.dsi.fastutil.longs.LongArrayList(); // Purpur + private int latency; + private volatile boolean suspendFlushingOnServerThread = false; + private static final long KEEPALIVE_LIMIT = Long.getLong("paper.playerconnection.keepalive", 30) * 1000; // Paper - provide property to set keepalive limit +@@ -91,6 +92,16 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack + + @Override + public void handleKeepAlive(ServerboundKeepAlivePacket packet) { ++ // Purpur start ++ if (me.earthme.luminol.LuminolConfig.useAlternateKeepAlive) { ++ long id = packet.getId(); ++ if (keepAlives.size() > 0 && keepAlives.contains(id)) { ++ int ping = (int) (Util.getMillis() - id); ++ this.latency = (this.latency * 3 + ping) / 4; ++ keepAlives.clear(); // we got a valid response, lets roll with it and forget the rest ++ } ++ } else ++ // Purpur end + //PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); // CraftBukkit // Paper - This shouldn't be on the main thread + if (this.keepAlivePending && packet.getId() == this.keepAliveChallenge) { + int i = (int) (Util.getMillis() - this.keepAliveTime); +@@ -197,6 +208,21 @@ public abstract class ServerCommonPacketListenerImpl implements ServerCommonPack + long currentTime = Util.getMillis(); + long elapsedTime = currentTime - this.keepAliveTime; + ++ // Purpur start ++ if (me.earthme.luminol.LuminolConfig.useAlternateKeepAlive) { ++ if (elapsedTime >= 1000L) { // 1 second ++ if (!processedDisconnect && keepAlives.size() * 1000L >= KEEPALIVE_LIMIT) { ++ LOGGER.warn("{} was kicked due to keepalive timeout!", this.player.getScoreboardName()); ++ disconnect(ServerCommonPacketListenerImpl.TIMEOUT_DISCONNECTION_MESSAGE, org.bukkit.event.player.PlayerKickEvent.Cause.TIMEOUT); ++ } else { ++ keepAliveTime = currentTime; // hijack this field for 1 second intervals ++ keepAlives.add(currentTime); // currentTime is ID ++ send(new ClientboundKeepAlivePacket(currentTime)); ++ } ++ } ++ } else ++ // Purpur end ++ + if (this.keepAlivePending) { + if (!this.processedDisconnect && elapsedTime >= KEEPALIVE_LIMIT) { // check keepalive limit, don't fire if already disconnected + ServerGamePacketListenerImpl.LOGGER.warn("{} was kicked due to keepalive timeout!", this.player.getScoreboardName()); // more info