Mirror von
https://github.com/PaperMC/Paper.git
synchronisiert 2024-12-15 11:00:06 +01:00
Add back fix swamp hut deadlock patch
Dieser Commit ist enthalten in:
Ursprung
a6bc17b8bb
Commit
7a165c9c5d
@ -1,56 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
|
|
||||||
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 2825975e5b33ea13f199008c7a4abc72ebf990b3..56c4f849d92b38537602fd77e481ee60a25bc84b 100644
|
|
||||||
--- a/src/main/java/net/minecraft/world/level/StructureFeatureManager.java
|
|
||||||
+++ b/src/main/java/net/minecraft/world/level/StructureFeatureManager.java
|
|
||||||
@@ -56,7 +56,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
|
|
||||||
ImmutableList.Builder<StructureStart> builder = ImmutableList.builder();
|
|
||||||
this.fillStartsForFeature(configuredStructureFeature, longSet, builder::add);
|
|
||||||
return builder.build();
|
|
||||||
@@ -106,7 +111,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;
|
|
||||||
}
|
|
62
patches/server/0863-Fix-swamp-hut-cat-generation-deadlock.patch
Normale Datei
62
patches/server/0863-Fix-swamp-hut-cat-generation-deadlock.patch
Normale Datei
@ -0,0 +1,62 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
|
||||||
|
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 ServerLevelAccessor 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 5ad968a2f1add27da0d6a858e683d5d771128092..e44352857272a2a4027c67bd25a28a9498b7bb49 100644
|
||||||
|
--- a/src/main/java/net/minecraft/world/entity/animal/Cat.java
|
||||||
|
+++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java
|
||||||
|
@@ -361,7 +361,7 @@ public class Cat extends TamableAnimal {
|
||||||
|
});
|
||||||
|
ServerLevel worldserver = world.getLevel();
|
||||||
|
|
||||||
|
- if (worldserver.structureManager().getStructureWithPieceAt(this.blockPosition(), StructureTags.CATS_SPAWN_AS_BLACK).isValid()) {
|
||||||
|
+ if (worldserver.structureManager().getStructureWithPieceAt(this.blockPosition(), StructureTags.CATS_SPAWN_AS_BLACK, world).isValid()) { // Paper - fix deadlock
|
||||||
|
this.setCatVariant(CatVariant.ALL_BLACK);
|
||||||
|
this.setPersistenceRequired();
|
||||||
|
}
|
||||||
|
diff --git a/src/main/java/net/minecraft/world/level/StructureManager.java b/src/main/java/net/minecraft/world/level/StructureManager.java
|
||||||
|
index 21afcbc71fdb10994f2f3451f5b06e4bb75c60c7..bca1e39da66a889caf92c28b6348623a440e1c7f 100644
|
||||||
|
--- a/src/main/java/net/minecraft/world/level/StructureManager.java
|
||||||
|
+++ b/src/main/java/net/minecraft/world/level/StructureManager.java
|
||||||
|
@@ -43,7 +43,12 @@ public class StructureManager {
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<StructureStart> startsForStructure(ChunkPos chunkPos, Predicate<Structure> predicate) {
|
||||||
|
- Map<Structure, LongSet> map = this.level.getChunk(chunkPos.x, chunkPos.z, ChunkStatus.STRUCTURE_REFERENCES).getAllReferences();
|
||||||
|
+ // Paper start
|
||||||
|
+ return this.startsForStructure(chunkPos, predicate, null);
|
||||||
|
+ }
|
||||||
|
+ public List<StructureStart> startsForStructure(ChunkPos chunkPos, Predicate<Structure> predicate, @Nullable ServerLevelAccessor levelAccessor) {
|
||||||
|
+ // Paper end
|
||||||
|
+ Map<Structure, LongSet> map = (levelAccessor == null ? this.level : levelAccessor).getChunk(chunkPos.x, chunkPos.z, ChunkStatus.STRUCTURE_REFERENCES).getAllReferences();
|
||||||
|
ImmutableList.Builder<StructureStart> builder = ImmutableList.builder();
|
||||||
|
|
||||||
|
for(Map.Entry<Structure, LongSet> entry : map.entrySet()) {
|
||||||
|
@@ -107,13 +112,18 @@ public class StructureManager {
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
@ -5,7 +5,7 @@ Subject: [PATCH] Add EntityDyeEvent and CollarColorable interface
|
|||||||
|
|
||||||
|
|
||||||
diff --git a/src/main/java/net/minecraft/world/entity/animal/Cat.java b/src/main/java/net/minecraft/world/entity/animal/Cat.java
|
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 5ad968a2f1add27da0d6a858e683d5d771128092..4e42bcb48c75c816e89e652c898242a9bd8c9d5a 100644
|
index e44352857272a2a4027c67bd25a28a9498b7bb49..ab86bfdaebe9b8791f0cfa6e0c61f80c8f891a93 100644
|
||||||
--- a/src/main/java/net/minecraft/world/entity/animal/Cat.java
|
--- a/src/main/java/net/minecraft/world/entity/animal/Cat.java
|
||||||
+++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java
|
+++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java
|
||||||
@@ -399,6 +399,13 @@ public class Cat extends TamableAnimal {
|
@@ -399,6 +399,13 @@ public class Cat extends TamableAnimal {
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren