diff --git a/src/main/java/carpet/CarpetServer.java b/src/main/java/carpet/CarpetServer.java index 773b61e3..c8cae167 100644 --- a/src/main/java/carpet/CarpetServer.java +++ b/src/main/java/carpet/CarpetServer.java @@ -109,7 +109,7 @@ public class CarpetServer implements ClientModInitializer,DedicatedServerModInit public static void tick(MinecraftServer server) { - TickSpeed.tick(server); + TickSpeed.tick(); HUDController.update_hud(server); scriptServer.tick(); diff --git a/src/main/java/carpet/commands/TickCommand.java b/src/main/java/carpet/commands/TickCommand.java index 27c6ef27..f4f04268 100644 --- a/src/main/java/carpet/commands/TickCommand.java +++ b/src/main/java/carpet/commands/TickCommand.java @@ -2,6 +2,7 @@ package carpet.commands; import carpet.CarpetSettings; import carpet.helpers.TickSpeed; +import carpet.network.ServerNetworkHandler; import carpet.settings.SettingsManager; import carpet.utils.CarpetProfiler; import carpet.utils.Messenger; @@ -107,6 +108,7 @@ public class TickCommand TickSpeed.deepFreeze = false; Messenger.m(source, "gi Game runs normally"); } + ServerNetworkHandler.updateTickingStateToConnectedPlayers(); return 1; } @@ -119,6 +121,7 @@ public class TickCommand private static int toggleSuperHot(ServerCommandSource source) { TickSpeed.is_superHot = !TickSpeed.is_superHot; + ServerNetworkHandler.updateTickingStateToConnectedPlayers(); if (TickSpeed.is_superHot) { Messenger.m(source,"gi Superhot enabled"); diff --git a/src/main/java/carpet/helpers/TickSpeed.java b/src/main/java/carpet/helpers/TickSpeed.java index 575867eb..756bbbb9 100644 --- a/src/main/java/carpet/helpers/TickSpeed.java +++ b/src/main/java/carpet/helpers/TickSpeed.java @@ -7,7 +7,6 @@ import java.util.function.BiConsumer; import carpet.CarpetServer; import carpet.network.ServerNetworkHandler; import carpet.utils.Messenger; -import net.minecraft.server.MinecraftServer; import net.minecraft.server.command.CommandManager; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; @@ -66,6 +65,7 @@ public class TickSpeed public static void add_ticks_to_run_in_pause(int ticks) { player_active_timeout = PLAYER_GRACE+ticks; + ServerNetworkHandler.updateTickPlayerActiveTimeoutToConnectedPlayers(); } public static BaseText tickrate_advance(ServerPlayerEntity player, int advance, String callback, ServerCommandSource source) @@ -155,7 +155,7 @@ public class TickSpeed } } - public static void tick(MinecraftServer server) + public static void tick() { process_entities = true; if (player_active_timeout > 0) diff --git a/src/main/java/carpet/mixins/CommandFunctionManager_tickMixin.java b/src/main/java/carpet/mixins/CommandFunctionManager_tickMixin.java index 301a05d5..118642b1 100644 --- a/src/main/java/carpet/mixins/CommandFunctionManager_tickMixin.java +++ b/src/main/java/carpet/mixins/CommandFunctionManager_tickMixin.java @@ -1,5 +1,6 @@ package carpet.mixins; +import carpet.helpers.TickSpeed; import carpet.utils.CarpetProfiler; import net.minecraft.server.function.CommandFunctionManager; import org.spongepowered.asm.mixin.Mixin; @@ -12,9 +13,11 @@ public class CommandFunctionManager_tickMixin { CarpetProfiler.ProfilerToken currentSection; - @Inject(method = "tick", at = @At("HEAD")) + @Inject(method = "tick", at = @At("HEAD"), cancellable = true) private void beforeDatapacks(CallbackInfo ci) { + if (!TickSpeed.process_entities && TickSpeed.deepFreeze) ci.cancel(); + else currentSection = CarpetProfiler.start_section(null, "Datapacks", CarpetProfiler.TYPE.GENERAL); } diff --git a/src/main/java/carpet/mixins/MinecraftClientMixin.java b/src/main/java/carpet/mixins/MinecraftClientMixin.java index 7e94395e..6b519175 100644 --- a/src/main/java/carpet/mixins/MinecraftClientMixin.java +++ b/src/main/java/carpet/mixins/MinecraftClientMixin.java @@ -1,9 +1,13 @@ package carpet.mixins; +import carpet.CarpetServer; +import carpet.helpers.TickSpeed; import carpet.network.CarpetClient; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.world.ClientWorld; 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; @@ -11,9 +15,21 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(MinecraftClient.class) public class MinecraftClientMixin { + @Shadow public ClientWorld world; + @Inject(method = "disconnect(Lnet/minecraft/client/gui/screen/Screen;)V", at = @At("HEAD")) private void onCloseGame(Screen screen, CallbackInfo ci) { CarpetClient.disconnect(); } + + @Inject(at = @At("HEAD"), method = "tick") + private void onClientTick(CallbackInfo info) { + if (this.world != null) { + if (CarpetServer.minecraft_server == null) + TickSpeed.tick(); + if (!TickSpeed.process_entities && TickSpeed.deepFreeze) + CarpetClient.shapes.renewShapes(); + } + } } diff --git a/src/main/java/carpet/mixins/MinecraftServer_scarpetMixin.java b/src/main/java/carpet/mixins/MinecraftServer_scarpetMixin.java index 705a3e1e..599e3796 100644 --- a/src/main/java/carpet/mixins/MinecraftServer_scarpetMixin.java +++ b/src/main/java/carpet/mixins/MinecraftServer_scarpetMixin.java @@ -1,6 +1,7 @@ package carpet.mixins; import carpet.fakes.MinecraftServerInterface; +import carpet.helpers.TickSpeed; import net.minecraft.server.MinecraftServer; import net.minecraft.server.ServerTask; import net.minecraft.server.world.ServerWorld; @@ -69,6 +70,8 @@ public abstract class MinecraftServer_scarpetMixin extends ReentrantThreadExecut )) public void tickTasks(BooleanSupplier booleanSupplier_1, CallbackInfo ci) { + if (!TickSpeed.process_entities && TickSpeed.deepFreeze) + return; TICK.onTick(); NETHER_TICK.onTick(); ENDER_TICK.onTick(); diff --git a/src/main/java/carpet/network/ClientNetworkHandler.java b/src/main/java/carpet/network/ClientNetworkHandler.java index 4d3cc1ad..7f5ffd73 100644 --- a/src/main/java/carpet/network/ClientNetworkHandler.java +++ b/src/main/java/carpet/network/ClientNetworkHandler.java @@ -65,6 +65,13 @@ public class ClientNetworkHandler } }); dataHandlers.put("TickRate", (p, t) -> TickSpeed.tickrate(((AbstractNumberTag)t).getFloat(), false)); + dataHandlers.put("TickingState", (p, t) -> { + CompoundTag tickingState = (CompoundTag)t; + TickSpeed.is_paused = tickingState.getBoolean("is_paused"); + TickSpeed.deepFreeze = tickingState.getBoolean("deepFreeze"); + TickSpeed.is_superHot = tickingState.getBoolean("is_superHot"); + }); + dataHandlers.put("TickPlayerActiveTimeout", (p, t) -> TickSpeed.player_active_timeout = ((AbstractNumberTag)t).getInt()); dataHandlers.put("scShape", (p, t) -> { // deprecated if (CarpetClient.shapes != null) CarpetClient.shapes.addShape((CompoundTag)t); diff --git a/src/main/java/carpet/network/ServerNetworkHandler.java b/src/main/java/carpet/network/ServerNetworkHandler.java index 72ffc14f..60c444a8 100644 --- a/src/main/java/carpet/network/ServerNetworkHandler.java +++ b/src/main/java/carpet/network/ServerNetworkHandler.java @@ -77,7 +77,7 @@ public class ServerNetworkHandler CarpetSettings.LOG.info("Player "+playerEntity.getName().getString()+" joined with a matching carpet client"); else CarpetSettings.LOG.warn("Player "+playerEntity.getName().getString()+" joined with another carpet version: "+clientVersion); - DataBuilder data = DataBuilder.create().withTickRate(); + DataBuilder data = DataBuilder.create().withTickRate().withTickingState().withTickPlayerActiveTimeout(); CarpetServer.settingsManager.getRules().forEach(data::withRule); CarpetServer.extensions.forEach(e -> { SettingsManager eManager = e.customSettingsManager(); @@ -173,6 +173,30 @@ public class ServerNetworkHandler } } + public static void updateTickingStateToConnectedPlayers() + { + if (CarpetSettings.superSecretSetting) return; + for (ServerPlayerEntity player : remoteCarpetPlayers.keySet()) + { + player.networkHandler.sendPacket(new CustomPayloadS2CPacket( + CarpetClient.CARPET_CHANNEL, + DataBuilder.create().withTickingState().build() + )); + } + } + + public static void updateTickPlayerActiveTimeoutToConnectedPlayers() + { + if (CarpetSettings.superSecretSetting) return; + for (ServerPlayerEntity player : remoteCarpetPlayers.keySet()) + { + player.networkHandler.sendPacket(new CustomPayloadS2CPacket( + CarpetClient.CARPET_CHANNEL, + DataBuilder.create().withTickPlayerActiveTimeout().build() + )); + } + } + public static void broadcastCustomCommand(String command, Tag data) { if (CarpetSettings.superSecretSetting) return; @@ -240,6 +264,20 @@ public class ServerNetworkHandler tag.putFloat("TickRate", TickSpeed.tickrate); return this; } + private DataBuilder withTickingState() + { + CompoundTag tickingState = new CompoundTag(); + tickingState.putBoolean("is_paused", TickSpeed.is_paused); + tickingState.putBoolean("deepFreeze", TickSpeed.deepFreeze); + tickingState.putBoolean("is_superhot", TickSpeed.is_superHot); + tag.put("TickingState", tickingState); + return this; + } + private DataBuilder withTickPlayerActiveTimeout() + { + tag.putInt("TickPlayerActiveTimeout", TickSpeed.player_active_timeout); + return this; + } private DataBuilder withRule(ParsedRule rule) { CompoundTag rules = (CompoundTag) tag.get("Rules"); diff --git a/src/main/java/carpet/script/CarpetEventServer.java b/src/main/java/carpet/script/CarpetEventServer.java index 4b6b31b6..69aec8c9 100644 --- a/src/main/java/carpet/script/CarpetEventServer.java +++ b/src/main/java/carpet/script/CarpetEventServer.java @@ -2,6 +2,7 @@ package carpet.script; import carpet.CarpetServer; import carpet.CarpetSettings; +import carpet.helpers.TickSpeed; import carpet.script.exception.InternalExpressionException; import carpet.script.value.BlockValue; import carpet.script.value.EntityValue; @@ -960,6 +961,8 @@ public class CarpetEventServer public void tick() { + if (!TickSpeed.process_entities && TickSpeed.deepFreeze) + return; Iterator eventIterator = scheduledCalls.iterator(); List currentCalls = new ArrayList<>(); while(eventIterator.hasNext()) diff --git a/src/main/java/carpet/script/utils/ShapesRenderer.java b/src/main/java/carpet/script/utils/ShapesRenderer.java index 371b840d..8be35a77 100644 --- a/src/main/java/carpet/script/utils/ShapesRenderer.java +++ b/src/main/java/carpet/script/utils/ShapesRenderer.java @@ -167,6 +167,15 @@ public class ShapesRenderer } } + public void renewShapes() + { + synchronized (shapes) + { + shapes.values().forEach(el -> el.values().forEach(shape -> { + shape.expiryTick++; + })); + } + } public abstract static class RenderedShape {