diff --git a/src/main/java/carpet/commands/TickCommand.java b/src/main/java/carpet/commands/TickCommand.java index ac65b7bd..cc7dc38c 100644 --- a/src/main/java/carpet/commands/TickCommand.java +++ b/src/main/java/carpet/commands/TickCommand.java @@ -43,7 +43,8 @@ public class TickCommand c.getSource(), getInteger(c,"ticks"), getString(c, "tail command")))))). - then(literal("freeze").executes( (c)-> toggleFreeze(c.getSource()))). + then(literal("freeze").executes( (c)-> toggleFreeze(c.getSource(), false)). + then(literal("deep").executes( (c)-> toggleFreeze(c.getSource(), true)))). then(literal("step"). executes((c) -> step(1)). then(argument("ticks", integer(1,72000)). @@ -95,15 +96,18 @@ public class TickCommand return 1; } - private static int toggleFreeze(ServerCommandSource source) + private static int toggleFreeze(ServerCommandSource source, boolean isDeep) { TickSpeed.is_paused = !TickSpeed.is_paused; if (TickSpeed.is_paused) { - Messenger.m(source, "gi Game is paused"); + TickSpeed.deepFreeze = isDeep; + Messenger.m(source, "gi Game is "+(isDeep?"deeply ":"")+"frozen"); + } else { + TickSpeed.deepFreeze = false; Messenger.m(source, "gi Game runs normally"); } return 1; diff --git a/src/main/java/carpet/helpers/TickSpeed.java b/src/main/java/carpet/helpers/TickSpeed.java index 79d05576..2daf4fd1 100644 --- a/src/main/java/carpet/helpers/TickSpeed.java +++ b/src/main/java/carpet/helpers/TickSpeed.java @@ -25,6 +25,7 @@ public class TickSpeed public static ServerCommandSource tick_warp_sender = null; public static int player_active_timeout = 0; public static boolean process_entities = true; + public static boolean deepFreeze = false; public static boolean is_paused = false; public static boolean is_superHot = false; diff --git a/src/main/java/carpet/mixins/ChunkTicketManager_tickMixin.java b/src/main/java/carpet/mixins/ChunkTicketManager_tickMixin.java new file mode 100644 index 00000000..9b70b707 --- /dev/null +++ b/src/main/java/carpet/mixins/ChunkTicketManager_tickMixin.java @@ -0,0 +1,23 @@ +package carpet.mixins; + +import carpet.helpers.TickSpeed; +import net.minecraft.server.world.ChunkTicketManager; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(ChunkTicketManager.class) +public class ChunkTicketManager_tickMixin +{ + @Shadow private long age; + + @Inject(method = "purge", at = @At("HEAD"), cancellable = true) + private void pauseTicketSystem(CallbackInfo ci) + { + // pausing expiry of tickets + // that will prevent also chunks from unloading, so require a deep frozen state + if (!TickSpeed.process_entities && TickSpeed.deepFreeze) age--; + } +} diff --git a/src/main/java/carpet/mixins/MinecraftServer_tickspeedMixin.java b/src/main/java/carpet/mixins/MinecraftServer_tickspeedMixin.java index ac475142..9b695772 100644 --- a/src/main/java/carpet/mixins/MinecraftServer_tickspeedMixin.java +++ b/src/main/java/carpet/mixins/MinecraftServer_tickspeedMixin.java @@ -120,7 +120,7 @@ public abstract class MinecraftServer_tickspeedMixin extends ReentrantThreadExec this.profiler.startTick(); this.profiler.push("tick"); - this.tick(TickSpeed.time_warp_start_time != 0 ? ()->true : this::shouldKeepTicking); + this.tick(TickSpeed.time_warp_start_time != 0 ? ()->!hasRunningTasks() : this::shouldKeepTicking); this.profiler.swap("nextTickWait"); this.field_19249 = true; this.field_19248 = Math.max(Util.getMeasuringTimeMs() + /*50L*/ msThisTick, this.timeReference); diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index ea11cc6d..80faf7b8 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -25,6 +25,7 @@ "ServerWorld_tickMixin", "ServerChunkManager_tickMixin", "ThreadedAnvilChunkStorage_tickMixin", + "ChunkTicketManager_tickMixin", "ThreadedAnvilChunkStorage_scarpetChunkCreationMixin", "ChunkHolder_scarpetChunkCreationMixin",