From 5ca60509e11a676bfdd6abc6767292ae8e41fac4 Mon Sep 17 00:00:00 2001 From: Axyss Date: Thu, 7 May 2026 23:42:04 +0200 Subject: [PATCH 1/7] Fix username duplication when plugin sets defaultRenderer --- .../src/main/java/io/papermc/paper/adventure/ChatProcessor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paper-server/src/main/java/io/papermc/paper/adventure/ChatProcessor.java b/paper-server/src/main/java/io/papermc/paper/adventure/ChatProcessor.java index f1ef191a9ca3..c3b5ed3fe14b 100644 --- a/paper-server/src/main/java/io/papermc/paper/adventure/ChatProcessor.java +++ b/paper-server/src/main/java/io/papermc/paper/adventure/ChatProcessor.java @@ -186,7 +186,7 @@ private void complete(final AbstractChatEvent event) { final ChatRenderer renderer = event.renderer(); final Set viewers = event.viewers(); - final ResourceKey chatTypeKey = renderer instanceof ChatRenderer.Default ? ChatType.CHAT : PAPER_RAW; + final ResourceKey chatTypeKey = renderer instanceof ChatRenderer.Default && !this.flags.get(FORMAT_CHANGED) ? ChatType.CHAT : PAPER_RAW; final ChatType.Bound chatType = ChatType.bind(chatTypeKey, this.player.level().registryAccess(), PaperAdventure.asVanilla(displayName(player))); OutgoingChat outgoingChat = viewers instanceof LazyChatAudienceSet lazyAudienceSet && lazyAudienceSet.isLazy() ? new ServerOutgoingChat() : new ViewersOutgoingChat(); From 1e46096fb0de5dc16d08a19aa51330ef85c285e9 Mon Sep 17 00:00:00 2001 From: Axyss Date: Wed, 29 Jul 2026 20:55:15 +0200 Subject: [PATCH 2/7] Avoid setting FORMAT_CHANGED when both renderers are default --- .../main/java/io/papermc/paper/adventure/ChatProcessor.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/paper-server/src/main/java/io/papermc/paper/adventure/ChatProcessor.java b/paper-server/src/main/java/io/papermc/paper/adventure/ChatProcessor.java index c3b5ed3fe14b..5afb095fa9b6 100644 --- a/paper-server/src/main/java/io/papermc/paper/adventure/ChatProcessor.java +++ b/paper-server/src/main/java/io/papermc/paper/adventure/ChatProcessor.java @@ -170,7 +170,8 @@ protected Void evaluate() { private void readModernModifications(final AbstractChatEvent chatEvent, final ChatRenderer originalRenderer) { this.flags.set(MESSAGE_CHANGED, !chatEvent.message().equals(this.paper$originalMessage)); - if (originalRenderer != chatEvent.renderer()) { // don't set to false if it hasn't changed + boolean isBothDefaultRenderers = !(chatEvent.renderer() instanceof ChatRenderer.Default && originalRenderer instanceof ChatRenderer.Default); // Avoids default renderer format duplication + if (originalRenderer != chatEvent.renderer() && isBothDefaultRenderers) { // don't set to false if it hasn't changed this.flags.set(FORMAT_CHANGED, true); } } @@ -186,7 +187,7 @@ private void complete(final AbstractChatEvent event) { final ChatRenderer renderer = event.renderer(); final Set viewers = event.viewers(); - final ResourceKey chatTypeKey = renderer instanceof ChatRenderer.Default && !this.flags.get(FORMAT_CHANGED) ? ChatType.CHAT : PAPER_RAW; + final ResourceKey chatTypeKey = renderer instanceof ChatRenderer.Default ? ChatType.CHAT : PAPER_RAW; final ChatType.Bound chatType = ChatType.bind(chatTypeKey, this.player.level().registryAccess(), PaperAdventure.asVanilla(displayName(player))); OutgoingChat outgoingChat = viewers instanceof LazyChatAudienceSet lazyAudienceSet && lazyAudienceSet.isLazy() ? new ServerOutgoingChat() : new ViewersOutgoingChat(); From c96d2f91196c1264b98b2fc8597cf610cd76e874 Mon Sep 17 00:00:00 2001 From: Axyss Date: Fri, 31 Jul 2026 04:02:15 +0200 Subject: [PATCH 3/7] Negation moved for better readability --- .../main/java/io/papermc/paper/adventure/ChatProcessor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/paper-server/src/main/java/io/papermc/paper/adventure/ChatProcessor.java b/paper-server/src/main/java/io/papermc/paper/adventure/ChatProcessor.java index 5afb095fa9b6..1244ac999c5e 100644 --- a/paper-server/src/main/java/io/papermc/paper/adventure/ChatProcessor.java +++ b/paper-server/src/main/java/io/papermc/paper/adventure/ChatProcessor.java @@ -170,8 +170,8 @@ protected Void evaluate() { private void readModernModifications(final AbstractChatEvent chatEvent, final ChatRenderer originalRenderer) { this.flags.set(MESSAGE_CHANGED, !chatEvent.message().equals(this.paper$originalMessage)); - boolean isBothDefaultRenderers = !(chatEvent.renderer() instanceof ChatRenderer.Default && originalRenderer instanceof ChatRenderer.Default); // Avoids default renderer format duplication - if (originalRenderer != chatEvent.renderer() && isBothDefaultRenderers) { // don't set to false if it hasn't changed + boolean isBothDefaultRenderers = chatEvent.renderer() instanceof ChatRenderer.Default && originalRenderer instanceof ChatRenderer.Default; // Avoids default renderer format duplication + if (originalRenderer != chatEvent.renderer() && !isBothDefaultRenderers) { // don't set to false if it hasn't changed this.flags.set(FORMAT_CHANGED, true); } } From 154633d5b15d4d665ea482ab342a8c501819e1a6 Mon Sep 17 00:00:00 2001 From: Warrior <50800980+Warriorrrr@users.noreply.github.com> Date: Sat, 1 Aug 2026 15:16:21 +0200 Subject: [PATCH 4/7] fix existing old comment --- .../src/main/java/io/papermc/paper/adventure/ChatProcessor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/paper-server/src/main/java/io/papermc/paper/adventure/ChatProcessor.java b/paper-server/src/main/java/io/papermc/paper/adventure/ChatProcessor.java index 1244ac999c5e..6762ca1e3ac5 100644 --- a/paper-server/src/main/java/io/papermc/paper/adventure/ChatProcessor.java +++ b/paper-server/src/main/java/io/papermc/paper/adventure/ChatProcessor.java @@ -171,7 +171,7 @@ protected Void evaluate() { private void readModernModifications(final AbstractChatEvent chatEvent, final ChatRenderer originalRenderer) { this.flags.set(MESSAGE_CHANGED, !chatEvent.message().equals(this.paper$originalMessage)); boolean isBothDefaultRenderers = chatEvent.renderer() instanceof ChatRenderer.Default && originalRenderer instanceof ChatRenderer.Default; // Avoids default renderer format duplication - if (originalRenderer != chatEvent.renderer() && !isBothDefaultRenderers) { // don't set to false if it hasn't changed + if (originalRenderer != chatEvent.renderer() && !isBothDefaultRenderers) { // don't set to true if it hasn't changed this.flags.set(FORMAT_CHANGED, true); } } From 1f81dfabfa6246f841151d315c601d9732d88832 Mon Sep 17 00:00:00 2001 From: Axyss Date: Wed, 30 Sep 2026 19:52:23 +0200 Subject: [PATCH 5/7] Revert previous approach --- .../main/java/io/papermc/paper/adventure/ChatProcessor.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/paper-server/src/main/java/io/papermc/paper/adventure/ChatProcessor.java b/paper-server/src/main/java/io/papermc/paper/adventure/ChatProcessor.java index 6762ca1e3ac5..1e0e0a89630c 100644 --- a/paper-server/src/main/java/io/papermc/paper/adventure/ChatProcessor.java +++ b/paper-server/src/main/java/io/papermc/paper/adventure/ChatProcessor.java @@ -170,8 +170,7 @@ protected Void evaluate() { private void readModernModifications(final AbstractChatEvent chatEvent, final ChatRenderer originalRenderer) { this.flags.set(MESSAGE_CHANGED, !chatEvent.message().equals(this.paper$originalMessage)); - boolean isBothDefaultRenderers = chatEvent.renderer() instanceof ChatRenderer.Default && originalRenderer instanceof ChatRenderer.Default; // Avoids default renderer format duplication - if (originalRenderer != chatEvent.renderer() && !isBothDefaultRenderers) { // don't set to true if it hasn't changed + if (originalRenderer != chatEvent.renderer()) { // don't set to true if it hasn't changed this.flags.set(FORMAT_CHANGED, true); } } From ec2c2026b2238ce73cef4b39888f2a917508e5c6 Mon Sep 17 00:00:00 2001 From: Axyss Date: Wed, 30 Sep 2026 20:26:27 +0200 Subject: [PATCH 6/7] Removed message component --- .../main/java/io/papermc/paper/chat/ViewerUnawareImpl.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/paper-api/src/main/java/io/papermc/paper/chat/ViewerUnawareImpl.java b/paper-api/src/main/java/io/papermc/paper/chat/ViewerUnawareImpl.java index e1ef23b4bdf6..f04c8207b038 100644 --- a/paper-api/src/main/java/io/papermc/paper/chat/ViewerUnawareImpl.java +++ b/paper-api/src/main/java/io/papermc/paper/chat/ViewerUnawareImpl.java @@ -5,13 +5,11 @@ import org.bukkit.entity.Player; import org.jetbrains.annotations.ApiStatus; import org.jspecify.annotations.NullMarked; -import org.jspecify.annotations.Nullable; @ApiStatus.Internal @NullMarked sealed class ViewerUnawareImpl implements ChatRenderer, ChatRenderer.ViewerUnaware permits ViewerUnawareImpl.Default { private final ViewerUnaware unaware; - private @Nullable Component message; ViewerUnawareImpl(final ViewerUnaware unaware) { this.unaware = unaware; @@ -24,10 +22,7 @@ public Component render(final Player source, final Component sourceDisplayName, @Override public Component render(final Player source, final Component sourceDisplayName, final Component message) { - if (this.message == null) { - this.message = this.unaware.render(source, sourceDisplayName, message); - } - return this.message; + return this.unaware.render(source, sourceDisplayName, message); } static final class Default extends ViewerUnawareImpl implements ChatRenderer.Default { From 6fbcbf601aad66048c3d98f086b6b43b6c203553 Mon Sep 17 00:00:00 2001 From: Axyss Date: Wed, 30 Sep 2026 20:45:04 +0200 Subject: [PATCH 7/7] Refactor defaultRenderer method to return singleton --- .../src/main/java/io/papermc/paper/chat/ChatRenderer.java | 6 +++--- .../main/java/io/papermc/paper/chat/ViewerUnawareImpl.java | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/paper-api/src/main/java/io/papermc/paper/chat/ChatRenderer.java b/paper-api/src/main/java/io/papermc/paper/chat/ChatRenderer.java index 1288cdeafe58..d6b51a69b2bb 100644 --- a/paper-api/src/main/java/io/papermc/paper/chat/ChatRenderer.java +++ b/paper-api/src/main/java/io/papermc/paper/chat/ChatRenderer.java @@ -26,12 +26,12 @@ public interface ChatRenderer { Component render(Player source, Component sourceDisplayName, Component message, Audience viewer); /** - * Create a new instance of the default {@link ChatRenderer}. + * Gets the default {@link ChatRenderer}. * - * @return a new {@link ChatRenderer} + * @return the default {@link ChatRenderer} */ static ChatRenderer defaultRenderer() { - return new ViewerUnawareImpl.Default((source, sourceDisplayName, message) -> Component.translatable("chat.type.text", sourceDisplayName, message)); + return ViewerUnawareImpl.Default.INSTANCE; } @ApiStatus.Internal diff --git a/paper-api/src/main/java/io/papermc/paper/chat/ViewerUnawareImpl.java b/paper-api/src/main/java/io/papermc/paper/chat/ViewerUnawareImpl.java index f04c8207b038..84e0d7c472fc 100644 --- a/paper-api/src/main/java/io/papermc/paper/chat/ViewerUnawareImpl.java +++ b/paper-api/src/main/java/io/papermc/paper/chat/ViewerUnawareImpl.java @@ -26,6 +26,8 @@ public Component render(final Player source, final Component sourceDisplayName, } static final class Default extends ViewerUnawareImpl implements ChatRenderer.Default { + static final ViewerUnawareImpl.Default INSTANCE = new ViewerUnawareImpl.Default((source, sourceDisplayName, message) -> Component.translatable("chat.type.text", sourceDisplayName, message)); + Default(final ViewerUnaware unaware) { super(unaware); }