using System.Linq; using StardewValley; namespace StardewModdingAPI.Mods.ConsoleCommands.Framework.Commands.World { /// A command which freezes the current time. internal class FreezeTimeCommand : TrainerCommand { /********* ** Fields *********/ /// The time of day at which to freeze time. internal static int FrozenTime; /// Whether to freeze time. private bool FreezeTime; /********* ** Public methods *********/ /// Construct an instance. public FreezeTimeCommand() : base("world_freezetime", "Freezes or resumes time.\n\nUsage: world_freezetime [value]\n- value: one of 0 (resume), 1 (freeze), or blank (toggle).", mayNeedUpdate: true) { } /// Handle the command. /// Writes messages to the console and log file. /// The command name. /// The command arguments. public override void Handle(IMonitor monitor, string command, ArgumentParser args) { if (args.Any()) { // parse arguments if (!args.TryGetInt(0, "value", out int value, min: 0, max: 1)) return; // handle this.FreezeTime = value == 1; FreezeTimeCommand.FrozenTime = Game1.timeOfDay; monitor.Log($"OK, time is now {(this.FreezeTime ? "frozen" : "resumed")}.", LogLevel.Info); } else { this.FreezeTime = !this.FreezeTime; FreezeTimeCommand.FrozenTime = Game1.timeOfDay; monitor.Log($"OK, time is now {(this.FreezeTime ? "frozen" : "resumed")}.", LogLevel.Info); } } /// Perform any logic needed on update tick. /// Writes messages to the console and log file. public override void OnUpdated(IMonitor monitor) { if (this.FreezeTime && Context.IsWorldReady) Game1.timeOfDay = FreezeTimeCommand.FrozenTime; } } }