Changes

5,984 bytes removed ,  11:29, 14 June 2022
Fix ObjectHolder
Line 166: Line 166:  
* A field is considered for injection if:
 
* A field is considered for injection if:
 
** it has at least the modifiers <code>public static</code>; and
 
** it has at least the modifiers <code>public static</code>; and
** one of the following conditions are true:
+
** the '''field''' is annotated with <code>@ObjectHolder</code>, and:
*** the '''enclosing class''' has an <code>@ObjectHolder</code> annotation, and the field is <code>final</code>, and:
+
*** the name value is explicitly defined; and
**** the name value is the field's name; and
+
*** the registry name value is explicitly defined
**** the registry name value is the name of the object's registry; and
  −
**** the namespace value is the enclosing class's namespace
  −
**** ''An exception is thrown if the namespace value cannot be found and inherited''
  −
*** the '''field''' is annotated with <code>@ObjectHolder</code>, and:
  −
**** the name value is explicitly defined; and
  −
**** the registry name value is either explicitly defined or the enclosing class's registry name; and
  −
**** the namespace value is either explicitly defined or the enclosing class's namespace
   
** ''An exception is thrown if a field does not have a corresponding registry.''
 
** ''An exception is thrown if a field does not have a corresponding registry.''
 
* ''An exception is thrown if the resulting <code>ResourceLocation</code> is incomplete or invalid (non-valid characters in path)''
 
* ''An exception is thrown if the resulting <code>ResourceLocation</code> is incomplete or invalid (non-valid characters in path)''
Line 190: Line 183:  
<div class="mw-collapsible-content" style="overflow: auto; white-space: nowrap;">
 
<div class="mw-collapsible-content" style="overflow: auto; white-space: nowrap;">
 
<syntaxhighlight lang="java">
 
<syntaxhighlight lang="java">
@ObjectHolder(registryName = "block", value = "minecraft") // Registry: minecraft:block, Inheritable resource namespace: "minecraft"
+
class Holder {
class AnnotatedHolder {
  −
    public static final Block diamond_block = null;  // No annotation. [public static final] is required.
  −
                                                      // Registry name is not explicitly defined.
  −
                                                      // So, registry name is inherited from class annotation: "minecraft:block"
  −
                                                      // Name path is the name of the field: "diamond_block"
  −
                                                      // Namespace is not explicitly defined.
  −
                                                      // So, namespace is inherited from class annotation: "minecraft"
  −
                                                      // To inject: "minecraft:diamond_block" from the [Block] registry
  −
 
  −
    @ObjectHolder(registry = "sound_event", value = "ambient.cave")
  −
    public static SoundEvent ambient_sound = null;    // Annotation present. [public static] is required.
  −
                                                      // Registry name is explicitly defined: "minecraft:sound_event"
  −
                                                      // Name path is the value of the annotation: "ambient.cave"
  −
                                                      // Namespace is not explicitly defined.
  −
                                                      // So, namespace is inherited from class annotation: "minecraft"
  −
                                                      // To inject: "minecraft:ambient.cave" from the [SoundEvent] registry
  −
 
  −
    // Assume for the next entry that [ManaType] is a valid registry.         
  −
    @ObjectHolder(registryName = "neomagicae:mana_type", value = "neomagicae:coffeinum")
  −
    public static final ManaType coffeinum = null;    // Annotation present. [public static] is required. [final] is optional.
  −
                                                      // Registry name is explicitly defined: "neomagicae:mana_type" (custom registry)
  −
                                                      // Resource location is explicitly defined: "neomagicae:coffeinum"
  −
                                                      // To inject: "neomagicae:coffeinum" from the [ManaType] registry
  −
 
