using System; #if HARMONY_2 using HarmonyLib; #else using Harmony; #endif namespace StardewModdingAPI.Framework.Patching { /// Encapsulates applying Harmony patches to the game. internal class GamePatcher { /********* ** Fields *********/ /// Encapsulates monitoring and logging. private readonly IMonitor Monitor; /********* ** Public methods *********/ /// Construct an instance. /// Encapsulates monitoring and logging. public GamePatcher(IMonitor monitor) { this.Monitor = monitor; } /// Apply all loaded patches to the game. /// The patches to apply. public void Apply(params IHarmonyPatch[] patches) { #if HARMONY_2 Harmony harmony = new Harmony("SMAPI"); #else HarmonyInstance harmony = HarmonyInstance.Create("SMAPI"); #endif foreach (IHarmonyPatch patch in patches) { try { patch.Apply(harmony); } catch (Exception ex) { this.Monitor.Log($"Couldn't apply runtime patch '{patch.Name}' to the game. Some SMAPI features may not work correctly. See log file for details.", LogLevel.Error); this.Monitor.Log(ex.GetLogSummary(), LogLevel.Trace); } } } } }