Paper/patches/server/0770-Fix-swamp-hut-cat-generation-deadlock.patch

63 Zeilen
3.7 KiB
Diff

2022-06-08 16:58:51 +02:00
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 534630b0161c8d869e49e7a59572193550be0671..a744cb70ac719eae376fb2ab2271e4f8ac7b12f2 100644
2022-06-08 16:58:51 +02:00
--- a/src/main/java/net/minecraft/world/entity/animal/Cat.java
+++ b/src/main/java/net/minecraft/world/entity/animal/Cat.java
@@ -364,7 +364,7 @@ public class Cat extends TamableAnimal implements VariantHolder<CatVariant> {
2022-06-08 16:58:51 +02:00
});
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
2022-12-07 22:35:34 +01:00
this.setVariant((CatVariant) BuiltInRegistries.CAT_VARIANT.getOrThrow(CatVariant.ALL_BLACK));
2022-06-08 16:58:51 +02:00
this.setPersistenceRequired();
}
diff --git a/src/main/java/net/minecraft/world/level/StructureManager.java b/src/main/java/net/minecraft/world/level/StructureManager.java
2023-09-22 19:31:02 +02:00
index 8b545682621554856a28a29869b2e82626a1d2f5..beccf9346cb0bad1b2c0e19104e394c016f8329a 100644
2022-06-08 16:58:51 +02:00
--- a/src/main/java/net/minecraft/world/level/StructureManager.java
+++ b/src/main/java/net/minecraft/world/level/StructureManager.java
2022-12-07 22:35:34 +01:00
@@ -44,7 +44,12 @@ public class StructureManager {
2022-06-08 16:58:51 +02:00
}
2022-07-27 23:32:15 +02:00
public List<StructureStart> startsForStructure(ChunkPos pos, Predicate<Structure> predicate) {
- Map<Structure, LongSet> map = this.level.getChunk(pos.x, pos.z, ChunkStatus.STRUCTURE_REFERENCES).getAllReferences();
2022-06-08 16:58:51 +02:00
+ // Paper start
2022-07-28 00:10:27 +02:00
+ return this.startsForStructure(pos, predicate, null);
2022-06-08 16:58:51 +02:00
+ }
2022-07-27 23:32:15 +02:00
+ 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();
2022-06-08 16:58:51 +02:00
+ // Paper end
ImmutableList.Builder<StructureStart> builder = ImmutableList.builder();
for(Map.Entry<Structure, LongSet> entry : map.entrySet()) {
2022-12-07 22:35:34 +01:00
@@ -108,13 +113,18 @@ public class StructureManager {
2022-06-08 16:58:51 +02:00
}
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
2022-12-07 22:35:34 +01:00
Registry<Structure> registry = this.registryAccess().registryOrThrow(Registries.STRUCTURE);
2022-06-08 16:58:51 +02:00
for(StructureStart structureStart : this.startsForStructure(new ChunkPos(pos), (structure) -> {
2022-12-07 22:35:34 +01:00
return registry.getHolder(registry.getId(structure)).map((reference) -> {
return reference.is(structureTag);
2022-06-08 16:58:51 +02:00
}).orElse(false);
- })) {
+ }, levelAccessor)) { // Paper
if (this.structureHasPieceAt(pos, structureStart)) {
return structureStart;
}