using System; using System.Diagnostics.CodeAnalysis; using StardewModdingAPI.Framework; #pragma warning disable 618 // Suppress obsolete-symbol errors in this file. Since several events are marked obsolete, this produces unnecessary warnings. namespace StardewModdingAPI.Events { /// Events raised when the in-game date or time changes. public static class TimeEvents { /********* ** Properties *********/ /// Manages deprecation warnings. private static DeprecationManager DeprecationManager; /// The backing field for . [SuppressMessage("ReSharper", "InconsistentNaming")] private static event EventHandler _OnNewDay; /// The backing field for . [SuppressMessage("ReSharper", "InconsistentNaming")] private static event EventHandler _DayOfMonthChanged; /// The backing field for . [SuppressMessage("ReSharper", "InconsistentNaming")] private static event EventHandler _SeasonOfYearChanged; /// The backing field for . [SuppressMessage("ReSharper", "InconsistentNaming")] private static event EventHandler _YearOfGameChanged; /********* ** Events *********/ /// Raised after the game begins a new day, including when loading a save. public static event EventHandler AfterDayStarted; /// Raised after the in-game clock changes. public static event EventHandler TimeOfDayChanged; /// Raised after the day-of-month value changes, including when loading a save. This may happen before save; in most cases you should use instead. [Obsolete("Use " + nameof(TimeEvents) + "." + nameof(TimeEvents.AfterDayStarted) + " or " + nameof(SaveEvents) + " instead")] public static event EventHandler DayOfMonthChanged { add { TimeEvents.DeprecationManager.Warn($"{nameof(TimeEvents)}.{nameof(TimeEvents.DayOfMonthChanged)}", "1.14", DeprecationLevel.Info); TimeEvents._DayOfMonthChanged += value; } remove => TimeEvents._DayOfMonthChanged -= value; } /// Raised after the year value changes. [Obsolete("Use " + nameof(TimeEvents) + "." + nameof(TimeEvents.AfterDayStarted) + " or " + nameof(SaveEvents) + " instead")] public static event EventHandler YearOfGameChanged { add { TimeEvents.DeprecationManager.Warn($"{nameof(TimeEvents)}.{nameof(TimeEvents.YearOfGameChanged)}", "1.14", DeprecationLevel.Info); TimeEvents._YearOfGameChanged += value; } remove => TimeEvents._YearOfGameChanged -= value; } /// Raised after the season value changes. [Obsolete("Use " + nameof(TimeEvents) + "." + nameof(TimeEvents.AfterDayStarted) + " or " + nameof(SaveEvents) + " instead")] public static event EventHandler SeasonOfYearChanged { add { TimeEvents.DeprecationManager.Warn($"{nameof(TimeEvents)}.{nameof(TimeEvents.SeasonOfYearChanged)}", "1.14", DeprecationLevel.Info); TimeEvents._SeasonOfYearChanged += value; } remove => TimeEvents._SeasonOfYearChanged -= value; } /// Raised when the player is transitioning to a new day and the game is performing its day update logic. This event is triggered twice: once after the game starts transitioning, and again after it finishes. [Obsolete("Use " + nameof(TimeEvents) + "." + nameof(TimeEvents.AfterDayStarted) + " or " + nameof(SaveEvents) + " instead")] public static event EventHandler OnNewDay { add { TimeEvents.DeprecationManager.Warn($"{nameof(TimeEvents)}.{nameof(TimeEvents.OnNewDay)}", "1.6", DeprecationLevel.Info); TimeEvents._OnNewDay += value; } remove => TimeEvents._OnNewDay -= value; } /********* ** Internal methods *********/ /// Injects types required for backwards compatibility. /// Manages deprecation warnings. internal static void Shim(DeprecationManager deprecationManager) { TimeEvents.DeprecationManager = deprecationManager; } /// Raise an event. /// Encapsulates monitoring and logging. internal static void InvokeAfterDayStarted(IMonitor monitor) { monitor.SafelyRaisePlainEvent($"{nameof(TimeEvents)}.{nameof(TimeEvents.AfterDayStarted)}", TimeEvents.AfterDayStarted?.GetInvocationList(), null, EventArgs.Empty); } /// Raise a event. /// Encapsulates monitoring and logging. /// The previous time in military time format (e.g. 6:00pm is 1800). /// The current time in military time format (e.g. 6:10pm is 1810). internal static void InvokeTimeOfDayChanged(IMonitor monitor, int priorTime, int newTime) { monitor.SafelyRaiseGenericEvent($"{nameof(TimeEvents)}.{nameof(TimeEvents.TimeOfDayChanged)}", TimeEvents.TimeOfDayChanged?.GetInvocationList(), null, new EventArgsIntChanged(priorTime, newTime)); } /// Raise a event. /// Encapsulates monitoring and logging. /// The previous day value. /// The current day value. internal static void InvokeDayOfMonthChanged(IMonitor monitor, int priorDay, int newDay) { monitor.SafelyRaiseGenericEvent($"{nameof(TimeEvents)}.{nameof(TimeEvents.DayOfMonthChanged)}", TimeEvents._DayOfMonthChanged?.GetInvocationList(), null, new EventArgsIntChanged(priorDay, newDay)); } /// Raise a event. /// Encapsulates monitoring and logging. /// The previous year value. /// The current year value. internal static void InvokeYearOfGameChanged(IMonitor monitor, int priorYear, int newYear) { monitor.SafelyRaiseGenericEvent($"{nameof(TimeEvents)}.{nameof(TimeEvents.YearOfGameChanged)}", TimeEvents._YearOfGameChanged?.GetInvocationList(), null, new EventArgsIntChanged(priorYear, newYear)); } /// Raise a event. /// Encapsulates monitoring and logging. /// The previous season name. /// The current season name. internal static void InvokeSeasonOfYearChanged(IMonitor monitor, string priorSeason, string newSeason) { monitor.SafelyRaiseGenericEvent($"{nameof(TimeEvents)}.{nameof(TimeEvents.SeasonOfYearChanged)}", TimeEvents._SeasonOfYearChanged?.GetInvocationList(), null, new EventArgsStringChanged(priorSeason, newSeason)); } /// Raise a event. /// Encapsulates monitoring and logging. /// The previous day value. /// The current day value. /// Whether the game just started the transition (true) or finished it (false). internal static void InvokeOnNewDay(IMonitor monitor, int priorDay, int newDay, bool isTransitioning) { monitor.SafelyRaiseGenericEvent($"{nameof(TimeEvents)}.{nameof(TimeEvents.OnNewDay)}", TimeEvents._OnNewDay?.GetInvocationList(), null, new EventArgsNewDay(priorDay, newDay, isTransitioning)); } } }