/********* ** Public methods *********/ /// <summary>The mod entry point, called after the mod is first loaded.</summary> /// <param name="helper">Provides simplified APIs for writing mods.</param> public override void Entry(IModHelper helper) { // get SMAPI core types SCore core = SCore.Instance; LogManager logManager = core.GetType().GetField("LogManager", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(core) as LogManager; if (logManager == null) { this.Monitor.Log($"Can't access SMAPI's internal log manager. Error-handling patches won't be applied.", LogLevel.Error); return; } // apply patches new GamePatcher(this.Monitor).Apply( new EventErrorPatch(logManager.MonitorForGame), new DialogueErrorPatch(logManager.MonitorForGame, this.Helper.Reflection), new ObjectErrorPatch(), new LoadErrorPatch(this.Monitor, this.OnSaveContentRemoved), new ScheduleErrorPatch(logManager.MonitorForGame), new UtilityErrorPatches() ); // hook events this.Helper.Events.GameLoop.SaveLoaded += this.OnSaveLoaded; }
/// <summary>Get the monitor with which to log game errors.</summary> private IMonitor GetMonitorForGame() { SCore core = SCore.Instance; LogManager logManager = core.GetType().GetField("LogManager", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(core) as LogManager; if (logManager == null) { this.Monitor.Log("Can't access SMAPI's internal log manager. Some game errors may be reported as being from Error Handler.", LogLevel.Error); } return(logManager?.MonitorForGame ?? this.Monitor); }