Skip to content

Commit

Permalink
For new registry values, allow copying from existing
Browse files Browse the repository at this point in the history
  • Loading branch information
Machine-Maker committed Dec 23, 2024
1 parent aa2c52b commit 173c5ac
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,17 @@ public interface WritableRegistry<T, B extends RegistryBuilder<T>> {
* @param value a consumer for the entry's builder
*/
void register(TypedKey<T> key, Consumer<? super B> value);

/**
* Register a new value with the specified key. This will
* fire a {@link RegistryEntryAddEvent} for the new entry. The
* builder in the consumer will be pre-filled with the values
* from the copyFrom key.
*
* @param key the entry's key (must be unique from others)
* @param copyFrom the key to copy values from (must already be registered)
* @param value a consumer for the entry's builder
* @throws IllegalArgumentException if copyFrom doesn't exist
*/
void register(TypedKey<T> key, TypedKey<T> copyFrom, Consumer<? super B> value);
}
Original file line number Diff line number Diff line change
Expand Up @@ -23508,10 +23508,10 @@ index 3d3eec1db91cb47395f40c4f47aa77164ad42175..216f97207dac88cc1dc3df59c6ee8a62
+ // Paper end - optimise collisions
}
diff --git a/net/minecraft/core/MappedRegistry.java b/net/minecraft/core/MappedRegistry.java
index 47b1fafd91b39e73c4e9134b0b8048000fba108a..76994c1491221c06cca5405ba239e6ff642b19ed 100644
index 452c358c2cfa0c39e0b09853cd4a9a12c6ced65d..5f752603aa5611ce9d3dd44cc5b70c27ac46a86e 100644
--- a/net/minecraft/core/MappedRegistry.java
+++ b/net/minecraft/core/MappedRegistry.java
@@ -50,6 +50,19 @@ public class MappedRegistry<T> implements WritableRegistry<T> {
@@ -51,6 +51,19 @@ public class MappedRegistry<T> implements WritableRegistry<T> {
return this.getTags();
}

Expand All @@ -23531,10 +23531,10 @@ index 47b1fafd91b39e73c4e9134b0b8048000fba108a..76994c1491221c06cca5405ba239e6ff
public MappedRegistry(ResourceKey<? extends Registry<T>> key, Lifecycle registryLifecycle) {
this(key, registryLifecycle, false);
}
@@ -114,6 +127,7 @@ public class MappedRegistry<T> implements WritableRegistry<T> {
this.toId.put(value, size);
@@ -116,6 +129,7 @@ public class MappedRegistry<T> implements WritableRegistry<T> {
this.registrationInfos.put(key, registrationInfo);
this.registryLifecycle = this.registryLifecycle.add(registrationInfo.lifecycle());
this.temporaryUnfrozenMap.put(key.location(), value); // Paper - support pre-filling in registry mod API
+ this.injectFluidRegister(key, value); // Paper - fluid method optimisations
return reference;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
--- a/net/minecraft/core/MappedRegistry.java
+++ b/net/minecraft/core/MappedRegistry.java
@@ -33,11 +_,11 @@
@@ -33,17 +_,18 @@
public class MappedRegistry<T> implements WritableRegistry<T> {
private final ResourceKey<? extends Registry<T>> key;
private final ObjectList<Holder.Reference<T>> byId = new ObjectArrayList<>(256);
Expand All @@ -17,6 +17,29 @@
private Lifecycle registryLifecycle;
private final Map<TagKey<T>, HolderSet.Named<T>> frozenTags = new IdentityHashMap<>();
MappedRegistry.TagSet<T> allTags = MappedRegistry.TagSet.unbound();
private boolean frozen;
@Nullable
private Map<T, Holder.Reference<T>> unregisteredIntrusiveHolders;
+ public final Map<ResourceLocation, T> temporaryUnfrozenMap = new HashMap<>(); // Paper - support pre-filling in registry mod API

@Override
public Stream<HolderSet.Named<T>> listTags() {
@@ -114,6 +_,7 @@
this.toId.put(value, size);
this.registrationInfos.put(key, registrationInfo);
this.registryLifecycle = this.registryLifecycle.add(registrationInfo.lifecycle());
+ this.temporaryUnfrozenMap.put(key.location(), value); // Paper - support pre-filling in registry mod API
return reference;
}
}
@@ -275,6 +_,7 @@
return this;
} else {
this.frozen = true;
+ this.temporaryUnfrozenMap.clear(); // Paper - support pre-filling in registry mod API
this.byValue.forEach((object, reference) -> reference.bindValue((T)object));
List<ResourceLocation> list = this.byKey
.entrySet()
@@ -509,4 +_,13 @@

Stream<HolderSet.Named<T>> getTags();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,19 @@
package io.papermc.paper.registry;

import com.google.common.base.Preconditions;
import com.mojang.serialization.Lifecycle;
import io.papermc.paper.adventure.PaperAdventure;
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;
import java.util.function.BiFunction;
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.NamespacedKey;
import org.bukkit.craftbukkit.CraftRegistry;
import org.bukkit.craftbukkit.util.ApiVersion;
import org.jspecify.annotations.Nullable;

public class WritableCraftRegistry<M, T extends Keyed, B extends PaperRegistryBuilder<M, T>> extends CraftRegistry<T, M> {

Expand All @@ -33,10 +31,17 @@ public WritableCraftRegistry(
this.meta = meta;
}

public void register(final TypedKey<T> key, final Consumer<? super B> value, final Conversions conversions) {
public void register(final TypedKey<T> key, final @Nullable TypedKey<T> copyFrom, final Consumer<? super B> value, final Conversions conversions) {
final ResourceKey<M> resourceKey = PaperRegistries.toNms(key);
this.registry.validateWrite(resourceKey);
final B builder = this.newBuilder(conversions);
final B builder;
if (copyFrom != null) {
final M existing = this.registry.temporaryUnfrozenMap.get(PaperAdventure.asVanilla(copyFrom));
Preconditions.checkArgument(existing != null, "Cannot copy from unregistered key: %s", copyFrom);
builder = this.meta.builderFiller().fill(conversions, existing);
} else {
builder = this.meta.builderFiller().create(conversions);
}
value.accept(builder);
PaperRegistryListenerManager.INSTANCE.registerWithListeners(
this.registry,
Expand All @@ -52,10 +57,6 @@ public WritableRegistry<T, B> createApiWritableRegistry(final Conversions conver
return new ApiWritableRegistry(conversions);
}

protected B newBuilder(final Conversions conversions) {
return this.meta.builderFiller().create(conversions);
}

public class ApiWritableRegistry implements WritableRegistry<T, B> {

private final Conversions conversions;
Expand All @@ -66,7 +67,12 @@ public ApiWritableRegistry(final Conversions conversions) {

@Override
public void register(final TypedKey<T> key, final Consumer<? super B> value) {
WritableCraftRegistry.this.register(key, value, this.conversions);
WritableCraftRegistry.this.register(key, null, value, this.conversions);
}

@Override
public void register(final TypedKey<T> key, final TypedKey<T> copyFrom, final Consumer<? super B> value) {
WritableCraftRegistry.this.register(key, copyFrom, value, this.conversions);
}
}
}

0 comments on commit 173c5ac

Please sign in to comment.