Paper icon indicating copy to clipboard operation
Paper copied to clipboard

Error on command block chat message output with more than 256 characters

Open batuhankal opened this issue 3 years ago • 4 comments

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

batuhankal avatar Sep 13 '22 11:09 batuhankal

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.

daviddempsey avatar Sep 14 '22 01:09 daviddempsey

Reopening, just because this also happens in vanilla doesn’t mean Paper can’t consider fixing it

NoahvdAa avatar Sep 14 '22 06:09 NoahvdAa

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.

lynxplay avatar Sep 17 '22 13:09 lynxplay

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.

synrg avatar Oct 10 '22 15:10 synrg

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.

batuhankal avatar Dec 16 '22 12:12 batuhankal

Thanks, I can confirm this is fixed in 1.19.3.

NoahvdAa avatar Dec 16 '22 15:12 NoahvdAa

how to bypass the limit

lolfusrin1 avatar May 07 '24 03:05 lolfusrin1