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));
}
}
}引用的其他类
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
实现
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
EntitySelector.joinNames()
- 引用位置:
-
- 引用位置:
方法调用/构造调用 - 关联成员:
EntitySelectorParser(), EntitySelectorParser.allowSelectors()
- 引用位置:
-
- 引用位置:
方法调用/返回值 - 关联成员:
Component.literal(), Component.translatableEscape()
- 引用位置:
-
- 引用位置:
参数/方法调用 - 关联成员:
PlayerChatMessage.system()
- 引用位置:
-
- 引用位置:
方法调用/返回值 - 关联成员:
FilteredText.passThrough()
- 引用位置: