From 39156be36ab1db8744013a91781177a7faa9533d 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. --- .../gameevent/DynamicGameEventListener.java.patch | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 paper-server/patches/sources/net/minecraft/world/level/gameevent/DynamicGameEventListener.java.patch diff --git a/paper-server/patches/sources/net/minecraft/world/level/gameevent/DynamicGameEventListener.java.patch b/paper-server/patches/sources/net/minecraft/world/level/gameevent/DynamicGameEventListener.java.patch new file mode 100644 index 0000000000..bcaf4b1a37 --- /dev/null +++ b/paper-server/patches/sources/net/minecraft/world/level/gameevent/DynamicGameEventListener.java.patch @@ -0,0 +1,11 @@ +--- a/net/minecraft/world/level/gameevent/DynamicGameEventListener.java ++++ b/net/minecraft/world/level/gameevent/DynamicGameEventListener.java +@@ -41,7 +41,7 @@ + + 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 - Perf: can cause sync loads while completing a chunk, resulting in deadlock + if (chunkAccess != null) { + dispatcherConsumer.accept(chunkAccess.getListenerRegistry(sectionPos.y())); + }