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