aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/api/0430-Improve-Registry.patch
blob: 453d8c9488b4f6c6a5447518a68736d519fefaf1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jake Potrebic <jake.m.potrebic@gmail.com>
Date: Wed, 20 Dec 2023 02:03:10 -0800
Subject: [PATCH] Improve Registry

Adds Registry#getKey(Object) which should be the
primary way people get the key for an object. Registry
items need to exist without having a key and so
getKey() methods on Keyed objects that have a registry
are marked as Deprecated or Obsolete.

diff --git a/src/main/java/org/bukkit/Art.java b/src/main/java/org/bukkit/Art.java
index 042d1d932a33022e4fc873652f70dc6ed342d46a..e57e34064262b90221b0621f1d13e9705e68421a 100644
--- a/src/main/java/org/bukkit/Art.java
+++ b/src/main/java/org/bukkit/Art.java
@@ -103,6 +103,13 @@ public enum Art implements Keyed {
         return id;
     }
 
+    // Paper start - deprecate getKey
+    /**
+     * @deprecated use {@link Registry#getKey(Keyed)}, {@link io.papermc.paper.registry.RegistryAccess#getRegistry(io.papermc.paper.registry.RegistryKey)},
+     * and {@link io.papermc.paper.registry.RegistryKey#PAINTING_VARIANT}. Painting variants can exist without a key.
+     */
+    @Deprecated(since = "1.21")
+    // Paper end - deprecate getKey
     @NotNull
     @Override
     public NamespacedKey getKey() {
diff --git a/src/main/java/org/bukkit/MusicInstrument.java b/src/main/java/org/bukkit/MusicInstrument.java
index c9f02466a04d20579fe2258bb02acf98e163ca81..bffd4ab2d08e5c3f83a49a31e1e55cc1eab7b319 100644
--- a/src/main/java/org/bukkit/MusicInstrument.java
+++ b/src/main/java/org/bukkit/MusicInstrument.java
@@ -47,6 +47,16 @@ public abstract class MusicInstrument implements Keyed, net.kyori.adventure.tran
         return Registry.INSTRUMENT.getOrThrow(NamespacedKey.minecraft(key));
     }
 
