| 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. |
| | } | | } |