diff --git a/patches/server/0921-Do-not-sync-load-chunk-for-dynamic-game-event-listen.patch b/patches/server/0921-Do-not-sync-load-chunk-for-dynamic-game-event-listen.patch new file mode 100644 index 0000000000..f9cbdd0899 --- /dev/null +++ b/patches/server/0921-Do-not-sync-load-chunk-for-dynamic-game-event-listen.patch @@ -0,0 +1,29 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Spottedleaf +Date: Sun, 3 Jul 2022 22:31:37 -0700 +Subject: [PATCH] Do not sync load chunk for dynamic game event listener + registration + +These can be called while an entity is being added to the world, +and if the entity is being added from a chunk load context the +sync load will block indefinitely (because the chunk load context +is for completing the chunk to FULL). + +This does raise questions about the current system for these +dynamic registrations, as it looks like there is _zero_ logic +to account for the case where the chunk is _not_ currently loaded +and then later loaded. + +diff --git a/src/main/java/net/minecraft/world/level/gameevent/DynamicGameEventListener.java b/src/main/java/net/minecraft/world/level/gameevent/DynamicGameEventListener.java +index 39f79c6d95e0f14d55783375df9ecf053e8d19de..610bfcceec51fcd1d82040f0dbfc03be20b8dce7 100644 +--- a/src/main/java/net/minecraft/world/level/gameevent/DynamicGameEventListener.java ++++ b/src/main/java/net/minecraft/world/level/gameevent/DynamicGameEventListener.java +@@ -66,7 +66,7 @@ public class DynamicGameEventListener { + + private static void ifChunkExists(LevelReader world, @Nullable SectionPos sectionPos, Consumer dispatcherConsumer) { + if (sectionPos != null) { +- ChunkAccess chunkAccess = world.getChunk(sectionPos.x(), sectionPos.z(), ChunkStatus.FULL, false); ++ ChunkAccess chunkAccess = world.getChunkIfLoadedImmediately(sectionPos.getX(), sectionPos.getZ()); // Paper - can cause sync loads while completing a chunk, resulting in deadlock + if (chunkAccess != null) { + dispatcherConsumer.accept(chunkAccess.getEventDispatcher(sectionPos.y())); + }