From 1dbceb13360b3a2dea0910801d88d734e6fbe29a Mon Sep 17 00:00:00 2001 From: spa77k <254093522+spa77k@users.noreply.github.com> Date: Wed, 4 Nov 2026 16:06:55 +0900 Subject: [PATCH 1/2] feat(paper): document command syntax exceptions --- astro.config.ts | 1 + .../command-api/basics/custom-arguments.md | 2 +- .../dev/api/command-api/basics/exceptions.md | 164 ++++++++++++++++++ 3 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 src/content/docs/paper/dev/api/command-api/basics/exceptions.md diff --git a/astro.config.ts b/astro.config.ts index 770c846ec..ef870847a 100644 --- a/astro.config.ts +++ b/astro.config.ts @@ -197,6 +197,7 @@ export default defineConfig({ "paper/dev/command-api/basics/requirements", "paper/dev/command-api/basics/argument-suggestions", "paper/dev/command-api/basics/custom-arguments", + "paper/dev/command-api/basics/exceptions", ], }, { diff --git a/src/content/docs/paper/dev/api/command-api/basics/custom-arguments.md b/src/content/docs/paper/dev/api/command-api/basics/custom-arguments.md index 500beada8..0e604ba88 100644 --- a/src/content/docs/paper/dev/api/command-api/basics/custom-arguments.md +++ b/src/content/docs/paper/dev/api/command-api/basics/custom-arguments.md @@ -9,7 +9,7 @@ reduce code repetition. ## Why would you use custom arguments? As example, if you want to have an argument for a player, which is currently online and an operator, you could use a player argument type, add custom suggestions, and throw a -`CommandSyntaxException` in your `executes(...)` method body. This would look like this: +[`CommandSyntaxException`](/paper/dev/command-api/basics/exceptions) in your `executes(...)` method body. This would look like this: ```java Commands.argument("player", ArgumentTypes.player()) diff --git a/src/content/docs/paper/dev/api/command-api/basics/exceptions.md b/src/content/docs/paper/dev/api/command-api/basics/exceptions.md new file mode 100644 index 000000000..9bbf780c1 --- /dev/null +++ b/src/content/docs/paper/dev/api/command-api/basics/exceptions.md @@ -0,0 +1,164 @@ +--- +title: Exceptions +description: A guide to command syntax exceptions. +slug: paper/dev/command-api/basics/exceptions +version: "26.3" +--- + +If a command cannot run with the input it was given, you can throw a `CommandSyntaxException`. The server catches it and sends +its message to the command sender in red, without logging a stack trace. You can throw it in the `executes(...)` method of a command node, +as well as in the `parse` and `convert` methods of [custom arguments](/paper/dev/command-api/basics/custom-arguments). + +## Exception types +Instead of constructing a `CommandSyntaxException` yourself, you create an exception type, which holds the message, +and call its `create(...)` method whenever you want to throw the exception. Brigadier provides the following exception types, +all of which implement the `CommandExceptionType` interface: + +| Class | Message | Creating an exception | +|------------------------------------------------------------------|----------------------------------------|-------------------------------------------------------| +| `SimpleCommandExceptionType` | A fixed `Message`. | `create()` | +| `DynamicCommandExceptionType` | A `Function`. | `create(Object)` | +| `Dynamic2CommandExceptionType` to `Dynamic4CommandExceptionType` | A function taking two to four objects. | `create(Object, Object)`, and so on | +| `DynamicNCommandExceptionType` | A function taking an `Object[]`. | `createWithContext(ImmutableStringReader, Object...)` | + +:::caution + +`DynamicNCommandExceptionType#create(Object, Object...)` does not pass its first argument to the function. +For example, `create("a", "b", "c")` only passes `["b", "c"]`. Use `createWithContext` or one of the other exception types instead. + +::: + +An exception type can be used to create any number of exceptions, so declare it as a constant and reuse it: + +```java +private static final SimpleCommandExceptionType ERROR_NOT_PLAYER = new SimpleCommandExceptionType( + new LiteralMessage("Only players can use this command!") +); + +private static final DynamicCommandExceptionType ERROR_FULL_HEALTH = new DynamicCommandExceptionType(name -> { + return new LiteralMessage(name + " already has full health!"); +}); +``` + +You can then throw them in your command: + +```java +Commands.literal("heal") + .executes(ctx -> { + if (!(ctx.getSource().getExecutor() instanceof Player player)) { + throw ERROR_NOT_PLAYER.create(); + } + + final double maxHealth = player.getAttribute(Attribute.MAX_HEALTH).getValue(); + if (player.getHealth() >= maxHealth) { + throw ERROR_FULL_HEALTH.create(player.getName()); + } + + player.setHealth(maxHealth); + return Command.SINGLE_SUCCESS; + }); +``` + +## Using components as messages +`LiteralMessage` only contains plain text. If you want to use a `Component` as the message, convert it using +the [`MessageComponentSerializer`](jd:paper:io.papermc.paper.command.brigadier.MessageComponentSerializer): + +```java +private static final DynamicCommandExceptionType ERROR_FULL_HEALTH = new DynamicCommandExceptionType(name -> { + return MessageComponentSerializer.message().serialize(MiniMessage.miniMessage().deserialize( + " already has full health!", + Placeholder.unparsed("name", name.toString()) + )); +}); +``` + +The message is still shown in red, but parts with their own color, like the name above, keep it. + +## Showing where the input is invalid +While a custom argument is parsing its input in `parse(StringReader)`, you can use `createWithContext(reader, ...)` instead +of `create(...)`. The exception then remembers the input and the position of the reader's cursor, and the server shows a second +line below the message. This line contains up to 10 characters before the cursor, the rest of the input in red and underlined, +and `<--[HERE]`. Clicking the line puts the command back into the chat box. + +The following argument only accepts even numbers. It moves the cursor back to the start of the number before throwing, +so that the whole number is marked, which is also what Brigadier's own argument types do: + +```java title="EvenIntegerArgument.java" +public final class EvenIntegerArgument implements CustomArgumentType { + + private static final DynamicCommandExceptionType ERROR_NOT_EVEN = new DynamicCommandExceptionType(value -> { + return new LiteralMessage(value + " is not an even number!"); + }); + + @Override + public Integer parse(final StringReader reader) throws CommandSyntaxException { + final int start = reader.getCursor(); + final int value = reader.readInt(); + if (value % 2 != 0) { + reader.setCursor(start); + throw ERROR_NOT_EVEN.createWithContext(reader, value); + } + + return value; + } + + @Override + public ArgumentType getNativeType() { + return IntegerArgumentType.integer(); + } +} +``` + +Running `/split 7` with this argument shows the following, with the `7` in the second line marked in red: + +``` +7 is not an even number! +split 7<--[HERE] +``` + +The second line is only shown for exceptions thrown while the command is being parsed. Exceptions thrown in `executes(...)` +or in `CustomArgumentType.Converted#convert` only show the message, even if they were created with context. + +## Built-in exceptions +`CommandSyntaxException.BUILT_IN_EXCEPTIONS` provides the exception types Brigadier uses itself, for example when a number +argument is out of range. On Paper, Vanilla replaces them with translatable messages, so players see them in the language +of their client. You can reuse them in your own code instead of writing your own messages: + +```java +throw CommandSyntaxException.BUILT_IN_EXCEPTIONS.integerTooHigh().createWithContext(reader, value, maximum); +``` + +Note that the exceptions for numbers that are too low or too high take the found value first and the limit second. +The exception above shows `Integer must not be more than : found `. + +The following table lists all built-in exceptions with their English message: + +| Method | Arguments | Message | +|-----------------------------------------|--------------------|---------------------------------------------------------------------| +| `doubleTooLow()` | `found`, `minimum` | Double must not be less than `minimum`: found `found` | +| `doubleTooHigh()` | `found`, `maximum` | Double must not be more than `maximum`: found `found` | +| `floatTooLow()` | `found`, `minimum` | Float must not be less than `minimum`: found `found` | +| `floatTooHigh()` | `found`, `maximum` | Float must not be more than `maximum`: found `found` | +| `integerTooLow()` | `found`, `minimum` | Integer must not be less than `minimum`: found `found` | +| `integerTooHigh()` | `found`, `maximum` | Integer must not be more than `maximum`: found `found` | +| `longTooLow()` | `found`, `minimum` | Long must not be less than `minimum`: found `found` | +| `longTooHigh()` | `found`, `maximum` | Long must not be more than `maximum`: found `found` | +| `literalIncorrect()` | `expected` | Expected literal `expected` | +| `readerExpectedStartOfQuote()` | | Expected quote to start a string | +| `readerExpectedEndOfQuote()` | | Unclosed quoted string | +| `readerInvalidEscape()` | `character` | Invalid escape sequence '\\`character`' in quoted string | +| `readerInvalidBool()` | `value` | Invalid boolean: expected 'true' or 'false' but found '`value`' | +| `readerInvalidInt()` | `value` | Invalid integer '`value`' | +| `readerExpectedInt()` | | Expected integer | +| `readerInvalidLong()` | `value` | Invalid long '`value`' | +| `readerExpectedLong()` | | Expected long | +| `readerInvalidDouble()` | `value` | Invalid double '`value`' | +| `readerExpectedDouble()` | | Expected double | +| `readerInvalidFloat()` | `value` | Invalid float '`value`' | +| `readerExpectedFloat()` | | Expected float | +| `readerExpectedBool()` | | Expected boolean | +| `readerExpectedSymbol()` | `symbol` | Expected '`symbol`' | +| `dispatcherUnknownCommand()` | | Unknown or incomplete command. See below for error | +| `dispatcherUnknownArgument()` | | Incorrect argument for command | +| `dispatcherExpectedArgumentSeparator()` | | Expected whitespace to end one argument, but found trailing data | +| `dispatcherParseException()` | `message` | Could not parse command: `message` | From 7fe807897c54a8737d9f622f28deed23505b87d0 Mon Sep 17 00:00:00 2001 From: spa77k <254093522+spa77k@users.noreply.github.com> Date: Thu, 5 Nov 2026 00:02:06 +0900 Subject: [PATCH 2/2] chore(paper): use in-game screenshots for exception messages --- .../basics/assets/exception-component.png | Bin 0 -> 11509 bytes .../basics/assets/exception-context.png | Bin 0 -> 17225 bytes .../basics/assets/exception-full-health.png | Bin 0 -> 11342 bytes .../dev/api/command-api/basics/exceptions.md | 13 ++++++++----- 4 files changed, 8 insertions(+), 5 deletions(-) create mode 100644 src/content/docs/paper/dev/api/command-api/basics/assets/exception-component.png create mode 100644 src/content/docs/paper/dev/api/command-api/basics/assets/exception-context.png create mode 100644 src/content/docs/paper/dev/api/command-api/basics/assets/exception-full-health.png diff --git a/src/content/docs/paper/dev/api/command-api/basics/assets/exception-component.png b/src/content/docs/paper/dev/api/command-api/basics/assets/exception-component.png new file mode 100644 index 0000000000000000000000000000000000000000..fea73b012d90645e7cd41d2ab2a31fe7baa661eb GIT binary patch literal 11509 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 literal 0 HcmV?d00001 diff --git a/src/content/docs/paper/dev/api/command-api/basics/assets/exception-full-health.png b/src/content/docs/paper/dev/api/command-api/basics/assets/exception-full-health.png new file mode 100644 index 0000000000000000000000000000000000000000..ad0729e6f1f87633480378c8f15870d5a888972a GIT binary patch literal 11342 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 MQkJUv_$BcF0Ts>%#sB~S literal 0 HcmV?d00001 diff --git a/src/content/docs/paper/dev/api/command-api/basics/exceptions.md b/src/content/docs/paper/dev/api/command-api/basics/exceptions.md index 9bbf780c1..b3cca5658 100644 --- a/src/content/docs/paper/dev/api/command-api/basics/exceptions.md +++ b/src/content/docs/paper/dev/api/command-api/basics/exceptions.md @@ -59,6 +59,10 @@ Commands.literal("heal") }); ``` +If the player already has full health, they see the message in red: + +![The message "Steve already has full health!" in red in the chat](./assets/exception-full-health.png) + ## Using components as messages `LiteralMessage` only contains plain text. If you want to use a `Component` as the message, convert it using the [`MessageComponentSerializer`](jd:paper:io.papermc.paper.command.brigadier.MessageComponentSerializer): @@ -74,6 +78,8 @@ private static final DynamicCommandExceptionType ERROR_FULL_HEALTH = new Dynamic The message is still shown in red, but parts with their own color, like the name above, keep it. +![The message "Steve already has full health!" in the chat, with the name in gold and the rest in red](./assets/exception-component.png) + ## Showing where the input is invalid While a custom argument is parsing its input in `parse(StringReader)`, you can use `createWithContext(reader, ...)` instead of `create(...)`. The exception then remembers the input and the position of the reader's cursor, and the server shows a second @@ -109,12 +115,9 @@ public final class EvenIntegerArgument implements CustomArgumentType