🇺🇦 Українська (Ukrainian - Ukraine)
🇺🇦 Українська (Ukrainian - Ukraine)
Зовнішній вигляд
🇺🇦 Українська (Ukrainian - Ukraine)
🇺🇦 Українська (Ukrainian - Ukraine)
Зовнішній вигляд
Ця сторінка написана для версії:
1.21.4
Ця сторінка написана для версії:
1.21.4
Аргументи використовуються в більшості команд. Іноді вони можуть бути необов’язковими, тобто якщо ви не надасте аргумент, команда також буде виконана. Один вузол може мати кілька типів аргументів, але майте на увазі, що існує можливість двозначність, якої слід уникати.
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> {
dispatcher.register(CommandManager.literal("command_with_arg")
.then(CommandManager.argument("value", IntegerArgumentType.integer())
.executes(FabricDocsReferenceCommands::executeCommandWithArg)));
});
private static int executeCommandWithArg(CommandContext<ServerCommandSource> context) {
int value = IntegerArgumentType.getInteger(context, "value");
context.getSource().sendFeedback(() -> Text.literal("Called /command_with_arg with value = %s".formatted(value)), false);
return 1;
}
У цьому випадку після тексту команди /command_with_arg
слід ввести ціле число. Наприклад, якщо ви запустіть /command_with_arg 3
, ви отримаєте повідомлення зворотного зв'язку:
Викликається /command_with_arg зі значенням = 3
Якщо ввести /command_with_arg
без аргументів, команду неможливо правильно проаналізувати.
Потім ми додаємо необов'язковий другий аргумент:
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> {
dispatcher.register(CommandManager.literal("command_with_two_args")
.then(CommandManager.argument("value_one", IntegerArgumentType.integer())
.executes(FabricDocsReferenceCommands::executeWithOneArg)
.then(CommandManager.argument("value_two", IntegerArgumentType.integer())
.executes(FabricDocsReferenceCommands::executeWithTwoArgs))));
});
private static int executeWithOneArg(CommandContext<ServerCommandSource> context) {
int value1 = IntegerArgumentType.getInteger(context, "value_one");
context.getSource().sendFeedback(() -> Text.literal("Called /command_with_two_args with value one = %s".formatted(value1)), false);
return 1;
}
private static int executeWithTwoArgs(CommandContext<ServerCommandSource> context) {
int value1 = IntegerArgumentType.getInteger(context, "value_one");
int value2 = IntegerArgumentType.getInteger(context, "value_two");
context.getSource().sendFeedback(() -> Text.literal("Called /argtater2 with value one = %s and value two = %s".formatted(value1, value2)),
false);
return 1;
}
Зараз ви можете написати одне або два цілих числа. Якщо ви надаєте одне число - відповідь з одним значенням буде надрукована. Якщо ви надаєте два чиста - відповідь з двома значеннями буде надрукована.
Ви можете вважати непотрібним вказувати подібні виконання двічі. Таким чином, ми можемо створити метод, який буде використовуватися в обидва виконання.
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> {
dispatcher.register(CommandManager.literal("command_with_common_exec")
.then(CommandManager.argument("value_one", IntegerArgumentType.integer())
.executes(context -> executeCommon(IntegerArgumentType.getInteger(context, "value_one"), 0, context))
.then(CommandManager.argument("value_two", IntegerArgumentType.integer())
.executes(context -> executeCommon(
IntegerArgumentType.getInteger(context, "value_one"),
IntegerArgumentType.getInteger(context, "value_two"),
context)))));
});
private static int executeCommon(int value1, int value2, CommandContext<ServerCommandSource> context) {
context.getSource().sendFeedback(() -> Text.literal("Called /command_with_common_exec with value 1 = %s and value 2 = %s".formatted(value1, value2)), false);
return 1;
}
Якщо в грі не має потрібного типу аргументу, ви можете створити свій власний. Для цього вам потрібно створити клас, який успадковує інтерфейс ArgumentType<T>
, де T
є типом аргументу.
Вам потрібно буде реалізувати метод parse
, який аналізуватиме вхідний рядок у потрібний тип.
Наприклад, ви можете створити тип аргументу, який аналізує BlockPos
із рядка в такому форматі: {x, y, z}
public class BlockPosArgumentType implements ArgumentType<BlockPos> {
/**
* Parse the BlockPos from the reader in the {x, y, z} format.
*/
@Override
public BlockPos parse(StringReader reader) throws CommandSyntaxException {
try {
// This requires the argument to be surrounded by quotation marks.
// eg: "{1, 2, 3}"
String string = reader.readString();
// Remove the { and } from the string using regex.
string = string.replace("{", "").replace("}", "");
// Split the string into the x, y, and z values.
String[] split = string.split(",");
// Parse the x, y, and z values from the split string.
int x = Integer.parseInt(split[0].trim());
int y = Integer.parseInt(split[1].trim());
int z = Integer.parseInt(split[2].trim());
// Return the BlockPos.
return new BlockPos(x, y, z);
} catch (Exception e) {
// Throw an exception if anything fails inside the try block.
throw CommandSyntaxException.BUILT_IN_EXCEPTIONS.dispatcherParseException().create("Invalid BlockPos format. Expected {x, y, z}");
}
}
}
WARNING
Вам потрібно зареєструвати тип спеціального аргументу як на сервері, так і на клієнті, інакше команда не працюватиме!
Ви можете зареєструвати власний тип аргументу в методі onInitialize
вашого ініціалізатора мода за допомогою класу ArgumentTypeRegistry
:
ArgumentTypeRegistry.registerArgumentType(
Identifier.of("fabric-docs", "block_pos"),
BlockPosArgumentType.class,
ConstantArgumentSerializer.of(BlockPosArgumentType::new)
);
Ми можемо використовувати наш власний тип аргументу в команді, передавши його екземпляр у метод .argument
у конструкторі команд.
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> {
dispatcher.register(CommandManager.literal("command_with_custom_arg").then(
CommandManager.argument("block_pos", new BlockPosArgumentType())
.executes(FabricDocsReferenceCommands::executeCustomArgCommand)
));
});
private static int executeCustomArgCommand(CommandContext<ServerCommandSource> context) {
BlockPos arg = context.getArgument("block_pos", BlockPos.class);
context.getSource().sendFeedback(() -> Text.literal("Called /command_with_custom_arg with block pos = %s".formatted(arg)), false);
return 1;
}
Виконуючи команду, ми можемо перевірити, чи працює тип аргументу: