MessageArgument.java

net.minecraft.commands.arguments.MessageArgument

信息

  • 全限定名:net.minecraft.commands.arguments.MessageArgument
  • 类型:public class
  • 包:net.minecraft.commands.arguments
  • 源码路径:src/main/java/net/minecraft/commands/arguments/MessageArgument.java
  • 起始行号:L27
  • 实现:SignedArgument<MessageArgument.Message>
  • 职责:

    TODO

字段/常量

  • EXAMPLES

    • 类型: Collection<String>
    • 修饰符: private static final
    • 源码定位: L28
    • 说明:

      TODO

  • TOO_LONG

    • 类型: Dynamic2CommandExceptionType
    • 修饰符: private static final
    • 源码定位: L29
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.commands.arguments.MessageArgument.Message

    • 类型: record
    • 修饰符: public
    • 源码定位: L91
    • 说明:

      TODO

  • net.minecraft.commands.arguments.MessageArgument.Part

    • 类型: record
    • 修饰符: public
    • 源码定位: L168
    • 说明:

      TODO

构造器

方法

下面的方法块按源码顺序生成。

public static MessageArgument message() @ L33

  • 方法名:message
  • 源码定位:L33
  • 返回类型:MessageArgument
  • 修饰符:public static

参数:

说明:

TODO

public static Component getMessage(CommandContext<CommandSourceStack> context, String name) @ L37

  • 方法名:getMessage
  • 源码定位:L37
  • 返回类型:Component
  • 修饰符:public static

参数:

  • context: CommandContext
  • name: String

说明:

TODO

public static void resolveChatMessage(CommandContext<CommandSourceStack> context, String name, Consumer<PlayerChatMessage> task) @ L42

  • 方法名:resolveChatMessage
  • 源码定位:L42
  • 返回类型:void
  • 修饰符:public static

参数:

  • context: CommandContext
  • name: String
  • task: Consumer

说明:

TODO

private static void resolveSignedMessage(Consumer<PlayerChatMessage> task, CommandSourceStack sender, PlayerChatMessage signedArgument) @ L55

  • 方法名:resolveSignedMessage
  • 源码定位:L55
  • 返回类型:void
  • 修饰符:private static

参数:

  • task: Consumer
  • sender: CommandSourceStack
  • signedArgument: PlayerChatMessage

说明:

TODO

private static void resolveDisguisedMessage(Consumer<PlayerChatMessage> task, CommandSourceStack sender, PlayerChatMessage argument) @ L65

  • 方法名:resolveDisguisedMessage
  • 源码定位:L65
  • 返回类型:void
  • 修饰符:private static

参数:

  • task: Consumer
  • sender: CommandSourceStack
  • argument: PlayerChatMessage

说明:

TODO

private static CompletableFuture<FilteredText> filterPlainText(CommandSourceStack sender, PlayerChatMessage message) @ L71

  • 方法名:filterPlainText
  • 源码定位:L71
  • 返回类型:CompletableFuture
  • 修饰符:private static

参数:

  • sender: CommandSourceStack
  • message: PlayerChatMessage

说明:

TODO

public MessageArgument.Message parse(StringReader reader) @ L78

  • 方法名:parse
  • 源码定位:L78
  • 返回类型:MessageArgument.Message
  • 修饰符:public

参数:

  • reader: StringReader

说明:

TODO

public <S> MessageArgument.Message parse(StringReader reader, S source) @ L82

  • 方法名:parse
  • 源码定位:L82
  • 返回类型: MessageArgument.Message
  • 修饰符:public

参数:

  • reader: StringReader
  • source: S

说明:

TODO

public Collection<String> getExamples() @ L86

  • 方法名:getExamples
  • 源码定位:L86
  • 返回类型:Collection
  • 修饰符:public

参数:

说明:

TODO

代码

public class MessageArgument implements SignedArgument<MessageArgument.Message> {
    private static final Collection<String> EXAMPLES = Arrays.asList("Hello world!", "foo", "@e", "Hello @p :)");
    private static final Dynamic2CommandExceptionType TOO_LONG = new Dynamic2CommandExceptionType(
        (length, maxLength) -> Component.translatableEscape("argument.message.too_long", length, maxLength)
    );
 
    public static MessageArgument message() {
        return new MessageArgument();
    }
 
    public static Component getMessage(CommandContext<CommandSourceStack> context, String name) throws CommandSyntaxException {
        MessageArgument.Message message = context.getArgument(name, MessageArgument.Message.class);
        return message.resolveComponent(context.getSource());
    }
 
    public static void resolveChatMessage(CommandContext<CommandSourceStack> context, String name, Consumer<PlayerChatMessage> task) throws CommandSyntaxException {
        MessageArgument.Message message = context.getArgument(name, MessageArgument.Message.class);
        CommandSourceStack sender = context.getSource();
        Component formatted = message.resolveComponent(sender);
        CommandSigningContext signingContext = sender.getSigningContext();
        PlayerChatMessage signedArgument = signingContext.getArgument(name);
        if (signedArgument != null) {
            resolveSignedMessage(task, sender, signedArgument.withUnsignedContent(formatted));
        } else {
            resolveDisguisedMessage(task, sender, PlayerChatMessage.system(message.text).withUnsignedContent(formatted));
        }
    }
 
