PaperMC/patches/server/0810-Fix-swamp-hut-cat-generation-deadlock.patch

63 lines
3.7 KiB
Diff
Raw Normal View History

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 913edb066f82b2e3abd2f98ae40144594740f920..9bcc1f4b60eebe77ffc2afaabd46629cb37cc8a0 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
@@ -363,7 +363,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
index b33a015b834873f279bf33a64974ef440a37df79..09c85ed428b8eaf51f8b3c6e45cce925f05ab354 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;
}