2020-08-25 13:30:57 +02:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Shane Freeder <theboyetronic@gmail.com>
|
|
|
|
Date: Wed, 19 Aug 2020 05:05:54 +0100
|
|
|
|
Subject: [PATCH] Buffer joins to world
|
|
|
|
|
|
|
|
This patch buffers the number of logins which will attempt to join
|
|
|
|
the world per tick, this attempts to reduce the impact that join floods
|
|
|
|
has on the server
|
|
|
|
|
|
|
|
diff --git a/src/main/java/com/destroystokyo/paper/PaperConfig.java b/src/main/java/com/destroystokyo/paper/PaperConfig.java
|
2021-02-26 18:54:48 +01:00
|
|
|
index faa1b775e45563b93ac1d5b904938b1f5ad8d80c..545948f20efd6c8dd42140b565af94cd6b52b661 100644
|
2020-08-25 13:30:57 +02:00
|
|
|
--- a/src/main/java/com/destroystokyo/paper/PaperConfig.java
|
|
|
|
+++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java
|
2021-02-26 18:54:48 +01:00
|
|
|
@@ -457,4 +457,9 @@ public class PaperConfig {
|
2020-08-25 13:30:57 +02:00
|
|
|
maxPlayerAutoSavePerTick = (playerAutoSaveRate == -1 || playerAutoSaveRate > 100) ? 10 : 20;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
+
|
|
|
|
+ public static int maxJoinsPerTick;
|
|
|
|
+ private static void maxJoinsPerTick() {
|
2020-08-25 14:23:58 +02:00
|
|
|
+ maxJoinsPerTick = getInt("settings.max-joins-per-tick", 3);
|
2020-08-25 13:30:57 +02:00
|
|
|
+ }
|
|
|
|
}
|
2021-03-16 08:19:45 +01:00
|
|
|
diff --git a/src/main/java/net/minecraft/network/NetworkManager.java b/src/main/java/net/minecraft/network/NetworkManager.java
|
2021-03-16 17:37:33 +01:00
|
|
|
index ab70eeaeca222de7de7cab1b3db14b2c4761c3c3..878f879f8d410c428ad8a4c49e0c86c559bc47a9 100644
|
2021-03-16 08:19:45 +01:00
|
|
|
--- a/src/main/java/net/minecraft/network/NetworkManager.java
|
|
|
|
+++ b/src/main/java/net/minecraft/network/NetworkManager.java
|
2021-03-16 14:04:28 +01:00
|
|
|
@@ -33,6 +33,7 @@ import net.minecraft.network.protocol.game.PacketPlayOutTabComplete;
|
|
|
|
import net.minecraft.network.protocol.game.PacketPlayOutTitle;
|
|
|
|
import net.minecraft.server.CancelledPacketHandleException;
|
|
|
|
import net.minecraft.server.MCUtil;
|
|
|
|
+import net.minecraft.server.MinecraftServer;
|
|
|
|
import net.minecraft.server.level.EntityPlayer;
|
|
|
|
import net.minecraft.server.network.LoginListener;
|
|
|
|
import net.minecraft.server.network.PlayerConnection;
|
|
|
|
@@ -382,10 +383,22 @@ public class NetworkManager extends SimpleChannelInboundHandler<Packet<?>> {
|
2020-08-25 13:30:57 +02:00
|
|
|
}
|
|
|
|
// Paper end
|
|
|
|
|
|
|
|
+ private static final int MAX_PER_TICK = com.destroystokyo.paper.PaperConfig.maxJoinsPerTick; // Paper
|
|
|
|
+ private static int joinAttemptsThisTick; // Paper
|
|
|
|
+ private static int currTick; // Paper
|
|
|
|
public void a() {
|
|
|
|
this.p();
|
|
|
|
+ // Paper start
|
|
|
|
+ if (currTick != MinecraftServer.currentTick) {
|
|
|
|
+ currTick = MinecraftServer.currentTick;
|
|
|
|
+ joinAttemptsThisTick = 0;
|
|
|
|
+ }
|
|
|
|
+ // Paper end
|
|
|
|
if (this.packetListener instanceof LoginListener) {
|
|
|
|
+ if ( ((LoginListener) this.packetListener).getLoginState() != LoginListener.EnumProtocolState.READY_TO_ACCEPT // Paper
|
|
|
|
+ || (joinAttemptsThisTick++ < MAX_PER_TICK)) { // Paper - limit the number of joins which can be processed each tick
|
|
|
|
((LoginListener) this.packetListener).tick();
|
|
|
|
+ } // Paper
|
|
|
|
}
|
|
|
|
|
|
|
|
if (this.packetListener instanceof PlayerConnection) {
|
2021-03-16 14:04:28 +01:00
|
|
|
diff --git a/src/main/java/net/minecraft/server/network/LoginListener.java b/src/main/java/net/minecraft/server/network/LoginListener.java
|
2021-06-11 08:29:15 +02:00
|
|
|
index ef2aa000932c222e358789fcd2629dd8a46cfe80..f40736a836d6097930b9704246c7077617b1f962 100644
|
2021-03-16 14:04:28 +01:00
|
|
|
--- a/src/main/java/net/minecraft/server/network/LoginListener.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/network/LoginListener.java
|
2021-05-23 13:18:50 +02:00
|
|
|
@@ -422,7 +422,7 @@ public class LoginListener implements PacketLoginInListener {
|
2021-03-16 14:04:28 +01:00
|
|
|
return new GameProfile(uuid, gameprofile.getName());
|
|
|
|
}
|
|
|
|
|
|
|
|
- static enum EnumProtocolState {
|
|
|
|
+ public enum EnumProtocolState { // Paper - package private -> public
|
|
|
|
|
|
|
|
HELLO, KEY, AUTHENTICATING, NEGOTIATING, READY_TO_ACCEPT, DELAY_ACCEPT, ACCEPTED;
|
|
|
|
|