--- a/net/minecraft/commands/arguments/MessageArgument.java +++ b/net/minecraft/commands/arguments/MessageArgument.java @@ -54,17 +54,21 @@ private static void resolveSignedMessage(Consumer callback, CommandSourceStack source, PlayerChatMessage message) { MinecraftServer minecraftServer = source.getServer(); CompletableFuture completableFuture = filterPlainText(source, message); - Component component = minecraftServer.getChatDecorator().decorate(source.getPlayer(), message.decoratedContent()); - source.getChatMessageChainer().append(completableFuture, filtered -> { - PlayerChatMessage playerChatMessage2 = message.withUnsignedContent(component).filter(filtered.mask()); + // Paper start - support asynchronous chat decoration + CompletableFuture componentFuture = minecraftServer.getChatDecorator().decorate(source.getPlayer(), source, message.decoratedContent()); + source.getChatMessageChainer().append(CompletableFuture.allOf(completableFuture, componentFuture), filtered -> { + PlayerChatMessage playerChatMessage2 = message.withUnsignedContent(componentFuture.join()).filter(completableFuture.join().mask()); + // Paper end - support asynchronous chat decoration callback.accept(playerChatMessage2); }); } private static void resolveDisguisedMessage(Consumer callback, CommandSourceStack source, PlayerChatMessage message) { ChatDecorator chatDecorator = source.getServer().getChatDecorator(); - Component component = chatDecorator.decorate(source.getPlayer(), message.decoratedContent()); - callback.accept(message.withUnsignedContent(component)); + // Paper start - support asynchronous chat decoration + CompletableFuture componentFuture = chatDecorator.decorate(source.getPlayer(), source, message.decoratedContent()); + source.getChatMessageChainer().append(componentFuture, (result) -> callback.accept(message.withUnsignedContent(result))); + // Paper end - support asynchronous chat decoration } private static CompletableFuture filterPlainText(CommandSourceStack source, PlayerChatMessage message) {