Просмотр исходного кода

Added Traverse.SetValue warning hook

ManlyMarco 4 лет назад
Родитель
Сommit
8a65fc9c62
1 измененных файлов с 9 добавлено и 1 удалено
  1. 9 1
      BepInEx.Preloader/RuntimeFixes/HarmonyFixes.cs

+ 9 - 1
BepInEx.Preloader/RuntimeFixes/HarmonyFixes.cs

@@ -12,7 +12,8 @@ namespace BepInEx.Preloader.RuntimeFixes
 			{
 				var harmony = new HarmonyLib.Harmony("BepInEx.Preloader.RuntimeFixes.HarmonyFixes");
 				harmony.Patch(AccessTools.Method(typeof(Traverse), nameof(Traverse.GetValue), new Type[0]), null, new HarmonyMethod(typeof(HarmonyFixes), nameof(GetValue)));
-			}
+				harmony.Patch(AccessTools.Method(typeof(Traverse), nameof(Traverse.SetValue), new []{ typeof(object) }), null, new HarmonyMethod(typeof(HarmonyFixes), nameof(SetValue)));
+            }
 			catch (Exception e)
 			{
 				Logging.Logger.LogError(e);
@@ -24,5 +25,12 @@ namespace BepInEx.Preloader.RuntimeFixes
 			if (!__instance.FieldExists() && !__instance.MethodExists() && !__instance.TypeExists())
 				Logging.Logger.LogWarning("Traverse.GetValue was called while not pointing at an existing Field, Property, Method or Type. The return value can be unexpected.\n" + new StackTrace());
 		}
+
+		private static void SetValue(Traverse __instance)
+		{
+			// If method exists it will crash inside traverse so only need to mention the field missing
+			if (!__instance.FieldExists() && !__instance.MethodExists())
+				Logging.Logger.LogWarning("Traverse.SetValue was called while not pointing at an existing Field or Property. The call will have no effect.\n" + new StackTrace());
+		}
 	}
 }