diff --git a/fabric/src/main/java/org/popcraft/chunky/mixin/ChunkMapMixin.java b/fabric/src/main/java/org/popcraft/chunky/mixin/ChunkMapMixin.java index c559268b..6a70014a 100644 --- a/fabric/src/main/java/org/popcraft/chunky/mixin/ChunkMapMixin.java +++ b/fabric/src/main/java/org/popcraft/chunky/mixin/ChunkMapMixin.java @@ -1,12 +1,10 @@ package org.popcraft.chunky.mixin; -import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ChunkHolder; import net.minecraft.server.level.ChunkMap; import net.minecraft.world.level.ChunkPos; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Invoker; import java.util.Optional; @@ -20,7 +18,4 @@ public interface ChunkMapMixin { @Invoker("readChunk") public CompletableFuture> invokeReadChunk(ChunkPos pos); - - @Accessor("pendingUnloads") - public Long2ObjectLinkedOpenHashMap getPendingUnloads(); } diff --git a/fabric/src/main/java/org/popcraft/chunky/mixin/ServerChunkCacheMixin.java b/fabric/src/main/java/org/popcraft/chunky/mixin/ServerChunkCacheMixin.java index da107bc0..1b3f01c5 100644 --- a/fabric/src/main/java/org/popcraft/chunky/mixin/ServerChunkCacheMixin.java +++ b/fabric/src/main/java/org/popcraft/chunky/mixin/ServerChunkCacheMixin.java @@ -1,12 +1,20 @@ package org.popcraft.chunky.mixin; +import net.minecraft.server.level.ChunkResult; import net.minecraft.server.level.ServerChunkCache; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.status.ChunkStatus; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; +import java.util.concurrent.CompletableFuture; + @Mixin(ServerChunkCache.class) public interface ServerChunkCacheMixin { - @Invoker("runDistanceManagerUpdates") - @SuppressWarnings({"UnusedReturnValue", "UnnecessaryInterfaceModifier"}) - public boolean invokeRunDistanceManagerUpdates(); + @SuppressWarnings("UnnecessaryModifier") + @Invoker("getChunkFutureMainThread") + public CompletableFuture> invokeGetChunkFutureMainThread(final int chunkX, + final int chunkZ, + final ChunkStatus toStatus, + final boolean create); } diff --git a/fabric/src/main/java/org/popcraft/chunky/platform/FabricWorld.java b/fabric/src/main/java/org/popcraft/chunky/platform/FabricWorld.java index a3e4ecfb..f4207a60 100644 --- a/fabric/src/main/java/org/popcraft/chunky/platform/FabricWorld.java +++ b/fabric/src/main/java/org/popcraft/chunky/platform/FabricWorld.java @@ -70,10 +70,6 @@ public CompletableFuture isChunkGenerated(final int x, final int z) { if (loadedChunkHolder != null && loadedChunkHolder.getLatestStatus() == ChunkStatus.FULL) { return CompletableFuture.completedFuture(true); } - final ChunkHolder unloadedChunkHolder = chunkMapMixin.getPendingUnloads().get(chunkPos.toLong()); - if (unloadedChunkHolder != null && unloadedChunkHolder.getLatestStatus() == ChunkStatus.FULL) { - return CompletableFuture.completedFuture(true); - } if (UPDATE_CHUNK_NBT) { return chunkMapMixin.invokeReadChunk(chunkPos) .thenApply(optionalNbt -> optionalNbt @@ -106,11 +102,7 @@ public CompletableFuture getChunkAtAsync(final int x, final int z) { if (TICKING_LOAD_DURATION > 0) { serverChunkCache.addRegionTicket(CHUNKY_TICKING, chunkPos, 1, Unit.INSTANCE); } - ((ServerChunkCacheMixin) serverChunkCache).invokeRunDistanceManagerUpdates(); - final ChunkMap chunkManager = serverChunkCache.chunkMap; - final ChunkMapMixin chunkMapMixin = (ChunkMapMixin) chunkManager; - final ChunkHolder chunkHolder = chunkMapMixin.invokeGetVisibleChunkIfPresent(chunkPos.toLong()); - final CompletableFuture chunkFuture = chunkHolder == null ? CompletableFuture.completedFuture(null) : CompletableFuture.allOf(chunkHolder.scheduleChunkGenerationTask(ChunkStatus.FULL, chunkManager)); + final CompletableFuture chunkFuture = CompletableFuture.allOf(((ServerChunkCacheMixin) world.getChunkSource()).invokeGetChunkFutureMainThread(x, z, ChunkStatus.FULL, true)); chunkFuture.whenCompleteAsync((ignored, throwable) -> serverChunkCache.removeRegionTicket(CHUNKY, chunkPos, 0, Unit.INSTANCE), world.getServer()); return chunkFuture; } diff --git a/neoforge/src/main/java/org/popcraft/chunky/platform/NeoForgeWorld.java b/neoforge/src/main/java/org/popcraft/chunky/platform/NeoForgeWorld.java index c57d35ca..a0e85faf 100644 --- a/neoforge/src/main/java/org/popcraft/chunky/platform/NeoForgeWorld.java +++ b/neoforge/src/main/java/org/popcraft/chunky/platform/NeoForgeWorld.java @@ -68,10 +68,6 @@ public CompletableFuture isChunkGenerated(final int x, final int z) { if (loadedChunkHolder != null && loadedChunkHolder.getLatestStatus() == ChunkStatus.FULL) { return CompletableFuture.completedFuture(true); } - final ChunkHolder unloadedChunkHolder = chunkStorage.pendingUnloads.get(chunkPos.toLong()); - if (unloadedChunkHolder != null && unloadedChunkHolder.getLatestStatus() == ChunkStatus.FULL) { - return CompletableFuture.completedFuture(true); - } if (UPDATE_CHUNK_NBT) { return chunkStorage.readChunk(chunkPos) .thenApply(optionalNbt -> optionalNbt @@ -104,10 +100,7 @@ public CompletableFuture getChunkAtAsync(final int x, final int z) { if (TICKING_LOAD_DURATION > 0) { serverChunkCache.addRegionTicket(CHUNKY_TICKING, chunkPos, 1, Unit.INSTANCE); } - serverChunkCache.runDistanceManagerUpdates(); - final ChunkMap chunkManager = serverChunkCache.chunkMap; - final ChunkHolder chunkHolder = chunkManager.getVisibleChunkIfPresent(chunkPos.toLong()); - final CompletableFuture chunkFuture = chunkHolder == null ? CompletableFuture.completedFuture(null) : CompletableFuture.allOf(chunkHolder.scheduleChunkGenerationTask(ChunkStatus.FULL, chunkManager)); + final CompletableFuture chunkFuture = CompletableFuture.allOf(world.getChunkSource().getChunkFutureMainThread(x, z, ChunkStatus.FULL, true)); chunkFuture.whenCompleteAsync((ignored, throwable) -> serverChunkCache.removeRegionTicket(CHUNKY, chunkPos, 0, Unit.INSTANCE), world.getServer()); return chunkFuture; } diff --git a/neoforge/src/main/resources/META-INF/accesstransformer.cfg b/neoforge/src/main/resources/META-INF/accesstransformer.cfg index 0388d408..7e821af7 100644 --- a/neoforge/src/main/resources/META-INF/accesstransformer.cfg +++ b/neoforge/src/main/resources/META-INF/accesstransformer.cfg @@ -1,6 +1,5 @@ # ChunkMap public net.minecraft.server.level.ChunkMap readChunk(Lnet/minecraft/world/level/ChunkPos;)Ljava/util/concurrent/CompletableFuture; public net.minecraft.server.level.ChunkMap getVisibleChunkIfPresent(J)Lnet/minecraft/server/level/ChunkHolder; -public net.minecraft.server.level.ChunkMap pendingUnloads # ServerChunkCache -public net.minecraft.server.level.ServerChunkCache runDistanceManagerUpdates()Z +public net.minecraft.server.level.ServerChunkCache getChunkFutureMainThread(IILnet/minecraft/world/level/chunk/status/ChunkStatus;Z)Ljava/util/concurrent/CompletableFuture;