import com.mojang.brigadier.StringReader; import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; import net.minecraft.text.Text; import java.util.ArrayList; import java.util.Collection; import java.util.UUID; /** * 代表一个返回 UUID 的参数类型。 */ public class UuidArgumentType implements ArgumentType { public static UuidArgumentType uuid() { return new UuidArgumentType(); } public static UUID getUuid(String name, CommandContext context) { // 注意你应该假设 CommandContext 中包含的 CommandSource 是一个泛型类型。 // 如果你需要访问 ServerCommandSource,确保你在强转之前验证了命令源。 return context.getArgument(name, UUID.class); } private static final Collection EXAMPLES = List.of( "765e5d33-c991-454f-8775-b6a7a394c097", // i509VCB: 用户名 The_1_gamers "069a79f4-44e9-4726-a5be-fca90e38aaf5", // Notch "61699b2e-d327-4a01-9f1e-0ea8c3f06bc6" // Dinnerbone ); @Override public UUID parse(StringReader reader) throws CommandSyntaxException { int argBeginning = reader.getCursor(); // 指针的开始位置,是参数的开始位置。 if (!reader.canRead()) { reader.skip(); } // 现在我们检查参数的内容,直到命令行的末尾(即 ''canRead'' 返回了 false) // 否则我们检查到空格的位置,即表示下一个参数要开始了 while (reader.canRead() && reader.peek() != ' ') { // “peek”提供了当前指针位置的字符。 reader.skip(); // 告诉 StringReader,将其指针移动到下一个位置。 } // 现在我们使用当前的指针位置,取出我们需要看到的特定部分子字符串,在下一个参数开始的位置结束。 String uuidString = reader.getString().substring(argBeginning, reader.getCursor()); try { UUID uuid = UUID.fromString(uuidString); // 我们的正常逻辑。 return uuid; // 我们返回我们的类型,在这个例子中,解析器会认为类型已经正确解析,并继续。 } catch (Exception ex) { // UUID 在由字符串生成时,可能会抛出异常,因此我们捕获这个异常,并将其包装成 CommandSyntaxException 类型。 // 创建时会带有环境,告诉 Brigadier,根据这个环境来告诉玩家,命令在哪里解析失败了。 // 尽管应该使用正常的 create 方法。 throw new SimpleCommandExceptionType(Text.literal(ex.getMessage())).createWithContext(reader); } } @Override public Collection getExamples() { // Brigadier 支持显示示例,表示这个命令应该像是什么样子,这应该包含一个集合, // 集合的内容是此类型能够返回的参数。 // 这主要用于检测二义性,即一种参数可能会被作为另一种参数解析。 return EXAMPLES; } }