aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--paper-server/src/main/java/io/papermc/paper/registry/PaperRegistries.java2
-rw-r--r--paper-server/src/main/java/io/papermc/paper/registry/PaperRegistryAccess.java7
-rw-r--r--paper-server/src/main/java/io/papermc/paper/registry/PaperRegistryBuilder.java10
-rw-r--r--paper-server/src/main/java/io/papermc/paper/registry/PaperRegistryListenerManager.java41
-rw-r--r--paper-server/src/main/java/io/papermc/paper/registry/WritableCraftRegistry.java19
-rw-r--r--paper-server/src/main/java/io/papermc/paper/registry/entry/AddableRegistryEntry.java41
-rw-r--r--paper-server/src/main/java/io/papermc/paper/registry/entry/ApiRegistryEntry.java27
-rw-r--r--paper-server/src/main/java/io/papermc/paper/registry/entry/BaseRegistryEntry.java27
-rw-r--r--paper-server/src/main/java/io/papermc/paper/registry/entry/CraftRegistryEntry.java51
-rw-r--r--paper-server/src/main/java/io/papermc/paper/registry/entry/ModifiableRegistryEntry.java29
-rw-r--r--paper-server/src/main/java/io/papermc/paper/registry/entry/RegistryEntry.java86
-rw-r--r--paper-server/src/main/java/io/papermc/paper/registry/entry/RegistryEntryBuilder.java28
-rw-r--r--paper-server/src/main/java/io/papermc/paper/registry/entry/RegistryEntryImpl.java13
-rw-r--r--paper-server/src/main/java/io/papermc/paper/registry/entry/RegistryEntryInfo.java12
-rw-r--r--paper-server/src/main/java/io/papermc/paper/registry/entry/RegistryEntryMeta.java122
-rw-r--r--paper-server/src/main/java/io/papermc/paper/registry/entry/WritableRegistryEntry.java25
-rw-r--r--paper-server/src/main/java/io/papermc/paper/registry/legacy/DelayedRegistryEntry.java16
-rw-r--r--paper-server/src/main/java/org/bukkit/craftbukkit/CraftRegistry.java6
-rw-r--r--paper-server/src/test/java/io/papermc/paper/registry/RegistryBuilderTest.java15
19 files changed, 220 insertions, 357 deletions
diff --git a/paper-server/src/main/java/io/papermc/paper/registry/PaperRegistries.java b/paper-server/src/main/java/io/papermc/paper/registry/PaperRegistries.java
index 3ebc3dbc86..a41356e136 100644
--- a/paper-server/src/main/java/io/papermc/paper/registry/PaperRegistries.java
+++ b/paper-server/src/main/java/io/papermc/paper/registry/PaperRegistries.java
@@ -104,7 +104,7 @@ public final class PaperRegistries {
start(Registries.TRIM_PATTERN, RegistryKey.TRIM_PATTERN).craft(TrimPattern.class, CraftTrimPattern::new).build().delayed(),
start(Registries.DAMAGE_TYPE, RegistryKey.DAMAGE_TYPE).craft(DamageType.class, CraftDamageType::new).build().delayed(),
start(Registries.WOLF_VARIANT, RegistryKey.WOLF_VARIANT).craft(Wolf.Variant.class, CraftWolf.CraftVariant::new).build().delayed(),
- start(Registries.ENCHANTMENT, RegistryKey.ENCHANTMENT).craft(Enchantment.class, CraftEnchantment::new).writable(PaperEnchantmentRegistryEntry.PaperBuilder::new).withSerializationUpdater(FieldRename.ENCHANTMENT_RENAME).delayed(),
+ start(Registries.ENCHANTMENT, RegistryKey.ENCHANTMENT).craft(Enchantment.class, CraftEnchantment::new).serializationUpdater(FieldRename.ENCHANTMENT_RENAME).writable(PaperEnchantmentRegistryEntry.PaperBuilder::new).delayed(),
start(Registries.JUKEBOX_SONG, RegistryKey.JUKEBOX_SONG).craft(JukeboxSong.class, CraftJukeboxSong::new).build().delayed(),
start(Registries.BANNER_PATTERN, RegistryKey.BANNER_PATTERN).craft(PatternType.class, CraftPatternType::new).build().delayed(),
start(Registries.PAINTING_VARIANT, RegistryKey.PAINTING_VARIANT).craft(Art.class, CraftArt::new).writable(PaperPaintingVariantRegistryEntry.PaperBuilder::new).delayed(),
diff --git a/paper-server/src/main/java/io/papermc/paper/registry/PaperRegistryAccess.java b/paper-server/src/main/java/io/papermc/paper/registry/PaperRegistryAccess.java
index ed071ed34e..3be7e0a1fb 100644
--- a/paper-server/src/main/java/io/papermc/paper/registry/PaperRegistryAccess.java
+++ b/paper-server/src/main/java/io/papermc/paper/registry/PaperRegistryAccess.java
@@ -1,7 +1,7 @@
package io.papermc.paper.registry;
-import io.papermc.paper.registry.entry.ApiRegistryEntry;
import io.papermc.paper.registry.entry.RegistryEntry;
+import io.papermc.paper.registry.entry.RegistryEntryMeta;
import io.papermc.paper.registry.legacy.DelayedRegistry;
import io.papermc.paper.registry.legacy.DelayedRegistryEntry;
import io.papermc.paper.registry.legacy.LegacyRegistryIdentifiers;
@@ -31,7 +31,10 @@ public class PaperRegistryAccess implements RegistryAccess {
@VisibleForTesting
public Set<RegistryKey<?>> getLoadedServerBackedRegistries() {
- return this.registries.keySet().stream().filter(registryHolder -> !(PaperRegistries.getEntry(registryHolder) instanceof ApiRegistryEntry)).collect(Collectors.toUnmodifiableSet());
+ return this.registries.keySet().stream().filter(registryHolder -> {
+ final RegistryEntry<?, ?> entry = PaperRegistries.getEntry(registryHolder);
+ return entry != null && !(entry.meta() instanceof RegistryEntryMeta.ApiOnly<?,?>);
+ }).collect(Collectors.toUnmodifiableSet());
}
@SuppressWarnings("unchecked")
diff --git a/paper-server/src/main/java/io/papermc/paper/registry/PaperRegistryBuilder.java b/paper-server/src/main/java/io/papermc/paper/registry/PaperRegistryBuilder.java
index 6a60d7b7ed..a3cb9a4209 100644
--- a/paper-server/src/main/java/io/papermc/paper/registry/PaperRegistryBuilder.java
+++ b/paper-server/src/main/java/io/papermc/paper/registry/PaperRegistryBuilder.java
@@ -12,14 +12,8 @@ public interface PaperRegistryBuilder<M, T> extends RegistryBuilder<T> {
B fill(Conversions conversions, @Nullable M nms);
- default Factory<M, T, B> asFactory() {
- return (lookup) -> this.fill(lookup, null);
+ default B create(final Conversions conversions) {
+ return this.fill(conversions, null);
}
}
-
- @FunctionalInterface
- interface Factory<M, T, B extends PaperRegistryBuilder<M, T>> {
-
- B create(Conversions conversions);
- }
}
diff --git a/paper-server/src/main/java/io/papermc/paper/registry/PaperRegistryListenerManager.java b/paper-server/src/main/java/io/papermc/paper/registry/PaperRegistryListenerManager.java
index 4f98c15d40..540aaa0964 100644
--- a/paper-server/src/main/java/io/papermc/paper/registry/PaperRegistryListenerManager.java
+++ b/paper-server/src/main/java/io/papermc/paper/registry/PaperRegistryListenerManager.java
@@ -9,7 +9,7 @@ import io.papermc.paper.plugin.lifecycle.event.LifecycleEventRunner;
import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEventType;
import io.papermc.paper.registry.data.util.Conversions;
import io.papermc.paper.registry.entry.RegistryEntry;
-import io.papermc.paper.registry.entry.RegistryEntryInfo;
+import io.papermc.paper.registry.entry.RegistryEntryMeta;
import io.papermc.paper.registry.event.RegistryEntryAddEventImpl;
import io.papermc.paper.registry.event.RegistryEventMap;
import io.papermc.paper.registry.event.RegistryEventProvider;
@@ -28,6 +28,7 @@ import net.minecraft.core.WritableRegistry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
+import org.bukkit.Keyed;
import org.intellij.lang.annotations.Subst;
import org.jspecify.annotations.Nullable;
@@ -86,8 +87,7 @@ public class PaperRegistryListenerManager {
this.registerWithListeners(registry, key, nms, registrationInfo, WritableRegistry::register, conversions);
}
- // TODO remove Keyed
- public <M, T extends org.bukkit.Keyed, B extends PaperRegistryBuilder<M, T>, R> R registerWithListeners(
+ public <M, T extends Keyed, B extends PaperRegistryBuilder<M, T>, R> R registerWithListeners( // TODO remove Keyed
final Registry<M> registry,
final ResourceKey<M> key,
final M nms,
@@ -96,34 +96,33 @@ public class PaperRegistryListenerManager {
final Conversions conversions
) {
Preconditions.checkState(LaunchEntryPointHandler.INSTANCE.hasEntered(Entrypoint.BOOTSTRAPPER), registry.key() + " tried to run modification listeners before bootstrappers have been called"); // verify that bootstrappers have been called
- final RegistryEntryInfo<M, T> entry = PaperRegistries.getEntry(registry.key());
- if (!RegistryEntry.Modifiable.isModifiable(entry) || !this.valueAddEventTypes.hasHandlers(entry.apiKey())) {
+ final RegistryEntry<M, T> entry = PaperRegistries.getEntry(registry.key());
+ if (entry == null || !entry.meta().modificationApiSupport().canModify() || !this.valueAddEventTypes.hasHandlers(entry.apiKey())) {
return registerMethod.register((WritableRegistry<M>) registry, key, nms, registrationInfo);
}
- final RegistryEntry.Modifiable<M, T, B> modifiableEntry = RegistryEntry.Modifiable.asModifiable(entry);
- @SuppressWarnings("PatternValidation") final TypedKey<T> typedKey = TypedKey.create(entry.apiKey(), Key.key(key.location().getNamespace(), key.location().getPath()));
- final B builder = modifiableEntry.fillBuilder(conversions, nms);
+ final RegistryEntryMeta.Buildable<M, T, B> modifiableEntry = (RegistryEntryMeta.Buildable<M, T, B>) entry.meta();
+ final B builder = modifiableEntry.builderFiller().fill(conversions, nms);
return this.registerWithListeners(registry, modifiableEntry, key, nms, builder, registrationInfo, registerMethod, conversions);
}
- <M, T extends org.bukkit.Keyed, B extends PaperRegistryBuilder<M, T>> void registerWithListeners( // TODO remove Keyed
+ <M, T extends Keyed, B extends PaperRegistryBuilder<M, T>> void registerWithListeners( // TODO remove Keyed
final WritableRegistry<M> registry,
- final RegistryEntryInfo<M, T> entry,
+ final RegistryEntryMeta.Buildable<M, T, B> entry,
final ResourceKey<M> key,
final B builder,
final RegistrationInfo registrationInfo,
final Conversions conversions
) {
- if (!RegistryEntry.Modifiable.isModifiable(entry) || !this.valueAddEventTypes.hasHandlers(entry.apiKey())) {
+ if (!entry.modificationApiSupport().canModify() || !this.valueAddEventTypes.hasHandlers(entry.apiKey())) {
registry.register(key, builder.build(), registrationInfo);
return;
}
- this.registerWithListeners(registry, RegistryEntry.Modifiable.asModifiable(entry), key, null, builder, registrationInfo, WritableRegistry::register, conversions);
+ this.registerWithListeners(registry, entry, key, null, builder, registrationInfo, WritableRegistry::register, conversions);
}
- public <M, T extends org.bukkit.Keyed, B extends PaperRegistryBuilder<M, T>, R> R registerWithListeners( // TODO remove Keyed
+ public <M, T extends Keyed, B extends PaperRegistryBuilder<M, T>, R> R registerWithListeners( // TODO remove Keyed
final Registry<M> registry,
- final RegistryEntry.Modifiable<M, T, B> entry,
+ final RegistryEntryMeta.Buildable<M, T, B> entry,
final ResourceKey<M> key,
final @Nullable M oldNms,
final B builder,
@@ -156,26 +155,28 @@ public class PaperRegistryListenerManager {
R register(WritableRegistry<M> writableRegistry, ResourceKey<M> key, M value, RegistrationInfo registrationInfo);
}
- public <M, T extends org.bukkit.Keyed, B extends PaperRegistryBuilder<M, T>> void runFreezeListeners(final ResourceKey<? extends Registry<M>> resourceKey, final Conversions conversions) {
- final RegistryEntryInfo<M, T> entry = PaperRegistries.getEntry(resourceKey);
- if (!RegistryEntry.Addable.isAddable(entry) || !this.freezeEventTypes.hasHandlers(entry.apiKey())) {
+ public <M, T extends Keyed, B extends PaperRegistryBuilder<M, T>> void runFreezeListeners(final ResourceKey<? extends Registry<M>> resourceKey, final Conversions conversions) {
+ final RegistryEntry<M, T> entry = PaperRegistries.getEntry(resourceKey);
+ if (entry == null || !entry.meta().modificationApiSupport().canAdd() || !this.freezeEventTypes.hasHandlers(entry.apiKey())) {
return;
}
- final RegistryEntry.Addable<M, T, B> writableEntry = RegistryEntry.Addable.asAddable(entry);
+ final RegistryEntryMeta.Buildable<M, T, B> writableEntry = (RegistryEntryMeta.Buildable<M, T, B>) entry.meta();
final WritableCraftRegistry<M, T, B> writableRegistry = PaperRegistryAccess.instance().getWritableRegistry(entry.apiKey());
final RegistryFreezeEventImpl<T, B> event = writableEntry.createFreezeEvent(writableRegistry, conversions);
LifecycleEventRunner.INSTANCE.callEvent(this.freezeEventTypes.getEventType(entry.apiKey()), event);
}
public <T, B extends RegistryBuilder<T>> RegistryEntryAddEventType<T, B> getRegistryValueAddEventType(final RegistryEventProvider<T, B> type) {
- if (!RegistryEntry.Modifiable.isModifiable(PaperRegistries.getEntry(type.registryKey()))) {
+ final RegistryEntry<?, ?> entry = PaperRegistries.getEntry(type.registryKey());
+ if (entry == null || !entry.meta().modificationApiSupport().canModify()) {
throw new IllegalArgumentException(type.registryKey() + " does not support RegistryEntryAddEvent");
}
return this.valueAddEventTypes.getOrCreate(type.registryKey(), RegistryEntryAddEventTypeImpl::new);
}
public <T, B extends RegistryBuilder<T>> LifecycleEventType.Prioritizable<BootstrapContext, RegistryFreezeEvent<T, B>> getRegistryFreezeEventType(final RegistryEventProvider<T, B> type) {
- if (!RegistryEntry.Addable.isAddable(PaperRegistries.getEntry(type.registryKey()))) {
+ final RegistryEntry<?, ?> entry = PaperRegistries.getEntry(type.registryKey());
+ if (entry == null || !entry.meta().modificationApiSupport().canAdd()) {
throw new IllegalArgumentException(type.registryKey() + " does not support RegistryFreezeEvent");
}
return this.freezeEventTypes.getOrCreate(type.registryKey(), RegistryLifecycleEventType::new);
diff --git a/paper-server/src/main/java/io/papermc/paper/registry/WritableCraftRegistry.java b/paper-server/src/main/java/io/papermc/paper/registry/WritableCraftRegistry.java
index f201f14250..6c17623e76 100644
--- a/paper-server/src/main/java/io/papermc/paper/registry/WritableCraftRegistry.java
+++ b/paper-server/src/main/java/io/papermc/paper/registry/WritableCraftRegistry.java
@@ -3,6 +3,7 @@ package io.papermc.paper.registry;
import com.mojang.serialization.Lifecycle;
import io.papermc.paper.registry.data.util.Conversions;
import io.papermc.paper.registry.entry.RegistryEntry;
+import io.papermc.paper.registry.entry.RegistryEntryMeta;
import io.papermc.paper.registry.entry.RegistryTypeMapper;
import io.papermc.paper.registry.event.WritableRegistry;
import java.util.Optional;
@@ -20,22 +21,16 @@ public class WritableCraftRegistry<M, T extends Keyed, B extends PaperRegistryBu
private static final RegistrationInfo FROM_PLUGIN = new RegistrationInfo(Optional.empty(), Lifecycle.experimental());
- private final RegistryEntry.BuilderHolder<M, T, B> entry;
+ private final RegistryEntryMeta.Buildable<M, T, B> meta;
private final MappedRegistry<M> registry;
- private final PaperRegistryBuilder.Factory<M, T, ? extends B> builderFactory;
public WritableCraftRegistry(
- final RegistryEntry.BuilderHolder<M, T, B> entry,
- final Class<?> classToPreload,
final MappedRegistry<M> registry,
- final BiFunction<NamespacedKey, ApiVersion, NamespacedKey> serializationUpdater,
- final PaperRegistryBuilder.Factory<M, T, ? extends B> builderFactory,
- final RegistryTypeMapper<M, T> minecraftToBukkit
+ final RegistryEntryMeta.Buildable<M, T, B> meta
) {
- super(classToPreload, registry, minecraftToBukkit, serializationUpdater);
- this.entry = entry;
+ super(meta, registry);
this.registry = registry;
- this.builderFactory = builderFactory;
+ this.meta = meta;
}
public void register(final TypedKey<T> key, final Consumer<? super B> value, final Conversions conversions) {
@@ -45,7 +40,7 @@ public class WritableCraftRegistry<M, T extends Keyed, B extends PaperRegistryBu
value.accept(builder);
PaperRegistryListenerManager.INSTANCE.registerWithListeners(
this.registry,
- RegistryEntry.Modifiable.asModifiable(this.entry),
+ this.meta,
resourceKey,
builder,
FROM_PLUGIN,
@@ -58,7 +53,7 @@ public class WritableCraftRegistry<M, T extends Keyed, B extends PaperRegistryBu
}
protected B newBuilder(final Conversions conversions) {
- return this.builderFactory.create(conversions);
+ return this.meta.builderFiller().create(conversions);
}
public class ApiWritableRegistry implements WritableRegistry<T, B> {
diff --git a/paper-server/src/main/java/io/papermc/paper/registry/entry/AddableRegistryEntry.java b/paper-server/src/main/java/io/papermc/paper/registry/entry/AddableRegistryEntry.java
deleted file mode 100644
index c44edcf13e..0000000000
--- a/paper-server/src/main/java/io/papermc/paper/registry/entry/AddableRegistryEntry.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package io.papermc.paper.registry.entry;
-
-import io.papermc.paper.registry.PaperRegistryBuilder;
-import io.papermc.paper.registry.RegistryHolder;
-import io.papermc.paper.registry.RegistryKey;
-import io.papermc.paper.registry.WritableCraftRegistry;
-import io.papermc.paper.registry.data.util.Conversions;
-import net.minecraft.core.MappedRegistry;
-import net.minecraft.core.Registry;
-import net.minecraft.resources.ResourceKey;
-import org.bukkit.Keyed;
-
-public class AddableRegistryEntry<M, T extends Keyed, B extends PaperRegistryBuilder<M, T>> extends CraftRegistryEntry<M, T> implements RegistryEntry.Addable<M, T, B> {
-
- private final PaperRegistryBuilder.Filler<M, T, B> builderFiller;
-
- protected AddableRegistryEntry(
- final ResourceKey<? extends Registry<M>> mcKey,
- final RegistryKey<T> apiKey,
- final Class<?> classToPreload,
- final RegistryTypeMapper<M, T> minecraftToBukkit,
- final PaperRegistryBuilder.Filler<M, T, B> builderFiller
- ) {
- super(mcKey, apiKey, classToPreload, minecraftToBukkit);
- this.builderFiller = builderFiller;
- }
-
- private WritableCraftRegistry<M, T, B> createRegistry(final Registry<M> registry) {
- return new WritableCraftRegistry<>(this, this.classToPreload, (MappedRegistry<M>) registry, this.updater, this.builderFiller.asFactory(), this.minecraftToBukkit);
- }
-
- @Override
- public RegistryHolder<T> createRegistryHolder(final Registry<M> nmsRegistry) {
- return new RegistryHolder.Memoized<>(() -> this.createRegistry(nmsRegistry));
- }
-
- @Override
- public B fillBuilder(final Conversions conversions, final M nms) {
- return this.builderFiller.fill(conversions, nms);
- }
-}
diff --git a/paper-server/src/main/java/io/papermc/paper/registry/entry/ApiRegistryEntry.java b/paper-server/src/main/java/io/papermc/paper/registry/entry/ApiRegistryEntry.java
deleted file mode 100644
index 2295b0d145..0000000000
--- a/paper-server/src/main/java/io/papermc/paper/registry/entry/ApiRegistryEntry.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package io.papermc.paper.registry.entry;
-
-import io.papermc.paper.registry.RegistryHolder;
-import io.papermc.paper.registry.RegistryKey;
-import java.util.function.Supplier;
-import net.minecraft.core.Registry;
-import net.minecraft.resources.ResourceKey;
-import org.bukkit.Keyed;
-
-public class ApiRegistryEntry<M, B extends Keyed> extends BaseRegistryEntry<M, B> {
-
- private final Supplier<org.bukkit.Registry<B>> registrySupplier;
-
- protected ApiRegistryEntry(
- final ResourceKey<? extends Registry<M>> mcKey,
- final RegistryKey<B> apiKey,
- final Supplier<org.bukkit.Registry<B>> registrySupplier
- ) {
- super(mcKey, apiKey);
- this.registrySupplier = registrySupplier;
- }
-
- @Override
- public RegistryHolder<B> createRegistryHolder(final Registry<M> nmsRegistry) {
- return new RegistryHolder.Memoized<>(this.registrySupplier);
- }
-}
diff --git a/paper-server/src/main/java/io/papermc/paper/registry/entry/BaseRegistryEntry.java b/paper-server/src/main/java/io/papermc/paper/registry/entry/BaseRegistryEntry.java
deleted file mode 100644
index ceb217dbbb..0000000000
--- a/paper-server/src/main/java/io/papermc/paper/registry/entry/BaseRegistryEntry.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package io.papermc.paper.registry.entry;
-
-import io.papermc.paper.registry.RegistryKey;
-import net.minecraft.core.Registry;
-import net.minecraft.resources.ResourceKey;
-import org.bukkit.Keyed;
-
-public abstract class BaseRegistryEntry<M, B extends Keyed> implements RegistryEntry<M, B> { // TODO remove Keyed
-
- private final ResourceKey<? extends Registry<M>> minecraftRegistryKey;
- private final RegistryKey<B> apiRegistryKey;
-
- protected BaseRegistryEntry(final ResourceKey<? extends Registry<M>> minecraftRegistryKey, final RegistryKey<B> apiRegistryKey) {
- this.minecraftRegistryKey = minecraftRegistryKey;
- this.apiRegistryKey = apiRegistryKey;
- }
-
- @Override
- public final ResourceKey<? extends Registry<M>> mcKey() {
- return this.minecraftRegistryKey;
- }
-
- @Override
- public final RegistryKey<B> apiKey() {
- return this.apiRegistryKey;
- }
-}
diff --git a/paper-server/src/main/java/io/papermc/paper/registry/entry/CraftRegistryEntry.java b/paper-server/src/main/java/io/papermc/paper/registry/entry/CraftRegistryEntry.java
deleted file mode 100644
index d8b28e823a..0000000000
--- a/paper-server/src/main/java/io/papermc/paper/registry/entry/CraftRegistryEntry.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package io.papermc.paper.registry.entry;
-
-import com.google.common.base.Preconditions;
-import com.mojang.datafixers.util.Either;
-import io.papermc.paper.registry.RegistryHolder;
-import io.papermc.paper.registry.RegistryKey;
-import java.util.function.BiFunction;
-import java.util.function.Function;
-import net.minecraft.core.Holder;
-import net.minecraft.core.Registry;
-import net.minecraft.resources.ResourceKey;
-import org.bukkit.Keyed;
-import org.bukkit.NamespacedKey;
-import org.bukkit.craftbukkit.CraftRegistry;
-import org.bukkit.craftbukkit.util.ApiVersion;
-
-public class CraftRegistryEntry<M, B extends Keyed> extends BaseRegistryEntry<M, B> { // TODO remove Keyed
-
- private static final BiFunction<NamespacedKey, ApiVersion, NamespacedKey> EMPTY = (namespacedKey, apiVersion) -> namespacedKey;
-
- protected final Class<?> classToPreload;
- protected final RegistryTypeMapper<M, B> minecraftToBukkit;
- protected BiFunction<NamespacedKey, ApiVersion, NamespacedKey> updater = EMPTY;
-
- protected CraftRegistryEntry(
- final ResourceKey<? extends Registry<M>> mcKey,
- final RegistryKey<B> apiKey,
- final Class<?> classToPreload,
- final RegistryTypeMapper<M, B> minecraftToBukkit
- ) {
- super(mcKey, apiKey);
- Preconditions.checkArgument(!classToPreload.getPackageName().startsWith("net.minecraft"), classToPreload + " should not be in the net.minecraft package as the class-to-preload");
- this.classToPreload = classToPreload;
- this.minecraftToBukkit = minecraftToBukkit;
- }
-
- @Override
- public RegistryEntry<M, B> withSerializationUpdater(final BiFunction<NamespacedKey, ApiVersion, NamespacedKey> updater) {
- this.updater = updater;
- return this;
- }
-
- @Override
- public RegistryHolder<B> createRegistryHolder(final Registry<M> nmsRegistry) {
- return new RegistryHolder.Memoized<>(() -> this.createApiRegistry(nmsRegistry));
- }
-
- private CraftRegistry<B, M> createApiRegistry(final Registry<M> nmsRegistry) {
- return new CraftRegistry<>(this.classToPreload, nmsRegistry, this.minecraftToBukkit, this.updater);
- }
-}
diff --git a/paper-server/src/main/java/io/papermc/paper/registry/entry/ModifiableRegistryEntry.java b/paper-server/src/main/java/io/papermc/paper/registry/entry/ModifiableRegistryEntry.java
deleted file mode 100644
index 4254335e55..0000000000
--- a/paper-server/src/main/java/io/papermc/paper/registry/entry/ModifiableRegistryEntry.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package io.papermc.paper.registry.entry;
-
-import io.papermc.paper.registry.PaperRegistryBuilder;
-import io.papermc.paper.registry.RegistryKey;
-import io.papermc.paper.registry.data.util.Conversions;
-import net.minecraft.core.Registry;
-import net.minecraft.resources.ResourceKey;
-import org.bukkit.Keyed;
-
-public class ModifiableRegistryEntry<M, T extends Keyed, B extends PaperRegistryBuilder<M, T>> extends CraftRegistryEntry<M, T> implements RegistryEntry.Modifiable<M, T, B> {
-
- protected final PaperRegistryBuilder.Filler<M, T, B> builderFiller;
-
- protected ModifiableRegistryEntry(
- final ResourceKey<? extends Registry<M>> mcKey,
- final RegistryKey<T> apiKey,
- final Class<?> toPreload,
- final RegistryTypeMapper<M, T> minecraftToBukkit,
- final PaperRegistryBuilder.Filler<M, T, B> builderFiller
- ) {
- super(mcKey, apiKey, toPreload, minecraftToBukkit);
- this.builderFiller = builderFiller;
- }
-
- @Override
- public B fillBuilder(final Conversions conversions, final M nms) {
- return this.builderFiller.fill(conversions, nms);
- }
-}
diff --git a/paper-server/src/main/java/io/papermc/paper/registry/entry/RegistryEntry.java b/paper-server/src/main/java/io/papermc/paper/registry/entry/RegistryEntry.java
index 32089721ed..17c7ec77cf 100644
--- a/paper-server/src/main/java/io/papermc/paper/registry/entry/RegistryEntry.java
+++ b/paper-server/src/main/java/io/papermc/paper/registry/entry/RegistryEntry.java
@@ -1,27 +1,24 @@
package io.papermc.paper.registry.entry;
-import io.papermc.paper.registry.PaperRegistryBuilder;
import io.papermc.paper.registry.RegistryHolder;
import io.papermc.paper.registry.RegistryKey;
-import io.papermc.paper.registry.TypedKey;
-import io.papermc.paper.registry.WritableCraftRegistry;
-import io.papermc.paper.registry.data.util.Conversions;
-import io.papermc.paper.registry.event.RegistryEntryAddEventImpl;
-import io.papermc.paper.registry.event.RegistryFreezeEventImpl;
import io.papermc.paper.registry.legacy.DelayedRegistryEntry;
-import java.util.function.BiFunction;
import net.minecraft.core.Registry;
+import net.minecraft.resources.ResourceKey;
import org.bukkit.Keyed;
-import org.bukkit.NamespacedKey;
-import org.bukkit.craftbukkit.util.ApiVersion;
-import org.jspecify.annotations.Nullable;
-public interface RegistryEntry<M, B extends Keyed> extends RegistryEntryInfo<M, B> { // TODO remove Keyed
+public interface RegistryEntry<M, A extends Keyed> { // TODO remove Keyed
- RegistryHolder<B> createRegistryHolder(Registry<M> nmsRegistry);
+ RegistryHolder<A> createRegistryHolder(Registry<M> nmsRegistry);
- default RegistryEntry<M, B> withSerializationUpdater(final BiFunction<NamespacedKey, ApiVersion, NamespacedKey> updater) {
- return this;
+ RegistryEntryMeta<M, A> meta();
+
+ default RegistryKey<A> apiKey() {
+ return this.meta().apiKey();
+ }
+
+ default ResourceKey<? extends Registry<M>> mcKey() {
+ return this.meta().mcKey();
}
/**
@@ -30,66 +27,7 @@ public interface RegistryEntry<M, B extends Keyed> extends RegistryEntryInfo<M,
* as fields, but instead be obtained via {@link io.papermc.paper.registry.RegistryAccess#getRegistry(RegistryKey)}
*/
@Deprecated
- default RegistryEntry<M, B> delayed() {
+ default RegistryEntry<M, A> delayed() {
return new DelayedRegistryEntry<>(this);
}
-
- interface BuilderHolder<M, T, B extends PaperRegistryBuilder<M, T>> extends RegistryEntryInfo<M, T> {
-
- B fillBuilder(Conversions conversions, M nms);
- }
-
- /**
- * Can mutate values being added to the registry
- */
- interface Modifiable<M, T, B extends PaperRegistryBuilder<M, T>> extends BuilderHolder<M, T, B> {
-
- static boolean isModifiable(final @Nullable RegistryEntryInfo<?, ?> entry) {
- return entry instanceof RegistryEntry.Modifiable<?, ?, ?> || (entry instanceof final DelayedRegistryEntry<?, ?> delayed && delayed.delegate() instanceof RegistryEntry.Modifiable<?, ?, ?>);
- }
-
- static <M, T extends Keyed, B extends PaperRegistryBuilder<M, T>> Modifiable<M, T, B> asModifiable(final RegistryEntryInfo<M, T> entry) { // TODO remove Keyed
- return (Modifiable<M, T, B>) possiblyUnwrap(entry);
- }
-
- default RegistryEntryAddEventImpl<T, B> createEntryAddEvent(final TypedKey<T> key, final B initialBuilder, final Conversions conversions) {
- return new RegistryEntryAddEventImpl<>(key, initialBuilder, this.apiKey(), conversions);
- }
- }
-
- /**
- * Can only add new values to the registry, not modify any values.
- */
- interface Addable<M, T extends Keyed, B extends PaperRegistryBuilder<M, T>> extends BuilderHolder<M, T, B> { // TODO remove Keyed
-
- default RegistryFreezeEventImpl<T, B> createFreezeEvent(final WritableCraftRegistry<M, T, B> writableRegistry, final Conversions conversions) {
- return new RegistryFreezeEventImpl<>(this.apiKey(), writableRegistry.createApiWritableRegistry(conversions), conversions);
- }
-
- static boolean isAddable(final @Nullable RegistryEntryInfo<?, ?> entry) {
- return entry instanceof RegistryEntry.Addable<?, ?, ?> || (entry instanceof final DelayedRegistryEntry<?, ?> delayed && delayed.delegate() instanceof RegistryEntry.Addable<?, ?, ?>);
- }
-
- static <M, T extends Keyed, B extends PaperRegistryBuilder<M, T>> Addable<M, T, B> asAddable(final RegistryEntryInfo<M, T> entry) {
- return (Addable<M, T, B>) possiblyUnwrap(entry);
- }
- }
-
- /**
- * Can mutate values and add new values.
- */
- interface Writable<M, T extends Keyed, B extends PaperRegistryBuilder<M, T>> extends Modifiable<M, T, B>, Addable<M, T, B> { // TODO remove Keyed
-
- static boolean isWritable(final @Nullable RegistryEntryInfo<?, ?> entry) {
- return entry instanceof RegistryEntry.Writable<?, ?, ?> || (entry instanceof final DelayedRegistryEntry<?, ?> delayed && delayed.delegate() instanceof RegistryEntry.Writable<?, ?, ?>);
- }
-
- static <M, T extends Keyed, B extends PaperRegistryBuilder<M, T>> Writable<M, T, B> asWritable(final RegistryEntryInfo<M, T> entry) { // TODO remove Keyed
- return (Writable<M, T, B>) possiblyUnwrap(entry);
- }
- }
-
- private static <M, B extends Keyed> RegistryEntryInfo<M, B> possiblyUnwrap(final RegistryEntryInfo<M, B> entry) {
- return entry instanceof final DelayedRegistryEntry<M, B> delayed ? delayed.delegate() : entry;
- }
}
diff --git a/paper-server/src/main/java/io/papermc/paper/registry/entry/RegistryEntryBuilder.java b/paper-server/src/main/java/io/papermc/paper/registry/entry/RegistryEntryBuilder.java
index 5352ec936c..bb7d19ee00 100644
--- a/paper-server/src/main/java/io/papermc/paper/registry/entry/RegistryEntryBuilder.java
+++ b/paper-server/src/main/java/io/papermc/paper/registry/entry/RegistryEntryBuilder.java
@@ -1,6 +1,5 @@
package io.papermc.paper.registry.entry;
-import com.mojang.datafixers.util.Either;
import io.papermc.paper.registry.PaperRegistryBuilder;
import io.papermc.paper.registry.RegistryKey;
import java.util.function.BiFunction;
@@ -11,6 +10,11 @@ import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceKey;
import org.bukkit.Keyed;
import org.bukkit.NamespacedKey;
+import org.bukkit.craftbukkit.util.ApiVersion;
+
+import static io.papermc.paper.registry.entry.RegistryEntryMeta.RegistryModificationApiSupport.ADDABLE;
+import static io.papermc.paper.registry.entry.RegistryEntryMeta.RegistryModificationApiSupport.MODIFIABLE;
+import static io.papermc.paper.registry.entry.RegistryEntryMeta.RegistryModificationApiSupport.WRITABLE;
public class RegistryEntryBuilder<M, A extends Keyed> { // TODO remove Keyed
@@ -30,7 +34,7 @@ public class RegistryEntryBuilder<M, A extends Keyed> { // TODO remove Keyed
}
public RegistryEntry<M, A> apiOnly(final Supplier<org.bukkit.Registry<A>> apiRegistrySupplier) {
- return new ApiRegistryEntry<>(this.mcKey, this.apiKey, apiRegistrySupplier);
+ return new RegistryEntryImpl<>(new RegistryEntryMeta.ApiOnly<>(this.mcKey, this.apiKey, apiRegistrySupplier));
}
public CraftStage<M, A> craft(final Class<?> classToPreload, final BiFunction<? super NamespacedKey, M, ? extends A> minecraftToBukkit) {
@@ -43,8 +47,11 @@ public class RegistryEntryBuilder<M, A extends Keyed> { // TODO remove Keyed
public static final class CraftStage<M, A extends Keyed> extends RegistryEntryBuilder<M, A> { // TODO remove Keyed
+ private static final BiFunction<NamespacedKey, ApiVersion, NamespacedKey> EMPTY = (namespacedKey, apiVersion) -> namespacedKey;
+
private final Class<?> classToPreload;
private final RegistryTypeMapper<M, A> minecraftToBukkit;
+ private BiFunction<NamespacedKey, ApiVersion, NamespacedKey> serializationUpdater = EMPTY;
private CraftStage(
final ResourceKey<? extends Registry<M>> mcKey,
@@ -57,20 +64,29 @@ public class RegistryEntryBuilder<M, A extends Keyed> { // TODO remove Keyed
this.minecraftToBukkit = minecraftToBukkit;
}
+ public CraftStage<M, A> serializationUpdater(final BiFunction<NamespacedKey, ApiVersion, NamespacedKey> serializationUpdater) {
+ this.serializationUpdater = serializationUpdater;
+ return this;
+ }
+
public RegistryEntry<M, A> build() {
- return new CraftRegistryEntry<>(this.mcKey, this.apiKey, this.classToPreload, this.minecraftToBukkit);
+ return new RegistryEntryImpl<>(new RegistryEntryMeta.Craft<>(this.mcKey, this.apiKey, this.classToPreload, this.minecraftToBukkit, this.serializationUpdater));
}
public <B extends PaperRegistryBuilder<M, A>> RegistryEntry<M, A> modifiable(final PaperRegistryBuilder.Filler<M, A, B> filler) {
- return new ModifiableRegistryEntry<>(this.mcKey, this.apiKey, this.classToPreload, this.minecraftToBukkit, filler);
+ return this.create(filler, MODIFIABLE);
}
public <B extends PaperRegistryBuilder<M, A>> RegistryEntry<M, A> addable(final PaperRegistryBuilder.Filler<M, A, B> filler) {
- return new AddableRegistryEntry<>(this.mcKey, this.apiKey, this.classToPreload, this.minecraftToBukkit, filler);
+ return this.create(filler, ADDABLE);
}
public <B extends PaperRegistryBuilder<M, A>> RegistryEntry<M, A> writable(final PaperRegistryBuilder.Filler<M, A, B> filler) {
- return new WritableRegistryEntry<>(this.mcKey, this.apiKey, this.classToPreload, this.minecraftToBukkit, filler);
+ return this.create(filler, WRITABLE);
+ }
+
+ private <B extends PaperRegistryBuilder<M, A>> RegistryEntry<M, A> create(final PaperRegistryBuilder.Filler<M, A, B> filler, final RegistryEntryMeta.RegistryModificationApiSupport support) {
+ return new RegistryEntryImpl<>(new RegistryEntryMeta.Buildable<>(this.mcKey, this.apiKey, this.classToPreload, this.minecraftToBukkit, this.serializationUpdater, filler, support));
}
}
}
diff --git a/paper-server/src/main/java/io/papermc/paper/registry/entry/RegistryEntryImpl.java b/paper-server/src/main/java/io/papermc/paper/registry/entry/RegistryEntryImpl.java
new file mode 100644
index 0000000000..1c8b2d4855
--- /dev/null
+++ b/paper-server/src/main/java/io/papermc/paper/registry/entry/RegistryEntryImpl.java
@@ -0,0 +1,13 @@
+package io.papermc.paper.registry.entry;
+
+import io.papermc.paper.registry.RegistryHolder;
+import net.minecraft.core.Registry;
+import org.bukkit.Keyed;
+
+record RegistryEntryImpl<M, A extends Keyed>(RegistryEntryMeta<M, A> meta) implements RegistryEntry<M, A> {
+
+ @Override
+ public RegistryHolder<A> createRegistryHolder(final Registry<M> nmsRegistry) {
+ return new RegistryHolder.Memoized<>(() -> this.meta().createApiRegistry(nmsRegistry));
+ }
+}
diff --git a/paper-server/src/main/java/io/papermc/paper/registry/entry/RegistryEntryInfo.java b/paper-server/src/main/java/io/papermc/paper/registry/entry/RegistryEntryInfo.java
deleted file mode 100644
index 0ae855e80f..0000000000
--- a/paper-server/src/main/java/io/papermc/paper/registry/entry/RegistryEntryInfo.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package io.papermc.paper.registry.entry;
-
-import io.papermc.paper.registry.RegistryKey;
-import net.minecraft.core.Registry;
-import net.minecraft.resources.ResourceKey;
-
-public interface RegistryEntryInfo<M, B> {
-
- ResourceKey<? extends Registry<M>> mcKey();
-
- RegistryKey<B> apiKey();
-}
diff --git a/paper-server/src/main/java/io/papermc/paper/registry/entry/RegistryEntryMeta.java b/paper-server/src/main/java/io/papermc/paper/registry/entry/RegistryEntryMeta.java
new file mode 100644
index 0000000000..7cd152734f
--- /dev/null
+++ b/paper-server/src/main/java/io/papermc/paper/registry/entry/RegistryEntryMeta.java
@@ -0,0 +1,122 @@
+package io.papermc.paper.registry.entry;
+
+import com.google.common.base.Preconditions;
+import io.papermc.paper.registry.PaperRegistryBuilder;
+import io.papermc.paper.registry.RegistryKey;
+import io.papermc.paper.registry.TypedKey;
+import io.papermc.paper.registry.WritableCraftRegistry;
+import io.papermc.paper.registry.data.util.Conversions;
+import io.papermc.paper.registry.event.RegistryEntryAddEventImpl;
+import io.papermc.paper.registry.event.RegistryFreezeEventImpl;
+import java.util.function.BiFunction;
+import java.util.function.Supplier;
+import net.minecraft.core.MappedRegistry;
+import net.minecraft.core.Registry;
+import net.minecraft.resources.ResourceKey;
+import org.bukkit.Keyed;
+import org.bukkit.NamespacedKey;
+import org.bukkit.craftbukkit.CraftRegistry;
+import org.bukkit.craftbukkit.util.ApiVersion;
+
+public sealed interface RegistryEntryMeta<M, A extends Keyed> permits RegistryEntryMeta.ApiOnly, RegistryEntryMeta.ServerSide { // TODO remove Keyed
+
+ ResourceKey<? extends Registry<M>> mcKey();
+
+ RegistryKey<A> apiKey();
+
+ org.bukkit.Registry<A> createApiRegistry(final Registry<M> nmsRegistry);
+
+ default RegistryModificationApiSupport modificationApiSupport() {
+ return RegistryModificationApiSupport.NONE;
+ }
+
+ record ApiOnly<M, A extends Keyed>(ResourceKey<? extends Registry<M>> mcKey, RegistryKey<A> apiKey, Supplier<org.bukkit.Registry<A>> registrySupplier) implements RegistryEntryMeta<M, A> { // TODO remove Keyed
+
+ @Override
+ public org.bukkit.Registry<A> createApiRegistry(final Registry<M> nmsRegistry) {
+ return this.registrySupplier.get();
+ }
+ }
+
+ sealed interface ServerSide<M, A extends Keyed> extends RegistryEntryMeta<M, A> permits RegistryEntryMeta.Craft, RegistryEntryMeta.Buildable { // TODO remove Keyed
+
+ Class<?> classToPreload();
+
+ RegistryTypeMapper<M, A> registryTypeMapper();
+
+ BiFunction<NamespacedKey, ApiVersion, NamespacedKey> serializationUpdater();
+
+ default org.bukkit.Registry<A> createApiRegistry(final Registry<M> nmsRegistry) {
+ return new CraftRegistry<>(this, nmsRegistry);
+ }
+ }
+
+ record Craft<M, A extends Keyed>(
+ ResourceKey<? extends Registry<M>> mcKey,
+ RegistryKey<A> apiKey,
+ Class<?> classToPreload,
+ RegistryTypeMapper<M, A> registryTypeMapper,
+ BiFunction<NamespacedKey, ApiVersion, NamespacedKey> serializationUpdater
+ ) implements ServerSide<M, A> { // TODO remove Keyed
+
+ public Craft {
+ Preconditions.checkArgument(!classToPreload.getPackageName().startsWith("net.minecraft"), classToPreload + " should not be in the net.minecraft package as the class-to-preload");
+ }
+ }
+
+ enum RegistryModificationApiSupport {
+ /**
+ * Cannot add or modify values in the registry.
+ */
+ NONE,
+ /**
+ * Can only add new values to the registry, not modify any values.
+ */
+ ADDABLE,
+ /**
+ * Can mutate values being added to the registry
+ */
+ MODIFIABLE,
+ /**
+ * Can mutate values and add new values.
+ */
+ WRITABLE,
+ ;
+
+ public boolean canAdd() {
+ return this != MODIFIABLE && this != NONE;
+ }
+
+ public boolean canModify() {
+ return this != ADDABLE && this != NONE;
+ }
+ }
+
+ record Buildable<M, A extends Keyed, B extends PaperRegistryBuilder<M, A>>( // TODO remove Keyed
+ ResourceKey<? extends Registry<M>> mcKey,
+ RegistryKey<A> apiKey,
+ Class<?> classToPreload,
+ RegistryTypeMapper<M, A> registryTypeMapper,
+ BiFunction<NamespacedKey, ApiVersion, NamespacedKey> serializationUpdater,
+ PaperRegistryBuilder.Filler<M, A, B> builderFiller,
+ RegistryModificationApiSupport modificationApiSupport
+ ) implements ServerSide<M, A> {
+
+ public RegistryEntryAddEventImpl<A, B> createEntryAddEvent(final TypedKey<A> key, final B initialBuilder, final Conversions conversions) {
+ return new RegistryEntryAddEventImpl<>(key, initialBuilder, this.apiKey(), conversions);
+ }
+
+ public RegistryFreezeEventImpl<A, B> createFreezeEvent(final WritableCraftRegistry<M, A, B> writableRegistry, final Conversions conversions) {
+ return new RegistryFreezeEventImpl<>(this.apiKey(), writableRegistry.createApiWritableRegistry(conversions), conversions);
+ }
+
+ @Override
+ public org.bukkit.Registry<A> createApiRegistry(final Registry<M> nmsRegistry) {
+ if (this.modificationApiSupport.canAdd()) {
+ return new WritableCraftRegistry<>((MappedRegistry<M>) nmsRegistry, this);
+ } else {
+ return ServerSide.super.createApiRegistry(nmsRegistry);
+ }
+ }
+ }
+}
diff --git a/paper-server/src/main/java/io/papermc/paper/registry/entry/WritableRegistryEntry.java b/paper-server/src/main/java/io/papermc/paper/registry/entry/WritableRegistryEntry.java
deleted file mode 100644
index 7ff5dbea3f..0000000000
--- a/paper-server/src/main/java/io/papermc/paper/registry/entry/WritableRegistryEntry.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package io.papermc.paper.registry.entry;
-
-import com.mojang.datafixers.util.Either;
-import io.papermc.paper.registry.PaperRegistryBuilder;
-import io.papermc.paper.registry.RegistryKey;
-import java.util.function.BiFunction;
-import java.util.function.Function;
-import net.minecraft.core.Holder;
-import net.minecraft.core.Registry;
-import net.minecraft.resources.ResourceKey;
-import org.bukkit.Keyed;
-import org.bukkit.NamespacedKey;
-
-public class WritableRegistryEntry<M, T extends Keyed, B extends PaperRegistryBuilder<M, T>> extends AddableRegistryEntry<M, T, B> implements RegistryEntry.Writable<M, T, B> { // TODO remove Keyed
-
- protected WritableRegistryEntry(
- final ResourceKey<? extends Registry<M>> mcKey,
- final RegistryKey<T> apiKey,
- final Class<?> classToPreload,
- final RegistryTypeMapper<M, T> minecraftToBukkit,
- final PaperRegistryBuilder.Filler<M, T, B> builderFiller
- ) {
- super(mcKey, apiKey, classToPreload, minecraftToBukkit, builderFiller);
- }
-}
diff --git a/paper-server/src/main/java/io/papermc/paper/registry/legacy/DelayedRegistryEntry.java b/paper-server/src/main/java/io/papermc/paper/registry/legacy/DelayedRegistryEntry.java
index 110b8d559f..168afab750 100644
--- a/paper-server/src/main/java/io/papermc/paper/registry/legacy/DelayedRegistryEntry.java
+++ b/paper-server/src/main/java/io/papermc/paper/registry/legacy/DelayedRegistryEntry.java
@@ -1,26 +1,20 @@
package io.papermc.paper.registry.legacy;
import io.papermc.paper.registry.RegistryHolder;
-import io.papermc.paper.registry.RegistryKey;
import io.papermc.paper.registry.entry.RegistryEntry;
+import io.papermc.paper.registry.entry.RegistryEntryMeta;
import net.minecraft.core.Registry;
-import net.minecraft.resources.ResourceKey;
import org.bukkit.Keyed;
-public record DelayedRegistryEntry<M, T extends Keyed>(RegistryEntry<M, T> delegate) implements RegistryEntry<M, T> {
+public record DelayedRegistryEntry<M, A extends Keyed>(RegistryEntry<M, A> delegate) implements RegistryEntry<M, A> {
@Override
- public ResourceKey<? extends Registry<M>> mcKey() {
- return this.delegate.mcKey();
+ public RegistryEntryMeta<M, A> meta() {
+ return this.delegate.meta();
}
@Override
- public RegistryKey<T> apiKey() {
- return this.delegate.apiKey();
- }
-
- @Override
- public RegistryHolder<T> createRegistryHolder(final Registry<M> nmsRegistry) {
+ public RegistryHolder<A> createRegistryHolder(final Registry<M> nmsRegistry) {
return this.delegate.createRegistryHolder(nmsRegistry);
}
}
diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftRegistry.java b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftRegistry.java
index a94cebfd26..332215f8b4 100644
--- a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftRegistry.java
+++ b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftRegistry.java
@@ -1,6 +1,7 @@
package org.bukkit.craftbukkit;
import com.google.common.base.Preconditions;
+import io.papermc.paper.registry.entry.RegistryEntryMeta;
import io.papermc.paper.util.Holderable;
import java.util.HashMap;
import java.util.Iterator;
@@ -97,7 +98,7 @@ public class CraftRegistry<B extends Keyed, M> implements Registry<B> {
// Paper start - support direct Holders
final java.util.Optional<ResourceKey<M>> resourceKey = registry.getResourceKey(minecraft);
if (resourceKey.isEmpty() && bukkitRegistry instanceof final CraftRegistry<?, ?> craftRegistry && craftRegistry.supportsDirectHolders()) {
- return ((CraftRegistry<B, M>) registry).convertDirectHolder(Holder.direct(minecraft));
+ return ((CraftRegistry<B, M>) bukkitRegistry).convertDirectHolder(Holder.direct(minecraft));
} else if (resourceKey.isEmpty()) {
throw new IllegalStateException(String.format("Cannot convert '%s' to bukkit representation, since it is not registered.", minecraft));
}
@@ -207,6 +208,9 @@ public class CraftRegistry<B extends Keyed, M> implements Registry<B> {
// Paper start - switch to Holder
this(bukkitClass, minecraftRegistry, new io.papermc.paper.registry.entry.RegistryTypeMapper<>(minecraftToBukkit), serializationUpdater);
}
+ public CraftRegistry(final RegistryEntryMeta.ServerSide<M, B> meta, final net.minecraft.core.Registry<M> minecraftRegistry) {
+ this(meta.classToPreload(), minecraftRegistry, meta.registryTypeMapper(), meta.serializationUpdater());
+ }
public CraftRegistry(Class<?> bukkitClass, net.minecraft.core.Registry<M> minecraftRegistry, io.papermc.paper.registry.entry.RegistryTypeMapper<M, B> minecraftToBukkit, BiFunction<NamespacedKey, ApiVersion, NamespacedKey> serializationUpdater) { // Paper - relax preload class
// Paper end - support Holders
this.bukkitClass = bukkitClass;
diff --git a/paper-server/src/test/java/io/papermc/paper/registry/RegistryBuilderTest.java b/paper-server/src/test/java/io/papermc/paper/registry/RegistryBuilderTest.java
index 55f5fc45cf..7fa18dd100 100644
--- a/paper-server/src/test/java/io/papermc/paper/registry/RegistryBuilderTest.java
+++ b/paper-server/src/test/java/io/papermc/paper/registry/RegistryBuilderTest.java
@@ -2,8 +2,7 @@ package io.papermc.paper.registry;
import io.papermc.paper.registry.data.util.Conversions;
import io.papermc.paper.registry.entry.RegistryEntry;
-import io.papermc.paper.registry.entry.RegistryEntryInfo;
-import io.papermc.paper.registry.legacy.DelayedRegistryEntry;
+import io.papermc.paper.registry.entry.RegistryEntryMeta;
import java.util.Map;
import java.util.stream.Stream;
import net.minecraft.core.Registry;
@@ -23,21 +22,17 @@ class RegistryBuilderTest {
static Stream<Arguments> registries() {
return PaperRegistries.REGISTRY_ENTRIES.stream()
- .map(RegistryBuilderTest::possiblyUnwrap)
- .filter(RegistryEntry.BuilderHolder.class::isInstance)
+ .map(RegistryEntry::meta)
+ .filter(RegistryEntryMeta.Buildable.class::isInstance)
.map(Arguments::arguments);
}
- private static <M, B extends Keyed> RegistryEntryInfo<M, B> possiblyUnwrap(final RegistryEntryInfo<M, B> entry) {
- return entry instanceof final DelayedRegistryEntry<M, B> delayed ? delayed.delegate() : entry;
- }
-
@ParameterizedTest
@MethodSource("registries")
- <M, T> void testEquality(final RegistryEntry.BuilderHolder<M, T, ?> registryEntry) {
+ <M, T extends Keyed> void testEquality(final RegistryEntryMeta.Buildable<M, T, ?> registryEntry) { // TODO remove Keyed
final Registry<M> registry = RegistryHelper.getRegistry().lookupOrThrow(registryEntry.mcKey());
for (final Map.Entry<ResourceKey<M>, M> entry : registry.entrySet()) {
- final M built = registryEntry.fillBuilder(new Conversions(new RegistryOps.HolderLookupAdapter(RegistryHelper.getRegistry())), entry.getValue()).build();
+ final M built = registryEntry.builderFiller().fill(new Conversions(new RegistryOps.HolderLookupAdapter(RegistryHelper.getRegistry())), entry.getValue()).build();
assertEquals(entry.getValue(), built);
}
}