summaryrefslogtreecommitdiff
path: root/src/SMAPI/Framework/Patching/GamePatcher.cs
diff options
context:
space:
mode:
authorJesse Plamondon-Willard <github@jplamondonw.com>2018-06-06 21:45:03 -0400
committerJesse Plamondon-Willard <github@jplamondonw.com>2018-06-06 21:45:03 -0400
commitcd62dcc8cfa35a9b423f4d15359ec3083b4c6d44 (patch)
treef5eb9c233aeaa44b9d0c22278b86c5648d5ac393 /src/SMAPI/Framework/Patching/GamePatcher.cs
parent9e525533e10ade49c733a34373e0fb749748918e (diff)
downloadSMAPI-cd62dcc8cfa35a9b423f4d15359ec3083b4c6d44.tar.gz
SMAPI-cd62dcc8cfa35a9b423f4d15359ec3083b4c6d44.tar.bz2
SMAPI-cd62dcc8cfa35a9b423f4d15359ec3083b4c6d44.zip
add simple Harmony wrapper for validation, error-handling, etc (#541)
Diffstat (limited to 'src/SMAPI/Framework/Patching/GamePatcher.cs')
-rw-r--r--src/SMAPI/Framework/Patching/GamePatcher.cs45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/SMAPI/Framework/Patching/GamePatcher.cs b/src/SMAPI/Framework/Patching/GamePatcher.cs
new file mode 100644
index 00000000..71ca8e55
--- /dev/null
+++ b/src/SMAPI/Framework/Patching/GamePatcher.cs
@@ -0,0 +1,45 @@
+using System;
+using Harmony;
+
+namespace StardewModdingAPI.Framework.Patching
+{
+ /// <summary>Encapsulates applying Harmony patches to the game.</summary>
+ internal class GamePatcher
+ {
+ /*********
+ ** Properties
+ *********/
+ /// <summary>Encapsulates monitoring and logging.</summary>
+ private readonly IMonitor Monitor;
+
+
+ /*********
+ ** Public methods
+ *********/
+ /// <summary>Construct an instance.</summary>
+ /// <param name="monitor">Encapsulates monitoring and logging.</param>
+ public GamePatcher(IMonitor monitor)
+ {
+ this.Monitor = monitor;
+ }
+
+ /// <summary>Apply all loaded patches to the game.</summary>
+ /// <param name="patches">The patches to apply.</param>
+ public void Apply(params IHarmonyPatch[] patches)
+ {
+ HarmonyInstance harmony = HarmonyInstance.Create("io.smapi");
+ 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);
+ }
+ }
+ }
+ }
+}