mirror of
https://github.com/PaperMC/Paper.git
synced 2024-08-19 02:33:04 +02:00
30 lines
1.8 KiB
Diff
30 lines
1.8 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
|
|
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 e64435c1dfbaf182d2292a1123701033f817ec38..d368ba29fec49a989be1cacd2422599d6d613c29 100644
|
|
--- a/src/main/java/net/minecraft/world/level/gameevent/DynamicGameEventListener.java
|
|
+++ b/src/main/java/net/minecraft/world/level/gameevent/DynamicGameEventListener.java
|
|
@@ -48,7 +48,7 @@ public class DynamicGameEventListener<T extends GameEventListener> {
|
|
|
|
private static void ifChunkExists(LevelReader world, @Nullable SectionPos sectionPos, Consumer<GameEventListenerRegistry> 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.getListenerRegistry(sectionPos.y()));
|
|
}
|