public void revertDetours() { if (DetourInited) { Log.Info("Reverting manual detours"); Detours.Reverse(); foreach (Detour d in Detours) { RedirectionHelper.RevertRedirect(d.OriginalMethod, d.Redirect); } Detours.Clear(); Log.Info("Reverting attribute-driven detours"); AssemblyRedirector.Revert(); Log.Info("Reverting Harmony detours"); foreach (MethodBase m in HarmonyMethodStates.Keys) { HarmonyInst.Unpatch(m, HarmonyPatchType.All, HARMONY_ID); } DetourInited = false; Log.Info("Reverting detours finished."); } }
public override void OnLevelLoaded(LoadMode mode) { if (mode != LoadMode.LoadGame && mode != LoadMode.NewGame) { return; } AssemblyRedirector.Deploy(); }
public void initDetours() { // TODO realize detouring with annotations if (!DetourInited) { Log.Info("Init detours"); bool detourFailed = false; try { Log.Info("Deploying Harmony patches"); #if DEBUG HarmonyInstance.DEBUG = true; #endif Assembly assembly = Assembly.GetExecutingAssembly(); HarmonyMethodStates.Clear(); // Harmony attribute-driven patching Log.Info($"Performing Harmony attribute-driven patching"); HarmonyInst = HarmonyInstance.Create(HARMONY_ID); HarmonyInst.PatchAll(assembly); foreach (Type type in assembly.GetTypes()) { object[] attributes = type.GetCustomAttributes(typeof(HarmonyPatch), true); if (attributes.Length <= 0) { continue; } foreach (object attr in attributes) { HarmonyPatch harmonyPatchAttr = (HarmonyPatch)attr; MethodBase info = HarmonyUtil.GetOriginalMethod(harmonyPatchAttr.info); IntPtr ptr = info.MethodHandle.GetFunctionPointer(); RedirectCallsState state = RedirectionHelper.GetState(ptr); HarmonyMethodStates[info] = state; } } // Harmony manual patching Log.Info($"Performing Harmony manual patching"); foreach (ManualHarmonyPatch manualPatch in ManualHarmonyPatches) { Log.Info($"Manually patching method {manualPatch.method.DeclaringType.FullName}.{manualPatch.method.Name}. Prefix: {manualPatch.prefix?.method}, Postfix: {manualPatch.postfix?.method}, Transpiler: {manualPatch.transpiler?.method}"); HarmonyInst.Patch(manualPatch.method, manualPatch.prefix, manualPatch.postfix, manualPatch.transpiler); IntPtr ptr = manualPatch.method.MethodHandle.GetFunctionPointer(); RedirectCallsState state = RedirectionHelper.GetState(ptr); HarmonyMethodStates[manualPatch.method] = state; } } catch (Exception e) { Log.Error("Could not deploy Harmony patches"); Log.Info(e.ToString()); Log.Info(e.StackTrace); detourFailed = true; } try { Log.Info("Deploying attribute-driven detours"); DetouredMethodStates = AssemblyRedirector.Deploy(); } catch (Exception e) { Log.Error("Could not deploy attribute-driven detours"); Log.Info(e.ToString()); Log.Info(e.StackTrace); detourFailed = true; } if (detourFailed) { Log.Info("Detours failed"); Singleton <SimulationManager> .instance.m_ThreadingWrapper.QueueMainThread(() => { UIView.library.ShowModal <ExceptionPanel>("ExceptionPanel").SetMessage("TM:PE failed to load", "Traffic Manager: President Edition failed to load. You can continue playing but it's NOT recommended. Traffic Manager will not work as expected.", true); }); } else { Log.Info("Detours successful"); } DetourInited = true; } }
static CSharp10Resolver() { AssemblyRedirector.Register(); }
public override void OnLevelUnloading() { AssemblyRedirector.Revert(); }
public override void OnCreated(ILoading loading) { base.OnCreated(loading); AssemblyRedirector.Deploy(); }
public override void OnReleased() { base.OnReleased(); AssemblyRedirector.Revert(); }
static RQNameTranslator() { AssemblyRedirector.Register(); }
public void Install() { if (initialized_) { return; } Log.Info("Init detours"); bool fail = false; try { #if DEBUG Harmony.DEBUG = true; #endif // Harmony attribute-driven patching Log.Info($"Performing Harmony attribute-driven patching"); var harmony = new Harmony(HARMONY_ID); Shortcuts.Assert(harmony != null, "HarmonyInst!=null"); harmony.PatchAll(); Log.Info($"Harmony attribute-driven patching successfull!"); } catch (Exception e) { Log.Error("Could not deploy Harmony patches"); Log.Info(e.Message); Log.Info(e.StackTrace); fail = true; } try { Log.Info("Deploying attribute-driven detours"); AssemblyRedirector.Deploy(); } catch (Exception e) { Log.Error("Could not deploy attribute-driven detours"); Log.Info(e.ToString()); Log.Info(e.StackTrace); fail = true; } if (fail) { Log.Info("Detours failed"); Singleton <SimulationManager> .instance.m_ThreadingWrapper.QueueMainThread( () => { UIView.library .ShowModal <ExceptionPanel>("ExceptionPanel") .SetMessage( "TM:PE failed to load", "Traffic Manager: President Edition failed to load. You can " + "continue playing but it's NOT recommended. Traffic Manager will " + "not work as expected.", true); }); } else { Log.Info("Detours successful"); } initialized_ = true; }
static VBResolver() { AssemblyRedirector.Register(); }