diff options
author | Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com> | 2021-07-29 22:50:50 -0400 |
---|---|---|
committer | Jesse Plamondon-Willard <Pathoschild@users.noreply.github.com> | 2021-07-29 22:50:50 -0400 |
commit | 737a434ad6704d22776f463c192b9a9748ce2a21 (patch) | |
tree | 87d3a3e27e44f36f2a17776efa6492f1d4dd7797 /src | |
parent | 880cd7b8bacfcee2cc6a8e15b6b8ea5e05e9467c (diff) | |
download | SMAPI-737a434ad6704d22776f463c192b9a9748ce2a21.tar.gz SMAPI-737a434ad6704d22776f463c192b9a9748ce2a21.tar.bz2 SMAPI-737a434ad6704d22776f463c192b9a9748ce2a21.zip |
reduce ErrorHandler's direct references to internal SMAPI code
That will allow removing the InternalsVisibleTo attribute to avoid namespace conflicts in an upcoming commit.
Diffstat (limited to 'src')
-rw-r--r-- | src/SMAPI.Mods.ErrorHandler/ModEntry.cs | 16 | ||||
-rw-r--r-- | src/SMAPI.Mods.ErrorHandler/Patches/LoadErrorPatch.cs | 3 | ||||
-rw-r--r-- | src/SMAPI/Framework/SCore.cs | 9 |
3 files changed, 22 insertions, 6 deletions
diff --git a/src/SMAPI.Mods.ErrorHandler/ModEntry.cs b/src/SMAPI.Mods.ErrorHandler/ModEntry.cs index 719eddab..b1081218 100644 --- a/src/SMAPI.Mods.ErrorHandler/ModEntry.cs +++ b/src/SMAPI.Mods.ErrorHandler/ModEntry.cs @@ -1,3 +1,4 @@ +using System; using System.Reflection; using StardewModdingAPI.Events; using StardewModdingAPI.Framework; @@ -71,12 +72,17 @@ namespace StardewModdingAPI.Mods.ErrorHandler /// <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); + // get SMAPI core + Type coreType = Type.GetType("StardewModdingAPI.Framework.SCore, StardewModdingAPI", throwOnError: false) + ?? throw new InvalidOperationException("Can't access SMAPI's core type. This mod may not work correctly."); + object core = coreType.GetProperty("Instance", BindingFlags.Static | BindingFlags.NonPublic)?.GetValue(null) + ?? throw new InvalidOperationException("Can't access SMAPI's core instance. This mod may not work correctly."); - return logManager?.MonitorForGame ?? this.Monitor; + // get monitor + MethodInfo getMonitorForGame = coreType.GetMethod("GetMonitorForGame") + ?? throw new InvalidOperationException("Can't access the SMAPI's 'GetMonitorForGame' method. This mod may not work correctly."); + + return (IMonitor)getMonitorForGame.Invoke(core, new object[0]) ?? this.Monitor; } } } diff --git a/src/SMAPI.Mods.ErrorHandler/Patches/LoadErrorPatch.cs b/src/SMAPI.Mods.ErrorHandler/Patches/LoadErrorPatch.cs index e14dc662..cc0e5e52 100644 --- a/src/SMAPI.Mods.ErrorHandler/Patches/LoadErrorPatch.cs +++ b/src/SMAPI.Mods.ErrorHandler/Patches/LoadErrorPatch.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; using HarmonyLib; +using Microsoft.Xna.Framework.Content; using StardewModdingAPI.Framework.Exceptions; using StardewModdingAPI.Framework.Patching; using StardewValley; @@ -82,7 +83,7 @@ namespace StardewModdingAPI.Mods.ErrorHandler.Patches { BluePrint _ = new BluePrint(building.buildingType.Value); } - catch (SContentLoadException) + catch (ContentLoadException) { LoadErrorPatch.Monitor.Log($"Removed invalid building type '{building.buildingType.Value}' in {location.Name} ({building.tileX}, {building.tileY}) to avoid a crash when loading save '{Constants.SaveFolderName}'. (Did you remove a custom building mod?)", LogLevel.Warn); location.buildings.Remove(building); diff --git a/src/SMAPI/Framework/SCore.cs b/src/SMAPI/Framework/SCore.cs index 4211abc5..b607f95d 100644 --- a/src/SMAPI/Framework/SCore.cs +++ b/src/SMAPI/Framework/SCore.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; using System.Net; @@ -310,6 +311,14 @@ namespace StardewModdingAPI.Framework } } + /// <summary>Get the core logger and monitor on behalf of the game.</summary> + /// <remarks>This method is called using reflection by the ErrorHandler mod to log game errors.</remarks> + [SuppressMessage("ReSharper", "UnusedMember.Global", Justification = "Used via reflection")] + public IMonitor GetMonitorForGame() + { + return this.LogManager.MonitorForGame; + } + /// <summary>Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.</summary> public void Dispose() { |