using System.Linq; using StardewModdingAPI; using StardewValley; namespace TrainerMod.Framework.Commands.World { /// A command which freezes the current time. internal class FreezeTimeCommand : TrainerCommand { /********* ** Properties *********/ /// The time of day at which to freeze time. internal static int FrozenTime; /// Whether to freeze time. private bool FreezeTime; /********* ** Accessors *********/ /// Whether the command needs to perform logic when the game updates. public override bool NeedsUpdate => this.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).") { } /// 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 Update(IMonitor monitor) { if (this.FreezeTime) Game1.timeOfDay = FreezeTimeCommand.FrozenTime; } } }