--- a/net/minecraft/world/level/StructureManager.java
+++ b/net/minecraft/world/level/StructureManager.java
@@ -48,7 +48,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 - Fix swamp hut cat generation deadlock
+        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 - Fix swamp hut cat generation deadlock
         Builder<StructureStart> builder = ImmutableList.builder();
 
         for (Entry<Structure, LongSet> entry : map.entrySet()) {
@@ -116,10 +121,20 @@
     }
 
     public StructureStart getStructureWithPieceAt(BlockPos pos, Predicate<Holder<Structure>> predicate) {
+        // Paper start - Fix swamp hut cat generation deadlock
+        return this.getStructureWithPieceAt(pos, predicate, null);
+    }
+
+    public StructureStart getStructureWithPieceAt(BlockPos pos, TagKey<Structure> tag, @Nullable ServerLevelAccessor levelAccessor) {
+        return this.getStructureWithPieceAt(pos, structure -> structure.is(tag), levelAccessor);
+    }
+
+    public StructureStart getStructureWithPieceAt(BlockPos pos, Predicate<Holder<Structure>> predicate, @Nullable ServerLevelAccessor levelAccessor) {
+        // Paper end - Fix swamp hut cat generation deadlock
         Registry<Structure> registry = this.registryAccess().registryOrThrow(Registries.STRUCTURE);
 
         for (StructureStart structureStart : this.startsForStructure(
-            new ChunkPos(pos), structure -> registry.getHolder(registry.getId(structure)).map(predicate::test).orElse(false)
+            new ChunkPos(pos), structure -> registry.getHolder(registry.getId(structure)).map(predicate::test).orElse(false), levelAccessor // Paper - Fix swamp hut cat generation deadlock
         )) {
             if (this.structureHasPieceAt(pos, structureStart)) {
                 return structureStart;
