예제 #1
0
        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);
            }
        }
예제 #2
0
 internal static ModEntry GetModById(string id) => _GetModById(ModScanner.NormaliseModId(id));
예제 #3
0
        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");
                }
            }
        }