--- a/net/minecraft/world/level/StructureManager.java
+++ b/net/minecraft/world/level/StructureManager.java
@@ -43,7 +43,12 @@
     }
 
     public List<StructureStart> startsForStructure(ChunkPos pos, Predicate<Structure> predicate) {
-        Map<Structure, LongSet> map = this.level.getChunk(pos.x, pos.z, ChunkStatus.STRUCTURE_REFERENCES).getAllReferences();
+        // Paper start
+        return this.startsForStructure(pos, predicate, null);
+    }
+    public List<StructureStart> startsForStructure(ChunkPos pos, Predicate<Structure> predicate, @Nullable ServerLevelAccessor levelAccessor) {
+        Map<Structure, LongSet> map = (levelAccessor == null ? this.level : levelAccessor).getChunk(pos.x, pos.z, ChunkStatus.STRUCTURE_REFERENCES).getAllReferences();
+        // Paper end
         ImmutableList.Builder<StructureStart> builder = ImmutableList.builder();
 
         for(Map.Entry<Structure, LongSet> entry : map.entrySet()) {
@@ -107,13 +112,18 @@
     }
 
     public StructureStart getStructureWithPieceAt(BlockPos pos, TagKey<Structure> structureTag) {
+        // Paper start
+        return this.getStructureWithPieceAt(pos, structureTag, null);
+    }
+    public StructureStart getStructureWithPieceAt(BlockPos pos, TagKey<Structure> structureTag, @Nullable ServerLevelAccessor levelAccessor) {
+        // Paper end
         Registry<Structure> registry = this.registryAccess().registryOrThrow(Registry.STRUCTURE_REGISTRY);
 
         for(StructureStart structureStart : this.startsForStructure(new ChunkPos(pos), (structure) -> {
             return registry.getHolder(registry.getId(structure)).map((holder) -> {
                 return holder.is(structureTag);
             }).orElse(false);
-        })) {
+        }, levelAccessor)) { // Paper
             if (this.structureHasPieceAt(pos, structureStart)) {
                 return structureStart;
             }
