diff --git a/paper-server/patches/unapplied/net/minecraft/network/Connection.java.patch b/paper-server/patches/sources/net/minecraft/network/Connection.java.patch similarity index 70% rename from paper-server/patches/unapplied/net/minecraft/network/Connection.java.patch rename to paper-server/patches/sources/net/minecraft/network/Connection.java.patch index f1e414f6b1..f36ea815c5 100644 --- a/paper-server/patches/unapplied/net/minecraft/network/Connection.java.patch +++ b/paper-server/patches/sources/net/minecraft/network/Connection.java.patch @@ -1,23 +1,23 @@ --- a/net/minecraft/network/Connection.java +++ b/net/minecraft/network/Connection.java -@@ -82,13 +82,13 @@ - marker.add(Connection.PACKET_MARKER); - }); - public static final Supplier NETWORK_WORKER_GROUP = Suppliers.memoize(() -> { -- return new NioEventLoopGroup(0, (new ThreadFactoryBuilder()).setNameFormat("Netty Client IO #%d").setDaemon(true).build()); -+ return new NioEventLoopGroup(0, (new ThreadFactoryBuilder()).setNameFormat("Netty Client IO #%d").setDaemon(true).setUncaughtExceptionHandler(new net.minecraft.DefaultUncaughtExceptionHandlerWithName(LOGGER)).build()); // Paper - }); - public static final Supplier NETWORK_EPOLL_WORKER_GROUP = Suppliers.memoize(() -> { -- return new EpollEventLoopGroup(0, (new ThreadFactoryBuilder()).setNameFormat("Netty Epoll Client IO #%d").setDaemon(true).build()); -+ return new EpollEventLoopGroup(0, (new ThreadFactoryBuilder()).setNameFormat("Netty Epoll Client IO #%d").setDaemon(true).setUncaughtExceptionHandler(new net.minecraft.DefaultUncaughtExceptionHandlerWithName(LOGGER)).build()); // Paper - }); - public static final Supplier LOCAL_WORKER_GROUP = Suppliers.memoize(() -> { -- return new DefaultEventLoopGroup(0, (new ThreadFactoryBuilder()).setNameFormat("Netty Local Client IO #%d").setDaemon(true).build()); -+ return new DefaultEventLoopGroup(0, (new ThreadFactoryBuilder()).setNameFormat("Netty Local Client IO #%d").setDaemon(true).setUncaughtExceptionHandler(new net.minecraft.DefaultUncaughtExceptionHandlerWithName(LOGGER)).build()); // Paper - }); +@@ -74,13 +_,13 @@ + public static final Marker PACKET_RECEIVED_MARKER = Util.make(MarkerFactory.getMarker("PACKET_RECEIVED"), marker -> marker.add(PACKET_MARKER)); + public static final Marker PACKET_SENT_MARKER = Util.make(MarkerFactory.getMarker("PACKET_SENT"), marker -> marker.add(PACKET_MARKER)); + public static final Supplier NETWORK_WORKER_GROUP = Suppliers.memoize( +- () -> new NioEventLoopGroup(0, new ThreadFactoryBuilder().setNameFormat("Netty Client IO #%d").setDaemon(true).build()) ++ () -> new NioEventLoopGroup(0, new ThreadFactoryBuilder().setNameFormat("Netty Client IO #%d").setDaemon(true).setUncaughtExceptionHandler(new net.minecraft.DefaultUncaughtExceptionHandlerWithName(LOGGER)).build()) // Paper + ); + public static final Supplier NETWORK_EPOLL_WORKER_GROUP = Suppliers.memoize( +- () -> new EpollEventLoopGroup(0, new ThreadFactoryBuilder().setNameFormat("Netty Epoll Client IO #%d").setDaemon(true).build()) ++ () -> new EpollEventLoopGroup(0, new ThreadFactoryBuilder().setNameFormat("Netty Epoll Client IO #%d").setDaemon(true).setUncaughtExceptionHandler(new net.minecraft.DefaultUncaughtExceptionHandlerWithName(LOGGER)).build()) // Paper + ); + public static final Supplier LOCAL_WORKER_GROUP = Suppliers.memoize( +- () -> new DefaultEventLoopGroup(0, new ThreadFactoryBuilder().setNameFormat("Netty Local Client IO #%d").setDaemon(true).build()) ++ () -> new DefaultEventLoopGroup(0, new ThreadFactoryBuilder().setNameFormat("Netty Local Client IO #%d").setDaemon(true).setUncaughtExceptionHandler(new net.minecraft.DefaultUncaughtExceptionHandlerWithName(LOGGER)).build()) // Paper + ); private static final ProtocolInfo INITIAL_PROTOCOL = HandshakeProtocols.SERVERBOUND; private final PacketFlow receiving; -@@ -96,6 +96,11 @@ +@@ -88,6 +_,11 @@ private final Queue> pendingActions = Queues.newConcurrentLinkedQueue(); public Channel channel; public SocketAddress address; @@ -29,7 +29,7 @@ @Nullable private volatile PacketListener disconnectListener; @Nullable -@@ -114,7 +119,42 @@ +@@ -106,6 +_,40 @@ private volatile DisconnectionDetails delayedDisconnect; @Nullable BandwidthDebugMonitor bandwidthDebugMonitor; @@ -39,7 +39,6 @@ + public java.net.InetSocketAddress virtualHost; + private static boolean enableExplicitFlush = Boolean.getBoolean("paper.explicit-flush"); // Paper - Disable explicit network manager flushing + // Paper end - + // Paper start - add utility methods + public final net.minecraft.server.level.ServerPlayer getPlayer() { + if (this.packetListener instanceof net.minecraft.server.network.ServerGamePacketListenerImpl impl) { @@ -68,13 +67,12 @@ + } + // Paper end - packet limiter + @Nullable public SocketAddress haProxyAddress; // Paper - Add API to get player's proxy address -+ - public Connection(PacketFlow side) { - this.receiving = side; - } -@@ -123,6 +163,9 @@ - super.channelActive(channelhandlercontext); - this.channel = channelhandlercontext.channel(); + + public Connection(PacketFlow receiving) { + this.receiving = receiving; +@@ -116,6 +_,9 @@ + super.channelActive(context); + this.channel = context.channel(); this.address = this.channel.remoteAddress(); + // Spigot Start + this.preparing = false; @@ -82,62 +80,61 @@ if (this.delayedDisconnect != null) { this.disconnect(this.delayedDisconnect); } -@@ -134,6 +177,21 @@ - } +@@ -128,14 +_,31 @@ - public void exceptionCaught(ChannelHandlerContext channelhandlercontext, Throwable throwable) { + @Override + public void exceptionCaught(ChannelHandlerContext context, Throwable exception) { + // Paper start - Handle large packets disconnecting client -+ if (throwable instanceof io.netty.handler.codec.EncoderException && throwable.getCause() instanceof PacketEncoder.PacketTooLargeException packetTooLargeException) { ++ if (exception instanceof io.netty.handler.codec.EncoderException && exception.getCause() instanceof PacketEncoder.PacketTooLargeException packetTooLargeException) { + final Packet packet = packetTooLargeException.getPacket(); + if (packet.packetTooLarge(this)) { -+ ProtocolSwapHandler.handleOutboundTerminalPacket(channelhandlercontext, packet); ++ ProtocolSwapHandler.handleOutboundTerminalPacket(context, packet); + return; + } else if (packet.isSkippable()) { -+ Connection.LOGGER.debug("Skipping packet due to errors", throwable.getCause()); -+ ProtocolSwapHandler.handleOutboundTerminalPacket(channelhandlercontext, packet); ++ Connection.LOGGER.debug("Skipping packet due to errors", exception.getCause()); ++ ProtocolSwapHandler.handleOutboundTerminalPacket(context, packet); + return; + } else { -+ throwable = throwable.getCause(); ++ exception = exception.getCause(); + } + } + // Paper end - Handle large packets disconnecting client - if (throwable instanceof SkipPacketException) { - Connection.LOGGER.debug("Skipping packet due to errors", throwable.getCause()); + if (exception instanceof SkipPacketException) { + LOGGER.debug("Skipping packet due to errors", exception.getCause()); } else { -@@ -141,8 +199,10 @@ - + boolean flag = !this.handlingFault; this.handlingFault = true; if (this.channel.isOpen()) { + net.minecraft.server.level.ServerPlayer player = this.getPlayer(); // Paper - Add API for quit reason - if (throwable instanceof TimeoutException) { - Connection.LOGGER.debug("Timeout", throwable); + if (exception instanceof TimeoutException) { + LOGGER.debug("Timeout", exception); + if (player != null) player.quitReason = org.bukkit.event.player.PlayerQuitEvent.QuitReason.TIMED_OUT; // Paper - Add API for quit reason - this.disconnect((Component) Component.translatable("disconnect.timeout")); + this.disconnect(Component.translatable("disconnect.timeout")); } else { - MutableComponent ichatmutablecomponent = Component.translatable("disconnect.genericReason", "Internal Exception: " + String.valueOf(throwable)); -@@ -155,9 +215,11 @@ - disconnectiondetails = new DisconnectionDetails(ichatmutablecomponent); + Component component = Component.translatable("disconnect.genericReason", "Internal Exception: " + exception); +@@ -147,9 +_,11 @@ + disconnectionDetails = new DisconnectionDetails(component); } + if (player != null) player.quitReason = org.bukkit.event.player.PlayerQuitEvent.QuitReason.ERRONEOUS_STATE; // Paper - Add API for quit reason if (flag) { - Connection.LOGGER.debug("Failed to sent packet", throwable); + LOGGER.debug("Failed to sent packet", exception); - if (this.getSending() == PacketFlow.CLIENTBOUND) { + boolean doesDisconnectExist = this.packetListener.protocol() != ConnectionProtocol.STATUS && this.packetListener.protocol() != ConnectionProtocol.HANDSHAKING; // Paper + if (this.getSending() == PacketFlow.CLIENTBOUND && doesDisconnectExist) { // Paper - Packet packet = this.sendLoginDisconnect ? new ClientboundLoginDisconnectPacket(ichatmutablecomponent) : new ClientboundDisconnectPacket(ichatmutablecomponent); - - this.send((Packet) packet, PacketSendListener.thenRun(() -> { -@@ -176,6 +238,7 @@ - + Packet packet = (Packet)(this.sendLoginDisconnect + ? new ClientboundLoginDisconnectPacket(component) + : new ClientboundDisconnectPacket(component)); +@@ -166,6 +_,7 @@ + } } } -+ if (net.minecraft.server.MinecraftServer.getServer().isDebugging()) io.papermc.paper.util.TraceUtil.printStackTrace(throwable); // Spigot // Paper ++ if (net.minecraft.server.MinecraftServer.getServer().isDebugging()) io.papermc.paper.util.TraceUtil.printStackTrace(exception); // Spigot // Paper } - protected void channelRead0(ChannelHandlerContext channelhandlercontext, Packet packet) { -@@ -185,11 +248,61 @@ - if (packetlistener == null) { + @Override +@@ -175,10 +_,60 @@ + if (packetListener == null) { throw new IllegalStateException("Received a packet before the packet listener was initialized"); } else { + // Paper start - packet limiter @@ -189,25 +186,15 @@ + } + } + // Paper end - packet limiter - if (packetlistener.shouldHandleMessage(packet)) { + if (packetListener.shouldHandleMessage(packet)) { try { - Connection.genericsFtw(packet, packetlistener); - } catch (RunningOnDifferentThreadException cancelledpackethandleexception) { - ; + genericsFtw(packet, packetListener); + } catch (RunningOnDifferentThreadException var5) { + } catch (io.papermc.paper.util.ServerStopRejectedExecutionException ignored) { // Paper - do not prematurely disconnect players on stop - } catch (RejectedExecutionException rejectedexecutionexception) { - this.disconnect((Component) Component.translatable("multiplayer.disconnect.server_shutdown")); - } catch (ClassCastException classcastexception) { -@@ -205,7 +318,7 @@ - } - - private static void genericsFtw(Packet packet, PacketListener listener) { -- packet.handle(listener); -+ packet.handle((T) listener); // CraftBukkit - decompile error - } - - private void validateListener(ProtocolInfo state, PacketListener listener) { -@@ -418,12 +531,26 @@ + } catch (RejectedExecutionException var6) { + this.disconnect(Component.translatable("multiplayer.disconnect.server_shutdown")); + } catch (ClassCastException var7) { +@@ -385,10 +_,24 @@ } } @@ -222,19 +209,17 @@ + Connection.joinAttemptsThisTick = 0; + } + // Paper end - Buffer joins to world - PacketListener packetlistener = this.packetListener; - - if (packetlistener instanceof TickablePacketListener tickablepacketlistener) { + if (this.packetListener instanceof TickablePacketListener tickablePacketListener) { + // Paper start - Buffer joins to world + if (!(this.packetListener instanceof net.minecraft.server.network.ServerLoginPacketListenerImpl loginPacketListener) + || loginPacketListener.state != net.minecraft.server.network.ServerLoginPacketListenerImpl.State.VERIFYING + || Connection.joinAttemptsThisTick++ < MAX_PER_TICK) { - tickablepacketlistener.tick(); + tickablePacketListener.tick(); + } // Paper end - Buffer joins to world } if (!this.isConnected() && !this.disconnectionHandled) { -@@ -431,7 +558,7 @@ +@@ -396,7 +_,7 @@ } if (this.channel != null) { @@ -243,34 +228,25 @@ } if (this.tickCount++ % 20 == 0) { -@@ -464,12 +591,15 @@ +@@ -432,12 +_,15 @@ } - public void disconnect(DisconnectionDetails disconnectionInfo) { + public void disconnect(DisconnectionDetails disconnectionDetails) { + // Spigot Start + this.preparing = false; + // Spigot End if (this.channel == null) { - this.delayedDisconnect = disconnectionInfo; + this.delayedDisconnect = disconnectionDetails; } if (this.isConnected()) { - this.channel.close().awaitUninterruptibly(); + this.channel.close(); // We can't wait as this may be called from an event loop. - this.disconnectionDetails = disconnectionInfo; + this.disconnectionDetails = disconnectionDetails; } - -@@ -537,7 +667,7 @@ } - - public void configurePacketHandler(ChannelPipeline pipeline) { -- pipeline.addLast("hackfix", new ChannelOutboundHandlerAdapter(this) { -+ pipeline.addLast("hackfix", new ChannelOutboundHandlerAdapter() { // CraftBukkit - decompile error - public void write(ChannelHandlerContext channelhandlercontext, Object object, ChannelPromise channelpromise) throws Exception { - super.write(channelhandlercontext, object, channelpromise); - } -@@ -613,6 +743,14 @@ - +@@ -584,6 +_,13 @@ + } } + // Paper start - add proper async disconnect @@ -280,33 +256,31 @@ + } + } + // Paper end - add proper async disconnect -+ - public void setupCompression(int compressionThreshold, boolean rejectsBadPackets) { - if (compressionThreshold >= 0) { - ChannelHandler channelhandler = this.channel.pipeline().get("decompress"); -@@ -633,6 +771,7 @@ + public void setupCompression(int threshold, boolean validateDecompressed) { + if (threshold >= 0) { + if (this.channel.pipeline().get("decompress") instanceof CompressionDecoder compressionDecoder) { +@@ -597,6 +_,7 @@ } else { - this.channel.pipeline().addAfter("prepender", "compress", new CompressionEncoder(compressionThreshold)); + this.channel.pipeline().addAfter("prepender", "compress", new CompressionEncoder(threshold)); } + this.channel.pipeline().fireUserEventTriggered(io.papermc.paper.network.ConnectionEvent.COMPRESSION_THRESHOLD_SET); // Paper - Add Channel initialization listeners } else { if (this.channel.pipeline().get("decompress") instanceof CompressionDecoder) { this.channel.pipeline().remove("decompress"); -@@ -641,6 +780,7 @@ +@@ -605,6 +_,7 @@ if (this.channel.pipeline().get("compress") instanceof CompressionEncoder) { this.channel.pipeline().remove("compress"); } + this.channel.pipeline().fireUserEventTriggered(io.papermc.paper.network.ConnectionEvent.COMPRESSION_DISABLED); // Paper - Add Channel initialization listeners } - } -@@ -661,6 +801,27 @@ - packetlistener1.onDisconnect(disconnectiondetails); +@@ -622,6 +_,26 @@ + ); + packetListener1.onDisconnect(disconnectionDetails); } + this.pendingActions.clear(); // Free up packet queue. + // Paper start - Add PlayerConnectionCloseEvent -+ final PacketListener packetListener = this.getPacketListener(); + if (packetListener instanceof net.minecraft.server.network.ServerCommonPacketListenerImpl commonPacketListener) { + /* Player was logged in, either game listener or configuration listener */ + final com.mojang.authlib.GameProfile profile = commonPacketListener.getOwner(); @@ -325,6 +299,6 @@ + } + } + // Paper end - Add PlayerConnectionCloseEvent - } } + } diff --git a/paper-server/patches/sources/net/minecraft/network/FriendlyByteBuf.java.patch b/paper-server/patches/sources/net/minecraft/network/FriendlyByteBuf.java.patch new file mode 100644 index 0000000000..f06b6bc4a6 --- /dev/null +++ b/paper-server/patches/sources/net/minecraft/network/FriendlyByteBuf.java.patch @@ -0,0 +1,42 @@ +--- a/net/minecraft/network/FriendlyByteBuf.java ++++ b/net/minecraft/network/FriendlyByteBuf.java +@@ -70,6 +_,7 @@ + public class FriendlyByteBuf extends ByteBuf { + public static final int DEFAULT_NBT_QUOTA = 2097152; + private final ByteBuf source; ++ @Nullable public final java.util.Locale adventure$locale; // Paper - track player's locale for server-side translations + public static final short MAX_STRING_LENGTH = 32767; + public static final int MAX_COMPONENT_STRING_LENGTH = 262144; + private static final int PUBLIC_KEY_SIZE = 256; +@@ -78,6 +_,7 @@ + private static final Gson GSON = new Gson(); + + public FriendlyByteBuf(ByteBuf source) { ++ this.adventure$locale = PacketEncoder.ADVENTURE_LOCALE.get(); // Paper - track player's locale for server-side translations + this.source = source; + } + +@@ -106,8 +_,13 @@ + } + + public void writeJsonWithCodec(Codec codec, T value) { ++ // Paper start - Adventure; add max length parameter ++ this.writeJsonWithCodec(codec, value, MAX_STRING_LENGTH); ++ } ++ public void writeJsonWithCodec(Codec codec, T value, int maxLength) { ++ // Paper end - Adventure; add max length parameter + DataResult dataResult = codec.encodeStart(JsonOps.INSTANCE, value); +- this.writeUtf(GSON.toJson(dataResult.getOrThrow(exception -> new EncoderException("Failed to encode: " + exception + " " + value)))); ++ this.writeUtf(GSON.toJson(dataResult.getOrThrow(exception -> new EncoderException("Failed to encode: " + exception + " " + value))), maxLength); // Paper - Adventure; add max length parameter + } + + public static IntFunction limitValue(IntFunction function, int limit) { +@@ -527,7 +_,7 @@ + + try { + NbtIo.writeAnyTag(nbt, new ByteBufOutputStream(buffer)); +- } catch (IOException var3) { ++ } catch (Exception var3) { // CraftBukkit - IOException -> Exception + throw new EncoderException(var3); + } + } diff --git a/paper-server/patches/unapplied/net/minecraft/network/PacketEncoder.java.patch b/paper-server/patches/sources/net/minecraft/network/PacketEncoder.java.patch similarity index 96% rename from paper-server/patches/unapplied/net/minecraft/network/PacketEncoder.java.patch rename to paper-server/patches/sources/net/minecraft/network/PacketEncoder.java.patch index ce1cafa04d..814472ca6a 100644 --- a/paper-server/patches/unapplied/net/minecraft/network/PacketEncoder.java.patch +++ b/paper-server/patches/sources/net/minecraft/network/PacketEncoder.java.patch @@ -1,10 +1,11 @@ --- a/net/minecraft/network/PacketEncoder.java +++ b/net/minecraft/network/PacketEncoder.java -@@ -17,10 +17,12 @@ - this.protocolInfo = state; +@@ -17,11 +_,13 @@ + this.protocolInfo = protocolInfo; } + static final ThreadLocal ADVENTURE_LOCALE = ThreadLocal.withInitial(() -> null); // Paper - adventure; set player's locale + @Override protected void encode(ChannelHandlerContext channelHandlerContext, Packet packet, ByteBuf byteBuf) throws Exception { PacketType> packetType = packet.type(); @@ -13,7 +14,7 @@ this.protocolInfo.codec().encode(byteBuf, packet); int i = byteBuf.readableBytes(); if (LOGGER.isDebugEnabled()) { -@@ -31,14 +33,40 @@ +@@ -32,14 +_,40 @@ JvmProfiler.INSTANCE.onPacketSent(this.protocolInfo.id(), packetType, channelHandlerContext.channel().remoteAddress(), i); } catch (Throwable var9) { diff --git a/paper-server/patches/unapplied/net/minecraft/network/VarInt.java.patch b/paper-server/patches/sources/net/minecraft/network/VarInt.java.patch similarity index 51% rename from paper-server/patches/unapplied/net/minecraft/network/VarInt.java.patch rename to paper-server/patches/sources/net/minecraft/network/VarInt.java.patch index e2a07664c5..0a23124969 100644 --- a/paper-server/patches/unapplied/net/minecraft/network/VarInt.java.patch +++ b/paper-server/patches/sources/net/minecraft/network/VarInt.java.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/network/VarInt.java +++ b/net/minecraft/network/VarInt.java -@@ -9,6 +9,18 @@ +@@ -9,6 +_,18 @@ private static final int DATA_BITS_PER_BYTE = 7; - public static int getByteSize(int i) { + public static int getByteSize(int data) { + // Paper start - Optimize VarInts -+ return VARINT_EXACT_BYTE_LENGTHS[Integer.numberOfLeadingZeros(i)]; ++ return VARINT_EXACT_BYTE_LENGTHS[Integer.numberOfLeadingZeros(data)]; + } + private static final int[] VARINT_EXACT_BYTE_LENGTHS = new int[33]; + static { @@ -14,30 +14,30 @@ + } + VARINT_EXACT_BYTE_LENGTHS[32] = 1; // Special case for the number 0. + } -+ public static int getByteSizeOld(int i) { ++ public static int getByteSizeOld(int data) { + // Paper end - Optimize VarInts - for (int j = 1; j < 5; j++) { - if ((i & -1 << j * 7) == 0) { - return j; -@@ -39,6 +51,21 @@ + for (int i = 1; i < 5; i++) { + if ((data & -1 << i * 7) == 0) { + return i; +@@ -39,6 +_,21 @@ } - public static ByteBuf write(ByteBuf buf, int i) { + public static ByteBuf write(ByteBuf buffer, int value) { + // Paper start - Optimize VarInts + // Peel the one and two byte count cases explicitly as they are the most common VarInt sizes + // that the proxy will write, to improve inlining. -+ if ((i & (0xFFFFFFFF << 7)) == 0) { -+ buf.writeByte(i); -+ } else if ((i & (0xFFFFFFFF << 14)) == 0) { -+ int w = (i & 0x7F | 0x80) << 8 | (i >>> 7); -+ buf.writeShort(w); ++ if ((value & (0xFFFFFFFF << 7)) == 0) { ++ buffer.writeByte(value); ++ } else if ((value & (0xFFFFFFFF << 14)) == 0) { ++ int w = (value & 0x7F | 0x80) << 8 | (value >>> 7); ++ buffer.writeShort(w); + } else { -+ writeOld(buf, i); ++ writeOld(buffer, value); + } -+ return buf; ++ return buffer; + } -+ public static ByteBuf writeOld(ByteBuf buf, int i) { ++ public static ByteBuf writeOld(ByteBuf buffer, int value) { + // Paper end - Optimize VarInts - while ((i & -128) != 0) { - buf.writeByte(i & 127 | 128); - i >>>= 7; + while ((value & -128) != 0) { + buffer.writeByte(value & 127 | 128); + value >>>= 7; diff --git a/paper-server/patches/unapplied/net/minecraft/network/Varint21FrameDecoder.java.patch b/paper-server/patches/sources/net/minecraft/network/Varint21FrameDecoder.java.patch similarity index 50% rename from paper-server/patches/unapplied/net/minecraft/network/Varint21FrameDecoder.java.patch rename to paper-server/patches/sources/net/minecraft/network/Varint21FrameDecoder.java.patch index e9aad632b1..5a1cea5c51 100644 --- a/paper-server/patches/unapplied/net/minecraft/network/Varint21FrameDecoder.java.patch +++ b/paper-server/patches/sources/net/minecraft/network/Varint21FrameDecoder.java.patch @@ -1,15 +1,15 @@ --- a/net/minecraft/network/Varint21FrameDecoder.java +++ b/net/minecraft/network/Varint21FrameDecoder.java -@@ -39,6 +39,12 @@ - } +@@ -41,6 +_,12 @@ - protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List list) { + @Override + protected void decode(ChannelHandlerContext context, ByteBuf in, List out) { + // Paper start - Perf: Optimize exception handling; if channel is not active just discard the packet -+ if (!channelHandlerContext.channel().isActive()) { -+ byteBuf.skipBytes(byteBuf.readableBytes()); ++ if (!context.channel().isActive()) { ++ in.skipBytes(in.readableBytes()); + return; + } + // Paper end - Perf: Optimize exception handling - byteBuf.markReaderIndex(); + in.markReaderIndex(); this.helperBuf.clear(); - if (!copyVarint(byteBuf, this.helperBuf)) { + if (!copyVarint(in, this.helperBuf)) { diff --git a/paper-server/patches/unapplied/net/minecraft/network/FriendlyByteBuf.java.patch b/paper-server/patches/unapplied/net/minecraft/network/FriendlyByteBuf.java.patch deleted file mode 100644 index c9d512f8d6..0000000000 --- a/paper-server/patches/unapplied/net/minecraft/network/FriendlyByteBuf.java.patch +++ /dev/null @@ -1,105 +0,0 @@ ---- a/net/minecraft/network/FriendlyByteBuf.java -+++ b/net/minecraft/network/FriendlyByteBuf.java -@@ -72,6 +72,7 @@ - - public static final int DEFAULT_NBT_QUOTA = 2097152; - private final ByteBuf source; -+ @Nullable public final java.util.Locale adventure$locale; // Paper - track player's locale for server-side translations - public static final short MAX_STRING_LENGTH = Short.MAX_VALUE; - public static final int MAX_COMPONENT_STRING_LENGTH = 262144; - private static final int PUBLIC_KEY_SIZE = 256; -@@ -80,6 +81,7 @@ - private static final Gson GSON = new Gson(); - - public FriendlyByteBuf(ByteBuf parent) { -+ this.adventure$locale = PacketEncoder.ADVENTURE_LOCALE.get(); // Paper - track player's locale for server-side translations - this.source = parent; - } - -@@ -120,11 +122,16 @@ - } - - public void writeJsonWithCodec(Codec codec, T value) { -+ // Paper start - Adventure; add max length parameter -+ this.writeJsonWithCodec(codec, value, MAX_STRING_LENGTH); -+ } -+ public void writeJsonWithCodec(Codec codec, T value, int maxLength) { -+ // Paper end - Adventure; add max length parameter - DataResult dataresult = codec.encodeStart(JsonOps.INSTANCE, value); - - this.writeUtf(FriendlyByteBuf.GSON.toJson((JsonElement) dataresult.getOrThrow((s) -> { - return new EncoderException("Failed to encode: " + s + " " + String.valueOf(value)); -- }))); -+ })), maxLength); // Paper - Adventure; add max length parameter - } - - public static IntFunction limitValue(IntFunction applier, int max) { -@@ -139,7 +146,7 @@ - - public > C readCollection(IntFunction collectionFactory, StreamDecoder reader) { - int i = this.readVarInt(); -- C c0 = (Collection) collectionFactory.apply(i); -+ C c0 = collectionFactory.apply(i); // CraftBukkit - decompile error - - for (int j = 0; j < i; ++j) { - c0.add(reader.decode(this)); -@@ -150,7 +157,7 @@ - - public void writeCollection(Collection collection, StreamEncoder writer) { - this.writeVarInt(collection.size()); -- Iterator iterator = collection.iterator(); -+ Iterator iterator = collection.iterator(); // CraftBukkit - decompile error - - while (iterator.hasNext()) { - T t0 = iterator.next(); -@@ -177,12 +184,12 @@ - - public void writeIntIdList(IntList list) { - this.writeVarInt(list.size()); -- list.forEach(this::writeVarInt); -+ list.forEach((java.util.function.IntConsumer) this::writeVarInt); // CraftBukkit - decompile error - } - - public > M readMap(IntFunction mapFactory, StreamDecoder keyReader, StreamDecoder valueReader) { - int i = this.readVarInt(); -- M m0 = (Map) mapFactory.apply(i); -+ M m0 = mapFactory.apply(i); // CraftBukkit - decompile error - - for (int j = 0; j < i; ++j) { - K k0 = keyReader.decode(this); -@@ -216,7 +223,7 @@ - } - - public > void writeEnumSet(EnumSet enumSet, Class type) { -- E[] ae = (Enum[]) type.getEnumConstants(); -+ E[] ae = type.getEnumConstants(); // CraftBukkit - decompile error - BitSet bitset = new BitSet(ae.length); - - for (int i = 0; i < ae.length; ++i) { -@@ -227,7 +234,7 @@ - } - - public > EnumSet readEnumSet(Class type) { -- E[] ae = (Enum[]) type.getEnumConstants(); -+ E[] ae = type.getEnumConstants(); // CraftBukkit - decompile error - BitSet bitset = this.readFixedBitSet(ae.length); - EnumSet enumset = EnumSet.noneOf(type); - -@@ -498,7 +505,7 @@ - } - - public > T readEnum(Class enumClass) { -- return ((Enum[]) enumClass.getEnumConstants())[this.readVarInt()]; -+ return ((T[]) enumClass.getEnumConstants())[this.readVarInt()]; // CraftBukkit - fix decompile error - } - - public FriendlyByteBuf writeEnum(Enum instance) { -@@ -565,7 +572,7 @@ - - try { - NbtIo.writeAnyTag((Tag) nbt, new ByteBufOutputStream(buf)); -- } catch (IOException ioexception) { -+ } catch (Exception ioexception) { // CraftBukkit - IOException -> Exception - throw new EncoderException(ioexception); - } - }