  −
    public static final Item ENDER_PEARL = null;      // No annotation. [public static final] is required.
  −
                                                      // Registry name is not explicitly defined.
  −
                                                      // So, registry name is inherited from class annotation: "minecraft:block"
  −
                                                      // Name path is the name of the field: "ENDER_PEARL" -> "ender_pearl"
  −
                                                      // !! ^ Field name is valid, because they are
  −
                                                      //      converted to lowercase automatically.
  −
                                                      // Namespace is not explicitly defined.
  −
                                                      // So, namespace is inherited from class annotation: "minecraft"
  −
                                                      // When registering, this will attempt to force into a Block type, which is not a type or supertype of this object.
  −
                                                      // Therefore, THIS WILL PRODUCE AN EXCEPTION.
  −
 
  −
    @ObjectHolder(registryName = "item", value = "minecraft:arrow")
  −
    public static final ArrowItem arrow = null;      // Annotation present. [public static] is required. [final] is optional.
  −
                                                      // Registry name is explicitly defined: "minecraft:item"
  −
                                                      // ArrowItem's supertype of Item has a corresponding registry: [Item]
  −
                                                      // Resource location is explicitly defined: "minecraft:arrow"
  −
                                                      // To inject: "minecraft:arrow" from the [Item] registry                                                   
  −
 
  −
    public static Block bedrock = null;              // No annotation, so [public static final] is required.
  −
                                                      // Therefore, the field is ignored.
  −
   
  −
    public static final CreativeModeTab group = null; // No annotation. [public static final] is required.
  −
                                                      // Registry name is not explicitly defined.
  −
                                                      // So, registry name is inherited from class annotation: "minecraft:block"
  −
                                                      // When registering, this will attempt to force into a Block type, which is not a type or supertype of this object.
  −
                                                      // Therefore, THIS WILL PRODUCE AN EXCEPTION.
  −
}
  −
 
  −
class UnannotatedHolder { // Note the lack of an @ObjectHolder annotation on this class.
   
     @ObjectHolder(registryName = "enchantment", value = "minecraft:flame")
 
     @ObjectHolder(registryName = "enchantment", value = "minecraft:flame")
 
     public static final Enchantment flame = null;    // Annotation present. [public static] is required. [final] is optional.
 
     public static final Enchantment flame = null;    // Annotation present. [public static] is required. [final] is optional.
Line 250: Line 190:  
                                                       // To inject: "minecraft:flame" from the [Enchantment] registry
 
                                                       // To inject: "minecraft:flame" from the [Enchantment] registry
   −
     public static final Biome ice_flat = null;        // No annotation on the enclosing class.
+
     public static final Biome ice_flat = null;        // No annotation on the field.
 
                                                       // Therefore, the field is ignored.
 
                                                       // Therefore, the field is ignored.
    
     @ObjectHolder("minecraft:creeper")
 
     @ObjectHolder("minecraft:creeper")
 
     public static Entity creeper = null;              // Annotation present. [public static] is required.
 
     public static Entity creeper = null;              // Annotation present. [public static] is required.
                                                      // Entity does not have a corresponding registry.
+
                                                       // The registry has not been specified on the field.
                                                       // The registry has not been specified on the class.
   
                                                       // Therefore, THIS WILL PRODUCE AN EXCEPTION.
 
                                                       // Therefore, THIS WILL PRODUCE AN EXCEPTION.
   −
     @ObjectHolder(registryName = "potion", value = "levitation")
+
     @ObjectHolder(registryName = "potion")
 
     public static final Potion levitation = null;    // Annotation present. [public static] is required. [final] is optional.
 
     public static final Potion levitation = null;    // Annotation present. [public static] is required. [final] is optional.
 
                                                       // Registry name is explicitly defined: "minecraft:potion"
 
                                                       // Registry name is explicitly defined: "minecraft:potion"
                                                       // Name path is the value of the annotation: "levitation"
+
                                                       // Resource location is not specified on the field
                                                      // Namespace is not explicitly defined.
  −
                                                      // No annotation in enclosing class.
   
                                                       // Therefore, THIS WILL PRODUCE AN EXCEPTION.
 
                                                       // Therefore, THIS WILL PRODUCE AN EXCEPTION.
 
}
 
}