Skip to content

Using defaultRenderer causes unexpected result in AsyncChatEvent #13574

@APickledWalrus

Description

@APickledWalrus

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:

Image

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;

Metadata

Metadata

Assignees

No one assigned

    Labels

    status: acceptedDisputed bug is accepted as valid or Feature accepted as desired to be added.version: 1.21.11Game version 1.21.11

    Type

    No fields configured for Bug.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions