🇮🇹 Italiano (Italian)
🇮🇹 Italiano (Italian)
Aspetto
🇮🇹 Italiano (Italian)
🇮🇹 Italiano (Italian)
Aspetto
This page is written for:
1.21
This page is written for:
1.21
La maggior parte dei comandi usa i parametri. A volte possono essere opzionali, il che significa che se non viene fornito quel parametri, il comando verrà eseguito comunque. Ogni nodo può avere tipi di parametri multipli, ma ricorda che c'è una possibilità di ambiguità, che dovrebbe essere evitata.
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;
}
In questo caso, dopo il testo del comando /command_with_arg
, dovresti scrivere un intero. Per esempio, se eseguissi /command_with_arg 3
, otterresti come risposta il messaggio:
Called /command_with_arg with value = 3
Se scrivessi /command_with_arg
senza parametri, non sarebbe possibile fare il parsing del comando correttamente.
Dopo di che aggiungiamo un secondo parametro opzionale:
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> {
dispatcher.register(CommandManager.literal("command_with_two_args")
.then(CommandManager.argument("value_one", IntegerArgumentType.integer())
.executes(FabricDocsReferenceCommands::executeWithOneAre)
.then(CommandManager.argument("value_two", IntegerArgumentType.integer())
.executes(FabricDocsReferenceCommands::executeWithTwoArgs))));
});
private static int executeWithOneAre(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;
}
Ora puoi scrivere uno oppure due interi. Se fornisci un intero, un testo di feedback con un singolo valore verrà stampato. Se fornisci due interi, un testo di feedback con due interi verrà stampato.
Potresti pensare che sia inutile specificare esecuzioni simili due volte. Per cui possiamo creare un metodo che verrà usato in entrambe le esecuzioni.
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;
}
Se vanilla non fornisce il tipo di parametro che ti serve, puoi creartene uno. Per fare questo, hai bisogno di creare una classe che implementa l'interfaccia ArgumentType<T>
dove T
è il tipo del parametro.
Avrai bisogno d'implementare il metodo parse
, che farà il parsing della stringa in input nel tipo desiderato.
Per esempio, puoi creare un tipo di parametro che fa il parsing di un BlockPos
da una stringa con il formato seguente: {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
Avrai bisogno di registrare i tipi di parametri personalizzati sia sul server sia sul client altrimenti il comando non funzionerà!
Puoi registrare il tuo tipo di parametro personalizzato nel metodo onInitialize
dell'inizializer della tua mod usando la classe ArgumentTypeRegistry
:
ArgumentTypeRegistry.registerArgumentType(
Identifier.of("fabric-docs", "block_pos"),
BlockPosArgumentType.class,
ConstantArgumentSerializer.of(BlockPosArgumentType::new)
);
Possiamo usare il nostro tipo di parametro personalizzato in un comando - passando un'istanza di esso nel metodo .argument
del costruttore del comando.
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;
}
Eseguendo il comando possiamo testare se il tipo di parametro funziona o meno: