Beispiel #1
0
        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.");
            }
        }
Beispiel #2
0
 public override void OnLevelLoaded(LoadMode mode)
 {
     if (mode != LoadMode.LoadGame && mode != LoadMode.NewGame)
     {
         return;
     }
     AssemblyRedirector.Deploy();
 }
Beispiel #3
0
        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;
            }
        }
Beispiel #4
0
 static CSharp10Resolver()
 {
     AssemblyRedirector.Register();
 }
Beispiel #5
0
 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();
 }
Beispiel #8
0
 static RQNameTranslator()
 {
     AssemblyRedirector.Register();
 }
Beispiel #9
0
        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;
        }
Beispiel #10
0
 static VBResolver()
 {
     AssemblyRedirector.Register();
 }