From eacab89181ee73a965d87be54a3bbaa3e72786ed Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Wed, 28 Feb 2024 14:05:14 -0500 Subject: [PATCH] 24w09a --- .../modernfix/chunk/SafeBlockGetter.java | 2 +- .../chunk_deadlock/ServerChunkCacheMixin.java | 19 ++++++------ .../paper_chunk_patches/ChunkMapMixin.java | 30 ++++++++----------- gradle.properties | 4 +-- 4 files changed, 25 insertions(+), 30 deletions(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/chunk/SafeBlockGetter.java b/common/src/main/java/org/embeddedt/modernfix/chunk/SafeBlockGetter.java index 3d4efe52..1c672057 100644 --- a/common/src/main/java/org/embeddedt/modernfix/chunk/SafeBlockGetter.java +++ b/common/src/main/java/org/embeddedt/modernfix/chunk/SafeBlockGetter.java @@ -7,7 +7,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.ChunkStatus; +import net.minecraft.world.level.chunk.status.ChunkStatus; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.Fluids; import org.jetbrains.annotations.Nullable; diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/chunk_deadlock/ServerChunkCacheMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/chunk_deadlock/ServerChunkCacheMixin.java index 30b69703..cbed06c6 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/chunk_deadlock/ServerChunkCacheMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/chunk_deadlock/ServerChunkCacheMixin.java @@ -1,16 +1,15 @@ package org.embeddedt.modernfix.common.mixin.bugfix.chunk_deadlock; -import com.mojang.datafixers.util.Either; import net.minecraft.core.Holder; import net.minecraft.core.registries.Registries; -import net.minecraft.server.level.ChunkHolder; +import net.minecraft.server.level.ChunkResult; import net.minecraft.server.level.ServerChunkCache; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biomes; import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.ChunkStatus; +import net.minecraft.world.level.chunk.status.ChunkStatus; import net.minecraft.world.level.chunk.EmptyLevelChunk; import org.embeddedt.modernfix.ModernFix; import org.spongepowered.asm.mixin.Final; @@ -26,7 +25,7 @@ public abstract class ServerChunkCacheMixin { @Shadow @Final private Thread mainThread; @Shadow @Final public ServerLevel level; - @Shadow protected abstract CompletableFuture> getChunkFutureMainThread(int k, int l, ChunkStatus arg, boolean bl); + @Shadow protected abstract CompletableFuture> getChunkFutureMainThread(int k, int l, ChunkStatus arg, boolean bl); @Shadow @Final private ServerChunkCache.MainThreadExecutor mainThreadProcessor; private final boolean debugDeadServerAccess = Boolean.getBoolean("modernfix.debugBadChunkloading"); @@ -41,24 +40,24 @@ public abstract class ServerChunkCacheMixin { Holder plains = this.level.registryAccess().registryOrThrow(Registries.BIOME).getHolderOrThrow(Biomes.PLAINS); cir.setReturnValue(new EmptyLevelChunk(this.level, new ChunkPos(chunkX, chunkZ), plains)); } else if(Thread.currentThread() != this.mainThread) { - CompletableFuture> future = CompletableFuture.supplyAsync(() -> this.getChunkFutureMainThread(chunkX, chunkZ, requiredStatus, false), this.mainThreadProcessor).join(); + CompletableFuture> future = CompletableFuture.supplyAsync(() -> this.getChunkFutureMainThread(chunkX, chunkZ, requiredStatus, false), this.mainThreadProcessor).join(); if(!future.isDone()) { // Wait at least 500 milliseconds before printing anything - Either resultingChunk = null; + ChunkResult resultingChunk = null; try { resultingChunk = future.get(500, TimeUnit.MILLISECONDS); } catch(InterruptedException | ExecutionException | TimeoutException ignored) { } - if(resultingChunk != null && resultingChunk.left().isPresent()) { - cir.setReturnValue(resultingChunk.left().get()); + if(resultingChunk != null && resultingChunk.isSuccess()) { + cir.setReturnValue(resultingChunk.orElse(null)); return; } if(debugDeadServerAccess) ModernFix.LOGGER.warn("Async loading of a chunk was requested, this might not be desirable", new Exception()); try { resultingChunk = future.get(10, TimeUnit.SECONDS); - if(resultingChunk.left().isPresent()) { - cir.setReturnValue(resultingChunk.left().get()); + if(resultingChunk.isSuccess()) { + cir.setReturnValue(resultingChunk.orElse(null)); return; } } catch(InterruptedException | ExecutionException | TimeoutException e) { diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/paper_chunk_patches/ChunkMapMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/paper_chunk_patches/ChunkMapMixin.java index a6d8d48e..9653bae5 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/paper_chunk_patches/ChunkMapMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/paper_chunk_patches/ChunkMapMixin.java @@ -1,13 +1,12 @@ package org.embeddedt.modernfix.common.mixin.bugfix.paper_chunk_patches; -import com.mojang.datafixers.util.Either; import net.minecraft.server.level.*; import net.minecraft.server.level.progress.ChunkProgressListener; import net.minecraft.util.thread.BlockableEventLoop; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.ChunkStatus; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; +import net.minecraft.world.level.chunk.status.ChunkStatus; +import net.minecraft.world.level.chunk.status.WorldGenContext; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -16,7 +15,6 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; @@ -27,15 +25,13 @@ public abstract class ChunkMapMixin { @Shadow @Final private ChunkMap.DistanceManager distanceManager; - @Shadow protected abstract CompletableFuture> protoChunkToFullChunk(ChunkHolder arg); + @Shadow protected abstract CompletableFuture protoChunkToFullChunk(ChunkHolder arg, ChunkAccess chunkAccess); - @Shadow @Final private ServerLevel level; - @Shadow @Final private ThreadedLevelLightEngine lightEngine; @Shadow @Final private ChunkProgressListener progressListener; - @Shadow protected abstract CompletableFuture> scheduleChunkGeneration(ChunkHolder chunkHolder, ChunkStatus chunkStatus); + @Shadow protected abstract CompletableFuture> scheduleChunkGeneration(ChunkHolder chunkHolder, ChunkStatus chunkStatus); - @Shadow @Final private StructureTemplateManager structureTemplateManager; + @Shadow private WorldGenContext worldGenContext; /* https://github.com/PaperMC/Paper/blob/ver/1.17.1/patches/server/0752-Fix-chunks-refusing-to-unload-at-low-TPS.patch */ @ModifyArg(method = "prepareAccessibleChunk", at = @At(value = "INVOKE", target = "Ljava/util/concurrent/CompletableFuture;thenApplyAsync(Ljava/util/function/Function;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;"), index = 1) @@ -48,24 +44,24 @@ public abstract class ChunkMapMixin { * @reason revert 1.17 chunk system changes, significantly reduces time and RAM needed to load chunks */ @Inject(method = "schedule", at = @At("HEAD"), cancellable = true) - private void useLegacySchedulingLogic(ChunkHolder holder, ChunkStatus requiredStatus, CallbackInfoReturnable>> cir) { + private void useLegacySchedulingLogic(ChunkHolder holder, ChunkStatus requiredStatus, CallbackInfoReturnable>> cir) { if(requiredStatus != ChunkStatus.EMPTY && !requiredStatus.hasLoadDependencies()) { ChunkPos chunkpos = holder.getPos(); - CompletableFuture> future = holder.getOrScheduleFuture(requiredStatus.getParent(), (ChunkMap)(Object)this); + CompletableFuture> future = holder.getOrScheduleFuture(requiredStatus.getParent(), (ChunkMap)(Object)this); cir.setReturnValue(future.thenComposeAsync((either) -> { - Optional optional = either.left(); + ChunkAccess partialChunk = either.orElse(null); if (requiredStatus == ChunkStatus.LIGHT) { this.distanceManager.addTicket(TicketType.LIGHT, chunkpos, 33 + ChunkStatus.getDistance(ChunkStatus.LIGHT), chunkpos); } // from original method - if (optional.isPresent() && optional.get().getStatus().isOrAfter(requiredStatus)) { - CompletableFuture> completablefuture = requiredStatus.load(this.level, this.structureTemplateManager, this.lightEngine, (arg2) -> { - return this.protoChunkToFullChunk(holder); - }, (ChunkAccess)optional.get()); + if (partialChunk != null && partialChunk.getStatus().isOrAfter(requiredStatus)) { + CompletableFuture completablefuture = requiredStatus.load(this.worldGenContext, (partialChunkAccess) -> { + return this.protoChunkToFullChunk(holder, partialChunkAccess); + }, partialChunk); this.progressListener.onStatusChange(chunkpos, requiredStatus); - return completablefuture; + return completablefuture.thenApply(ChunkResult::of); } else { return this.scheduleChunkGeneration(holder, requiredStatus); } diff --git a/gradle.properties b/gradle.properties index d81488e8..1bf7e7b0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ junit_version=5.10.0-M1 mixinextras_version=0.3.2 mod_id=modernfix -minecraft_version=24w07a +minecraft_version=24w09a enabled_platforms=fabric forge_version=20.4.132-beta # parchment_version=2023.07.09 @@ -15,7 +15,7 @@ rei_version=13.0.678 ctm_version=1.20.1-1.1.8+4 kubejs_version=1902.6.0-build.142 rhino_version=1902.2.2-build.268 -supported_minecraft_versions=24w07a +supported_minecraft_versions=24w09a fabric_loader_version=0.15.6 fabric_api_version=0.91.1+1.20.4