internal static void Check() { if (PlayerPrefs.GetInt("QModManager_EnableUpdateCheck", 1) == 0) { Logger.Info("Update check disabled"); return; } if (!NetworkUtilities.CheckConnection()) { Logger.Warn("Cannot check for updates, internet disabled"); return; } ServicePointManager.ServerCertificateValidationCallback = NetworkUtilities.CustomSCVC; using (WebClient client = new WebClient()) { client.DownloadStringCompleted += (sender, e) => { if (e.Error != null) { Logger.Error("There was an error retrieving the latest version from GitHub!"); Logger.Exception(e.Error); return; } Parse(e.Result); }; Logger.Debug("Getting the latest version..."); client.DownloadStringAsync(new Uri(VersionURL)); } }
internal static void StartLoadingMods() { Logger.Info("Started loading mods"); AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { FileInfo[] allDlls = new DirectoryInfo(QModBaseDir).GetFiles("*.dll", SearchOption.AllDirectories); foreach (FileInfo dll in allDlls) { if (args.Name.Contains(Path.GetFileNameWithoutExtension(dll.Name))) { return(Assembly.LoadFrom(dll.FullName)); } } return(null); }; Logger.Debug("Added AssemblyResolve event"); if (!Directory.Exists(QModBaseDir)) { Logger.Info("QMods directory was not found! Creating..."); return; } string[] subDirs = Directory.GetDirectories(QModBaseDir); foreach (string subDir in subDirs) { if (Directory.GetFiles(subDir, "*.dll", SearchOption.TopDirectoryOnly).Length < 1) { continue; } string folderName = new DirectoryInfo(subDir).Name; string jsonFile = Path.Combine(subDir, "mod.json"); if (!File.Exists(jsonFile)) { Logger.Error($"No \"mod.json\" file found for mod located in folder \"{subDir}\". A template file will be created"); File.WriteAllText(jsonFile, JsonConvert.SerializeObject(new QMod())); erroredMods.Add(QMod.CreateFakeQMod(folderName)); continue; } QMod mod = QMod.FromJsonFile(Path.Combine(subDir, "mod.json")); if (!QMod.QModValid(mod, folderName)) { erroredMods.Add(QMod.CreateFakeQMod(folderName)); continue; } if (mod.Enable == false) { Logger.Info($"Mod \"{mod.DisplayName}\" is disabled via config, skipping..."); continue; } string modAssemblyPath = Path.Combine(subDir, mod.AssemblyName); if (!File.Exists(modAssemblyPath)) { Logger.Error($"No matching dll found at \"{modAssemblyPath}\" for mod \"{mod.DisplayName}\""); erroredMods.Add(mod); continue; } mod.LoadedAssembly = Assembly.LoadFrom(modAssemblyPath); mod.ModAssemblyPath = modAssemblyPath; //mod.MessageReceivers = GetMessageRecievers(mod.LoadedAssembly); foundMods.Add(mod); } // Add the found mods into the sortedMods list sortedMods.AddRange(foundMods); // Disable mods that are not for the detected game // (Disable Subnautica mods if Below Zero is detected and disable Below Zero mods if Subnautica is detected) DisableNonApplicableMods(); // Remove mods with duplicate mod ids if any are found RemoveDuplicateModIDs(); // Sort the mods based on their LoadBefore and LoadAfter properties // If any mods break (i.e., a loop is found), they are removed from the list so that they aren't loaded // And are outputted into the log. SortMods(); // Check if all the mods' dependencies are present // If a mod's dependecies aren't present, that mods isn't loaded and it is outputted in the log. CheckForDependencies(); // Finally, load all the mods after sorting and checking for dependencies. // If anything goes wrong during loading, it is outputted in the log. LoadAllMods(); }
internal static void PatchHarmony() { HarmonyInstance.Create("qmodmanager").PatchAll(); Logger.Debug("Patched!"); }