Paper
Paper copied to clipboard
Error on command block chat message output with more than 256 characters
Expected behavior
Command block vanilla say command with more than 256 characters (but less than 32,768 which I believe to be the supposed character limit) to display its message in chat upon activation.
Observed/Actual behavior
In-game, neither output nor any error. However, error on the server console:
[ERROR]: Packet encoding of packet ID 51 threw (skippable? true)
io.netty.handler.codec.EncoderException: String too big (was 1186 characters, max 256)
at net.minecraft.network.FriendlyByteBuf.writeUtf(FriendlyByteBuf.java:645) ~[?:?]
at net.minecraft.network.chat.ChatMessageContent.write(ChatMessageContent.java:32) ~[paper-1.19.2.jar:git-Paper-142]
at net.minecraft.network.chat.SignedMessageBody.write(SignedMessageBody.java:22) ~[paper-1.19.2.jar:git-Paper-142]
at net.minecraft.network.chat.PlayerChatMessage.write(PlayerChatMessage.java:33) ~[paper-1.19.2.jar:git-Paper-142]
at net.minecraft.network.protocol.game.ClientboundPlayerChatPacket.write(ClientboundPlayerChatPacket.java:17) ~[paper-1.19.2.jar:git-Paper-142]
at net.minecraft.network.PacketEncoder.encode(PacketEncoder.java:41) ~[paper-1.19.2.jar:git-Paper-142]
at net.minecraft.network.PacketEncoder.encode(PacketEncoder.java:14) ~[paper-1.19.2.jar:git-Paper-142]
at io.netty.handler.codec.MessageToByteEncoder.write(MessageToByteEncoder.java:107) ~[netty-codec-4.1.77.Final.jar:4.1.77.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:717) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeWriteAndFlush(AbstractChannelHandlerContext.java:764) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:790) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:758) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:808) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
at io.netty.channel.DefaultChannelPipeline.writeAndFlush(DefaultChannelPipeline.java:1025) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
at io.netty.channel.AbstractChannel.writeAndFlush(AbstractChannel.java:306) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
at net.minecraft.network.Connection.doSendPacket(Connection.java:459) ~[?:?]
at net.minecraft.network.Connection.lambda$sendPacket$11(Connection.java:433) ~[?:?]
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174) ~[netty-common-4.1.77.Final.jar:4.1.77.Final]
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167) ~[netty-common-4.1.77.Final.jar:4.1.77.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470) ~[netty-common-4.1.77.Final.jar:4.1.77.Final]
at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:391) ~[netty-transport-classes-epoll-4.1.77.Final.jar:4.1.77.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:995) ~[netty-common-4.1.77.Final.jar:4.1.77.Final]
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.77.Final.jar:4.1.77.Final]
at java.lang.Thread.run(Thread.java:833) ~[?:?]
Steps/models to reproduce
Enter say command in an unconditional impulse command block that has more than 256 characters in total and activate it.
Example (1186 characters):
say Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque pellentesque arcu quis vulputate varius. In hac habitasse platea dictumst. Fusce ut ultrices leo, sed ultricies risus. Donec lacus nisi, mollis vel rhoncus in, feugiat scelerisque tortor. Nulla facilisi. Nunc tempus accumsan urna, in maximus nulla ultrices non. Morbi ut porta enim, sit amet maximus orci.Sed sit amet odio sit amet mi cursus aliquet placerat pretium eros. Etiam nec orci vel lectus tempor accumsan. Aenean velit mi, pretium vel sagittis in, consequat ut odio. Etiam pharetra in justo et mattis. In venenatis vitae lectus euismod dictum. Nunc ut dapibus enim. Integer et tempus eros. Aenean quis lacus id libero porttitor finibus sed eu turpis.Donec posuere iaculis luctus. In gravida mi sem, non facilisis ex cursus facilisis. Sed et convallis tortor, sit amet fringilla nulla. Suspendisse lorem odio, elementum sit amet justo at, hendrerit malesuada lacus. Aenean ut augue congue, malesuada dolor at, volutpat libero. Integer id leo mauris. Suspendisse lectus nibh, lobortis vel pellentesque vitae, iaculis eu elit. Maecenas sed sem at nisi feugiat posuere. Nullam feugiat nec metus faucibus vestibulum.
Plugin and Datapack List
Dynmap, EssentialsX, FastAsyncWorldEdit, GSit
Paper version
This server is running Paper version git-Paper-142 (MC: 1.19.2) (Implementing API version 1.19.2-R0.1-SNAPSHOT) (Git: ef0e5a6)
You are running the latest version
Previous version: git-Paper-138 (MC: 1.19.2)
Other
No response
I replicated this on a 1.19.2 vanilla Minecraft server and it provides the same error.
[21:35:06] [Netty Server IO #1/ERROR]: Error receiving packet 51
io.netty.handler.codec.EncoderException: String too big (was 1186 characters, max 256)
at qx.a(SourceFile:617) ~[server-1.19.2.jar:?]
at ri.a(SourceFile:24) ~[server-1.19.2.jar:?]
at sf.a(SourceFile:24) ~[server-1.19.2.jar:?]
at sd.a(SourceFile:41) ~[server-1.19.2.jar:?]
at vf.a(SourceFile:21) ~[server-1.19.2.jar:?]
at qz.a(SourceFile:45) ~[server-1.19.2.jar:?]
at qz.encode(SourceFile:14) ~[server-1.19.2.jar:?]
at io.netty.handler.codec.MessageToByteEncoder.write(MessageToByteEncoder.java:107) ~[netty-codec-4.1.77.Final.jar:4.1.77.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:717) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeWriteAndFlush(AbstractChannelHandlerContext.java:764) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:790) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:758) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:808) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
at io.netty.channel.DefaultChannelPipeline.writeAndFlush(DefaultChannelPipeline.java:1025) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
at io.netty.channel.AbstractChannel.writeAndFlush(AbstractChannel.java:306) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
at qv.a(SourceFile:209) ~[server-1.19.2.jar:?]
at qv.b(SourceFile:201) ~[server-1.19.2.jar:?]
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174) [netty-common-4.1.77.Final.jar:4.1.77.Final]
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167) [netty-common-4.1.77.Final.jar:4.1.77.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470) [netty-common-4.1.77.Final.jar:4.1.77.Final]
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:503) [netty-transport-4.1.77.Final.jar:4.1.77.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:995) [netty-common-4.1.77.Final.jar:4.1.77.Final]
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) [netty-common-4.1.77.Final.jar:4.1.77.Final]
at java.lang.Thread.run(Thread.java:833) [?:?]
so this is not a Paper issue.
Reopening, just because this also happens in vanilla doesn’t mean Paper can’t consider fixing it
I don't know how well a fix would work here. We can remove the limitation of a ChatMessageContent's plain content of 256 characters on the server side, however the limit is also enforced when the content is read:
// net.minecraft.network.chat.ChatMessageContent
public static ChatMessageContent read(FriendlyByteBuf buf) {
String string = buf.readUtf(256);
Component component = buf.readNullable(FriendlyByteBuf::readComponent);
return new ChatMessageContent(string, Objects.requireNonNullElse(component, Component.literal(string)));
}
which would kick clients receiving this message.
We would have to cut the plain content down to 256 character, however that also feels less than idea.
Same traceback triggered by writing a 282 character message in mark2 console via say.
Paper version:
This server is running Paper version git-Paper-194 (MC: 1.19.2) (Implementing API version 1.19.2-R0.1-SNAPSHOT) (Git: ad3d357)
Truncating the content (maybe add an ellipsis character to the end) seems like a better outcome than a traceback. In my case, if my instructions to the players were unclear due to the truncation, they'd ask me to provide the missing part, i guess. Not sure what this would break for command blocks. I guess whoever is programming those commands would need to account for the limit and rewrite their command blocks accordingly to work within it.
I would like to note that the problem does not occur in git-Paper-338 (MC: 1.19.3). The command output is displayed properly in the chat with no error in the console.
Thanks, I can confirm this is fixed in 1.19.3.
how to bypass the limit