// todo support methods with arguments (currently there has been no need for it) public static SyncDelegate RegisterSyncDelegate(Type inType, string nestedType, string methodName, string[] fields, Type[] args = null) { string typeName = $"{inType}+{nestedType}"; Type type = MpReflection.GetTypeByName(typeName); if (type == null) { throw new Exception($"Couldn't find type {typeName}"); } MethodInfo method = AccessTools.Method(type, methodName, args); if (method == null) { throw new Exception($"Couldn't find method {typeName}::{methodName}"); } MpUtil.MarkNoInlining(method); SyncDelegate handler = new SyncDelegate(type, method, fields); syncMethods[handler.method] = handler; handlers.Add(handler); PatchMethodForSync(method); return(handler); }
public static SyncMethod RegisterSyncMethod(MethodInfo method, SyncType[] argTypes) { MpUtil.MarkNoInlining(method); SyncMethod handler = new SyncMethod((method.IsStatic ? null : method.DeclaringType), method, argTypes); syncMethods[method] = handler; handlers.Add(handler); PatchMethodForSync(method); return(handler); }
public static void EarlyMarkNoInline(Assembly asm) { foreach (var type in asm.GetTypes()) { MpPatchExtensions.DoMpPatches(null, type)?.ForEach(m => MpUtil.MarkNoInlining(m)); var harmonyMethods = type.GetHarmonyMethods(); if (harmonyMethods?.Count > 0) { var original = MpUtil.GetOriginalMethod(HarmonyMethod.Merge(harmonyMethods)); if (original != null) { MpUtil.MarkNoInlining(original); } } } }
private void EarlyMarkNoInline() { foreach (var type in MpUtil.AllModTypes()) { MpPatchExtensions.DoMpPatches(null, type)?.ForEach(m => MpUtil.MarkNoInlining(m)); var harmonyMethods = type.GetHarmonyMethods(); if (harmonyMethods?.Count > 0) { var original = MpUtil.GetOriginalMethod(HarmonyMethod.Merge(harmonyMethods)); if (original != null) { MpUtil.MarkNoInlining(original); } } } }
private void EarlyPatches() { // special case? MpUtil.MarkNoInlining(AccessTools.Method(typeof(OutfitForcedHandler), nameof(OutfitForcedHandler.Reset))); foreach (var asm in AppDomain.CurrentDomain.GetAssemblies()) { var firstMethod = asm.GetType("Harmony.AccessTools")?.GetMethod("FirstMethod"); if (firstMethod != null) { harmony.Patch(firstMethod, new HarmonyMethod(typeof(AccessTools_FirstMethod_Patch), nameof(AccessTools_FirstMethod_Patch.Prefix))); } if (asm == typeof(HarmonyPatch).Assembly) { continue; } var emitCallParameter = asm.GetType("Harmony.MethodPatcher")?.GetMethod("EmitCallParameter", AccessTools.all); if (emitCallParameter != null) { harmony.Patch(emitCallParameter, new HarmonyMethod(typeof(PatchHarmony), emitCallParameter.GetParameters().Length == 4 ? nameof(PatchHarmony.EmitCallParamsPrefix4) : nameof(PatchHarmony.EmitCallParamsPrefix5))); } } { var prefix = new HarmonyMethod(AccessTools.Method(typeof(CaptureThingSetMakers), "Prefix")); harmony.Patch(AccessTools.Constructor(typeof(ThingSetMaker_MarketValue)), prefix); harmony.Patch(AccessTools.Constructor(typeof(ThingSetMaker_Nutrition)), prefix); } harmony.Patch( AccessTools.Method(typeof(ThingCategoryDef), "get_DescendantThingDefs"), new HarmonyMethod(typeof(ThingCategoryDef_DescendantThingDefsPatch), "Prefix"), new HarmonyMethod(typeof(ThingCategoryDef_DescendantThingDefsPatch), "Postfix") ); harmony.Patch( AccessTools.Method(typeof(ThingCategoryDef), "get_ThisAndChildCategoryDefs"), new HarmonyMethod(typeof(ThingCategoryDef_ThisAndChildCategoryDefsPatch), "Prefix"), new HarmonyMethod(typeof(ThingCategoryDef_ThisAndChildCategoryDefsPatch), "Postfix") ); harmony.Patch( AccessTools.Method(typeof(LoadedModManager), nameof(LoadedModManager.ParseAndProcessXML)), transpiler: new HarmonyMethod(typeof(ParseAndProcessXml_Patch), "Transpiler") ); harmony.Patch( AccessTools.Method(typeof(XmlNode), "get_ChildNodes"), postfix: new HarmonyMethod(typeof(XmlNodeListPatch), nameof(XmlNodeListPatch.XmlNode_ChildNodes_Postfix)) ); harmony.Patch( AccessTools.Method(typeof(XmlInheritance), nameof(XmlInheritance.TryRegisterAllFrom)), new HarmonyMethod(typeof(XmlInheritance_Patch), "Prefix"), new HarmonyMethod(typeof(XmlInheritance_Patch), "Postfix") ); harmony.Patch( AccessTools.Constructor(typeof(LoadableXmlAsset), new[] { typeof(string), typeof(string), typeof(string) }), new HarmonyMethod(typeof(LoadableXmlAssetCtorPatch), "Prefix") ); // Cross os compatibility harmony.Patch( AccessTools.Method(typeof(DirectXmlLoader), nameof(DirectXmlLoader.XmlAssetsInModFolder)), null, new HarmonyMethod(typeof(XmlAssetsInModFolderPatch), "Postfix") ); // Might fix some mod desyncs harmony.Patch( AccessTools.Constructor(typeof(Def), new Type[0]), new HarmonyMethod(typeof(RandPatches), nameof(RandPatches.Prefix)), new HarmonyMethod(typeof(RandPatches), nameof(RandPatches.Postfix)) ); }