User Tools

Site Tools


tutorial:command_argument_types

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
tutorial:command_argument_types [2023/11/18 12:59] – [Specifying suggestions] solidblocktutorial: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 which share the exact same.+        // This is mainly used to detect ambiguity, which means an argument of this type may be parsed as another type.
         return EXAMPLES;         return EXAMPLES;
     }     }
Line 90: Line 90:
  
 <code java [enable_line_numbers="true"]> <code java [enable_line_numbers="true"]>
-ArgumentTypeRegistry.registerArgumentType(new Identifier("tutorial", "uuid"), UuidArgumentType.class, ConstantArgumentSerializer.of(UuidArgumentType::uuid)); +ArgumentTypeRegistry.registerArgumentType( 
 +  new Identifier("tutorial", "uuid"), 
 +  UuidArgumentType.class, ConstantArgumentSerializer.of(UuidArgumentType::uuid)); 
 // The argument should be what will create the ArgumentType. // The argument should be what will create the ArgumentType.
 </code> </code>
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 which share the exact same.+        // This is mainly used to detect ambiguity, which means an argument of this type may be parsed as another type.
         return EXAMPLES;         return EXAMPLES;
     }     }
Line 220: Line 222:
     public void writePacket(Properties properties, PacketByteBuf buf) {     public void writePacket(Properties properties, PacketByteBuf buf) {
       // Writes the basic properties to a packet. You should ensure all properties       // Writes the basic properties to a packet. You should ensure all properties
-      // can be in some ways stored in the packed.+      // can be in some ways stored in the packet.
       buf.writeBoolean(properties.booleanValue).writeInt(properties.intValue);       buf.writeBoolean(properties.booleanValue).writeInt(properties.intValue);
     }     }
Line 251: Line 253:
  
       @Override       @Override
-      public ArgumentSerializer<ExampleArgumentType, ?> getSerializer() { +      public ArgumentSerializer<ExampleArgumentType, Serializer.Properties> getSerializer() { 
-        return new Serializer();+        // Do not create a new ''Serializer'' object here. 
 +        return Serializer.this;
       }       }
     }     }
Line 258: Line 261:
 } }
 </code> </code>
 +
 +And now you can register it like this:
 +<code java>
 +ArgumentTypeRegistry.registerArgumentType(new Identifier("tutorial", "example"), ExampleArgumentType.class, new ExampleArgumentType.Serializer());
 +</code>
 +
 +==== Another possible way to define serializer ====
  
 If the argument does not require ''CommandRegistryAccess'', it itself may extend ''ArgumentSerializer.ArgumentTypeProperties'': If the argument does not require ''CommandRegistryAccess'', it itself may extend ''ArgumentSerializer.ArgumentTypeProperties'':
Line 275: Line 285:
   @Override   @Override
   public ArgumentSerializer<ExampleArgumentType, ?> getSerializer() {   public ArgumentSerializer<ExampleArgumentType, ?> getSerializer() {
-    return new Serializer();+    // always return a same object here to avoid failing to serialize. 
 +    return Serializer.INSTANCE;
   }   }
  
   public static class Serializer implements ArgumentSerializer<ExampleArgumentType, ExampleArgumentType> {   public static class Serializer implements ArgumentSerializer<ExampleArgumentType, ExampleArgumentType> {
 +    public static final Serializer INSTANCE = new Serializer();
 +    private Serializer() {}
 +  
     @Override     @Override
     public void writePacket(ExampleArgumentType properties, PacketByteBuf buf) {     public void writePacket(ExampleArgumentType properties, PacketByteBuf buf) {
Line 301: Line 315:
   }   }
 } }
 +</code>
 +
 +And now you can register it like this:
 +<code java>
 +ArgumentTypeRegistry.registerArgumentType(new Identifier("tutorial", "example"), ExampleArgumentType.class, ExampleArgumentType.Serializer.INSTANCE);
 </code> </code>
tutorial/command_argument_types.1700312392.txt.gz · Last modified: 2023/11/18 12:59 by solidblock