Fix main thread deadlock when spawning rise-out-of-ground entities

IrisEntity.spawn waited on J.sfut(...).get() to move the spawn point below
ground. J.sfut schedules the task for the next main thread tick, so when spawn
already runs on the main thread (ambient spawning in WorldEntitySpawner) the
future can never complete and the server stops ticking. Run the check inline
when already on the main thread.
This commit is contained in:
Michael committed 2026-10-28 03:56:54 -05:00
1 parent f64a7c6753
commit 0c760d9256
1 file changed
+13 -7
@@ -278,14 +278,20 @@ public class IrisEntity extends IrisRegistrant implements NativeEntityOptions {
} }
if (isSpawnEffectRiseOutOfGround()) { if (isSpawnEffectRiseOutOfGround()) {
AtomicReference<Location> f = new AtomicReference<>(at); AtomicReference<Location> f = new AtomicReference<>(at);
Runnable riseStart = () -> {
if (Chunks.hasPlayersNearby(f.get())) {
Location b = f.get().clone();
Location start = new Location(b.getWorld(), b.getX(), b.getY() - 5, b.getZ());
f.set(start);
}
};
try { try {
J.sfut(() -> { // J.sfut schedules onto the next main thread tick, so waiting on it from the main thread never returns.
if (Chunks.hasPlayersNearby(f.get())) { if (Bukkit.isPrimaryThread()) {
Location b = f.get().clone(); riseStart.run();
Location start = new Location(b.getWorld(), b.getX(), b.getY() - 5, b.getZ()); } else {
f.set(start); J.sfut(riseStart).get();
} }
}).get();
} catch (InterruptedException e) { } catch (InterruptedException e) {
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();
IrisLogging.reportError("Iris entity spawn preparation was interrupted.", e); IrisLogging.reportError("Iris entity spawn preparation was interrupted.", e);