zh_cn:tutorial:command_argument_types
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionLast revisionBoth sides next revision | ||
zh_cn:tutorial:command_argument_types [2023/04/20 11:09] – 没有必要使用 SystemUtil solidblock | zh_cn:tutorial:command_argument_types [2024/04/15 07:14] – solidblock | ||
---|---|---|---|
Line 3: | Line 3: | ||
Brigadier 支持自定义的参数类型,本页会展示如何创建一个简单的参数类型。 | Brigadier 支持自定义的参数类型,本页会展示如何创建一个简单的参数类型。 | ||
- | 注意:自定义的参数类型要求客户端也正确注册,如果是服务器的插件,请考虑使用已存在的参数类型和一个自定义的建议提供器。 | + | **注意:**自定义的参数类型要求客户端也正确注册,如果是服务器的插件,请考虑使用已存在的参数类型和一个自定义的建议提供器。 |
- | 本例中,我们将会创建一个 UuidArgumentType。 | + | ===== 解析 ===== |
+ | 本例中,我们将会创建一个 | ||
- | 首先创建一个类并继承 '' | + | 首先创建一个类并继承 '' |
<code java> | <code java> | ||
Line 21: | Line 22: | ||
所以的解析都发生在此方法中。此方法会根据命令行中提供的参数返回一个对象,或者抛出一个 '' | 所以的解析都发生在此方法中。此方法会根据命令行中提供的参数返回一个对象,或者抛出一个 '' | ||
- | 接下来你会存在当前指针(cursor)的位置,这样你可以截取子字符串,截出特定的参数。指针总是出现在参数在命令行中出现的开始的位置。 | + | 接下来你会存储当前指针(cursor)的位置,这样你可以截取子字符串,截出特定的参数。指针总是出现在参数在命令行中出现的开始的位置。 |
<code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
- | int argBeginning = reader.getCursor(); | + | |
- | if (!reader.canRead()) { | + | if (!reader.canRead()) { |
- | reader.skip(); | + | reader.skip(); |
- | } | + | } |
</ | </ | ||
- | 现在抓取整个参数。你可能会有不同的标准,或像一些参数一样,检测到命令行中有 '' | + | 现在抓取整个参数。你可能会有不同的标准,或像一些参数一样,检测到命令行中有 '' |
<code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
- | while (reader.canRead() && reader.peek() != ' ') { // “peek”提供了当前指针位置的字符。 | + | |
- | reader.skip(); | + | reader.skip(); |
- | } | + | } |
</ | </ | ||
接下来我们会从这个 '' | 接下来我们会从这个 '' | ||
- | <code java [enable_line_numbers=" | + | <code java [enable_line_numbers=" |
+ | | ||
+ | </ | ||
- | 最终,我们检票我们的参数是否正确,并解析我们的参数,如果解析失败则抛出异常。 | + | 最终,我们检查我们的参数是否正确,并解析我们的参数,如果解析失败则抛出异常。 |
<code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
- | try { | + | public static final DynamicCommandExceptionType INVALID_UUID = new DynamicCommandExceptionType(o -> Text.literal(" |
- | UUID uuid = UUID.fromString(uuidString); | + | |
- | return uuid; // 我们返回我们的类型,在这个例子中,解析器会认为类型已经正确解析,并继续。 | + | @Override |
- | } catch (Exception | + | public UUID parse(StringReader reader) throws CommandSyntaxException { |
- | // UUID 在由字符串生成时,可能会抛出异常,因此我们捕获这个异常,并将其包装成 CommandSyntaxException 类型。 | + | // ... |
- | // 创建时会带有环境,告诉 Brigadier,根据这个环境来告诉玩家,命令在哪里解析失败了。 | + | |
- | // 尽管应该使用正常的 create 方法。 | + | UUID uuid = UUID.fromString(uuidString); |
- | throw new SimpleCommandExceptionType(Text.literal(ex.getMessage())).createWithContext(reader); | + | return uuid; // 我们返回我们的类型,在这个例子中,解析器会认为类型已经正确解析,并继续。 |
- | } | + | } catch (InvalidArgumentException |
+ | // UUID 在由字符串生成时,可能会抛出异常,因此我们捕获这个异常,并将其包装成 CommandSyntaxException 类型。 | ||
+ | // 创建时会带有环境,告诉 Brigadier,根据这个环境来告诉玩家,命令在哪里解析失败了。 | ||
+ | // 尽管也可以使用正常的 create 方法。 | ||
+ | | ||
+ | throw INVALID_UUID.createWithContext(reader, | ||
+ | } | ||
+ | // ... | ||
+ | | ||
</ | </ | ||
+ | |||
+ | ===== 定义参数示例 ===== | ||
+ | 有时候参数需要有一些示例,通常存储在作为静态常量字段的不可变集合中。示例是用于检测二义性的。 | ||
+ | <code java> | ||
+ | private static final Collection< | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ); | ||
+ | |||
+ | @Override | ||
+ | public Collection< | ||
+ | // Brigadier 支持显示示例,表示这个命令应该像是什么样子,这应该包含一个集合, | ||
+ | // 集合的内容是此类型能够返回的参数。 | ||
+ | // 这主要用于检测二义性,即一种参数可能会被作为另一种参数解析。 | ||
+ | return EXAMPLES; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== 注册参数类型 ===== | ||
'' | '' | ||
<code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
- | ArgumentTypeRegistry.registerArgumentType(new Identifier(" | + | ArgumentTypeRegistry.registerArgumentType( |
- | // 这个参数会创建 ArgumentType。 | + | |
+ | | ||
+ | // 参数会创建 ArgumentType。 | ||
</ | </ | ||
- | 参数类型的完整代码会是这样: | + | ===== 完整参数类型示例 ===== |
<file java UuidArgumentType.java [enable_line_numbers=" | <file java UuidArgumentType.java [enable_line_numbers=" | ||
Line 88: | Line 121: | ||
public static <S> UUID getUuid(String name, CommandContext< | public static <S> UUID getUuid(String name, CommandContext< | ||
// 注意你应该假设 CommandContext 中包含的 CommandSource 是一个泛型类型。 | // 注意你应该假设 CommandContext 中包含的 CommandSource 是一个泛型类型。 | ||
- | // 如果你需要访问 ServerCommandSource,确保你在强转之前验证了源。 | + | // 如果你需要访问 ServerCommandSource,确保你在强转之前验证了命令源。 |
return context.getArgument(name, | return context.getArgument(name, | ||
} | } | ||
Line 129: | Line 162: | ||
// Brigadier 支持显示示例,表示这个命令应该像是什么样子,这应该包含一个集合, | // Brigadier 支持显示示例,表示这个命令应该像是什么样子,这应该包含一个集合, | ||
// 集合的内容是此类型能够返回的参数。 | // 集合的内容是此类型能够返回的参数。 | ||
- | // 这主要用于计算共享了同一个的难懂的命令。 | + | // 这主要用于检测二义性,即一种参数可能会被作为另一种参数解析。 |
return EXAMPLES; | return EXAMPLES; | ||
} | } |
zh_cn/tutorial/command_argument_types.txt · Last modified: 2024/04/15 07:24 by solidblock