public static IMod LoadMod(IMod mod)
        {
            if (mod == null)
            {
                return(null);
            }
            var modType = mod.GetType();
            var attrib  = modType.GetFirstAttribute <ALoadOrderAttribute>();
            var name    = mod.GetCleanId();

            if (attrib != null)
            {
                foreach (var pair in ModIdReliance.ToArray())
                {
                    var i = pair.Value.FindIndex(m => m.GetCleanId() == name);
                    if (i != -1)
                    {
                        ModIdReliance[pair.Key][i] = mod;
                    }
                }
                foreach (var id in attrib.beforeIds)
                {
                    if (!ModIdReliance.ContainsKey(id.GetCleanId()))
                    {
                        ModIdReliance.Add(id, new List <IMod>());
                    }
                    if (!ModIdReliance[id].Contains(mod))
                    {
                        ModIdReliance[id].Add(mod);
                    }
                }
                foreach (var id in attrib.afterIds)
                {
                    if (!ModIdReliance.ContainsKey(name))
                    {
                        ModIdReliance.Add(name, new List <IMod>());
                    }
                    if (ModIdReliance[name].FindIndex(m => m.GetCleanId() == id.GetCleanId()) != -1)
                    {
                        ModIdReliance[name].Add(new Placeholder(id.GetCleanId()));
                    }
                }
                if (attrib.beforeIds.Count > 0)
                {
                    return(mod);
                }
            }
            try
            {
                if (!Pathfinder.IsModIdentifierValid(name, true))
                {
                    return(null); // never reached due to throw
                }
                Logger.Info("Loading mod '{0}'", name);
                CurrentMod = mod;
                mod.Load();
                UnloadedModIds.Remove(name);
                LoadedMods.Add(name, mod);
                GUI.ModOptions.Handler.LoadFor(mod);
                if (ModIdReliance.ContainsKey(name))
                {
                    foreach (var internalMod in ModIdReliance[name])
                    {
                        LoadMod(internalMod);
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error("Mod '{0}' of file '{1}' failed to load:\n\t{2}", modType.FullName, Path.GetFileName(modType.Assembly.Location), ex);
                UnloadMod(mod);
                UnloadedModIds.Remove(name);
                CurrentMod = null;
                return(null);
            }
            CurrentMod = null;
            return(mod);
        }
Example #2
0
        public static IMod LoadMod(IMod mod)
        {
            if (mod == null)
            {
                return(null);
            }
            var modType = mod.GetType();
            var attrib  = modType.GetFirstAttribute <ModInfoAttribute>();
            var name    = mod.GetCleanId();

            if (attrib != null)
            {
                foreach (var pair in ModIdReliance.ToArray())
                {
                    var i = pair.Value.FindIndex(m => m.GetCleanId() == name);
                    if (i != -1)
                    {
                        ModIdReliance[pair.Key][i] = mod;
                    }
                }
                foreach (var id in attrib.BeforeIds)
                {
                    if (!ModIdReliance.ContainsKey(id.GetCleanId()))
                    {
                        ModIdReliance.Add(id, new List <IMod>());
                    }
                    if (!ModIdReliance[id].Contains(mod))
                    {
                        ModIdReliance[id].Add(mod);
                    }
                }
                foreach (var id in attrib.AfterIds)
                {
                    if (!ModIdReliance.ContainsKey(name))
                    {
                        ModIdReliance.Add(name, new List <IMod>());
                    }
                    if (ModIdReliance[name].FindIndex(m => m.GetCleanId() == id.GetCleanId()) != -1)
                    {
                        ModIdReliance[name].Add(new Placeholder(id.GetCleanId()));
                    }
                }
                if (attrib.BeforeIds.Count > 0)
                {
                    return(mod);
                }
            }
            try
            {
                if (!Pathfinder.IsModIdentifierValid(name, true))
                {
                    return(null); // never reached due to throw
                }
                Logger.Info("Loading mod '{0}'", name);
                using (var _ = new CurrentModOverride(mod))
                {
                    if (ModAttributeHandler.ModToEventMethods.TryGetValue(CurrentMod.GetType(), out var infos))
                    {
                        foreach (var i in infos)
                        {
                            var eventAttrib = i.GetFirstAttribute <EventAttribute>();
                            var paramType   = i.GetParameters()[0].ParameterType;
                            EventManager.RegisterListener(paramType, i.CreateDelegate <Action <PathfinderEvent> >(typeof(Action <>).MakeGenericType(paramType)), eventAttrib.Options);
                        }
                    }
                    mod.Load();
                    UnloadedModIds.Remove(name);
                    LoadedMods.Add(name, mod);
                    GUI.ModOptions.Handler.LoadFor(mod);
                    if (ModIdReliance.ContainsKey(name))
                    {
                        foreach (var internalMod in ModIdReliance[name])
                        {
                            LoadMod(internalMod);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error("Mod '{0}' of file '{1}' failed to load:\n\t{2}", modType.FullName, Path.GetFileName(modType.Assembly.Location), ex);
                UnloadMod(mod);
                UnloadedModIds.Remove(name);
                return(null);
            }
            return(mod);
        }