tutorial:command_argument_types
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| tutorial:command_argument_types [2023/11/18 12:44] – solidblock | tutorial:command_argument_types [2024/04/15 07:21] (current) – [Custom argument serializer] solidblock | ||
|---|---|---|---|
| Line 80: | Line 80: | ||
| // Brigadier has support to show examples for what the argument should look like, | // Brigadier has support to show examples for what the argument should look like, | ||
| // this should contain a Collection of only the argument this type will return. | // this should contain a Collection of only the argument this type will return. | ||
| - | // This is mainly used to calculate ambiguous commands | + | // This is mainly used to detect ambiguity, |
| return EXAMPLES; | return EXAMPLES; | ||
| } | } | ||
| Line 90: | Line 90: | ||
| <code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
| - | ArgumentTypeRegistry.registerArgumentType(new Identifier(" | + | ArgumentTypeRegistry.registerArgumentType( |
| + | | ||
| + | | ||
| // The argument should be what will create the ArgumentType. | // The argument should be what will create the ArgumentType. | ||
| </ | </ | ||
| Line 166: | Line 168: | ||
| // Brigadier has support to show examples for what the argument should look like, | // Brigadier has support to show examples for what the argument should look like, | ||
| // this should contain a Collection of only the argument this type will return. | // this should contain a Collection of only the argument this type will return. | ||
| - | // This is mainly used to calculate ambiguous commands | + | // This is mainly used to detect ambiguity, |
| return EXAMPLES; | return EXAMPLES; | ||
| } | } | ||
| Line 200: | Line 202: | ||
| </ | </ | ||
| + | ===== Custom argument serializer ====== | ||
| + | In the example above, the UUID is simple. If the argument is complex, how to make it correctly send to and understood by the client? This is where '' | ||
| + | |||
| + | '' | ||
| + | * The '' | ||
| + | * The '' | ||
| + | |||
| + | In this example, we create a new complicated argument type, which contains a boolean value and an integer value. '' | ||
| + | |||
| + | <code java> | ||
| + | public record ExampleArgumentType(CommandRegistryAccess commandRegistryAccess, | ||
| + | @Override | ||
| + | public String parse(StringReader reader) throws CommandSyntaxException { | ||
| + | ... | ||
| + | } | ||
| + | | ||
| + | public static class Serializer implements ArgumentSerializer< | ||
| + | @Override | ||
| + | public void writePacket(Properties properties, PacketByteBuf buf) { | ||
| + | // Writes the basic properties to a packet. You should ensure all properties | ||
| + | // can be in some ways stored in the packet. | ||
| + | buf.writeBoolean(properties.booleanValue).writeInt(properties.intValue); | ||
| + | } | ||
| + | |||
| + | @Override | ||
| + | public Properties fromPacket(PacketByteBuf buf) { | ||
| + | // Reads the information in the packet. It returns the '' | ||
| + | return new Properties(buf.readBoolean(), | ||
| + | } | ||
| + | |||
| + | @Override | ||
| + | public void writeJson(Properties properties, JsonObject json) { | ||
| + | // Present the argument type in the format of JSON. | ||
| + | json.addProperty(" | ||
| + | json.addProperty(" | ||
| + | } | ||
| + | |||
| + | @Override | ||
| + | public Properties getArgumentTypeProperties(ExampleArgumentType argumentType) { | ||
| + | return new Properties(argumentType.booleanValue, | ||
| + | } | ||
| + | |||
| + | public record Properties(boolean booleanValue, | ||
| + | @Override | ||
| + | public ExampleArgumentType createType(CommandRegistryAccess commandRegistryAccess) { | ||
| + | // Only in this method, '' | ||
| + | // and the argument type that require '' | ||
| + | return new ExampleArgumentType(commandRegistryAccess, | ||
| + | } | ||
| + | |||
| + | @Override | ||
| + | public ArgumentSerializer< | ||
| + | // Do not create a new '' | ||
| + | return Serializer.this; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | And now you can register it like this: | ||
| + | <code java> | ||
| + | ArgumentTypeRegistry.registerArgumentType(new Identifier(" | ||
| + | </ | ||
| + | |||
| + | ==== Another possible way to define serializer ==== | ||
| + | |||
| + | If the argument does not require '' | ||
| + | |||
| + | <code java> | ||
| + | public record ExampleArgumentType(boolean booleanValue, | ||
| + | @Override | ||
| + | public String parse(StringReader reader) throws CommandSyntaxException { | ||
| + | ... | ||
| + | } | ||
| + | |||
| + | @Override | ||
| + | public ExampleArgumentType createType(CommandRegistryAccess commandRegistryAccess) { | ||
| + | return this; | ||
| + | } | ||
| + | |||
| + | @Override | ||
| + | public ArgumentSerializer< | ||
| + | // always return a same object here to avoid failing to serialize. | ||
| + | return Serializer.INSTANCE; | ||
| + | } | ||
| + | |||
| + | public static class Serializer implements ArgumentSerializer< | ||
| + | public static final Serializer INSTANCE = new Serializer(); | ||
| + | private Serializer() {} | ||
| + | | ||
| + | @Override | ||
| + | public void writePacket(ExampleArgumentType properties, PacketByteBuf buf) { | ||
| + | buf.writeBoolean(properties.booleanValue).writeInt(properties.intValue); | ||
| + | } | ||
| + | |||
| + | @Override | ||
| + | public ExampleArgumentType fromPacket(PacketByteBuf buf) { | ||
| + | return new ExampleArgumentType(buf.readBoolean(), | ||
| + | } | ||
| + | |||
| + | @Override | ||
| + | public void writeJson(ExampleArgumentType properties, JsonObject json) { | ||
| + | json.addProperty(" | ||
| + | json.addProperty(" | ||
| + | } | ||
| + | |||
| + | @Override | ||
| + | public ExampleArgumentType getArgumentTypeProperties(ExampleArgumentType argumentType) { | ||
| + | return argumentType; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | And now you can register it like this: | ||
| + | <code java> | ||
| + | ArgumentTypeRegistry.registerArgumentType(new Identifier(" | ||
| + | </ | ||
tutorial/command_argument_types.1700311459.txt.gz · Last modified: 2023/11/18 12:44 by solidblock