1358d1e914
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: 881e06e5 PR-725: Add Item Unlimited Lifetime APIs CraftBukkit Changes: 74c08312 SPIGOT-6962: Call EntityChangeBlockEvent when when FallingBlockEntity starts to fall 64db5126 SPIGOT-6959: Make /loot command ignore empty items for spawn 2d760831 Increase outdated build delay 9ed7e4fb SPIGOT-6138, SPIGOT-6415: Don't call CreatureSpawnEvent after cross-dimensional travel fc4ad813 SPIGOT-6895: Trees grown with applyBoneMeal() don't fire the StructureGrowthEvent 59733a2e SPIGOT-6961: Actually return a copy of the ItemMeta Spigot Changes: ffceeae3 SPIGOT-6956: Drop unload queue patch as attempt at fixing stop issue e19ddabd PR-1011: Add Item Unlimited Lifetime APIs 34d40b0e SPIGOT-2942: give command fires PlayerDropItemEvent, cancelling it causes Item Duplication
57 Zeilen
4.0 KiB
Diff
57 Zeilen
4.0 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 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;
|
|
}
|