mirror of
https://github.com/PaperMC/Paper.git
synced 2024-09-17 17:31:06 +02:00
526795bacd
* Update patches to handle vineflower decompiler * update patches again to handle inlined simple lambdas * update vf again and re-apply/rebuild patches * update patches after removal of verify-merges flag * fix compile issue * remove maven local * fix some issues * address more issues * fix collision patch * use paperweight release * more fixes * update fineflower and fix patches again * add missing comment descriptor --------- Co-authored-by: Jason Penilla <11360596+jpenilla@users.noreply.github.com>
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 53eeb59257e3e943cbe7dc113674135077f0c20d..fc316f6c6db1d39bb24daa1d272e5128c71320dd 100644
|
|
--- a/src/main/java/net/minecraft/world/level/gameevent/DynamicGameEventListener.java
|
|
+++ b/src/main/java/net/minecraft/world/level/gameevent/DynamicGameEventListener.java
|
|
@@ -41,7 +41,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 - Perf: can cause sync loads while completing a chunk, resulting in deadlock
|
|
if (chunkAccess != null) {
|
|
dispatcherConsumer.accept(chunkAccess.getListenerRegistry(sectionPos.y()));
|
|
}
|