+    // Paper start - deprecate getKey
+    /**
+     * @deprecated use {@link Registry#getKey(Keyed)} and {@link Registry#INSTRUMENT}. MusicInstruments
+     * can exist without a key.
+     */
+    @Deprecated(forRemoval = true, since = "1.20.5")
+    @Override
+    public abstract @NotNull NamespacedKey getKey();
+    // Paper end - deprecate getKey
+
     // Paper start - translation key
     @Override
     public @NotNull String translationKey() {
diff --git a/src/main/java/org/bukkit/Registry.java b/src/main/java/org/bukkit/Registry.java
index 6112db5d1153d045f2271038bada6b46d1a6a051..67cf3fcad21a8977d6fad172cc776b628ab68f25 100644
--- a/src/main/java/org/bukkit/Registry.java
+++ b/src/main/java/org/bukkit/Registry.java
@@ -379,6 +379,79 @@ public interface Registry<T extends Keyed> extends Iterable<T> {
     @Nullable
     T get(@NotNull NamespacedKey key);
 
+    // Paper start - improve Registry
+    /**
+     * Gets the object by its key or throws if it doesn't exist.
+     *
+     * @param key the key to get the object of in this registry
+     * @return the object for the key
+     * @throws java.util.NoSuchElementException if the key doesn't point to an object in the registry
+     */
+    default @NotNull T getOrThrow(final net.kyori.adventure.key.@NotNull Key key) {
+        final T value = this.get(key);
+        if (value == null) {
+            throw new java.util.NoSuchElementException("No value for " + key + " in " + this);
+        }
+        return value;
+    }
+
+    /**
+     * Gets the object by its key or throws if it doesn't exist.
+     *
+     * @param key the key to get the object of in this registry
+     * @return the object for the key
+     * @throws java.util.NoSuchElementException if the key doesn't point to an object in the registry
+     */
+    default @NotNull T getOrThrow(final io.papermc.paper.registry.@NotNull TypedKey<T> key) {
+        final T value = this.get(key);
+        if (value == null) {
+            throw new java.util.NoSuchElementException("No value for " + key + " in " + this);
+        }
+        return value;
+    }
+
+    /**
+     * Gets the key for this object or throws if it doesn't exist.
+     * <p>
+     * Some types can exist without being in a registry
+     * and such will have no key associated with them. This
+     * method throw an exception if it isn't in this registry.
+     *
+     * @param value the value to get the key of in this registry
+     * @return the key for the value
+     * @throws java.util.NoSuchElementException if the value doesn't exist in this registry
+     * @see #getKey(Keyed)
+     */
+    default @NotNull NamespacedKey getKeyOrThrow(final @NotNull T value) {
+        Preconditions.checkArgument(value != null, "value cannot be null");
+        final NamespacedKey key = this.getKey(value);
+        if (key == null) {
+            throw new java.util.NoSuchElementException(value + " has no key in " + this);
+        }
+        return key;
+    }
+
+    /**
+     * Get the key for this object.
+     * <p>
+     * Some types can exist without being in a registry
+     * and such will have no key associated with them. This
+     * method will return null.
+     *
+     * @param value the value to get the key of in this registry
+     * @return the key for the value or null if not in the registry
+     * @see #getKeyOrThrow(Keyed)
+     */
+    default @Nullable NamespacedKey getKey(final @NotNull T value) {
+        Preconditions.checkArgument(value != null, "value cannot be null");
+        //noinspection ConstantValue (it might not be in the future...)
+        if (value instanceof Keyed) {
+            return value.getKey();
+        }
+        return null;
+    }
+    // Paper end - improve Registry
+
     /**
      * Get the object by its key.
      *
@@ -475,5 +548,12 @@ public interface Registry<T extends Keyed> extends Iterable<T> {
         public Class<T> getType() {
             return this.type;
         }
+
+        // Paper start - improve Registry
+        @Override
+        public @NotNull NamespacedKey getKey(final @NotNull T value) {
+            return value.getKey();
+        }
+        // Paper end - improve Registry
     }
 }
diff --git a/src/main/java/org/bukkit/Sound.java b/src/main/java/org/bukkit/Sound.java
index 8c7b50906fc5b84c5570408f357410810bbfbded..7a35120c82b88774de777d3c3176ef553a8e9244 100644
--- a/src/main/java/org/bukkit/Sound.java
+++ b/src/main/java/org/bukkit/Sound.java
@@ -1636,6 +1636,13 @@ public enum Sound implements Keyed, net.kyori.adventure.sound.Sound.Type { // Pa
         this.key = NamespacedKey.minecraft(key);
     }
 
+    // Paper start - deprecate getKey
+    /**
+     * @deprecated use {@link Registry#getKey(Keyed)} and {@link Registry#SOUNDS}. Sounds
+     * can exist without a key.
+     */
+    @Deprecated(since = "1.20.5")
+    // Paper end - deprecate getKey
     @NotNull
     @Override
     public NamespacedKey getKey() {
diff --git a/src/main/java/org/bukkit/block/banner/PatternType.java b/src/main/java/org/bukkit/block/banner/PatternType.java
index eaf6cd758344eeba29f00f822a50c93704af8bda..eb192030832e1741850871bec9bf999f014b6fc1 100644
--- a/src/main/java/org/bukkit/block/banner/PatternType.java
+++ b/src/main/java/org/bukkit/block/banner/PatternType.java
@@ -56,6 +56,13 @@ public interface PatternType extends OldEnum<PatternType>, Keyed {
     PatternType FLOW = getType("flow");
     PatternType GUSTER = getType("guster");
 
+    // Paper start - deprecate getKey
+    /**
+     * @deprecated use {@link Registry#getKey(Keyed)}, {@link io.papermc.paper.registry.RegistryAccess#getRegistry(io.papermc.paper.registry.RegistryKey)},
+     * and {@link io.papermc.paper.registry.RegistryKey#BANNER_PATTERN}. PatternTypes can exist without a key.
+     */
+    @Deprecated(since = "1.20.5")
+    // Paper end - deprecate getKey
     @Override
     @NotNull
     public NamespacedKey getKey();
diff --git a/src/main/java/org/bukkit/generator/structure/Structure.java b/src/main/java/org/bukkit/generator/structure/Structure.java
index 20a7fd27ba3a029d58dd18ad9b470ffaed8c9578..a773550549b4093a5fb4ef47284c438dcddd99ab 100644
--- a/src/main/java/org/bukkit/generator/structure/Structure.java
+++ b/src/main/java/org/bukkit/generator/structure/Structure.java
@@ -61,4 +61,13 @@ public abstract class Structure implements Keyed {
      */
     @NotNull
     public abstract StructureType getStructureType();
+    // Paper start - deprecate getKey
+    /**
+     * @deprecated use {@link Registry#getKey(Keyed)} and {@link Registry#STRUCTURE}. Structures
+     * can exist without a key.
+     */
+    @Override
+    @Deprecated(since = "1.20.4")
+    public abstract @NotNull NamespacedKey getKey();
+    // Paper end - deprecate getKey
 }
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 804cb7162b34225d5dd84aada283de568d7d6592..2a7bedf850896e358213c2a201ca3d611cb9ea67 100644
--- a/src/main/java/org/bukkit/inventory/meta/trim/TrimMaterial.java
+++ b/src/main/java/org/bukkit/inventory/meta/trim/TrimMaterial.java
@@ -74,4 +74,14 @@ public interface TrimMaterial extends Keyed, Translatable {
     @Deprecated(forRemoval = true)
     @org.jetbrains.annotations.NotNull String getTranslationKey();
     // Paper end - adventure
+
+    // Paper start - Registry#getKey
+    /**
+     * @deprecated use {@link Registry#getKey(Keyed)}, {@link io.papermc.paper.registry.RegistryAccess#getRegistry(io.papermc.paper.registry.RegistryKey)},
+     * and {@link io.papermc.paper.registry.RegistryKey#TRIM_MATERIAL}. TrimMaterials can exist without a key.
+     */
+    @Deprecated(forRemoval = true, since = "1.20.4")
+    @Override
+    org.bukkit.@org.jetbrains.annotations.NotNull NamespacedKey getKey();
+    // Paper end - Registry#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 56cfe665daba1754e41f633d7c18172bebf87028..db657206c158e755227e8ef8e102a2ee2cc3bf0a 100644
--- a/src/main/java/org/bukkit/inventory/meta/trim/TrimPattern.java
+++ b/src/main/java/org/bukkit/inventory/meta/trim/TrimPattern.java
@@ -106,4 +106,14 @@ public interface TrimPattern extends Keyed, Translatable {
     @Deprecated(forRemoval = true)
     @org.jetbrains.annotations.NotNull String getTranslationKey();
     // Paper end - adventure
+
+    // Paper start - Registry#getKey
+    /**
+     * @deprecated use {@link Registry#getKey(Keyed)}, {@link io.papermc.paper.registry.RegistryAccess#getRegistry(io.papermc.paper.registry.RegistryKey)},
+     * and {@link io.papermc.paper.registry.RegistryKey#TRIM_PATTERN}. TrimPatterns can exist without a key.
+     */
+    @Deprecated(forRemoval = true, since = "1.20.4")
+    @Override
+    org.bukkit.@org.jetbrains.annotations.NotNull NamespacedKey getKey();
+    // Paper end - Registry#getKey
 }