From ba08b8cdf17407a5448f709efc273fe7a591da78 Mon Sep 17 00:00:00 2001 From: DerFrZocker Date: Mon, 13 Jan 2025 19:39:04 +1100 Subject: [PATCH] #1085: Add RegistryAware to indicate better that not all registry items are registered --- src/main/java/org/bukkit/Art.java | 15 +++++- src/main/java/org/bukkit/Fluid.java | 15 +++++- src/main/java/org/bukkit/GameEvent.java | 15 +++++- src/main/java/org/bukkit/JukeboxSong.java | 15 +++++- src/main/java/org/bukkit/Material.java | 32 +++++++++++-- src/main/java/org/bukkit/MusicInstrument.java | 15 +++++- src/main/java/org/bukkit/Particle.java | 36 +++++++++++--- src/main/java/org/bukkit/Sound.java | 15 +++++- .../java/org/bukkit/attribute/Attribute.java | 15 +++++- src/main/java/org/bukkit/block/Biome.java | 15 +++++- src/main/java/org/bukkit/block/BlockType.java | 15 +++++- .../org/bukkit/block/banner/PatternType.java | 15 ++++-- .../java/org/bukkit/damage/DamageType.java | 15 +++++- .../org/bukkit/enchantments/Enchantment.java | 15 +++++- src/main/java/org/bukkit/entity/Cat.java | 15 +++++- .../java/org/bukkit/entity/EntityType.java | 33 +++++++++++-- src/main/java/org/bukkit/entity/Frog.java | 15 +++++- src/main/java/org/bukkit/entity/Villager.java | 29 +++++++++++- src/main/java/org/bukkit/entity/Wolf.java | 15 +++++- .../org/bukkit/entity/memory/MemoryKey.java | 32 ++++++++++++- .../bukkit/generator/structure/Structure.java | 15 +++++- .../generator/structure/StructureType.java | 15 +++++- .../java/org/bukkit/inventory/ItemType.java | 15 +++++- .../java/org/bukkit/inventory/MenuType.java | 15 +++++- .../inventory/meta/trim/TrimMaterial.java | 15 +++++- .../inventory/meta/trim/TrimPattern.java | 15 +++++- src/main/java/org/bukkit/map/MapCursor.java | 15 +++++- .../org/bukkit/potion/PotionEffectType.java | 15 +++++- .../java/org/bukkit/potion/PotionType.java | 32 ++++++++++++- .../org/bukkit/registry/RegistryAware.java | 47 +++++++++++++++++++ .../org/bukkit/registry/package-info.java | 4 ++ 31 files changed, 546 insertions(+), 44 deletions(-) create mode 100644 src/main/java/org/bukkit/registry/RegistryAware.java create mode 100644 src/main/java/org/bukkit/registry/package-info.java diff --git a/src/main/java/org/bukkit/Art.java b/src/main/java/org/bukkit/Art.java index d24bf449..cf71cfc6 100644 --- a/src/main/java/org/bukkit/Art.java +++ b/src/main/java/org/bukkit/Art.java @@ -4,6 +4,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import java.util.Locale; import org.bukkit.packs.DataPack; +import org.bukkit.registry.RegistryAware; import org.bukkit.util.OldEnum; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -16,7 +17,7 @@ import org.jetbrains.annotations.Nullable; * There may be additional arts present in the server, for example from a {@link DataPack} * which can be accessed via {@link Registry#ART}. */ -public interface Art extends OldEnum, Keyed { +public interface Art extends OldEnum, Keyed, RegistryAware { Art KEBAB = getArt("kebab"); Art AZTEC = getArt("aztec"); @@ -88,6 +89,18 @@ public interface Art extends OldEnum, Keyed { */ int getBlockHeight(); + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ + @NotNull + @Override + @Deprecated(since = "1.21.4") + NamespacedKey getKey(); + /** * Get the ID of this painting. * diff --git a/src/main/java/org/bukkit/Fluid.java b/src/main/java/org/bukkit/Fluid.java index dff295a4..4d8c335d 100644 --- a/src/main/java/org/bukkit/Fluid.java +++ b/src/main/java/org/bukkit/Fluid.java @@ -3,13 +3,14 @@ package org.bukkit; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import java.util.Locale; +import org.bukkit.registry.RegistryAware; import org.bukkit.util.OldEnum; import org.jetbrains.annotations.NotNull; /** * Represents a fluid type. */ -public interface Fluid extends OldEnum, Keyed { +public interface Fluid extends OldEnum, Keyed, RegistryAware { /** * No fluid. @@ -37,6 +38,18 @@ public interface Fluid extends OldEnum, Keyed { return Registry.FLUID.getOrThrow(NamespacedKey.minecraft(key)); } + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ + @NotNull + @Override + @Deprecated(since = "1.21.4") + NamespacedKey getKey(); + /** * @param name of the fluid. * @return the fluid with the given name. diff --git a/src/main/java/org/bukkit/GameEvent.java b/src/main/java/org/bukkit/GameEvent.java index 8d8d2d71..ea782872 100644 --- a/src/main/java/org/bukkit/GameEvent.java +++ b/src/main/java/org/bukkit/GameEvent.java @@ -3,13 +3,14 @@ package org.bukkit; import com.google.common.collect.Lists; import java.util.Collection; import java.util.Collections; +import org.bukkit.registry.RegistryAware; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** * Represents a generic Mojang game event. */ -public abstract class GameEvent implements Keyed { +public abstract class GameEvent implements Keyed, RegistryAware { public static final GameEvent BLOCK_ACTIVATE = getEvent("block_activate"); public static final GameEvent BLOCK_ATTACH = getEvent("block_attach"); @@ -112,6 +113,18 @@ public abstract class GameEvent implements Keyed { public static final GameEvent RESONATE_14 = getEvent("resonate_14"); public static final GameEvent RESONATE_15 = getEvent("resonate_15"); + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ + @NotNull + @Override + @Deprecated(since = "1.21.4") + public abstract NamespacedKey getKey(); + /** * Returns a {@link GameEvent} by a {@link NamespacedKey}. * diff --git a/src/main/java/org/bukkit/JukeboxSong.java b/src/main/java/org/bukkit/JukeboxSong.java index 5872188c..67780237 100644 --- a/src/main/java/org/bukkit/JukeboxSong.java +++ b/src/main/java/org/bukkit/JukeboxSong.java @@ -1,5 +1,6 @@ package org.bukkit; +import org.bukkit.registry.RegistryAware; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; @@ -7,7 +8,7 @@ import org.jetbrains.annotations.NotNull; * Represents a song which may play in a Jukebox. */ @ApiStatus.Experimental -public interface JukeboxSong extends Keyed, Translatable { +public interface JukeboxSong extends Keyed, Translatable, RegistryAware { public static final JukeboxSong THIRTEEN = get("13"); public static final JukeboxSong CAT = get("cat"); @@ -33,4 +34,16 @@ public interface JukeboxSong extends Keyed, Translatable { private static JukeboxSong get(@NotNull String key) { return Registry.JUKEBOX_SONG.getOrThrow(NamespacedKey.minecraft(key)); } + + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ + @NotNull + @Override + @Deprecated(since = "1.21.4") + NamespacedKey getKey(); } diff --git a/src/main/java/org/bukkit/Material.java b/src/main/java/org/bukkit/Material.java index b8d3b0c4..e3ff03b7 100644 --- a/src/main/java/org/bukkit/Material.java +++ b/src/main/java/org/bukkit/Material.java @@ -128,6 +128,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemType; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.material.MaterialData; +import org.bukkit.registry.RegistryAware; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -135,7 +136,7 @@ import org.jetbrains.annotations.Nullable; /** * An enum of all material IDs accepted by the official server and client */ -public enum Material implements Keyed, Translatable { +public enum Material implements Keyed, Translatable, RegistryAware { // AIR(9648, 0), STONE(22948), @@ -4839,11 +4840,36 @@ public enum Material implements Keyed, Translatable { return legacy; } + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ @NotNull @Override + @Deprecated(since = "1.21.4") public NamespacedKey getKey() { - Preconditions.checkArgument(!legacy, "Cannot get key of Legacy Material"); - return key; + return getKeyOrThrow(); + } + + @NotNull + @Override + public NamespacedKey getKeyOrThrow() { + Preconditions.checkState(isRegistered(), "Cannot get key of this registry item, because it is not registered. Use #isRegistered() before calling this method."); + return this.key; + } + + @Nullable + @Override + public NamespacedKey getKeyOrNull() { + return this.key; + } + + @Override + public boolean isRegistered() { + return !legacy; } /** diff --git a/src/main/java/org/bukkit/MusicInstrument.java b/src/main/java/org/bukkit/MusicInstrument.java index 708286af..a64e4b77 100644 --- a/src/main/java/org/bukkit/MusicInstrument.java +++ b/src/main/java/org/bukkit/MusicInstrument.java @@ -3,10 +3,11 @@ package org.bukkit; import com.google.common.collect.Lists; import java.util.Collection; import java.util.Collections; +import org.bukkit.registry.RegistryAware; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public abstract class MusicInstrument implements Keyed { +public abstract class MusicInstrument implements Keyed, RegistryAware { public static final MusicInstrument PONDER_GOAT_HORN = getInstrument("ponder_goat_horn"); public static final MusicInstrument SING_GOAT_HORN = getInstrument("sing_goat_horn"); @@ -17,6 +18,18 @@ public abstract class MusicInstrument implements Keyed { public static final MusicInstrument YEARN_GOAT_HORN = getInstrument("yearn_goat_horn"); public static final MusicInstrument DREAM_GOAT_HORN = getInstrument("dream_goat_horn"); + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ + @NotNull + @Override + @Deprecated(since = "1.21.4") + public abstract NamespacedKey getKey(); + /** * Returns a {@link MusicInstrument} by a {@link NamespacedKey}. * diff --git a/src/main/java/org/bukkit/Particle.java b/src/main/java/org/bukkit/Particle.java index bc23886a..daa70791 100644 --- a/src/main/java/org/bukkit/Particle.java +++ b/src/main/java/org/bukkit/Particle.java @@ -3,10 +3,12 @@ package org.bukkit; import com.google.common.base.Preconditions; import org.bukkit.block.data.BlockData; import org.bukkit.inventory.ItemStack; +import org.bukkit.registry.RegistryAware; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -public enum Particle implements Keyed { +public enum Particle implements Keyed, RegistryAware { POOF("poof"), EXPLOSION("explosion"), EXPLOSION_EMITTER("explosion_emitter"), @@ -198,12 +200,34 @@ public enum Particle implements Keyed { @NotNull @Override - public NamespacedKey getKey() { - if (key == null) { - throw new UnsupportedOperationException("Cannot get key from legacy particle"); - } + public NamespacedKey getKeyOrThrow() { + Preconditions.checkState(isRegistered(), "Cannot get key of this registry item, because it is not registered. Use #isRegistered() before calling this method."); + return this.key; + } - return key; + @Nullable + @Override + public NamespacedKey getKeyOrNull() { + return this.key; + } + + @Override + public boolean isRegistered() { + return this.key != null; + } + + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ + @NotNull + @Override + @Deprecated(since = "1.21.4") + public NamespacedKey getKey() { + return getKeyOrThrow(); } /** diff --git a/src/main/java/org/bukkit/Sound.java b/src/main/java/org/bukkit/Sound.java index fab510af..329bc43b 100644 --- a/src/main/java/org/bukkit/Sound.java +++ b/src/main/java/org/bukkit/Sound.java @@ -4,6 +4,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import java.util.Locale; import org.bukkit.packs.DataPack; +import org.bukkit.registry.RegistryAware; import org.bukkit.util.OldEnum; import org.jetbrains.annotations.NotNull; @@ -20,7 +21,7 @@ import org.jetbrains.annotations.NotNull; * guarantee values will not be removed from this interface. As such, you should not * depend on the ordinal values of this class. */ -public interface Sound extends OldEnum, Keyed { +public interface Sound extends OldEnum, Keyed, RegistryAware { Sound AMBIENT_BASALT_DELTAS_ADDITIONS = getSound("ambient.basalt_deltas.additions"); Sound AMBIENT_BASALT_DELTAS_LOOP = getSound("ambient.basalt_deltas.loop"); @@ -1679,6 +1680,18 @@ public interface Sound extends OldEnum, Keyed { return Registry.SOUNDS.getOrThrow(NamespacedKey.minecraft(key)); } + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ + @NotNull + @Override + @Deprecated(since = "1.21.4") + NamespacedKey getKey(); + /** * @param name of the sound. * @return the sound with the given name. diff --git a/src/main/java/org/bukkit/attribute/Attribute.java b/src/main/java/org/bukkit/attribute/Attribute.java index 50e74a9f..876ac3c3 100644 --- a/src/main/java/org/bukkit/attribute/Attribute.java +++ b/src/main/java/org/bukkit/attribute/Attribute.java @@ -8,13 +8,14 @@ import org.bukkit.Keyed; import org.bukkit.NamespacedKey; import org.bukkit.Registry; import org.bukkit.Translatable; +import org.bukkit.registry.RegistryAware; import org.bukkit.util.OldEnum; import org.jetbrains.annotations.NotNull; /** * Types of attributes which may be present on an {@link Attributable}. */ -public interface Attribute extends OldEnum, Keyed, Translatable { +public interface Attribute extends OldEnum, Keyed, Translatable, RegistryAware { /** * Maximum health of an Entity. @@ -150,6 +151,18 @@ public interface Attribute extends OldEnum, Keyed, Translatable { return Registry.ATTRIBUTE.getOrThrow(NamespacedKey.minecraft(key)); } + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ + @NotNull + @Override + @Deprecated(since = "1.21.4") + NamespacedKey getKey(); + /** * @param name of the attribute. * @return the attribute with the given name. diff --git a/src/main/java/org/bukkit/block/Biome.java b/src/main/java/org/bukkit/block/Biome.java index f04aa030..68e041ca 100644 --- a/src/main/java/org/bukkit/block/Biome.java +++ b/src/main/java/org/bukkit/block/Biome.java @@ -9,6 +9,7 @@ import org.bukkit.Keyed; import org.bukkit.NamespacedKey; import org.bukkit.Registry; import org.bukkit.packs.DataPack; +import org.bukkit.registry.RegistryAware; import org.bukkit.util.OldEnum; import org.jetbrains.annotations.NotNull; @@ -20,7 +21,7 @@ import org.jetbrains.annotations.NotNull; * There may be additional biomes present in the server, for example from a {@link DataPack} * which can be accessed via {@link Registry#BIOME}. */ -public interface Biome extends OldEnum, Keyed { +public interface Biome extends OldEnum, Keyed, RegistryAware { Biome OCEAN = getBiome("ocean"); Biome PLAINS = getBiome("plains"); @@ -101,6 +102,18 @@ public interface Biome extends OldEnum, Keyed { return Registry.BIOME.getOrThrow(NamespacedKey.minecraft(key)); } + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ + @NotNull + @Override + @Deprecated(since = "1.21.4") + NamespacedKey getKey(); + /** * @param name of the biome. * @return the biome with the given name. diff --git a/src/main/java/org/bukkit/block/BlockType.java b/src/main/java/org/bukkit/block/BlockType.java index 04bbbaba..4f26e656 100644 --- a/src/main/java/org/bukkit/block/BlockType.java +++ b/src/main/java/org/bukkit/block/BlockType.java @@ -117,6 +117,7 @@ import org.bukkit.block.data.type.WallHangingSign; import org.bukkit.block.data.type.WallSign; import org.bukkit.block.data.type.WallSkull; import org.bukkit.inventory.ItemType; +import org.bukkit.registry.RegistryAware; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -129,7 +130,7 @@ import org.jetbrains.annotations.Nullable; * changes may occur. Do not use this API in plugins. */ @ApiStatus.Internal -public interface BlockType extends Keyed, Translatable { +public interface BlockType extends Keyed, Translatable, RegistryAware { /** * Typed represents a subtype of {@link BlockType}s that have a known block @@ -3602,6 +3603,18 @@ public interface BlockType extends Keyed, Translatable { */ boolean isEnabledByFeature(@NotNull World world); + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ + @NotNull + @Override + @Deprecated(since = "1.21.4") + NamespacedKey getKey(); + /** * Tries to convert this BlockType into a Material * diff --git a/src/main/java/org/bukkit/block/banner/PatternType.java b/src/main/java/org/bukkit/block/banner/PatternType.java index b6aa112f..967423da 100644 --- a/src/main/java/org/bukkit/block/banner/PatternType.java +++ b/src/main/java/org/bukkit/block/banner/PatternType.java @@ -6,12 +6,13 @@ import java.util.Locale; import org.bukkit.Keyed; import org.bukkit.NamespacedKey; import org.bukkit.Registry; +import org.bukkit.registry.RegistryAware; import org.bukkit.util.OldEnum; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public interface PatternType extends OldEnum, Keyed { +public interface PatternType extends OldEnum, Keyed, RegistryAware { PatternType BASE = getType("base"); PatternType SQUARE_BOTTOM_LEFT = getType("square_bottom_left"); PatternType SQUARE_BOTTOM_RIGHT = getType("square_bottom_right"); @@ -56,9 +57,17 @@ public interface PatternType extends OldEnum, Keyed { PatternType FLOW = getType("flow"); PatternType GUSTER = getType("guster"); - @Override + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ @NotNull - public NamespacedKey getKey(); + @Override + @Deprecated(since = "1.21.4") + NamespacedKey getKey(); /** * Returns the identifier used to represent diff --git a/src/main/java/org/bukkit/damage/DamageType.java b/src/main/java/org/bukkit/damage/DamageType.java index 14f90d8d..089fe199 100644 --- a/src/main/java/org/bukkit/damage/DamageType.java +++ b/src/main/java/org/bukkit/damage/DamageType.java @@ -4,6 +4,7 @@ import org.bukkit.Keyed; import org.bukkit.NamespacedKey; import org.bukkit.Registry; import org.bukkit.Translatable; +import org.bukkit.registry.RegistryAware; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; @@ -17,7 +18,7 @@ import org.jetbrains.annotations.NotNull; * @see Minecraft Wiki */ @ApiStatus.Experimental -public interface DamageType extends Keyed, Translatable { +public interface DamageType extends Keyed, Translatable, RegistryAware { public static final DamageType IN_FIRE = getDamageType("in_fire"); public static final DamageType CAMPFIRE = getDamageType("campfire"); @@ -117,4 +118,16 @@ public interface DamageType extends Keyed, Translatable { * @return the exhaustion */ public float getExhaustion(); + + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ + @NotNull + @Override + @Deprecated(since = "1.21.4") + NamespacedKey getKey(); } diff --git a/src/main/java/org/bukkit/enchantments/Enchantment.java b/src/main/java/org/bukkit/enchantments/Enchantment.java index e560a13a..6aae550c 100644 --- a/src/main/java/org/bukkit/enchantments/Enchantment.java +++ b/src/main/java/org/bukkit/enchantments/Enchantment.java @@ -7,6 +7,7 @@ import org.bukkit.NamespacedKey; import org.bukkit.Registry; import org.bukkit.Translatable; import org.bukkit.inventory.ItemStack; +import org.bukkit.registry.RegistryAware; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -14,7 +15,7 @@ import org.jetbrains.annotations.Nullable; /** * The various type of enchantments that may be added to armour or weapons */ -public abstract class Enchantment implements Keyed, Translatable { +public abstract class Enchantment implements Keyed, Translatable, RegistryAware { /** * Provides protection against environmental damage */ @@ -311,6 +312,18 @@ public abstract class Enchantment implements Keyed, Translatable { */ public abstract boolean canEnchantItem(@NotNull ItemStack item); + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ + @NotNull + @Override + @Deprecated(since = "1.21.4") + public abstract NamespacedKey getKey(); + /** * Gets the Enchantment at the specified key * diff --git a/src/main/java/org/bukkit/entity/Cat.java b/src/main/java/org/bukkit/entity/Cat.java index 104b9c8a..10d09329 100644 --- a/src/main/java/org/bukkit/entity/Cat.java +++ b/src/main/java/org/bukkit/entity/Cat.java @@ -7,6 +7,7 @@ import org.bukkit.DyeColor; import org.bukkit.Keyed; import org.bukkit.NamespacedKey; import org.bukkit.Registry; +import org.bukkit.registry.RegistryAware; import org.bukkit.util.OldEnum; import org.jetbrains.annotations.NotNull; @@ -48,7 +49,7 @@ public interface Cat extends Tameable, Sittable { /** * Represents the various different cat types there are. */ - interface Type extends OldEnum, Keyed { + interface Type extends OldEnum, Keyed, RegistryAware { Type TABBY = getType("tabby"); Type BLACK = getType("black"); @@ -67,6 +68,18 @@ public interface Cat extends Tameable, Sittable { return Registry.CAT_VARIANT.getOrThrow(NamespacedKey.minecraft(key)); } + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ + @NotNull + @Override + @Deprecated(since = "1.21.4") + NamespacedKey getKey(); + /** * @param name of the cat type. * @return the cat type with the given name. diff --git a/src/main/java/org/bukkit/entity/EntityType.java b/src/main/java/org/bukkit/entity/EntityType.java index 896b87bf..db72cee7 100644 --- a/src/main/java/org/bukkit/entity/EntityType.java +++ b/src/main/java/org/bukkit/entity/EntityType.java @@ -39,11 +39,12 @@ import org.bukkit.entity.minecart.SpawnerMinecart; import org.bukkit.entity.minecart.StorageMinecart; import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffectType; +import org.bukkit.registry.RegistryAware; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public enum EntityType implements Keyed, Translatable { +public enum EntityType implements Keyed, Translatable, RegistryAware { // These strings MUST match the strings in nms.EntityTypes and are case sensitive. /** @@ -388,12 +389,18 @@ public enum EntityType implements Keyed, Translatable { return name; } + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ @NotNull @Override + @Deprecated(since = "1.21.4") public NamespacedKey getKey() { - Preconditions.checkArgument(key != null, "EntityType doesn't have key! Is it UNKNOWN?"); - - return key; + return getKeyOrThrow(); } @Nullable @@ -476,4 +483,22 @@ public enum EntityType implements Keyed, Translatable { public boolean isEnabledByFeature(@NotNull World world) { return Bukkit.getDataPackManager().isEnabledByFeature(this, world); } + + @NotNull + @Override + public NamespacedKey getKeyOrThrow() { + Preconditions.checkState(isRegistered(), "Cannot get key of this registry item, because it is not registered. Use #isRegistered() before calling this method."); + return this.key; + } + + @Nullable + @Override + public NamespacedKey getKeyOrNull() { + return this.key; + } + + @Override + public boolean isRegistered() { + return this != UNKNOWN; + } } diff --git a/src/main/java/org/bukkit/entity/Frog.java b/src/main/java/org/bukkit/entity/Frog.java index db34a624..3deeda10 100644 --- a/src/main/java/org/bukkit/entity/Frog.java +++ b/src/main/java/org/bukkit/entity/Frog.java @@ -6,6 +6,7 @@ import java.util.Locale; import org.bukkit.Keyed; import org.bukkit.NamespacedKey; import org.bukkit.Registry; +import org.bukkit.registry.RegistryAware; import org.bukkit.util.OldEnum; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -48,7 +49,7 @@ public interface Frog extends Animals { /** * Represents the variant of a frog - ie its color. */ - interface Variant extends OldEnum, Keyed { + interface Variant extends OldEnum, Keyed, RegistryAware { /** * Temperate (brown-orange) frog. @@ -68,6 +69,18 @@ public interface Frog extends Animals { return Registry.FROG_VARIANT.getOrThrow(NamespacedKey.minecraft(key)); } + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ + @NotNull + @Override + @Deprecated(since = "1.21.4") + NamespacedKey getKey(); + /** * @param name of the frog variant. * @return the frog variant with the given name. diff --git a/src/main/java/org/bukkit/entity/Villager.java b/src/main/java/org/bukkit/entity/Villager.java index b67a4750..6dbc8521 100644 --- a/src/main/java/org/bukkit/entity/Villager.java +++ b/src/main/java/org/bukkit/entity/Villager.java @@ -9,6 +9,7 @@ import org.bukkit.Keyed; import org.bukkit.Location; import org.bukkit.NamespacedKey; import org.bukkit.Registry; +import org.bukkit.registry.RegistryAware; import org.bukkit.util.OldEnum; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -287,7 +288,7 @@ public interface Villager extends AbstractVillager { * Represents Villager type, usually corresponding to what biome they spawn * in. */ - interface Type extends OldEnum, Keyed { + interface Type extends OldEnum, Keyed, RegistryAware { Type DESERT = getType("desert"); Type JUNGLE = getType("jungle"); @@ -302,6 +303,18 @@ public interface Villager extends AbstractVillager { return Registry.VILLAGER_TYPE.getOrThrow(NamespacedKey.minecraft(key)); } + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ + @NotNull + @Override + @Deprecated(since = "1.21.4") + NamespacedKey getKey(); + /** * @param name of the villager type. * @return the villager type with the given name. @@ -330,7 +343,7 @@ public interface Villager extends AbstractVillager { * Represents the various different Villager professions there may be. * Villagers have different trading options depending on their profession, */ - interface Profession extends OldEnum, Keyed { + interface Profession extends OldEnum, Keyed, RegistryAware { Profession NONE = getProfession("none"); /** @@ -409,6 +422,18 @@ public interface Villager extends AbstractVillager { return Registry.VILLAGER_PROFESSION.getOrThrow(NamespacedKey.minecraft(key)); } + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ + @NotNull + @Override + @Deprecated(since = "1.21.4") + NamespacedKey getKey(); + /** * @param name of the villager profession. * @return the villager profession with the given name. diff --git a/src/main/java/org/bukkit/entity/Wolf.java b/src/main/java/org/bukkit/entity/Wolf.java index 91e96ee5..ebac1932 100644 --- a/src/main/java/org/bukkit/entity/Wolf.java +++ b/src/main/java/org/bukkit/entity/Wolf.java @@ -4,6 +4,7 @@ import org.bukkit.DyeColor; import org.bukkit.Keyed; import org.bukkit.NamespacedKey; import org.bukkit.Registry; +import org.bukkit.registry.RegistryAware; import org.jetbrains.annotations.NotNull; /** @@ -89,7 +90,7 @@ public interface Wolf extends Tameable, Sittable { /** * Represents the variant of a wolf. */ - interface Variant extends Keyed { + interface Variant extends Keyed, RegistryAware { Variant PALE = getVariant("pale"); Variant SPOTTED = getVariant("spotted"); @@ -105,5 +106,17 @@ public interface Wolf extends Tameable, Sittable { private static Variant getVariant(@NotNull String key) { return Registry.WOLF_VARIANT.getOrThrow(NamespacedKey.minecraft(key)); } + + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ + @NotNull + @Override + @Deprecated(since = "1.21.4") + NamespacedKey getKey(); } } diff --git a/src/main/java/org/bukkit/entity/memory/MemoryKey.java b/src/main/java/org/bukkit/entity/memory/MemoryKey.java index 8f601e85..28eb83e5 100644 --- a/src/main/java/org/bukkit/entity/memory/MemoryKey.java +++ b/src/main/java/org/bukkit/entity/memory/MemoryKey.java @@ -1,5 +1,6 @@ package org.bukkit.entity.memory; +import com.google.common.base.Preconditions; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -8,6 +9,7 @@ import java.util.UUID; import org.bukkit.Keyed; import org.bukkit.Location; import org.bukkit.NamespacedKey; +import org.bukkit.registry.RegistryAware; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -17,7 +19,7 @@ import org.jetbrains.annotations.Nullable; * * @param the class type of the memory value */ -public final class MemoryKey implements Keyed { +public final class MemoryKey implements Keyed, RegistryAware { private final NamespacedKey namespacedKey; private final Class tClass; @@ -30,8 +32,34 @@ public final class MemoryKey implements Keyed { @NotNull @Override + public NamespacedKey getKeyOrThrow() { + Preconditions.checkState(isRegistered(), "Cannot get key of this registry item, because it is not registered. Use #isRegistered() before calling this method."); + return this.namespacedKey; + } + + @Nullable + @Override + public NamespacedKey getKeyOrNull() { + return this.namespacedKey; + } + + @Override + public boolean isRegistered() { + return this.namespacedKey != null; + } + + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ + @NotNull + @Override + @Deprecated(since = "1.21.4") public NamespacedKey getKey() { - return namespacedKey; + return getKeyOrThrow(); } /** diff --git a/src/main/java/org/bukkit/generator/structure/Structure.java b/src/main/java/org/bukkit/generator/structure/Structure.java index 20a7fd27..0042b801 100644 --- a/src/main/java/org/bukkit/generator/structure/Structure.java +++ b/src/main/java/org/bukkit/generator/structure/Structure.java @@ -3,6 +3,7 @@ package org.bukkit.generator.structure; import org.bukkit.Keyed; import org.bukkit.NamespacedKey; import org.bukkit.Registry; +import org.bukkit.registry.RegistryAware; import org.jetbrains.annotations.NotNull; /** @@ -12,7 +13,7 @@ import org.jetbrains.annotations.NotNull; * there might be additional structures present (for example structures added by * data packs), which can be received via {@link Registry#STRUCTURE}. */ -public abstract class Structure implements Keyed { +public abstract class Structure implements Keyed, RegistryAware { public static final Structure PILLAGER_OUTPOST = getStructure("pillager_outpost"); public static final Structure MINESHAFT = getStructure("mineshaft"); @@ -61,4 +62,16 @@ public abstract class Structure implements Keyed { */ @NotNull public abstract StructureType getStructureType(); + + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ + @NotNull + @Override + @Deprecated(since = "1.21.4") + public abstract NamespacedKey getKey(); } diff --git a/src/main/java/org/bukkit/generator/structure/StructureType.java b/src/main/java/org/bukkit/generator/structure/StructureType.java index ffa0fc25..63fa2b5e 100644 --- a/src/main/java/org/bukkit/generator/structure/StructureType.java +++ b/src/main/java/org/bukkit/generator/structure/StructureType.java @@ -3,6 +3,7 @@ package org.bukkit.generator.structure; import org.bukkit.Keyed; import org.bukkit.NamespacedKey; import org.bukkit.Registry; +import org.bukkit.registry.RegistryAware; import org.jetbrains.annotations.NotNull; /** @@ -13,7 +14,7 @@ import org.jetbrains.annotations.NotNull; * structure types added by data packs), which can be received via * {@link Registry#STRUCTURE_TYPE}. */ -public abstract class StructureType implements Keyed { +public abstract class StructureType implements Keyed, RegistryAware { public static final StructureType BURIED_TREASURE = getStructureType("buried_treasure"); public static final StructureType DESERT_PYRAMID = getStructureType("desert_pyramid"); @@ -36,4 +37,16 @@ public abstract class StructureType implements Keyed { private static StructureType getStructureType(@NotNull String name) { return Registry.STRUCTURE_TYPE.getOrThrow(NamespacedKey.minecraft(name)); } + + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ + @NotNull + @Override + @Deprecated(since = "1.21.4") + public abstract NamespacedKey getKey(); } diff --git a/src/main/java/org/bukkit/inventory/ItemType.java b/src/main/java/org/bukkit/inventory/ItemType.java index 4f357925..7f693668 100644 --- a/src/main/java/org/bukkit/inventory/ItemType.java +++ b/src/main/java/org/bukkit/inventory/ItemType.java @@ -35,6 +35,7 @@ import org.bukkit.inventory.meta.SkullMeta; import org.bukkit.inventory.meta.SpawnEggMeta; import org.bukkit.inventory.meta.SuspiciousStewMeta; import org.bukkit.inventory.meta.TropicalFishBucketMeta; +import org.bukkit.registry.RegistryAware; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -47,7 +48,7 @@ import org.jetbrains.annotations.Nullable; * changes may occur. Do not use this API in plugins. */ @ApiStatus.Internal -public interface ItemType extends Keyed, Translatable { +public interface ItemType extends Keyed, Translatable, RegistryAware { /** * Typed represents a subtype of {@link ItemType}s that have a known item meta type @@ -2400,6 +2401,18 @@ public interface ItemType extends Keyed, Translatable { */ boolean isEnabledByFeature(@NotNull World world); + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ + @NotNull + @Override + @Deprecated(since = "1.21.4") + NamespacedKey getKey(); + /** * Tries to convert this ItemType into a Material * diff --git a/src/main/java/org/bukkit/inventory/MenuType.java b/src/main/java/org/bukkit/inventory/MenuType.java index c741186a..2e44eccc 100644 --- a/src/main/java/org/bukkit/inventory/MenuType.java +++ b/src/main/java/org/bukkit/inventory/MenuType.java @@ -17,6 +17,7 @@ import org.bukkit.inventory.view.StonecutterView; import org.bukkit.inventory.view.builder.InventoryViewBuilder; import org.bukkit.inventory.view.builder.LocationInventoryViewBuilder; import org.bukkit.inventory.view.builder.MerchantInventoryViewBuilder; +import org.bukkit.registry.RegistryAware; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; @@ -25,7 +26,7 @@ import org.jetbrains.annotations.NotNull; * created and viewed by the player. */ @ApiStatus.Experimental -public interface MenuType extends Keyed { +public interface MenuType extends Keyed, RegistryAware { /** * A MenuType which represents a chest with 1 row. @@ -197,6 +198,18 @@ public interface MenuType extends Keyed { @NotNull Class getInventoryViewClass(); + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ + @NotNull + @Override + @Deprecated(since = "1.21.4") + NamespacedKey getKey(); + @NotNull private static T get(@NotNull final String key) { return (T) Registry.MENU.getOrThrow(NamespacedKey.minecraft(key)); diff --git a/src/main/java/org/bukkit/inventory/meta/trim/TrimMaterial.java b/src/main/java/org/bukkit/inventory/meta/trim/TrimMaterial.java index ebfd6f55..ce29d34f 100644 --- a/src/main/java/org/bukkit/inventory/meta/trim/TrimMaterial.java +++ b/src/main/java/org/bukkit/inventory/meta/trim/TrimMaterial.java @@ -5,12 +5,13 @@ import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.Registry; import org.bukkit.Translatable; +import org.bukkit.registry.RegistryAware; import org.jetbrains.annotations.NotNull; /** * Represents a material that may be used in an {@link ArmorTrim}. */ -public interface TrimMaterial extends Keyed, Translatable { +public interface TrimMaterial extends Keyed, Translatable, RegistryAware { /** * {@link Material#QUARTZ}. @@ -61,4 +62,16 @@ public interface TrimMaterial extends Keyed, Translatable { private static TrimMaterial getTrimMaterial(@NotNull String key) { return Registry.TRIM_MATERIAL.getOrThrow(NamespacedKey.minecraft(key)); } + + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ + @NotNull + @Override + @Deprecated(since = "1.21.4") + NamespacedKey getKey(); } diff --git a/src/main/java/org/bukkit/inventory/meta/trim/TrimPattern.java b/src/main/java/org/bukkit/inventory/meta/trim/TrimPattern.java index e8e07864..12d413d3 100644 --- a/src/main/java/org/bukkit/inventory/meta/trim/TrimPattern.java +++ b/src/main/java/org/bukkit/inventory/meta/trim/TrimPattern.java @@ -5,12 +5,13 @@ import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.Registry; import org.bukkit.Translatable; +import org.bukkit.registry.RegistryAware; import org.jetbrains.annotations.NotNull; /** * Represents a pattern that may be used in an {@link ArmorTrim}. */ -public interface TrimPattern extends Keyed, Translatable { +public interface TrimPattern extends Keyed, Translatable, RegistryAware { /** * {@link Material#SENTRY_ARMOR_TRIM_SMITHING_TEMPLATE}. @@ -89,4 +90,16 @@ public interface TrimPattern extends Keyed, Translatable { private static TrimPattern getTrimPattern(@NotNull String key) { return Registry.TRIM_PATTERN.getOrThrow(NamespacedKey.minecraft(key)); } + + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ + @NotNull + @Override + @Deprecated(since = "1.21.4") + NamespacedKey getKey(); } diff --git a/src/main/java/org/bukkit/map/MapCursor.java b/src/main/java/org/bukkit/map/MapCursor.java index 3ca6d94e..2a0c4673 100644 --- a/src/main/java/org/bukkit/map/MapCursor.java +++ b/src/main/java/org/bukkit/map/MapCursor.java @@ -6,6 +6,7 @@ import java.util.Locale; import org.bukkit.Keyed; import org.bukkit.NamespacedKey; import org.bukkit.Registry; +import org.bukkit.registry.RegistryAware; import org.bukkit.util.OldEnum; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -229,7 +230,7 @@ public final class MapCursor { * index in the file './assets/minecraft/textures/map/map_icons.png' from minecraft.jar or from a * resource pack. */ - public interface Type extends OldEnum, Keyed { + public interface Type extends OldEnum, Keyed, RegistryAware { Type PLAYER = getType("player"); Type FRAME = getType("frame"); @@ -272,6 +273,18 @@ public final class MapCursor { return Registry.MAP_DECORATION_TYPE.getOrThrow(NamespacedKey.minecraft(key)); } + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ + @NotNull + @Override + @Deprecated(since = "1.21.4") + NamespacedKey getKey(); + /** * Gets the internal value of the cursor. * diff --git a/src/main/java/org/bukkit/potion/PotionEffectType.java b/src/main/java/org/bukkit/potion/PotionEffectType.java index 7fbcb125..52f7dbf0 100644 --- a/src/main/java/org/bukkit/potion/PotionEffectType.java +++ b/src/main/java/org/bukkit/potion/PotionEffectType.java @@ -10,6 +10,7 @@ import org.bukkit.Keyed; import org.bukkit.NamespacedKey; import org.bukkit.Registry; import org.bukkit.Translatable; +import org.bukkit.registry.RegistryAware; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -17,7 +18,7 @@ import org.jetbrains.annotations.Nullable; /** * Represents a type of potion and its effect on an entity. */ -public abstract class PotionEffectType implements Keyed, Translatable { +public abstract class PotionEffectType implements Keyed, Translatable, RegistryAware { private static final BiMap ID_MAP = HashBiMap.create(); /** @@ -265,6 +266,18 @@ public abstract class PotionEffectType implements Keyed, Translatable { @NotNull public abstract Color getColor(); + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ + @NotNull + @Override + @Deprecated(since = "1.21.4") + public abstract NamespacedKey getKey(); + /** * Returns the duration modifier applied to effects of this type. * diff --git a/src/main/java/org/bukkit/potion/PotionType.java b/src/main/java/org/bukkit/potion/PotionType.java index ca79f97b..03294f3d 100644 --- a/src/main/java/org/bukkit/potion/PotionType.java +++ b/src/main/java/org/bukkit/potion/PotionType.java @@ -1,11 +1,13 @@ package org.bukkit.potion; +import com.google.common.base.Preconditions; import com.google.common.base.Suppliers; import java.util.List; import java.util.function.Supplier; import org.bukkit.Bukkit; import org.bukkit.Keyed; import org.bukkit.NamespacedKey; +import org.bukkit.registry.RegistryAware; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -14,7 +16,7 @@ import org.jetbrains.annotations.Nullable; * This enum reflects and matches each potion state that can be obtained from * the Creative mode inventory */ -public enum PotionType implements Keyed { +public enum PotionType implements Keyed, RegistryAware { WATER("water"), MUNDANE("mundane"), THICK("thick"), @@ -124,6 +126,24 @@ public enum PotionType implements Keyed { return internalPotionDataSupplier.get().getMaxLevel(); } + @NotNull + @Override + public NamespacedKey getKeyOrThrow() { + Preconditions.checkState(isRegistered(), "Cannot get key of this registry item, because it is not registered. Use #isRegistered() before calling this method."); + return this.key; + } + + @Nullable + @Override + public NamespacedKey getKeyOrNull() { + return this.key; + } + + @Override + public boolean isRegistered() { + return this.key != null; + } + /** * @param effectType the effect to get by * @return the matching potion type @@ -141,10 +161,18 @@ public enum PotionType implements Keyed { return null; } + /** + * {@inheritDoc} + * + * @see #getKeyOrThrow() + * @see #isRegistered() + * @deprecated A key might not always be present, use {@link #getKeyOrThrow()} instead. + */ @NotNull @Override + @Deprecated(since = "1.21.4") public NamespacedKey getKey() { - return key; + return getKeyOrThrow(); } /** diff --git a/src/main/java/org/bukkit/registry/RegistryAware.java b/src/main/java/org/bukkit/registry/RegistryAware.java new file mode 100644 index 00000000..c48fd260 --- /dev/null +++ b/src/main/java/org/bukkit/registry/RegistryAware.java @@ -0,0 +1,47 @@ +package org.bukkit.registry; + +import org.bukkit.NamespacedKey; +import org.bukkit.Registry; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Indicates that instances of a class may be registered to the server and have a key associated with them. + * + * @see Registry + */ +public interface RegistryAware { + + /** + * Gets the key of this instance if it is registered otherwise throws an error. + *
+ * This is a convenience method and plugins should always check {@link #isRegistered()} before using this method. + * + * @return the key with which this instance is registered. + * @throws IllegalStateException if this instance is not registered. + * @see #isRegistered() + * @see #getKeyOrNull() + * @see Registry + */ + @NotNull + NamespacedKey getKeyOrThrow(); + + /** + * Gets the key of this instance if it is registered otherwise returns {@code null}. + * + * @return the key with which this instance is registered or {@code null} if not registered. + * @see #getKeyOrThrow() + * @see Registry + */ + @Nullable + NamespacedKey getKeyOrNull(); + + /** + * Returns whether this instance is register in a registry and therefore has a key or not. + * + * @return true, if this instance is registered. Otherwise, false. + * @see #getKeyOrThrow() + * @see Registry + */ + boolean isRegistered(); +} diff --git a/src/main/java/org/bukkit/registry/package-info.java b/src/main/java/org/bukkit/registry/package-info.java new file mode 100644 index 00000000..0b8b0ce6 --- /dev/null +++ b/src/main/java/org/bukkit/registry/package-info.java @@ -0,0 +1,4 @@ +/** + * Class related to {@link org.bukkit.Registry} + */ +package org.bukkit.registry;