93 lines
		
	
	
	
		
			2.9 KiB
			
		
	
	
	
		
			Diff
		
	
	
	
	
	
		
		
			
		
	
	
			93 lines
		
	
	
	
		
			2.9 KiB
			
		
	
	
	
		
			Diff
		
	
	
	
	
	
| 
								 | 
							
								From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
							 | 
						||
| 
								 | 
							
								From: Jake Potrebic <jake.m.potrebic@gmail.com>
							 | 
						||
| 
								 | 
							
								Date: Wed, 2 Mar 2022 13:36:21 -0800
							 | 
						||
| 
								 | 
							
								Subject: [PATCH] Add PaperRegistry
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								diff --git a/src/main/java/io/papermc/paper/registry/Reference.java b/src/main/java/io/papermc/paper/registry/Reference.java
							 | 
						||
| 
								 | 
							
								new file mode 100644
							 | 
						||
| 
								 | 
							
								index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
							 | 
						||
| 
								 | 
							
								--- /dev/null
							 | 
						||
| 
								 | 
							
								+++ b/src/main/java/io/papermc/paper/registry/Reference.java
							 | 
						||
| 
								 | 
							
								@@ -0,0 +0,0 @@
							 | 
						||
| 
								 | 
							
								+package io.papermc.paper.registry;
							 | 
						||
| 
								 | 
							
								+
							 | 
						||
| 
								 | 
							
								+import org.bukkit.Keyed;
							 | 
						||
| 
								 | 
							
								+import org.bukkit.NamespacedKey;
							 | 
						||
| 
								 | 
							
								+import org.bukkit.Registry;
							 | 
						||
| 
								 | 
							
								+import org.jetbrains.annotations.NotNull;
							 | 
						||
| 
								 | 
							
								+import org.jetbrains.annotations.Nullable;
							 | 
						||
| 
								 | 
							
								+
							 | 
						||
| 
								 | 
							
								+/**
							 | 
						||
| 
								 | 
							
								+ * Represents a reference to a server-backed registry value that may
							 | 
						||
| 
								 | 
							
								+ * change.
							 | 
						||
| 
								 | 
							
								+ *
							 | 
						||
| 
								 | 
							
								+ * @param <T> type of the value
							 | 
						||
| 
								 | 
							
								+ */
							 | 
						||
| 
								 | 
							
								+public interface Reference<T extends Keyed> extends Keyed {
							 | 
						||
| 
								 | 
							
								+
							 | 
						||
| 
								 | 
							
								+    /**
							 | 
						||
| 
								 | 
							
								+     * Gets the value from the registry with the key.
							 | 
						||
| 
								 | 
							
								+     *
							 | 
						||
| 
								 | 
							
								+     * @return the value
							 | 
						||
| 
								 | 
							
								+     * @throws java.util.NoSuchElementException if there is no value with this key
							 | 
						||
| 
								 | 
							
								+     */
							 | 
						||
| 
								 | 
							
								+    @NotNull T value();
							 | 
						||
| 
								 | 
							
								+
							 | 
						||
| 
								 | 
							
								+    /**
							 | 
						||
| 
								 | 
							
								+     * Gets the value from the registry with the key.
							 | 
						||
| 
								 | 
							
								+     *
							 | 
						||
| 
								 | 
							
								+     * @return the value or null if it doesn't exist
							 | 
						||
| 
								 | 
							
								+     */
							 | 
						||
| 
								 | 
							
								+    @Nullable T valueOrNull();
							 | 
						||
| 
								 | 
							
								+
							 | 
						||
| 
								 | 
							
								+    /**
							 | 
						||
| 
								 | 
							
								+     * Creates a reference to a registered value.
							 | 
						||
| 
								 | 
							
								+     *
							 | 
						||
| 
								 | 
							
								+     * @param registry the registry the value is located in
							 | 
						||
| 
								 | 
							
								+     * @param key the key to the value
							 | 
						||
| 
								 | 
							
								+     * @param <T> the type of the value
							 | 
						||
| 
								 | 
							
								+     * @return a reference
							 | 
						||
| 
								 | 
							
								+     */
							 | 
						||
| 
								 | 
							
								+    static <T extends Keyed> @NotNull Reference<T> create(@NotNull Registry<T> registry, @NotNull NamespacedKey key) {
							 | 
						||
| 
								 | 
							
								+        return new ReferenceImpl<>(registry, key);
							 | 
						||
| 
								 | 
							
								+    }
							 | 
						||
| 
								 | 
							
								+}
							 | 
						||
| 
								 | 
							
								diff --git a/src/main/java/io/papermc/paper/registry/ReferenceImpl.java b/src/main/java/io/papermc/paper/registry/ReferenceImpl.java
							 | 
						||
| 
								 | 
							
								new file mode 100644
							 | 
						||
| 
								 | 
							
								index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
							 | 
						||
| 
								 | 
							
								--- /dev/null
							 | 
						||
| 
								 | 
							
								+++ b/src/main/java/io/papermc/paper/registry/ReferenceImpl.java
							 | 
						||
| 
								 | 
							
								@@ -0,0 +0,0 @@
							 | 
						||
| 
								 | 
							
								+package io.papermc.paper.registry;
							 | 
						||
| 
								 | 
							
								+
							 | 
						||
| 
								 | 
							
								+import org.bukkit.Keyed;
							 | 
						||
| 
								 | 
							
								+import org.bukkit.NamespacedKey;
							 | 
						||
| 
								 | 
							
								+import org.bukkit.Registry;
							 | 
						||
| 
								 | 
							
								+import org.jetbrains.annotations.NotNull;
							 | 
						||
| 
								 | 
							
								+import org.jetbrains.annotations.Nullable;
							 | 
						||
| 
								 | 
							
								+
							 | 
						||
| 
								 | 
							
								+import java.util.NoSuchElementException;
							 | 
						||
| 
								 | 
							
								+
							 | 
						||
| 
								 | 
							
								+record ReferenceImpl<T extends Keyed>(@NotNull Registry<T> registry, @NotNull NamespacedKey key) implements Reference<T> {
							 | 
						||
| 
								 | 
							
								+
							 | 
						||
| 
								 | 
							
								+    @Override
							 | 
						||
| 
								 | 
							
								+    public @NotNull T value() {
							 | 
						||
| 
								 | 
							
								+        final T value = this.registry.get(this.key);
							 | 
						||
| 
								 | 
							
								+        if (value == null) {
							 | 
						||
| 
								 | 
							
								+            throw new NoSuchElementException("No such value with key " + this.key);
							 | 
						||
| 
								 | 
							
								+        }
							 | 
						||
| 
								 | 
							
								+        return value;
							 | 
						||
| 
								 | 
							
								+    }
							 | 
						||
| 
								 | 
							
								+
							 | 
						||
| 
								 | 
							
								+    @Override
							 | 
						||
| 
								 | 
							
								+    public @Nullable T valueOrNull() {
							 | 
						||
| 
								 | 
							
								+        return this.registry.get(this.key);
							 | 
						||
| 
								 | 
							
								+    }
							 | 
						||
| 
								 | 
							
								+
							 | 
						||
| 
								 | 
							
								+    @Override
							 | 
						||
| 
								 | 
							
								+    public @NotNull NamespacedKey getKey() {
							 | 
						||
| 
								 | 
							
								+        return this.key;
							 | 
						||
| 
								 | 
							
								+    }
							 | 
						||
| 
								 | 
							
								+}
							 |