From 763fb751cb1ba846fa5452c3cbb9f035b5761cec Mon Sep 17 00:00:00 2001 From: Spottedleaf Date: Wed, 14 Aug 2024 12:17:46 -0700 Subject: [PATCH] Add TickThread check to ServerChunkCache#getChunkNow We shouldn't be using the currently loading chunk unless we are on the main thread. --- .../mixin/chunk_system/LevelMixin.java | 2 +- .../chunk_system/ServerChunkCacheMixin.java | 8 +++++--- .../mixin/collisions/ExplosionMixin.java | 1 - .../scheduling/NewChunkHolder.java | 18 ------------------ 4 files changed, 6 insertions(+), 23 deletions(-) diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/LevelMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/LevelMixin.java index 00ac021..bc6bccd 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/LevelMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/LevelMixin.java @@ -199,7 +199,7 @@ abstract class LevelMixin implements ChunkSystemLevel, ChunkSystemEntityGetter, @Override public LevelChunk moonrise$getFullChunkIfLoaded(final int chunkX, final int chunkZ) { - return this.getChunkSource().getChunk(chunkX, chunkZ, false); + return (LevelChunk)this.getChunkSource().getChunk(chunkX, chunkZ, ChunkStatus.FULL, false); } @Override diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/ServerChunkCacheMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/ServerChunkCacheMixin.java index ad2a197..c3c340f 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/ServerChunkCacheMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/chunk_system/ServerChunkCacheMixin.java @@ -106,8 +106,10 @@ abstract class ServerChunkCacheMixin extends ChunkSource implements ChunkSystemS return ifPresent; } - if (currentChunk != null) { - final ChunkAccess loading = PlatformHooks.get().getCurrentlyLoadingChunk(currentChunk.vanillaChunkHolder); + final PlatformHooks platformHooks = PlatformHooks.get(); + + if (platformHooks.hasCurrentlyLoadingChunk() && currentChunk != null) { + final ChunkAccess loading = platformHooks.getCurrentlyLoadingChunk(currentChunk.vanillaChunkHolder); if (loading != null && TickThread.isTickThread()) { return loading; } @@ -149,7 +151,7 @@ abstract class ServerChunkCacheMixin extends ChunkSource implements ChunkSystemS return ret; } - if (ret != null) { + if (ret != null || !TickThread.isTickThread()) { return ret; } diff --git a/src/main/java/ca/spottedleaf/moonrise/mixin/collisions/ExplosionMixin.java b/src/main/java/ca/spottedleaf/moonrise/mixin/collisions/ExplosionMixin.java index 6f3392a..41100e8 100644 --- a/src/main/java/ca/spottedleaf/moonrise/mixin/collisions/ExplosionMixin.java +++ b/src/main/java/ca/spottedleaf/moonrise/mixin/collisions/ExplosionMixin.java @@ -437,7 +437,6 @@ abstract class ExplosionMixin { } final double diameter = (double)this.radius * 2.0; - // use null predicate to avoid indirection on test(), but we need to move the spectator check into the loop itself final List entities = this.level.getEntities(this.source, new AABB( (double)Mth.floor(this.x - (diameter + 1.0)), diff --git a/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/NewChunkHolder.java b/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/NewChunkHolder.java index 48a8ef4..b6a471b 100644 --- a/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/NewChunkHolder.java +++ b/src/main/java/ca/spottedleaf/moonrise/patches/chunk_system/scheduling/NewChunkHolder.java @@ -1119,24 +1119,6 @@ public final class NewChunkHolder { private static final long CHUNK_LOADED_MASK_RAD1 = getLoadedMask(1); private static final long CHUNK_LOADED_MASK_RAD2 = getLoadedMask(2); - public static boolean areNeighboursFullLoaded(final long bitset, final int radius) { - switch (radius) { - case 0: { - return (bitset & CHUNK_LOADED_MASK_RAD0) == CHUNK_LOADED_MASK_RAD0; - } - case 1: { - return (bitset & CHUNK_LOADED_MASK_RAD1) == CHUNK_LOADED_MASK_RAD1; - } - case 2: { - return (bitset & CHUNK_LOADED_MASK_RAD2) == CHUNK_LOADED_MASK_RAD2; - } - - default: { - throw new IllegalArgumentException("Radius not recognized: " + radius); - } - } - } - // only updated while holding scheduling lock private FullChunkStatus pendingFullChunkStatus = FullChunkStatus.INACCESSIBLE; // updated while holding no locks, but adds a ticket before to prevent pending status from dropping