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.LiteralText; import net.minecraft.util.SystemUtil; import java.util.ArrayList; import java.util.Collection; import java.util.UUID; /** * Представляет ArgumentType который будет возвращать UUID. */ public class UuidArgumentType implements ArgumentType { public static UuidArgumentType uuid() { return new UuidArgumentType(); } public static UUID getUuid(String name, CommandContext context) { // Обратите внимание, что вы должны предполагать, что CommandSource, заключенный внутри CommandContext, всегда будет универсальным типом. // Если вам нужно получить доступ к ServerCommandSource, убедитесь, что источник является источником команд сервера перед приведением. return context.getArgument(name, UUID.class); } private static final Collection EXAMPLES = SystemUtil.consume(new ArrayList<>(), list -> { list.add("765e5d33-c991-454f-8775-b6a7a394c097"); // i509VCB: Username The_1_gamers list.add("069a79f4-44e9-4726-a5be-fca90e38aaf5"); // Notch list.add("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'у предоставить некоторый контекст, чтобы сообщить пользователю, где произошла ошибка команды. // Хотя можно было бы использовать обычный метод создания. throw new SimpleCommandExceptionType(new LiteralText(ex.getMessage())).createWithContext(reader); } } @Override public Collection getExamples() { // У Brigadier есть поддержка, чтобы показать примеры того, как должен выглядеть аргумент, он должен содержать коллекцию только аргументов, которые вернет этот тип. Это в основном используется для вычисления неоднозначных команд, которые имеют одинаковые return EXAMPLES; } }