package io.papermc.paper.registry; import com.mojang.serialization.Lifecycle; import io.papermc.paper.registry.data.util.Conversions; import io.papermc.paper.registry.entry.RegistryEntryMeta; import io.papermc.paper.registry.event.WritableRegistry; import java.util.Optional; import java.util.function.Consumer; import net.minecraft.core.MappedRegistry; import net.minecraft.core.RegistrationInfo; import net.minecraft.resources.ResourceKey; import org.bukkit.Keyed; import org.bukkit.craftbukkit.CraftRegistry; public class WritableCraftRegistry> extends CraftRegistry { private static final RegistrationInfo FROM_PLUGIN = new RegistrationInfo(Optional.empty(), Lifecycle.experimental()); private final RegistryEntryMeta.Buildable meta; private final MappedRegistry registry; public WritableCraftRegistry( final MappedRegistry registry, final RegistryEntryMeta.Buildable meta ) { super(meta, registry); this.registry = registry; this.meta = meta; } public void register(final TypedKey key, final Consumer> value, final Conversions conversions) { final ResourceKey resourceKey = PaperRegistries.toNms(key); this.registry.validateWrite(resourceKey); final PaperRegistryBuilderFactory builderFactory = new PaperRegistryBuilderFactory<>(this.registry.key(), conversions, this.meta.builderFiller(), this.registry::getValueForCopying); value.accept(builderFactory); PaperRegistryListenerManager.INSTANCE.registerWithListeners( this.registry, this.meta, resourceKey, builderFactory.requireBuilder(), FROM_PLUGIN, conversions ); } public WritableRegistry createApiWritableRegistry(final Conversions conversions) { return new ApiWritableRegistry(conversions); } public class ApiWritableRegistry implements WritableRegistry { private final Conversions conversions; public ApiWritableRegistry(final Conversions conversions) { this.conversions = conversions; } @Override public void registerWith(final TypedKey key, final Consumer> value) { WritableCraftRegistry.this.register(key, value, this.conversions); } } }