|
|
|
@@ -5,6 +5,43 @@ Subject: [PATCH] Add StructuresLocateEvent
|
|
|
|
|
|
|
|
|
|
Co-authored-by: Jake Potrebic <jake.m.potrebic@gmail.com>
|
|
|
|
|
|
|
|
|
|
diff --git a/src/main/java/io/papermc/paper/registry/PaperRegistries.java b/src/main/java/io/papermc/paper/registry/PaperRegistries.java
|
|
|
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
|
|
|
--- a/src/main/java/io/papermc/paper/registry/PaperRegistries.java
|
|
|
|
|
+++ b/src/main/java/io/papermc/paper/registry/PaperRegistries.java
|
|
|
|
|
@@ -0,0 +0,0 @@ import static io.papermc.paper.registry.entry.RegistryEntry.entry;
|
|
|
|
|
@DefaultQualifier(NonNull.class)
|
|
|
|
|
public final class PaperRegistries {
|
|
|
|
|
|
|
|
|
|
+ @Deprecated(forRemoval = true)
|
|
|
|
|
+ @org.jetbrains.annotations.VisibleForTesting
|
|
|
|
|
+ public static final RegistryKey<io.papermc.paper.world.structure.ConfiguredStructure> CONFIGURED_STRUCTURE_REGISTRY_KEY = RegistryKeyImpl.createInternal("worldgen/structure");
|
|
|
|
|
+ @Deprecated(forRemoval = true)
|
|
|
|
|
+ static final RegistryEntry<Structure, io.papermc.paper.world.structure.ConfiguredStructure, ?> CONFIGURED_STRUCTURE_REGISTRY_ENTRY = entry(Registries.STRUCTURE, CONFIGURED_STRUCTURE_REGISTRY_KEY, io.papermc.paper.world.structure.ConfiguredStructure.class, io.papermc.paper.world.structure.PaperConfiguredStructure::minecraftToBukkit).delayed();
|
|
|
|
|
+
|
|
|
|
|
static final List<RegistryEntry<?, ?, ?>> REGISTRY_ENTRIES;
|
|
|
|
|
private static final Map<RegistryKey<?>, RegistryEntry<?, ?, ?>> BY_REGISTRY_KEY;
|
|
|
|
|
private static final Map<ResourceKey<?>, RegistryEntry<?, ?, ?>> BY_RESOURCE_KEY;
|
|
|
|
|
diff --git a/src/main/java/io/papermc/paper/registry/PaperRegistryAccess.java b/src/main/java/io/papermc/paper/registry/PaperRegistryAccess.java
|
|
|
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
|
|
|
--- a/src/main/java/io/papermc/paper/registry/PaperRegistryAccess.java
|
|
|
|
|
+++ b/src/main/java/io/papermc/paper/registry/PaperRegistryAccess.java
|
|
|
|
|
@@ -0,0 +0,0 @@ public class PaperRegistryAccess implements RegistryAccess {
|
|
|
|
|
public <T extends Keyed> @Nullable Registry<T> getRegistry(final Class<T> type) {
|
|
|
|
|
final RegistryKey<T> registryKey;
|
|
|
|
|
final @Nullable RegistryEntry<?, T, ?> entry;
|
|
|
|
|
- registryKey = requireNonNull(byType(type), () -> type + " is not a valid registry type");
|
|
|
|
|
- entry = PaperRegistries.getEntry(registryKey);
|
|
|
|
|
+ if (type == io.papermc.paper.world.structure.ConfiguredStructure.class) { // manually handle "duplicate" registries to avoid polluting maps in PaperRegistries
|
|
|
|
|
+ registryKey = (RegistryKey<T>) PaperRegistries.CONFIGURED_STRUCTURE_REGISTRY_KEY;
|
|
|
|
|
+ entry = (RegistryEntry<?, T, ?>) PaperRegistries.CONFIGURED_STRUCTURE_REGISTRY_ENTRY;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ registryKey = requireNonNull(byType(type), () -> type + " is not a valid registry type");
|
|
|
|
|
+ entry = PaperRegistries.getEntry(registryKey);
|
|
|
|
|
+ }
|
|
|
|
|
final @Nullable RegistryHolder<T> registry = (RegistryHolder<T>) this.registries.get(registryKey);
|
|
|
|
|
if (registry != null) {
|
|
|
|
|
// if the registry exists, return right away. Since this is the "legacy" method, we return DelayedRegistry
|
|
|
|
|
diff --git a/src/main/java/io/papermc/paper/world/structure/PaperConfiguredStructure.java b/src/main/java/io/papermc/paper/world/structure/PaperConfiguredStructure.java
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
|
|
|
|
@@ -32,18 +69,10 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|
|
|
|
+ private PaperConfiguredStructure() {
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Deprecated(forRemoval = true)
|
|
|
|
|
+ public static final class LegacyRegistry extends CraftRegistry<ConfiguredStructure, Structure> {
|
|
|
|
|
+
|
|
|
|
|
+ public LegacyRegistry(final Registry<Structure> minecraftRegistry) {
|
|
|
|
|
+ super(ConfiguredStructure.class, minecraftRegistry, LegacyRegistry::minecraftToBukkit);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private static @Nullable ConfiguredStructure minecraftToBukkit(NamespacedKey key, Structure nms) {
|
|
|
|
|
+ final ResourceLocation structureTypeLoc = Objects.requireNonNull(BuiltInRegistries.STRUCTURE_TYPE.getKey(nms.type()), "unexpected structure type " + nms.type());
|
|
|
|
|
+ final @Nullable StructureType structureType = StructureType.getStructureTypes().get(structureTypeLoc.getPath());
|
|
|
|
|
+ return structureType == null ? null : new ConfiguredStructure(key, structureType);
|
|
|
|
|
+ }
|
|
|
|
|
+ public static @Nullable ConfiguredStructure minecraftToBukkit(NamespacedKey key, Structure nms) {
|
|
|
|
|
+ final ResourceLocation structureTypeLoc = Objects.requireNonNull(BuiltInRegistries.STRUCTURE_TYPE.getKey(nms.type()), "unexpected structure type " + nms.type());
|
|
|
|
|
+ final @Nullable StructureType structureType = StructureType.getStructureTypes().get(structureTypeLoc.getPath());
|
|
|
|
|
+ return structureType == null ? null : new ConfiguredStructure(key, structureType);
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/chunk/ChunkGenerator.java b/src/main/java/net/minecraft/world/level/chunk/ChunkGenerator.java
|
|
|
|
@@ -75,22 +104,6 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|
|
|
|
ChunkGeneratorStructureState chunkgeneratorstructurestate = world.getChunkSource().getGeneratorState();
|
|
|
|
|
Map<StructurePlacement, Set<Holder<Structure>>> map = new Object2ObjectArrayMap();
|
|
|
|
|
Iterator iterator = structures.iterator();
|
|
|
|
|
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftRegistry.java b/src/main/java/org/bukkit/craftbukkit/CraftRegistry.java
|
|
|
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
|
|
|
--- a/src/main/java/org/bukkit/craftbukkit/CraftRegistry.java
|
|
|
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/CraftRegistry.java
|
|
|
|
|
@@ -0,0 +0,0 @@ public class CraftRegistry<B extends Keyed, M> implements Registry<B> {
|
|
|
|
|
return new CraftRegistry<>(Wolf.Variant.class, registryHolder.registryOrThrow(Registries.WOLF_VARIANT), CraftWolf.CraftVariant::new);
|
|
|
|
|
}
|
|
|
|
|
// TODO registry modification API
|
|
|
|
|
+ // Paper start - remove this after a while along with all ConfiguredStructure stuff
|
|
|
|
|
+ if (bukkitClass == io.papermc.paper.world.structure.ConfiguredStructure.class) {
|
|
|
|
|
+ return new io.papermc.paper.world.structure.PaperConfiguredStructure.LegacyRegistry(registryHolder.registryOrThrow(Registries.STRUCTURE));
|
|
|
|
|
+ }
|
|
|
|
|
+ // Paper end
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
diff --git a/src/test/java/io/papermc/paper/world/structure/ConfiguredStructureTest.java b/src/test/java/io/papermc/paper/world/structure/ConfiguredStructureTest.java
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
|
|
|
|
@@ -201,7 +214,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|
|
|
|
if (!(object instanceof CraftRegistry<?, ?> registry)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
+ if (object instanceof io.papermc.paper.world.structure.PaperConfiguredStructure.LegacyRegistry) continue; // Paper - skip
|
|
|
|
|
+ if (object == Registry.CONFIGURED_STRUCTURE) continue; // Paper - skip
|
|
|
|
|
|
|
|
|
|
data.add(Arguments.of(registry));
|
|
|
|
|
} catch (ReflectiveOperationException e) {
|
|
|
|
@@ -210,10 +223,10 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|
|
|
|
--- a/src/test/java/org/bukkit/registry/RegistryArgumentAddedTest.java
|
|
|
|
|
+++ b/src/test/java/org/bukkit/registry/RegistryArgumentAddedTest.java
|
|
|
|
|
@@ -0,0 +0,0 @@ public class RegistryArgumentAddedTest extends AbstractTestingBase {
|
|
|
|
|
|
|
|
|
|
Set<Class<?>> loadedRegistries = new HashSet<>(DummyServer.registers.keySet());
|
|
|
|
|
Set<Class<?>> notFound = new HashSet<>();
|
|
|
|
|
+ loadedRegistries.remove(io.papermc.paper.world.structure.ConfiguredStructure.class); // Paper - ignore
|
|
|
|
|
loadedRegistries.addAll(io.papermc.paper.registry.PaperRegistryAccess.instance().getLoadedServerBackedRegistries());
|
|
|
|
|
// Paper end
|
|
|
|
|
Set<io.papermc.paper.registry.RegistryKey<?>> notFound = new HashSet<>(); // Paper
|
|
|
|
|
+ loadedRegistries.remove(io.papermc.paper.registry.PaperRegistries.CONFIGURED_STRUCTURE_REGISTRY_KEY); // Paper - ignore
|
|
|
|
|
|
|
|
|
|
RegistriesArgumentProvider
|
|
|
|
|
.getData()
|
|
|
|
|