packetevents icon indicating copy to clipboard operation
packetevents copied to clipboard

Support serializing chat components (mixed lists) in nbt

Open SoSeDiK opened this issue 1 month ago • 1 comments

I'm trying to replace text in signs, which is sent as part of their block entity's nbt data (WrapperPlayServerBlockEntityData & WrapperPlayServerChunkData).

As an example, I can successfully read text like so:

var wrapper = new WrapperPlayServerBlockEntityData(event);
NBTCompound nbt = wrapper.getNBT();
NBTCompound sideText = nbt.getListOrThrow("front_text"); // & "back_text"
List<Component> messages = sideText.getListOrThrow("messages", AdventureSerializer.serializer(), wrapper);

However, trying to write it back while having mixed string & non-string components (reading them while mixed is fine):

sideText.setList("messages", messages, AdventureSerializer.serializer(), wrapper);

Leads to:

Exception
[20:31:17 WARN]: [com.github.retrooper.packetevents.PacketEventsAPI] PacketEvents caught an unhandled exception while calling your listener.
java.lang.IllegalArgumentException: Invalid tag type. Expected class com.github.retrooper.packetevents.protocol.nbt.NBTString, got class com.github.retrooper.packetevents.protocol.nbt.NBTCompound.
	at packetevents-spigot-2.10.2-SNAPSHOT.jar/com.github.retrooper.packetevents.protocol.nbt.NBTList.validateAddTag(NBTList.java:124) ~[packetevents-spigot-2.10.2-SNAPSHOT.jar:?]
	at packetevents-spigot-2.10.2-SNAPSHOT.jar/com.github.retrooper.packetevents.protocol.nbt.NBTList.addTag(NBTList.java:106) ~[packetevents-spigot-2.10.2-SNAPSHOT.jar:?]
	at packetevents-spigot-2.10.2-SNAPSHOT.jar/com.github.retrooper.packetevents.protocol.nbt.NBTList.addTagUnsafe(NBTList.java:115) ~[packetevents-spigot-2.10.2-SNAPSHOT.jar:?]
	at packetevents-spigot-2.10.2-SNAPSHOT.jar/com.github.retrooper.packetevents.protocol.nbt.NBTCompound.setList(NBTCompound.java:315) ~[packetevents-spigot-2.10.2-SNAPSHOT.jar:?]
	at UglyChatter.jar/me.sosedik.uglychatter.listener.misc.SignBeautifier.renderText(SignBeautifier.java:145) ~[UglyChatter.jar:?]
	at UglyChatter.jar/me.sosedik.uglychatter.listener.misc.SignBeautifier.handleBlockEntityData(SignBeautifier.java:99) ~[UglyChatter.jar:?]
	at UglyChatter.jar/me.sosedik.uglychatter.listener.misc.SignBeautifier.onPacketSend(SignBeautifier.java:87) ~[UglyChatter.jar:?]
	at packetevents-spigot-2.10.2-SNAPSHOT.jar/com.github.retrooper.packetevents.event.PacketListener$1.onPacketSend(PacketListener.java:46) ~[packetevents-spigot-2.10.2-SNAPSHOT.jar:?]
	at packetevents-spigot-2.10.2-SNAPSHOT.jar/com.github.retrooper.packetevents.event.PacketSendEvent.call(PacketSendEvent.java:51) ~[packetevents-spigot-2.10.2-SNAPSHOT.jar:?]
	at packetevents-spigot-2.10.2-SNAPSHOT.jar/com.github.retrooper.packetevents.event.EventManager.callEvent(EventManager.java:84) ~[packetevents-spigot-2.10.2-SNAPSHOT.jar:?]
	at packetevents-spigot-2.10.2-SNAPSHOT.jar/com.github.retrooper.packetevents.util.PacketEventsImplHelper.handleClientBoundPacket(PacketEventsImplHelper.java:61) ~[packetevents-spigot-2.10.2-SNAPSHOT.jar:?]
	at packetevents-spigot-2.10.2-SNAPSHOT.jar/io.github.retrooper.packetevents.injector.handlers.PacketEventsEncoder.handleClientBoundPacket(PacketEventsEncoder.java:102) ~[packetevents-spigot-2.10.2-SNAPSHOT.jar:?]
	at packetevents-spigot-2.10.2-SNAPSHOT.jar/io.github.retrooper.packetevents.injector.handlers.PacketEventsEncoder.write(PacketEventsEncoder.java:134) ~[packetevents-spigot-2.10.2-SNAPSHOT.jar:?]

Text components can be represented in multiple formats within the same list: https://minecraft.wiki/w/Text_component_format (e.g., a list with a component and two strings: [{text: "A", color: "red"}, "B", "C"]) And packetevents currently does not like that.

SoSeDiK avatar Nov 14 '25 19:11 SoSeDiK

The problem is that packetevents currently doesn't really support mixed lists with like vanilla does in recent versions Nbt list tags no longer have an assigned nbt type in vanilla, they can contain any tag; the list type is only present when serializing/deserializing nbt lists to/from network

packetevents sadly can't just simply remove the type of nbt lists because of backwards compatibility, so there still are a lot of issues with how we handle mixed nbt lists which can't be solved so easily

booky10 avatar Nov 14 '25 19:11 booky10