|
| 1 | +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
| 2 | +From: Jake Potrebic <jake.m.potrebic@gmail.com> |
| 3 | +Date: Tue, 1 Mar 2022 14:12:17 -0800 |
| 4 | +Subject: [PATCH] Fix World#locateNearestStructure |
| 5 | + |
| 6 | +1.18.2 switched to TagKeys to reference tags of objects, and this method |
| 7 | + impl needs to be changed to reflect that |
| 8 | + |
| 9 | +diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java |
| 10 | +index 0a0bc8c45cb70073cb94dee25b5e54fb98bf9c8e..3a9c27ece0ad18b2c4686164766794c56fcea268 100644 |
| 11 | +--- a/src/main/java/net/minecraft/server/MinecraftServer.java |
| 12 | ++++ b/src/main/java/net/minecraft/server/MinecraftServer.java |
| 13 | +@@ -2061,6 +2061,11 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa |
| 14 | + this.worldData.setDataPackConfig(MinecraftServer.getSelectedPacks(this.packRepository)); |
| 15 | + this.resources.managers.updateRegistryTags(this.registryAccess()); |
| 16 | + net.minecraft.world.item.alchemy.PotionBrewing.reload(); // Paper |
| 17 | ++ // Paper start - clear cache cause datapacks can add more configured structures |
| 18 | ++ for (ServerLevel level : this.levels.values()) { |
| 19 | ++ level.getWorld().structureCache.clear(); |
| 20 | ++ } |
| 21 | ++ // Paper end |
| 22 | + new io.papermc.paper.event.server.ServerResourcesReloadedEvent(cause).callEvent(); // Paper |
| 23 | + if (Thread.currentThread() != this.serverThread) return; // Paper |
| 24 | + //this.getPlayerList().saveAll(); // Paper - we don't need to do this |
| 25 | +diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java |
| 26 | +index 8e87aca16879d7dd1dc0bd17d3215fca40b547cd..b5b56d4549e97abbbe9e91d881b9bca8428f1eec 100644 |
| 27 | +--- a/src/main/java/net/minecraft/server/level/ServerLevel.java |
| 28 | ++++ b/src/main/java/net/minecraft/server/level/ServerLevel.java |
| 29 | +@@ -1790,7 +1790,16 @@ public class ServerLevel extends Level implements WorldGenLevel { |
| 30 | + if (optional.isEmpty()) { |
| 31 | + return null; |
| 32 | + } else { |
| 33 | +- Pair<BlockPos, Holder<ConfiguredStructureFeature<?, ?>>> pair = this.getChunkSource().getGenerator().findNearestMapFeature(this, (HolderSet) optional.get(), pos, radius, skipExistingChunks); |
| 34 | ++ // Paper start |
| 35 | ++ return this.findNearestMapFeature(optional.get(), pos, radius, skipExistingChunks); |
| 36 | ++ } |
| 37 | ++ } |
| 38 | ++ } |
| 39 | ++ public @Nullable BlockPos findNearestMapFeature(HolderSet<ConfiguredStructureFeature<?, ?>> holderSet, BlockPos pos, int radius, boolean skipExistingChunks) { |
| 40 | ++ { |
| 41 | ++ { |
| 42 | ++ Pair<BlockPos, Holder<ConfiguredStructureFeature<?, ?>>> pair = this.getChunkSource().getGenerator().findNearestMapFeature(this, holderSet, pos, radius, skipExistingChunks); |
| 43 | ++ // Paper end |
| 44 | + |
| 45 | + return pair != null ? (BlockPos) pair.getFirst() : null; |
| 46 | + } |
| 47 | +diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java |
| 48 | +index a3ddeb9862bc87294c215dc906cd8cca8f699b62..b2c5fbfcb64f3056d7975db43b2db45bfd5e9890 100644 |
| 49 | +--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java |
| 50 | ++++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java |
| 51 | +@@ -2071,10 +2071,22 @@ public class CraftWorld extends CraftRegionAccessor implements World { |
| 52 | + |
| 53 | + } |
| 54 | + |
| 55 | ++ public final Map<StructureType, List<Holder.Reference<net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature<?, ?>>>> structureCache = new java.util.HashMap<>(); // Paper |
| 56 | + @Override |
| 57 | + public Location locateNearestStructure(Location origin, StructureType structureType, int radius, boolean findUnexplored) { |
| 58 | + BlockPos originPos = new BlockPos(origin.getX(), origin.getY(), origin.getZ()); |
| 59 | +- BlockPos nearest = this.getHandle().findNearestMapFeature(TagKey.create(Registry.CONFIGURED_STRUCTURE_FEATURE_REGISTRY, CraftNamespacedKey.toMinecraft(structureType.getKey())), originPos, radius, findUnexplored); |
| 60 | ++ // Paper start - fix because you can't just create random TagKeys |
| 61 | ++ if (!this.getHandle().serverLevelData.worldGenSettings().generateFeatures()) { // from ServerLevel#findNearestMapFeature |
| 62 | ++ return null; |
| 63 | ++ } |
| 64 | ++ final List<Holder.Reference<net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature<?, ?>>> features = this.structureCache.computeIfAbsent(structureType, (type) -> { |
| 65 | ++ final Registry<net.minecraft.world.level.levelgen.feature.StructureFeature<?>> structureFeatureRegistry = this.getHandle().registryAccess().registryOrThrow(Registry.STRUCTURE_FEATURE_REGISTRY); |
| 66 | ++ return this.getHandle().registryAccess().registryOrThrow(Registry.CONFIGURED_STRUCTURE_FEATURE_REGISTRY).holders().filter(holder -> { |
| 67 | ++ return structureType.getKey().equals(org.bukkit.craftbukkit.util.CraftNamespacedKey.fromMinecraft(Objects.requireNonNull(structureFeatureRegistry.getKey(holder.value().feature)))); |
| 68 | ++ }).toList(); |
| 69 | ++ }); |
| 70 | ++ BlockPos nearest = this.getHandle().findNearestMapFeature(net.minecraft.core.HolderSet.direct(features), originPos, radius, findUnexplored); |
| 71 | ++ // Paper end |
| 72 | + return (nearest == null) ? null : new Location(this, nearest.getX(), nearest.getY(), nearest.getZ()); |
| 73 | + } |
| 74 | + |
0 commit comments