    private static void resolveSignedMessage(Consumer<PlayerChatMessage> task, CommandSourceStack sender, PlayerChatMessage signedArgument) {
        MinecraftServer server = sender.getServer();
        CompletableFuture<FilteredText> filteredFuture = filterPlainText(sender, signedArgument);
        Component decorated = server.getChatDecorator().decorate(sender.getPlayer(), signedArgument.decoratedContent());
        sender.getChatMessageChainer().append(filteredFuture, filtered -> {
            PlayerChatMessage filteredMessage = signedArgument.withUnsignedContent(decorated).filter(filtered.mask());
            task.accept(filteredMessage);
        });
    }
 
    private static void resolveDisguisedMessage(Consumer<PlayerChatMessage> task, CommandSourceStack sender, PlayerChatMessage argument) {
        ChatDecorator decorator = sender.getServer().getChatDecorator();
        Component decorated = decorator.decorate(sender.getPlayer(), argument.decoratedContent());
        task.accept(argument.withUnsignedContent(decorated));
    }
 
    private static CompletableFuture<FilteredText> filterPlainText(CommandSourceStack sender, PlayerChatMessage message) {
        ServerPlayer player = sender.getPlayer();
        return player != null && message.hasSignatureFrom(player.getUUID())
            ? player.getTextFilter().processStreamMessage(message.signedContent())
            : CompletableFuture.completedFuture(FilteredText.passThrough(message.signedContent()));
    }
 
    public MessageArgument.Message parse(StringReader reader) throws CommandSyntaxException {
        return MessageArgument.Message.parseText(reader, true);
    }
 
    public <S> MessageArgument.Message parse(StringReader reader, @Nullable S source) throws CommandSyntaxException {
        return MessageArgument.Message.parseText(reader, EntitySelectorParser.allowSelectors(source));
    }
 
    @Override
    public Collection<String> getExamples() {
        return EXAMPLES;
    }
 
    public record Message(String text, MessageArgument.Part[] parts) {
        private Component resolveComponent(CommandSourceStack sender) throws CommandSyntaxException {
            return this.toComponent(sender, sender.permissions().hasPermission(Permissions.COMMANDS_ENTITY_SELECTORS));
        }
 
        public Component toComponent(CommandSourceStack sender, boolean allowSelectors) throws CommandSyntaxException {
            if (this.parts.length != 0 && allowSelectors) {
                MutableComponent result = Component.literal(this.text.substring(0, this.parts[0].start()));
                int readTo = this.parts[0].start();
 
                for (MessageArgument.Part part : this.parts) {
                    Component component = part.toComponent(sender);
                    if (readTo < part.start()) {
                        result.append(this.text.substring(readTo, part.start()));
                    }
 
                    result.append(component);
                    readTo = part.end();
                }
 
                if (readTo < this.text.length()) {
                    result.append(this.text.substring(readTo));
                }
 
                return result;
            } else {
                return Component.literal(this.text);
            }
        }
 
        public static MessageArgument.Message parseText(StringReader reader, boolean allowSelectors) throws CommandSyntaxException {
            if (reader.getRemainingLength() > 256) {
                throw MessageArgument.TOO_LONG.create(reader.getRemainingLength(), 256);
            } else {
                String text = reader.getRemaining();
                if (!allowSelectors) {
                    reader.setCursor(reader.getTotalLength());
                    return new MessageArgument.Message(text, new MessageArgument.Part[0]);
                } else {
                    List<MessageArgument.Part> result = Lists.newArrayList();
                    int offset = reader.getCursor();
 
                    while (true) {
                        int start;
                        EntitySelector parse;
                        while (true) {
                            if (!reader.canRead()) {
                                return new MessageArgument.Message(text, result.toArray(new MessageArgument.Part[0]));
                            }
 
                            if (reader.peek() == '@') {
                                start = reader.getCursor();
 
                                try {
                                    EntitySelectorParser parser = new EntitySelectorParser(reader, true);
                                    parse = parser.parse();
                                    break;
                                } catch (CommandSyntaxException var8) {
                                    if (var8.getType() != EntitySelectorParser.ERROR_MISSING_SELECTOR_TYPE
                                        && var8.getType() != EntitySelectorParser.ERROR_UNKNOWN_SELECTOR_TYPE) {
                                        throw var8;
                                    }
 
                                    reader.setCursor(start + 1);
                                }
                            } else {
                                reader.skip();
                            }
                        }
 
                        result.add(new MessageArgument.Part(start - offset, reader.getCursor() - offset, parse));
                    }
                }
            }
        }
    }
 
    public record Part(int start, int end, EntitySelector selector) {
        public Component toComponent(CommandSourceStack sender) throws CommandSyntaxException {
            return EntitySelector.joinNames(this.selector.findEntities(sender));
        }
    }
}

引用的其他类

  • CommandSourceStack

    • 引用位置: 参数
  • SignedArgument

    • 引用位置: 实现
  • EntitySelector

    • 引用位置: 方法调用
    • 关联成员: EntitySelector.joinNames()
  • EntitySelectorParser

    • 引用位置: 方法调用/构造调用
    • 关联成员: EntitySelectorParser(), EntitySelectorParser.allowSelectors()
  • Component

    • 引用位置: 方法调用/返回值
    • 关联成员: Component.literal(), Component.translatableEscape()
  • PlayerChatMessage

    • 引用位置: 参数/方法调用
    • 关联成员: PlayerChatMessage.system()
  • FilteredText

    • 引用位置: 方法调用/返回值
    • 关联成员: FilteredText.passThrough()