diff --git a/src/main/java/org/embeddedt/modernfix/mixin/bugfix/paper_chunk_patches/ChunkMapMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/bugfix/paper_chunk_patches/ChunkMapMixin.java index 5ecfe981..231a070e 100644 --- a/src/main/java/org/embeddedt/modernfix/mixin/bugfix/paper_chunk_patches/ChunkMapMixin.java +++ b/src/main/java/org/embeddedt/modernfix/mixin/bugfix/paper_chunk_patches/ChunkMapMixin.java @@ -2,10 +2,13 @@ package org.embeddedt.modernfix.mixin.bugfix.paper_chunk_patches; import com.mojang.datafixers.util.Either; import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ChunkHolder; -import net.minecraft.server.level.ChunkMap; +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.StructureManager; import net.minecraftforge.server.ServerLifecycleHooks; import org.embeddedt.modernfix.duck.IPaperChunkHolder; import org.spongepowered.asm.mixin.Final; @@ -16,17 +19,30 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.List; +import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; import java.util.function.Function; @Mixin(ChunkMap.class) -public class ChunkMapMixin { +public abstract class ChunkMapMixin { @Shadow @Final private BlockableEventLoop mainThreadExecutor; + @Shadow @Final private ChunkMap.DistanceManager distanceManager; + + @Shadow protected abstract CompletableFuture> protoChunkToFullChunk(ChunkHolder arg); + + @Shadow @Final private ServerLevel level; + @Shadow @Final private StructureManager structureManager; + @Shadow @Final private ThreadedLevelLightEngine lightEngine; + @Shadow @Final private ChunkProgressListener progressListener; + + @Shadow protected abstract CompletableFuture> scheduleChunkGeneration(ChunkHolder chunkHolder, ChunkStatus chunkStatus); + private Executor mainInvokingExecutor; @Inject(method = "", at = @At("RETURN"), cancellable = true) @@ -64,4 +80,36 @@ public class ChunkMapMixin { }; return inputFuture.thenComposeAsync(function, targetExecutor); } + + /** + * @author embeddedt + * @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) { + if(requiredStatus != ChunkStatus.EMPTY) { + ChunkPos chunkpos = holder.getPos(); + CompletableFuture> future = holder.getOrScheduleFuture(requiredStatus.getParent(), (ChunkMap)(Object)this); + cir.setReturnValue(future.thenComposeAsync((either) -> { + Optional optional = either.left(); + if(!optional.isPresent()) + return CompletableFuture.completedFuture(either); + + if (requiredStatus == ChunkStatus.LIGHT) { + this.distanceManager.addTicket(TicketType.LIGHT, chunkpos, 33 + ChunkStatus.getDistance(ChunkStatus.LIGHT), chunkpos); + } + + // from original method + if (optional.get().getStatus().isOrAfter(requiredStatus)) { + CompletableFuture> completablefuture = requiredStatus.load(this.level, this.structureManager, this.lightEngine, (arg2) -> { + return this.protoChunkToFullChunk(holder); + }, (ChunkAccess)optional.get()); + this.progressListener.onStatusChange(chunkpos, requiredStatus); + return completablefuture; + } else { + return this.scheduleChunkGeneration(holder, requiredStatus); + } + }, this.mainThreadExecutor).thenComposeAsync(CompletableFuture::completedFuture, this.mainThreadExecutor)); + } + } } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index c1e448c8..56e08703 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -26,3 +26,5 @@ public net.minecraft.world.level.block.state.BlockBehaviour$Properties f_60888_ public net.minecraft.server.level.ServerChunkCache$MainThreadExecutor public net.minecraft.nbt.CompoundTag (Ljava/util/Map;)V # public net.minecraft.client.renderer.texture.TextureAtlasSprite (Lnet/minecraft/client/renderer/texture/TextureAtlas;Lnet/minecraft/client/renderer/texture/TextureAtlasSprite$Info;IIIIILcom/mojang/blaze3d/platform/NativeImage;)V # +public net.minecraft.server.level.DistanceManager m_140792_(Lnet/minecraft/server/level/TicketType;Lnet/minecraft/world/level/ChunkPos;ILjava/lang/Object;)V # addTicket +public net.minecraft.server.level.ChunkMap$DistanceManager \ No newline at end of file