Beispiel #1
0
        static void DiscoverAndLoadAssemblies(ICollection <ProtoMod> protomods)
        {
            HashSet <AssemblyInfo> foundAssemblies = new HashSet <AssemblyInfo>();

            foreach (var mod in protomods)
            {
                foreach (var file in Directory.GetFiles(mod.path, "*.dll", SearchOption.AllDirectories))
                {
                    foundAssemblies.Add(new AssemblyInfo(AssemblyName.GetAssemblyName(Path.GetFullPath(file)),
                                                         Path.GetFullPath(file), mod));
                }
            }

            Assembly FindAssembly(object obj, ResolveEventArgs args)
            {
                var name = new AssemblyName(args.Name);

                return(foundAssemblies.FirstOrDefault((x) => x.DoesMatch(name))?.LoadAssembly());
            }

            AppDomain.CurrentDomain.AssemblyResolve += FindAssembly;
            try
            {
                foreach (var mod in protomods)
                {
                    foreach (var assembly in foundAssemblies.Where((x) => x.mod == mod))
                    {
                        var a = assembly.LoadAssembly();
                        if (!TryGetEntryType(a, out var entryType) || assembly.IsModAssembly || (!mod.isFromJSON && Path.GetFullPath(assembly.Path) != Path.GetFullPath(mod.entryFile)))
                        {
                            continue;
                        }
                        assembly.IsModAssembly = true;
                        var newMod = AddMod(assembly.mod, entryType);
                        HarmonyOverrideHandler.LoadOverrides(entryType.Module);
                        goto foundmod;
                    }

                    throw new EntryPointNotFoundException($"Could not find assembly for mod '{mod}'");

foundmod:
                    continue;
                }
            }
            finally
            {
                AppDomain.CurrentDomain.AssemblyResolve -= FindAssembly;
            }
        }
Beispiel #2
0
        /// <summary>
        /// Called before GameContext.Awake()
        /// </summary>
        internal static void PreLoad()
        {
            if (isPreInitialized)
            {
                return;
            }
            isPreInitialized = true;
            Debug.Log("SRML has successfully invaded the game!");

            prefabParent = new GameObject("PrefabParent").transform;
            prefabParent.gameObject.SetActive(false);
            GameObject.DontDestroyOnLoad(prefabParent.gameObject);
            foreach (var v in Assembly.GetExecutingAssembly().GetTypes())
            {
                System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(v.TypeHandle);
            }

            HarmonyPatcher.PatchAll();

            try
            {
                SRModLoader.InitializeMods();
            }
            catch (Exception e)
            {
                Debug.LogError(e);
                ErrorGUI.CreateError($"{e.GetType().Name}: {e.Message}");
                return;
            }
            FileLogger.Init();
            Console.Console.Init();
            HarmonyOverrideHandler.PatchAll();
            try
            {
                SRModLoader.PreLoadMods();
            }
            catch (Exception e)
            {
                Debug.LogError(e);
                ErrorGUI.CreateError($"{e.Message}");
                return;
            }
            IdentifiableRegistry.CategorizeAllIds();
            GadgetRegistry.CategorizeAllIds();
            ReplacerCache.ClearCache();

            HarmonyPatcher.Instance.Patch(typeof(GameContext).GetMethod("Start"),
                                          prefix: new HarmonyMethod(typeof(Main).GetMethod("Load", BindingFlags.NonPublic | BindingFlags.Static)));
        }