diff --git a/src/main/java/carpet/fakes/ThreadedAnvilChunkStorageInterface.java b/src/main/java/carpet/fakes/ThreadedAnvilChunkStorageInterface.java index a003100e..7054bd23 100644 --- a/src/main/java/carpet/fakes/ThreadedAnvilChunkStorageInterface.java +++ b/src/main/java/carpet/fakes/ThreadedAnvilChunkStorageInterface.java @@ -3,6 +3,7 @@ package carpet.fakes; import java.util.List; import java.util.Map; +import net.minecraft.server.world.ChunkHolder; import net.minecraft.util.math.ChunkPos; public interface ThreadedAnvilChunkStorageInterface @@ -12,4 +13,6 @@ public interface ThreadedAnvilChunkStorageInterface void relightChunk(ChunkPos pos); void releaseRelightTicket(ChunkPos pos); + + Iterable getChunks(); } diff --git a/src/main/java/carpet/mixins/ServerChunkManager_tickMixin.java b/src/main/java/carpet/mixins/ServerChunkManager_tickMixin.java index 9b7b1141..9e8cbf89 100644 --- a/src/main/java/carpet/mixins/ServerChunkManager_tickMixin.java +++ b/src/main/java/carpet/mixins/ServerChunkManager_tickMixin.java @@ -1,9 +1,14 @@ package carpet.mixins; +import carpet.fakes.ThreadedAnvilChunkStorageInterface; import carpet.helpers.TickSpeed; import carpet.utils.CarpetProfiler; +import net.minecraft.server.world.ChunkHolder; import net.minecraft.server.world.ServerChunkManager; import net.minecraft.server.world.ServerWorld; +import net.minecraft.server.world.ThreadedAnvilChunkStorage; +import net.minecraft.world.chunk.WorldChunk; + import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -12,14 +17,24 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Optional; import java.util.function.BooleanSupplier; +import com.google.common.collect.Lists; + @Mixin(ServerChunkManager.class) public abstract class ServerChunkManager_tickMixin { @Shadow @Final private ServerWorld world; + @Shadow @Final + public ThreadedAnvilChunkStorage threadedAnvilChunkStorage; + CarpetProfiler.ProfilerToken currentSection; @Inject(method = "tickChunks", at = @At("HEAD")) @@ -44,8 +59,21 @@ public abstract class ServerChunkManager_tickMixin )) private boolean skipChunkTicking(ServerWorld serverWorld) { - if (!TickSpeed.process_entities) return true; - return serverWorld.isDebugWorld(); + boolean debug = serverWorld.isDebugWorld(); + if (!TickSpeed.process_entities) { + if (!debug){ + List holders = Lists.newArrayList(((ThreadedAnvilChunkStorageInterface)threadedAnvilChunkStorage).getChunks()); + Collections.shuffle(holders); + for (ChunkHolder holder: holders){ + Optional optional = holder.getTickingFuture().getNow(ChunkHolder.UNLOADED_WORLD_CHUNK).left(); + if (optional.isPresent()){ + holder.flushUpdates(optional.get()); + } + } + } + return true; + } + return debug; } } diff --git a/src/main/java/carpet/mixins/ThreadedAnvilChunkStorage_scarpetChunkCreationMixin.java b/src/main/java/carpet/mixins/ThreadedAnvilChunkStorage_scarpetChunkCreationMixin.java index 6ec96b74..b6da7406 100644 --- a/src/main/java/carpet/mixins/ThreadedAnvilChunkStorage_scarpetChunkCreationMixin.java +++ b/src/main/java/carpet/mixins/ThreadedAnvilChunkStorage_scarpetChunkCreationMixin.java @@ -95,6 +95,9 @@ public abstract class ThreadedAnvilChunkStorage_scarpetChunkCreationMixin implem @Shadow protected abstract CompletableFuture, Unloaded>> getRegion (final ChunkPos centerChunk, final int margin, final IntFunction distanceToStatus); + @Shadow + protected abstract Iterable entryIterator(); + //in method_20617 //method_19534(Lnet/minecraft/server/world/ChunkHolder;Lnet/minecraft/world/chunk/Chunk;)Ljava/util/concurrent/CompletableFuture; // incmopatibility with optifine makes this mixin fail. @@ -426,4 +429,9 @@ public abstract class ThreadedAnvilChunkStorage_scarpetChunkCreationMixin implem return report; } + + @Override + public Iterable getChunks() { + return entryIterator(); + } }