/// <summary> /// Unpatches patch. /// </summary> public static void SafeUnpatch(this HarmonyLib.Harmony harmony, Type patchType) { var metadata = patchType.GetCustomAttribute <SafePatchAttribute>(); if (metadata == null) { ADOLib.Log($"Type {patchType} doesn't have SafePatch attribute."); return; } ADOLib.Log($"Unpatching {metadata.PatchId}"); if (!metadata.IsEnabled) { ADOLib.Log($"{metadata.PatchId} is not patched!", LogType.Warning); return; } var classType = metadata.Assembly.GetType(metadata.ClassName); if (classType == null) { ADOLib.Log($"Type {metadata.ClassName} not found in assembly {metadata.Assembly}."); return; } var original = metadata.info.method; foreach (var patch in patchType.GetMethods()) { harmony.Unpatch(original, patch); } metadata.IsEnabled = false; ADOLib.Log($"Successfully unpatched {metadata.PatchId}", LogType.Success); }
public static void Patch(HarmonyObj obj) { if (obj.GetPatchedMethods().Any(x => x == coreGame)) { obj.Unpatch(coreGame, transpiler); } obj.Patch(coreGame, null, null, new HarmonyMethod(transpiler)); }
public static void Patch(HarmonyObj obj, CanvasUtility canvas, HUDConfigModel hud, MenuUIInstaller menuUIInstaller) { if (obj.GetPatchedMethods().Any(x => x == menuTransitions)) { obj.Unpatch(menuTransitions, transpiler); } canvasUtility = canvas; hudConfig = hud; menuInstaller = menuUIInstaller; obj.Patch(menuTransitions, null, null, new HarmonyMethod(transpiler)); }
public static void UnpatchAll(this Harmony harmony, Type type) { foreach (var met in type.GetMethods().Where(x => x.IsStatic && x.IsPublic)) { foreach (var attr in met.GetCustomAttributes(false)) { if (attr is HarmonyPatch hp) { var original = AccessTools.Method(hp.info.declaringType, hp.info.methodName, hp.info.argumentTypes); harmony.Unpatch(original, met); } } } }
public override void DefsLoaded() { foreach (ThingDef tDef in DefDatabase <ThingDef> .AllDefs.Where(t => t.race?.Humanlike == true)) { if (tDef.comps == null) { tDef.comps = new List <CompProperties>(); } tDef.comps.Add(new CompProperties(typeof(Pawn_ToolTracker))); Dictionaries.PawnCanUseTools.Add(tDef); } var harmony = new HarmonyLib.Harmony("ToolsFramework"); if (ModsConfig.IsActive("roolo.dualwield") || ModsConfig.IsActive("roolo.dualwield_local") || ModsConfig.IsActive("roolo.dualwield_steam") || ModsConfig.IsActive("roolo.dualwield_copy")) { var myAddOffHand = AccessTools.Method(typeof(Patch_DualWield_Ext_Pawn_EquipmentTracker), nameof(Patch_DualWield_Ext_Pawn_EquipmentTracker.AddOffHandEquipment)); var myTryGetOffHand = AccessTools.Method(typeof(Patch_DualWield_Ext_Pawn_EquipmentTracker), nameof(Patch_DualWield_Ext_Pawn_EquipmentTracker.TryGetOffHandEquipment)); var AddOffHand = AccessTools.Method("DualWield.Ext_Pawn_EquipmentTracker:AddOffHandEquipment"); var TryGetOffHand = AccessTools.Method("DualWield.Ext_Pawn_EquipmentTracker:TryGetOffHandEquipment"); HarmonyLib.Harmony.ReversePatch(TryGetOffHand, new HarmonyMethod(myTryGetOffHand), null); HarmonyLib.Harmony.ReversePatch(AddOffHand, new HarmonyMethod(myAddOffHand), null); } if (ModsConfig.IsActive("petetimessix.simplesidearms") || ModsConfig.IsActive("petetimessix.simplesidearms_local") || ModsConfig.IsActive("petetimessix.simplesidearms_steam") || ModsConfig.IsActive("petetimessix.simplesidearms_copy")) { harmony.Unpatch(AccessTools.Constructor(typeof(Toil)), HarmonyPatchType.Postfix, "PeteTimesSix.SimpleSidearms"); } BaseMod.thisMod.GetSettings <Settings>(); Dictionaries.StatPartSettings.SetOrAdd(StatDefOf.ToolReadinessDelay, ToolsFramework.Settings.equipDelayFactor); Dictionaries.StatPartSettings.SetOrAdd(StatDefOf.ToolWearFactor, ToolsFramework.Settings.degradationFactor); ToolsFramework.Settings.AllITool = false; var unoptToolDef = DefDatabase <ThingDef> .AllDefs.Where(t => t.IsTool() && !typeof(ITool).IsAssignableFrom(t.thingClass)); if (unoptToolDef.Any()) { ToolsFramework.Settings.AllITool = false; Log.Warning("TF_BaseMessage" + "TF_Warning_Unoptimized".Translate(unoptToolDef.ToStringSafeEnumerable())); } else { ToolsFramework.Settings.AllITool = true; } var stats = new List <StatDef>(); foreach (var tdef in DefDatabase <ThingDef> .AllDefs.Where(t => t.HasComp(typeof(ToolComp)))) { var compProp = tdef.ToolCompProp(); compProp.statsAffected = compProp.ToolTypes.SelectMany(t => t.workStatFactors.Select(tt => tt.stat)).ToList(); compProp.statsAffected.AddRange(compProp.ToolTypes.SelectMany(t => t.workStatOffset.Select(tt => tt.stat))); compProp.statsAffected.RemoveDuplicates(); stats.AddRange(compProp.statsAffected); } stats.RemoveDuplicates(); foreach (var stat in stats) { if (stat.parts == null) { stat.parts = new List <StatPart>(); } var statPart = new StatPart_Tool() { parentStat = stat }; foreach (var toolType in DefDatabase <ToolType> .AllDefs.Where(t => t.workStatFactors.Any(tt => tt.stat == stat) || t.workStatOffset.Any(tt => tt.stat == stat))) { statPart.ToolTypes.Add(toolType); } stat.parts.Add(statPart); } }