aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--patches/server/0877-Fix-swamp-hut-cat-generation-deadlock.patch56
1 files changed, 56 insertions, 0 deletions
diff --git a/patches/server/0877-Fix-swamp-hut-cat-generation-deadlock.patch b/patches/server/0877-Fix-swamp-hut-cat-generation-deadlock.patch
new file mode 100644
index 0000000000..c928ada21b
--- /dev/null
+++ b/patches/server/0877-Fix-swamp-hut-cat-generation-deadlock.patch
@@ -0,0 +1,56 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Spottedleaf <[email protected]>
+Date: Sat, 12 Mar 2022 06:31:13 -0800
+Subject: [PATCH] Fix swamp hut cat generation deadlock
+
+The worldgen thread will attempt to get structure references
+via the world's getChunkAt method, which is fine if the gen is
+not cancelled - but if the chunk was unloaded, the call will block
+indefinitely. Instead of using the world state, we use the already
+supplied generatoraccess which will always have the chunk available.
+
+diff --git a/src/main/java/net/minecraft/world/entity/animal/Cat.java b/src/main/java/net/minecraft/world/entity/animal/Cat.java
+index 5f7c394f9cc178c9cb06c90b91296b979d61239b..e4eac546836b73b5e9c8fd68ca0d32c01148313e 100644
+--- a/src/main/java/net/minecraft/world/entity/animal/Cat.java
++++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java
+@@ -392,7 +392,7 @@ public class Cat extends TamableAnimal {
+ Registry<ConfiguredStructureFeature<?, ?>> iregistry = worldserver1.registryAccess().registryOrThrow(Registry.CONFIGURED_STRUCTURE_FEATURE_REGISTRY);
+
+ if (ChunkGenerator.allConfigurations(iregistry, StructureFeature.SWAMP_HUT).anyMatch((structurefeature) -> {
+- return worldserver1.structureFeatureManager().getStructureWithPieceAt(this.blockPosition(), structurefeature).isValid();
++ return worldserver1.structureFeatureManager().getStructureWithPieceAt(this.blockPosition(), structurefeature, world).isValid(); // Paper - fix deadlock
+ })) {
+ this.setCatType(10);
+ this.setPersistenceRequired();
+diff --git a/src/main/java/net/minecraft/world/level/StructureFeatureManager.java b/src/main/java/net/minecraft/world/level/StructureFeatureManager.java
+index 81bb2235bec095b9e5fa7b41dfd12c6b06b4bdf5..fa6eaf7041b6a8b17c64322307839dbd358ad3ab 100644
+--- a/src/main/java/net/minecraft/world/level/StructureFeatureManager.java
++++ b/src/main/java/net/minecraft/world/level/StructureFeatureManager.java
+@@ -58,7 +58,12 @@ public class StructureFeatureManager {
+ }
+
+ public List<StructureStart> startsForFeature(SectionPos sectionPos, ConfiguredStructureFeature<?, ?> configuredStructureFeature) {
+- LongSet longSet = this.level.getChunk(sectionPos.x(), sectionPos.z(), ChunkStatus.STRUCTURE_REFERENCES).getReferencesForFeature(configuredStructureFeature);
++ // Paper start - add world option
++ return this.startsForFeature(sectionPos, configuredStructureFeature, (ServerLevelAccessor)null);
++ }
++ public List<StructureStart> startsForFeature(SectionPos sectionPos, ConfiguredStructureFeature<?, ?> configuredStructureFeature, ServerLevelAccessor world) {
++ LongSet longSet = (world == null ? this.level : world).getChunk(sectionPos.x(), sectionPos.z(), ChunkStatus.STRUCTURE_REFERENCES).getReferencesForFeature(configuredStructureFeature);
++ // Paper end - add world option
+ Builder<StructureStart> builder = ImmutableList.builder();
+ this.fillStartsForFeature(configuredStructureFeature, longSet, builder::add);
+ return builder.build();
+@@ -108,7 +113,12 @@ public class StructureFeatureManager {
+ }
+
+ public StructureStart getStructureWithPieceAt(BlockPos pos, ConfiguredStructureFeature<?, ?> configuredStructureFeature) {
+- for(StructureStart structureStart : this.startsForFeature(SectionPos.of(pos), configuredStructureFeature)) {
++ // Paper start - add world option
++ return this.getStructureWithPieceAt(pos, configuredStructureFeature, (ServerLevelAccessor)null);
++ }
++ public StructureStart getStructureWithPieceAt(BlockPos pos, ConfiguredStructureFeature<?, ?> configuredStructureFeature, ServerLevelAccessor world) {
++ // Paper end - add world option
++ for(StructureStart structureStart : this.startsForFeature(SectionPos.of(pos), configuredStructureFeature, world)) { // Paper - add world option
+ if (this.structureHasPieceAt(pos, structureStart)) {
+ return structureStart;
+ }