--- a/net/minecraft/world/level/StructureManager.java +++ b/net/minecraft/world/level/StructureManager.java @@ -48,7 +_,13 @@ } public List startsForStructure(ChunkPos chunkPos, Predicate structurePredicate) { - Map allReferences = this.level.getChunk(chunkPos.x, chunkPos.z, ChunkStatus.STRUCTURE_REFERENCES).getAllReferences(); + // Paper start - Fix swamp hut cat generation deadlock + return this.startsForStructure(chunkPos, structurePredicate, null); + } + + public List startsForStructure(ChunkPos chunkPos, Predicate structurePredicate, @Nullable ServerLevelAccessor levelAccessor) { + Map allReferences = (levelAccessor == null ? this.level : levelAccessor).getChunk(chunkPos.x, chunkPos.z, ChunkStatus.STRUCTURE_REFERENCES).getAllReferences(); + // Paper end - Fix swamp hut cat generation deadlock Builder builder = ImmutableList.builder(); for (Entry entry : allReferences.entrySet()) { @@ -118,10 +_,20 @@ } public StructureStart getStructureWithPieceAt(BlockPos pos, Predicate> predicate) { + // Paper start - Fix swamp hut cat generation deadlock + return this.getStructureWithPieceAt(pos, predicate, null); + } + + public StructureStart getStructureWithPieceAt(BlockPos pos, TagKey tag, @Nullable ServerLevelAccessor levelAccessor) { + return this.getStructureWithPieceAt(pos, structure -> structure.is(tag), levelAccessor); + } + + public StructureStart getStructureWithPieceAt(BlockPos pos, Predicate> predicate, @Nullable ServerLevelAccessor levelAccessor) { + // Paper end - Fix swamp hut cat generation deadlock Registry registry = this.registryAccess().lookupOrThrow(Registries.STRUCTURE); for (StructureStart structureStart : this.startsForStructure( - new ChunkPos(pos), structure -> registry.get(registry.getId(structure)).map(predicate::test).orElse(false) + new ChunkPos(pos), structure -> registry.get(registry.getId(structure)).map(predicate::test).orElse(false), levelAccessor // Paper - Fix swamp hut cat generation deadlock )) { if (this.structureHasPieceAt(pos, structureStart)) { return structureStart;