aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0875-Fix-World-locateNearestStructure.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0875-Fix-World-locateNearestStructure.patch')
-rw-r--r--patches/server/0875-Fix-World-locateNearestStructure.patch74
1 files changed, 74 insertions, 0 deletions
diff --git a/patches/server/0875-Fix-World-locateNearestStructure.patch b/patches/server/0875-Fix-World-locateNearestStructure.patch
new file mode 100644
index 0000000000..95d96b579b
--- /dev/null
+++ b/patches/server/0875-Fix-World-locateNearestStructure.patch
@@ -0,0 +1,74 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Jake Potrebic <[email protected]>
+Date: Tue, 1 Mar 2022 14:12:17 -0800
+Subject: [PATCH] Fix World#locateNearestStructure
+
+1.18.2 switched to TagKeys to reference tags of objects, and this method
+ impl needs to be changed to reflect that
+
+diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
+index 85b3bf7718e51ffa52799c0748843aaad3fd3813..17e87875a95495940899b862eabf98b3d6a365da 100644
+--- a/src/main/java/net/minecraft/server/MinecraftServer.java
++++ b/src/main/java/net/minecraft/server/MinecraftServer.java
+@@ -2060,6 +2060,11 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
+ this.resources.managers.updateRegistryTags(this.registryAccess());
+ io.papermc.paper.registry.PaperRegistry.clearCaches(); // Paper
+ net.minecraft.world.item.alchemy.PotionBrewing.reload(); // Paper
++ // Paper start - clear cache cause datapacks can add more configured structures
++ for (ServerLevel level : this.levels.values()) {
++ level.getWorld().structureCache.clear();
++ }
++ // Paper end
+ new io.papermc.paper.event.server.ServerResourcesReloadedEvent(cause).callEvent(); // Paper
+ if (Thread.currentThread() != this.serverThread) return; // Paper
+ //this.getPlayerList().saveAll(); // Paper - we don't need to do this
+diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
+index 8e87aca16879d7dd1dc0bd17d3215fca40b547cd..b5b56d4549e97abbbe9e91d881b9bca8428f1eec 100644
+--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
++++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
+@@ -1790,7 +1790,16 @@ public class ServerLevel extends Level implements WorldGenLevel {
+ if (optional.isEmpty()) {
+ return null;
+ } else {
+- Pair<BlockPos, Holder<ConfiguredStructureFeature<?, ?>>> pair = this.getChunkSource().getGenerator().findNearestMapFeature(this, (HolderSet) optional.get(), pos, radius, skipExistingChunks);
++ // Paper start
++ return this.findNearestMapFeature(optional.get(), pos, radius, skipExistingChunks);
++ }
++ }
++ }
++ public @Nullable BlockPos findNearestMapFeature(HolderSet<ConfiguredStructureFeature<?, ?>> holderSet, BlockPos pos, int radius, boolean skipExistingChunks) {
++ {
++ {
++ Pair<BlockPos, Holder<ConfiguredStructureFeature<?, ?>>> pair = this.getChunkSource().getGenerator().findNearestMapFeature(this, holderSet, pos, radius, skipExistingChunks);
++ // Paper end
+
+ return pair != null ? (BlockPos) pair.getFirst() : null;
+ }
+diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+index a3ddeb9862bc87294c215dc906cd8cca8f699b62..b2c5fbfcb64f3056d7975db43b2db45bfd5e9890 100644
+--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
++++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+@@ -2071,10 +2071,22 @@ public class CraftWorld extends CraftRegionAccessor implements World {
+
+ }
+
++ public final Map<StructureType, List<Holder.Reference<net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature<?, ?>>>> structureCache = new java.util.HashMap<>(); // Paper
+ @Override
+ public Location locateNearestStructure(Location origin, StructureType structureType, int radius, boolean findUnexplored) {
+ BlockPos originPos = new BlockPos(origin.getX(), origin.getY(), origin.getZ());
+- BlockPos nearest = this.getHandle().findNearestMapFeature(TagKey.create(Registry.CONFIGURED_STRUCTURE_FEATURE_REGISTRY, CraftNamespacedKey.toMinecraft(structureType.getKey())), originPos, radius, findUnexplored);
++ // Paper start - fix because you can't just create random TagKeys
++ if (!this.getHandle().serverLevelData.worldGenSettings().generateFeatures()) { // from ServerLevel#findNearestMapFeature
++ return null;
++ }
++ final List<Holder.Reference<net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature<?, ?>>> features = this.structureCache.computeIfAbsent(structureType, (type) -> {
++ final Registry<net.minecraft.world.level.levelgen.feature.StructureFeature<?>> structureFeatureRegistry = this.getHandle().registryAccess().registryOrThrow(Registry.STRUCTURE_FEATURE_REGISTRY);
++ return this.getHandle().registryAccess().registryOrThrow(Registry.CONFIGURED_STRUCTURE_FEATURE_REGISTRY).holders().filter(holder -> {
++ return structureType.getKey().equals(org.bukkit.craftbukkit.util.CraftNamespacedKey.fromMinecraft(Objects.requireNonNull(structureFeatureRegistry.getKey(holder.value().feature))));
++ }).toList();
++ });
++ BlockPos nearest = this.getHandle().findNearestMapFeature(net.minecraft.core.HolderSet.direct(features), originPos, radius, findUnexplored);
++ // Paper end
+ return (nearest == null) ? null : new Location(this, nearest.getX(), nearest.getY(), nearest.getZ());
+ }
+