public static void LoadFor(IMod mod) { var optionType = mod.GetType().GetFirstAttribute <ModOptionsAttribute>()?.ModOptionsType; if (optionType == null) { return; } var options = (AbstractOptions)Activator.CreateInstance(optionType); ModOptions.Add(mod.GetCleanId(), options); }
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); }
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); }