Line 5:
Line 5:
Most objects that are known within the game are handled by a <code>Registry</code>. Each registry uniquely defines each object through a "registry name" via a [[Using Resources#ResourceLocation|ResourceLocation]]. This "registry name" can be accessed with its respective getter and setter: <code>#getRegistryName</code> and <code>#setRegistryName</code>. You can only set the "registry name" of a given object once; otherwise, an exception will be thrown.
Most objects that are known within the game are handled by a <code>Registry</code>. Each registry uniquely defines each object through a "registry name" via a [[Using Resources#ResourceLocation|ResourceLocation]]. This "registry name" can be accessed with its respective getter and setter: <code>#getRegistryName</code> and <code>#setRegistryName</code>. You can only set the "registry name" of a given object once; otherwise, an exception will be thrown.
−
{{Tip|In a global context, each object is universally unique through its <code>RegistryKey</code>: a concatenation of its registry's id and the object's registry name.}}
+
{{Tip|In a global context, each object is universally unique through its <code>ResourceKey</code>: a concatenation of its registry's id and the object's registry name.}}
Due to the inconsistent ordering and registration process vanilla uses, Forge wraps most vanilla registries using <code>IForgeRegistry</code>. This guarantees that the loading order for these wrapped registries will be <code>Block</code>, <code>Item</code>, and then the rest of the wrapped registries in alphabetical order. All registries supported by Forge can be found within the <code>ForgeRegistries</code> class. Since all registry names are unique to a specific registry, different registry objects within different registries can have the same name (e.g. a <code>Block</code> and an <code>Item</code> each hold a registry object named <code>examplemod:object</code>.
Due to the inconsistent ordering and registration process vanilla uses, Forge wraps most vanilla registries using <code>IForgeRegistry</code>. This guarantees that the loading order for these wrapped registries will be <code>Block</code>, <code>Item</code>, and then the rest of the wrapped registries in alphabetical order. All registries supported by Forge can be found within the <code>ForgeRegistries</code> class. Since all registry names are unique to a specific registry, different registry objects within different registries can have the same name (e.g. a <code>Block</code> and an <code>Item</code> each hold a registry object named <code>examplemod:object</code>.
Line 26:
Line 26:
|java=private static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, MODID);
|java=private static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, MODID);
−
public static final RegistryObject<Block> EXAMPLE_BLOCK = BLOCKS.register("example_block", () -> new Block(AbstractBlock.Properties.create(Material.ROCK)));
+
public static final RegistryObject<Block> EXAMPLE_BLOCK = BLOCKS.register("example_block", () -> new Block(BlockBehaviour.Properties.of(Material.STONE)));
public ExampleMod() {
public ExampleMod() {
Line 33:
Line 33:
|kotlin=private val BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, MODID)
|kotlin=private val BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, MODID)
−
val EXAMPLE_BLOCK: RegistryObject<Block> = BLOCKS.register("example_block") { Block(AbstractBlock.Properties.create(Material.ROCK)) }
+
val EXAMPLE_BLOCK: RegistryObject<Block> = BLOCKS.register("example_block") { Block(BlockBehaviour.Properties.of(Material.ROCK)) }
internal class ExampleMod {
internal class ExampleMod {
Line 43:
Line 43:
private final val BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, MODID)
private final val BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, MODID)
−
final val EXAMPLE_BLOCK = registerBlock("example_block", () => new Block(AbstractBlock.Properties.create(Material.ROCK)))
+
final val EXAMPLE_BLOCK = registerBlock("example_block", () => new Block(BlockBehaviour.Properties.of(Material.ROCK)))
}
}
class ExampleMod {
class ExampleMod {
Line 76:
Line 76:
|}}
|}}
−
{{Tip/Important|Since all objects registered must be singleton, some classes cannot by themselves be registered. Instead, <code>*Type</code> classes are registered and used in the formers' constructors to wrap the flyweight objects. For example, a [[Basics_of_Tile_Entities|<code>TileEntity</code>]] is wrapped via <code>TileEntityType</code>, and <code>Entity</code> is wrapped via <code>EntityType</code>. These <code>*Type</code> classes hold factories that simply create the containing type on demand.
+
{{Tip/Important|Since all objects registered must be singleton, some classes cannot by themselves be registered. Instead, <code>*Type</code> classes are registered and used in the formers' constructors to wrap the flyweight objects. For example, a [[Basics_of_Block_Entities|<code>BlockEntity</code>]] is wrapped via <code>BlockEntityType</code>, and <code>Entity</code> is wrapped via <code>EntityType</code>. These <code>*Type</code> classes hold factories that simply create the containing type on demand.
−
These factory holders are created through the use of their <code>*Type$Builder</code> classes. An example: (<code>REGISTER</code> here refers to a <code>DeferredRegister<TileEntityType<?>></code>)
+
These factory holders are created through the use of their <code>*Type$Builder</code> classes. An example: (<code>REGISTER</code> here refers to a <code>DeferredRegister<BlockEntityType<?>></code>)
{{Template:Tabs/Code_Snippets
{{Template:Tabs/Code_Snippets
−
|java=public static final RegistryObject<TileEntityType<ExampleTile>> EXAMPLE_TILE = REGISTER.register(
+
|java=public static final RegistryObject<BlockEntityType<ExampleBlockEntity>> EXAMPLE_BLOCK_ENTITY = REGISTER.register(
−
"example_tile", () -> TileEntityType.Builder.create(ExampleTile::new, EXAMPLE_BLOCK.get()).build(null)
+
"example_block_entity", () -> BlockEntityType.Builder.of(ExampleBlockEntity::new, EXAMPLE_BLOCK.get()).build(null)
);
);
−
|kotlin=val EXAMPLE_TILE: RegistryObject<TileEntityType<ExampleTile>> = REGISTER.register("example_tile") { TileEntityType.Builder.create(::ExampleTile, EXAMPLE_BLOCK.get()).build(null)) }
+
|kotlin=val EXAMPLE_BLOCK_ENTITY: RegistryObject<BlockEntityType<ExampleBlockEntity>> = REGISTER.register("example_block_entity") { BlockEntityType.Builder.of(::ExampleBlockEntity, EXAMPLE_BLOCK.get()).build(null)) }
−
|scala=final val EXAMPLE_TILE = REGISTER.register("example_tile", () => TileEntityType.Builder.create(() => new ExampleTile(), GeneralRegistrar.EXAMPLE_BLOCK.get).build(null))
+
|scala=final val EXAMPLE_BLOCK_ENTITY = REGISTER.register("example_block_entity", () => BlockEntityType.Builder.of(() => new ExampleBlockEntity(), GeneralRegistrar.EXAMPLE_BLOCK.get).build(null))
|}}
|}}
}}
}}
Line 95:
Line 95:
These registries include:
These registries include:
* Custom Stats (a <code>ResourceLocation</code> registry)
* Custom Stats (a <code>ResourceLocation</code> registry)
−
* <code>IRuleTestType</code>
+
* <code>RuleTestType</code>
−
* <code>IPosRuleTests</code>
+
* <code>PosRuleTestType</code>
−
* <code>IRecipeType</code>
+
* <code>RecipeType</code>
+
* <code>GameEvent</code>
+
* <code>PositionSourceType</code>
* <code>VillagerType</code>
* <code>VillagerType</code>
* <code>LootPoolEntryType</code>
* <code>LootPoolEntryType</code>
−
* <code>LootFunctionType</code>
+
* <code>LootItemFunctionType</code>
−
* <code>LootConditionType</code>
+
* <code>LootItemConditionType</code>
−
* <code>IStructurePieceType</code>
+
* <code>LootNumberProviderType</code>
+
* <code>LootNbtProviderType</code>
+
* <code>LootScoreProviderType</code>
+
* <code>FloatProviderType</code>
+
* <code>IntProviderType</code>
+
* <code>HeightProviderType</code>
+
* <code>StructurePieceType</code>
* <code>TrunkPlacerType</code>
* <code>TrunkPlacerType</code>
* <code>FeatureSizeType</code>
* <code>FeatureSizeType</code>
−
* <code>BiomeProvider</code> (A <code>Codec</code> registry)
+
* A <code>Codec</code> of <code>BiomeSource</code>
−
* <code>ChunkGenerator</code> (A <code>Codec</code> registry)
+
* A <code>Codec</code> of <code>ChunkGenerator</code>
−
* <code>IStructureProcessorType</code>
+
* <code>StructureProcessorType</code>
−
* <code>IJigsawDeserializer</code>
+
* <code>StructurePoolElementType</code>
−
* All registries within <code>WorldGenRegistries</code> excluding <code>Biome</code>
+
* All registries within <code>BuiltinRegistries</code> excluding <code>Biome</code>
To register objects to any one of these registries, you will need to call <code>Registry::register(Registry, ResourceLocation, T)</code> where the type parameter <code>T</code> is the object instance being registered. The method can then be called and registered during the highest priority of <code>FMLCommonSetupEvent</code>. We can also utilize a <code>Lazy</code> above to store the result on first access and use within our code.
To register objects to any one of these registries, you will need to call <code>Registry::register(Registry, ResourceLocation, T)</code> where the type parameter <code>T</code> is the object instance being registered. The method can then be called and registered during the highest priority of <code>FMLCommonSetupEvent</code>. We can also utilize a <code>Lazy</code> above to store the result on first access and use within our code.
Line 118:
Line 126:
|java=public static final Lazy<ConfiguredFeature<?, ?>> EXAMPLE_CONFIGURED_FEATURE = Lazy.of(() ->
|java=public static final Lazy<ConfiguredFeature<?, ?>> EXAMPLE_CONFIGURED_FEATURE = Lazy.of(() ->
register("example_configured_feature",
register("example_configured_feature",
−
Feature.NO_OP.withConfiguration(NoFeatureConfig.field_236559_b_)
+
Feature.NO_OP.configured(NoneFeatureConfiguration.INSTANCE)
−
.withPlacement(Placement.NOPE.configure(NoPlacementConfig.INSTANCE))
+
.decorated(FeatureDecorator.NOPE.configured(NoneDecoratorConfiguration.INSTANCE))
)
)
);
);
Line 129:
Line 137:
private static <T extends ConfiguredFeature<?, ?>> T register(String name, T value) {
private static <T extends ConfiguredFeature<?, ?>> T register(String name, T value) {
−
return Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation(MODID, name), value);
+
return Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, new ResourceLocation(MODID, name), value);
}
}
|kotlin=val EXAMPLE_CONFIGURED_FEATURE: ConfiguredFeature<*, *> by lazy {
|kotlin=val EXAMPLE_CONFIGURED_FEATURE: ConfiguredFeature<*, *> by lazy {
register("example_configured_feature",
register("example_configured_feature",
−
Feature.NO_OP.withConfiguration(NoFeatureConfig.field_236559_b_)
+
Feature.NO_OP.configured(NoneFeatureConfiguration.INSTANCE)
−
.withPlacement(Placement.NOPE.configure(NoPlacementConfig.INSTANCE)))
+
.decorated(FeatureDecorator.NOPE.configured(NoneDecoratorConfiguration.INSTANCE)))
}
}
Line 146:
Line 154:
private fun <T: ConfiguredFeature<*, *>> register(name: String, value: T): T =
private fun <T: ConfiguredFeature<*, *>> register(name: String, value: T): T =
−
Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, ResourceLocation(MODID, name), value)
+
Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, ResourceLocation(MODID, name), value)
|scala=class Events {
|scala=class Events {
@SubscribeEvent(priority = EventPriority.HIGHEST)
@SubscribeEvent(priority = EventPriority.HIGHEST)
Line 155:
Line 163:
object Events {
object Events {
final lazy val EXAMPLE_CONFIGURED_FEATURE = register("example_configured_feature",
final lazy val EXAMPLE_CONFIGURED_FEATURE = register("example_configured_feature",
−
Feature.NO_OP.withConfiguration(NoFeatureConfig.field_236559_b_)
+
Feature.NO_OP.configured(NoneFeatureConfiguration.INSTANCE)
−
.withPlacement(Placement.NOPE.configure(NoPlacementConfig.INSTANCE)))
+
.decorated(FeatureDecorator.NOPE.configured(NoneDecoratorConfiguration.INSTANCE)))
private def register[T <: ConfiguredFeature[_, _]](name: String, value: T): T =
private def register[T <: ConfiguredFeature[_, _]](name: String, value: T): T =
−
Registry.register(WorldGenRegistries.CONFIGURED_FEATURE, new ResourceLocation(MODID, name), value)
+
Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, new ResourceLocation(MODID, name), value)
}
}
|}}
|}}
Line 165:
Line 173:
{{Tip/Warning|Vanilla registry methods are not thread-safe, so they must be wrapped within the synchronous queue provided within the common setup event via <code>#enqueueWork</code>.}}
{{Tip/Warning|Vanilla registry methods are not thread-safe, so they must be wrapped within the synchronous queue provided within the common setup event via <code>#enqueueWork</code>.}}
−
Besides the registries within <code>WorldGenRegistries</code>, all other '''non-forge''' wrapped registries can be statically initialized like so:
+
Besides the registries within <code>BuiltinRegistries</code>, all other '''non-forge''' wrapped registries can be statically initialized like so:
{{Template:Tabs/Code_Snippets
{{Template:Tabs/Code_Snippets
−
|java=public static final IRecipeType<ExampleRecipe> EXAMPLE_RECIPE = IRecipeType.register(MODID + ":example_recipe");
+
|java=public static final RecipeType<ExampleRecipe> EXAMPLE_RECIPE = RecipeType.register(MODID + ":example_recipe");
−
|kotlin=val EXAMPLE_RECIPE: IRecipeType<ExampleRecipe> = IRecipeType.register("${MODID}:example_recipe")
+
|kotlin=val EXAMPLE_RECIPE: RecipeType<ExampleRecipe> = RecipeType.register("${MODID}:example_recipe")
−
|scala=final val EXAMPLE_RECIPE = IRecipeType.register(s"${MODID}:example_recipe")
+
|scala=final val EXAMPLE_RECIPE = RecipeType.register(s"${MODID}:example_recipe")
|}}
|}}
Line 177:
Line 185:
=== Data Driven Entries ===
=== Data Driven Entries ===
−
Registries are considered to be data driven if they are located within <code>DynamicRegistries</code> with the exception of <code>Dimension</code>.
+
Registries are considered to be data driven if they are located within <code>RegistryAccess</code> with the exception of <code>LevelStem</code> and <code>Level</code>.
The following registries are data driven:
The following registries are data driven:
* <code>ConfiguredSurfaceBuilder</code>
* <code>ConfiguredSurfaceBuilder</code>
−
* <code>ConfiguredCarver</code>
+
* <code>ConfiguredWorldCarver</code>
* <code>ConfiguredFeature</code>
* <code>ConfiguredFeature</code>
−
* <code>StructureFeature</code>
+
* <code>ConfiguredStructureFeature</code>
* <code>StructureProcessorList</code>
* <code>StructureProcessorList</code>
−
* <code>JigsawPattern</code>
+
* <code>StructureTemplatePool</code>
* <code>Biome</code>
* <code>Biome</code>
−
* <code>DimensionSettings</code>
+
* <code>NoiseGeneratorSettings</code>
* <code>DimensionType</code>
* <code>DimensionType</code>
−
* <code>Dimension</code>
+
* <code>LevelStem</code>
+
* <code>Level</code>
These registry objects only need to be registered within code if they are to be used within a pre-existing registry object (e.g. a <code>ConfiguredFeature</code> for ore generation within an overworld <code>Biome</code>). Otherwise, their instance can be purely registered using a JSON file.
These registry objects only need to be registered within code if they are to be used within a pre-existing registry object (e.g. a <code>ConfiguredFeature</code> for ore generation within an overworld <code>Biome</code>). Otherwise, their instance can be purely registered using a JSON file.
Line 204:
Line 213:
<code>RegistryObject</code>s can be used to retrieve references to registered objects once they become available. Their references are updated along with all <code>@ObjectHolder</code> annotations after the associated <code>RegistryEvent$Register</code> has been dispatched and frozen.
<code>RegistryObject</code>s can be used to retrieve references to registered objects once they become available. Their references are updated along with all <code>@ObjectHolder</code> annotations after the associated <code>RegistryEvent$Register</code> has been dispatched and frozen.
−
A <code>RegistryObject</code> can be retrieved as a result of using <code>DeferredRegister</code> or calling the static constructor <code>RegistryObject::of</code>. Each static constructor takes in the "registry name" of the object being referenced and either a <code>IForgeRegistry</code> or, if custom registries are used, a supplier of the object class implementing <code>IForgeRegistryEntry</code>. The <code>RegistryObject</code> can be stored within some field and retreive the registered object using <code>#get</code>.
+
A <code>RegistryObject</code> can be retrieved as a result of using <code>DeferredRegister</code> or calling the static constructor <code>RegistryObject::of</code>. Each static constructor takes in the "registry name" of the object being referenced and either a <code>IForgeRegistry</code> or, if custom registries are used, a supplier of the object class implementing <code>IForgeRegistryEntry</code>. The <code>RegistryObject</code> can be stored within some field and retrieve the registered object using <code>#get</code>.
An example using <code>RegistryObject</code>:
An example using <code>RegistryObject</code>:
Line 259:
Line 268:
@ObjectHolder("minecraft") // Inheritable resource namespace: "minecraft"
@ObjectHolder("minecraft") // Inheritable resource namespace: "minecraft"
class AnnotatedHolder {
class AnnotatedHolder {
−
public static final Block diamond_block = null; // No annotation. [public static final] is required.
+
public static final Block diamond_block = null; // No annotation. [public static final] is required.
−
// Block has a corresponding registry: [Block]
+
// Block has a corresponding registry: [Block]
−
// Name path is the name of the field: "diamond_block"
+
// Name path is the name of the field: "diamond_block"
−
// Namespace is not explicitly defined.
+
// Namespace is not explicitly defined.
−
// So, namespace is inherited from class annotation: "minecraft"
+
// So, namespace is inherited from class annotation: "minecraft"
−
// To inject: "minecraft:diamond_block" from the [Block] registry
+
// To inject: "minecraft:diamond_block" from the [Block] registry
@ObjectHolder("ambient.cave")
@ObjectHolder("ambient.cave")
−
public static SoundEvent ambient_sound = null; // Annotation present. [public static] is required.
+
public static SoundEvent ambient_sound = null; // Annotation present. [public static] is required.
−
// SoundEvent has a corresponding registry: [SoundEvent]
+
// SoundEvent has a corresponding registry: [SoundEvent]
−
// Name path is the value of the annotation: "ambient.cave"
+
// Name path is the value of the annotation: "ambient.cave"
−
// Namespace is not explicitly defined.
+
// Namespace is not explicitly defined.
−
// So, namespace is inherited from class annotation: "minecraft"
+
// So, namespace is inherited from class annotation: "minecraft"
−
// To inject: "minecraft:ambient.cave" from the [SoundEvent] registry
+
// To inject: "minecraft:ambient.cave" from the [SoundEvent] registry
// Assume for the next entry that [ManaType] is a valid registry.
// Assume for the next entry that [ManaType] is a valid registry.
@ObjectHolder("neomagicae:coffeinum")
@ObjectHolder("neomagicae:coffeinum")
−
public static final ManaType coffeinum = null; // Annotation present. [public static] is required. [final] is optional.
+
public static final ManaType coffeinum = null; // Annotation present. [public static] is required. [final] is optional.
−
// ManaType has a corresponding registry: [ManaType] (custom registry)
+
// ManaType has a corresponding registry: [ManaType] (custom registry)
−
// Resource location is explicitly defined: "neomagicae:coffeinum"
+
// Resource location is explicitly defined: "neomagicae:coffeinum"
−
// To inject: "neomagicae:coffeinum" from the [ManaType] registry
+
// To inject: "neomagicae:coffeinum" from the [ManaType] registry
−
public static final Item ENDER_PEARL = null; // No annotation. [public static final] is required.
+
public static final Item ENDER_PEARL = null; // No annotation. [public static final] is required.
−
// Item has a corresponding registry: [Item].
+
// Item has a corresponding registry: [Item].
−
// Name path is the name of the field: "ENDER_PEARL" -> "ender_pearl"
+
// Name path is the name of the field: "ENDER_PEARL" -> "ender_pearl"
−
// !! ^ Field name is valid, because they are
+
// !! ^ Field name is valid, because they are
−
// converted to lowercase automatically.
+
// converted to lowercase automatically.
−
// Namespace is not explicitly defined.
+
// Namespace is not explicitly defined.
−
// So, namespace is inherited from class annotation: "minecraft"
+
// So, namespace is inherited from class annotation: "minecraft"
−
// To inject: "minecraft:ender_pearl" from the [Item] registry
+
// To inject: "minecraft:ender_pearl" from the [Item] registry
@ObjectHolder("minecraft:arrow")
@ObjectHolder("minecraft:arrow")
−
public static final ArrowItem arrow = null; // Annotation present. [public static] is required. [final] is optional.
+
public static final ArrowItem arrow = null; // Annotation present. [public static] is required. [final] is optional.
−
// ArrowItem does not have a corresponding registry.
+
// ArrowItem does not have a corresponding registry.
−
// ArrowItem's supertype of Item has a corresponding registry: [Item]
+
// ArrowItem's supertype of Item has a corresponding registry: [Item]
−
// Resource location is explicitly defined: "minecraft:arrow"
+
// Resource location is explicitly defined: "minecraft:arrow"
−
// To inject: "minecraft:arrow" from the [Item] registry
+
// To inject: "minecraft:arrow" from the [Item] registry
−
public static Block bedrock = null; // No annotation, so [public static final] is required.
+
public static Block bedrock = null; // No annotation, so [public static final] is required.
−
// Therefore, the field is ignored.
+
// Therefore, the field is ignored.
−
public static final ItemGroup group = null; // No annotation. [public static final] is required.
+
public static final CreativeModeTab group = null; // No annotation. [public static final] is required.
−
// ItemGroup does not have a corresponding registry.
+
// CreativeModeTab does not have a corresponding registry.
−
// No supertypes of ItemGroup has a corresponding registry.
+
// No supertypes of CreativeModeTab has a corresponding registry.
−
// Therefore, THIS WILL PRODUCE AN EXCEPTION.
+
// Therefore, THIS WILL PRODUCE AN EXCEPTION.
}
}
class UnannotatedHolder { // Note the lack of an @ObjectHolder annotation on this class.
class UnannotatedHolder { // Note the lack of an @ObjectHolder annotation on this class.
@ObjectHolder("minecraft:flame")
@ObjectHolder("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.
−
// Enchantment has corresponding registry: [Enchantment].
+
// Enchantment has corresponding registry: [Enchantment].
−
// Resource location is explicitly defined: "minecraft:flame"
+
// Resource location is explicitly defined: "minecraft:flame"
−
// 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 enclosing class.
−
// 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.
+
// Entity does not have a corresponding registry.
−
// No supertypes of Entity has a corresponding registry.
+
// No supertypes of Entity has a corresponding registry.
−
// Therefore, THIS WILL PRODUCE AN EXCEPTION.
+
// Therefore, THIS WILL PRODUCE AN EXCEPTION.
@ObjectHolder("levitation")
@ObjectHolder("levitation")
−
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.
−
// Potion has a corresponding registry: [Potion].
+
// Potion has a corresponding registry: [Potion].
−
// Name path is the value of the annotation: "levitation"
+
// Name path is the value of the annotation: "levitation"
−
// Namespace is not explicitly defined.
+
// Namespace is not explicitly defined.
−
// No annotation in enclosing class.
+
// No annotation in enclosing class.
−
// Therefore, THIS WILL PRODUCE AN EXCEPTION.
+
// Therefore, THIS WILL PRODUCE AN EXCEPTION.
}
}
</syntaxhighlight>
</syntaxhighlight>