Expected behavior
When setting the renderer in an AsyncChatEvent to ChatRenderer.defaultRenderer(), it should render in the default format. This is typically something like <APickledWalrus> hello world!.
Observed/Actual behavior
When the renderer is set, the output instead contains the player name twice:
Steps/models to reproduce
I ran a server will only the following test plugin:
import io.papermc.paper.chat.ChatRenderer;
import io.papermc.paper.event.player.AsyncChatEvent;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;
public class TestPlugin extends JavaPlugin implements Listener {
@Override
public void onEnable() {
Bukkit.getPluginManager().registerEvents(this, this);
}
@EventHandler
public void onChat(AsyncChatEvent event) {
event.renderer(ChatRenderer.defaultRenderer());
}
}
Plugin and Datapack List
> plugins
[20:31:18 INFO]: ℹ Server Plugins (1):
[20:31:18 INFO]: Paper Plugins:
[20:31:18 INFO]: - PickleTest
> datapack list
[20:31:30 INFO]: There are 3 data pack(s) enabled: [vanilla (built-in)], [file/bukkit (world)], [paper (built-in)]
[20:31:30 INFO]: There are no more data packs available
Paper version
> version
[20:31:49 INFO]: Checking version, please wait...
[20:31:49 INFO]: This server is running Paper version 1.21.11-99-main@81b9122 (2026-01-20T19:08:30Z) (Implementing API version 1.21.11-R0.1-SNAPSHOT)
You are running the latest version
Previous version: 1.21.11-51-90191f7 (MC: 1.21.11)
Other
This appears to be an issue with one of the internal checks for whether the renderer being used is the default renderer.
I manually used the implementation of ChatRenderer.defaultRenderer(), which works as expected.
event.renderer(ChatRenderer.viewerUnaware((source, sourceDisplayName, message) ->
Component.translatable("chat.type.text", sourceDisplayName, message)))
The difference here is that it is just a regular ViewerUnaware renderer, not a Default renderer.
This line stands out to me, but I have zero familiarity with Paper internals here:
|
final ResourceKey<ChatType> chatTypeKey = renderer instanceof ChatRenderer.Default ? ChatType.CHAT : PAPER_RAW; |
Expected behavior
When setting the renderer in an AsyncChatEvent to
ChatRenderer.defaultRenderer(), it should render in the default format. This is typically something like<APickledWalrus> hello world!.Observed/Actual behavior
When the renderer is set, the output instead contains the player name twice:
Steps/models to reproduce
I ran a server will only the following test plugin:
Plugin and Datapack List
Paper version
Other
This appears to be an issue with one of the internal checks for whether the renderer being used is the default renderer.
I manually used the implementation of
ChatRenderer.defaultRenderer(), which works as expected.The difference here is that it is just a regular ViewerUnaware renderer, not a Default renderer.
This line stands out to me, but I have zero familiarity with Paper internals here:
Paper/paper-server/src/main/java/io/papermc/paper/adventure/ChatProcessor.java
Line 189 in 81b9122