mirror of
https://github.com/PaperMC/Paper.git
synced 2024-11-23 11:06:29 +01:00
90fe0d58a5
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 897a0a23 SPIGOT-5753: Back PotionType by a minecraft registry 255b2aa1 SPIGOT-7080: Add World#locateNearestBiome ff984826 Remove javadoc.io doc links CraftBukkit Changes: 71b0135cc SPIGOT-5753: Back PotionType by a minecraft registry a6bcb8489 SPIGOT-7080: Add World#locateNearestBiome ad0e57434 SPIGOT-7502: CraftMetaItem - cannot deserialize BlockStateTag b3efca57a SPIGOT-6400: Use Mockito instead of InvocationHandler 38c599f9d PR-1272: Only allow one entity in CraftItem instead of two f065271ac SPIGOT-7498: ChunkSnapshot.getBlockEmittedLight() gets 64 blocks upper in Overworld Spigot Changes: e0e223fe Remove javadoc.io doc links
63 lines
3.7 KiB
Diff
63 lines
3.7 KiB
Diff
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
|
|
--- 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> {
|
|
});
|
|
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.setVariant((CatVariant) BuiltInRegistries.CAT_VARIANT.getOrThrow(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 b33a015b834873f279bf33a64974ef440a37df79..09c85ed428b8eaf51f8b3c6e45cce925f05ab354 100644
|
|
--- a/src/main/java/net/minecraft/world/level/StructureManager.java
|
|
+++ b/src/main/java/net/minecraft/world/level/StructureManager.java
|
|
@@ -44,7 +44,12 @@ public class StructureManager {
|
|
}
|
|
|
|
public List<StructureStart> startsForStructure(ChunkPos pos, Predicate<Structure> predicate) {
|
|
- Map<Structure, LongSet> map = this.level.getChunk(pos.x, pos.z, ChunkStatus.STRUCTURE_REFERENCES).getAllReferences();
|
|
+ // Paper start
|
|
+ return this.startsForStructure(pos, predicate, null);
|
|
+ }
|
|
+ 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();
|
|
+ // Paper end
|
|
ImmutableList.Builder<StructureStart> builder = ImmutableList.builder();
|
|
|
|
for(Map.Entry<Structure, LongSet> entry : map.entrySet()) {
|
|
@@ -108,13 +113,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(Registries.STRUCTURE);
|
|
|
|
for(StructureStart structureStart : this.startsForStructure(new ChunkPos(pos), (structure) -> {
|
|
return registry.getHolder(registry.getId(structure)).map((reference) -> {
|
|
return reference.is(structureTag);
|
|
}).orElse(false);
|
|
- })) {
|
|
+ }, levelAccessor)) { // Paper
|
|
if (this.structureHasPieceAt(pos, structureStart)) {
|
|
return structureStart;
|
|
}
|