internal static bool GetVersionById(string id, out ModEntry mod, out Version version) { mod = null; version = null; if (string.IsNullOrEmpty(id)) { return(false); } id = ModScanner.NormaliseModId(id); switch (id) { case "modnix": case "loader": case "": version = ModLoader.LoaderVersion; return(true); case "phoenixpoint": case "phoenix point": case "game": version = ModLoader.GameVersion; return(true); case "ppml": case "ppml+": case "phoenixpointmodloader": case "phoenix point mod loader": version = ModLoader.PPML_COMPAT; return(true); case "non-modnix": case "nonmodnix": return(false); default: mod = _GetModById(id); version = GetVersionFromMod(mod); return(mod != null); } }
internal static ModEntry GetModById(string id) => _GetModById(ModScanner.NormaliseModId(id));
private static void RemoveUnfulfilledMods() { Log.Verbo("Check mod requirements"); var dependees = new HashSet <string>(); foreach (var mod in EnabledMods.ToArray()) { if (mod.Disabled) { continue; } var reqs = mod.Metadata.Requires; if (reqs == null) { continue; } var requirements = new Dictionary <string, List <AppVer> >(); foreach (var req in reqs) { var id = ModScanner.NormaliseModId(req.Id); if (id == null) { continue; } if (!requirements.ContainsKey(id)) { requirements[id] = new List <AppVer>(); } requirements[id].Add(req); } foreach (var reqSet in requirements) { bool found = ModLoader.GetVersionById(reqSet.Key, out ModEntry target, out Version ver), fulfill = found; if (target == mod) { mod.Log().Warn("Mod {0} not allowed to depends on itself with mod_info.Requires", reqSet.Key); continue; } if (found) { fulfill = reqSet.Value.Any(r => (r.Min == null || r.Min <= ver) && (r.Max == null || r.Max >= ver)); } if (!fulfill) { var r = reqs.FirstOrDefault(e => ModScanner.NormaliseModId(e.Id) == reqSet.Key); DisableAndRemoveMod(mod, "require", "requirement {0} failed, found {1}", reqSet.Key, found ? (object)ver : "none", r?.Name, r?.Url); break; } else { dependees.Add(reqSet.Key); } } } foreach (var mod in EnabledMods.ToArray()) { var flags = mod.Metadata.Flags; if (flags != null && Tools.InList(flags, "library") && !dependees.Contains(mod.Key)) { DisableAndRemoveMod(mod, "no_dependent", "library disabled because no mods require it"); } } }