public static void UnloadMod(IMod mod) { if (mod == null || mod is Placeholder) { return; } CurrentMod = mod; var name = Utility.ActiveModId; var attrib = mod.GetType().GetFirstAttribute <ALoadOrderAttribute>(); if (attrib != null) { foreach (var ident in attrib.afterIds) { var id = ident.GetCleanId(); if (LoadedMods.ContainsKey(id) && LoadedMods[id].GetType().GetFirstAttribute <AllowOrderUnloadAttribute>()?.Allowed == true) { UnloadMod(LoadedMods[id]); } } } foreach (var e in (from p in Extension.Handler.ModExtensions where p.Key.IndexOf('.') != -1 && p.Key.Remove(p.Key.IndexOf('.')) == name select p.Key) .ToArray() ) { Extension.Handler.UnregisterExtension(e); } foreach (var e in (from p in Executable.Handler.ModExecutables where p.Key.IndexOf('.') != -1 && p.Key.Remove(p.Key.IndexOf('.')) == name select p.Key) .ToArray() ) { Executable.Handler.UnregisterExecutable(e); } foreach (var d in (from p in Daemon.Handler.ModDaemons where p.Key.IndexOf('.') != -1 && p.Key.Remove(p.Key.IndexOf('.')) == name select p.Key) .ToArray() ) { Daemon.Handler.UnregisterDaemon(d); } List <string> clist; Command.Handler.ModIdToCommandKeyList.TryGetValue(name, out clist); if (clist != null) { foreach (var c in clist.ToArray()) { Command.Handler.UnregisterCommand(c); } } foreach (var g in (from p in Mission.Handler.ModGoals where p.Key.IndexOf('.') != -1 && p.Key.Remove(p.Key.IndexOf('.')) == name select p.Key) .ToArray() ) { Mission.Handler.UnregisterMissionGoal(g); } foreach (var m in (from p in Mission.Handler.ModMissions where p.Key.IndexOf('.') != -1 && p.Key.Remove(p.Key.IndexOf('.')) == name select p.Key) .ToArray() ) { Mission.Handler.UnregisterMission(m); } foreach (var p in (from p in Port.Handler.PortTypes where p.Key.IndexOf('.') != -1 && p.Key.Remove(p.Key.IndexOf('.')) == name select p.Key) .ToArray() ) { Port.Handler.UnregisterPort(p); } var events = new List <Tuple <Action <PathfinderEvent>, string, string, int> >(); foreach (var v in EventManager.eventListeners.Values) { events.AddRange(v.FindAll(t => t.Item3 == name)); } foreach (var list in EventManager.eventListeners.ToArray()) { foreach (var e in events) { list.Value.Remove(e); } } GUI.ModOptions.Handler.ModOptions.Remove(name); mod.Unload(); UnloadedModIds.Add(name); LoadedMods.Remove(name); CurrentMod = null; }
public static void UnloadMod(IMod mod) { if (mod == null || mod is Placeholder) { return; } using (var _ = new CurrentModOverride(mod)) { var name = Utility.ActiveModId; var attrib = mod.GetType().GetFirstAttribute <ModInfoAttribute>(); if (attrib != null) { foreach (var ident in attrib.AfterIds) { var id = ident.GetCleanId(); if (LoadedMods.ContainsKey(id) && LoadedMods[id].GetType().GetFirstAttribute <AllowOrderUnloadAttribute>()?.Allowed == true) { UnloadMod(LoadedMods[id]); } } } foreach (var e in (from p in Extension.Handler.ModExtensions where p.Key.IndexOf('.') != -1 && p.Key.Remove(p.Key.IndexOf('.')) == name select p.Key) .ToArray() ) { Logger.Verbose($"Unloading Extension '{e}'"); Extension.Handler.UnregisterExtension(e); } foreach (var e in (from p in Executable.Handler.ModExecutables where p.Key.IndexOf('.') != -1 && p.Key.Remove(p.Key.IndexOf('.')) == name select p.Key) .ToArray() ) { Logger.Verbose($"Unloading Executable '{e}'"); Executable.Handler.UnregisterExecutable(e); } foreach (var d in (from p in Daemon.Handler.ModDaemons where p.Key.IndexOf('.') != -1 && p.Key.Remove(p.Key.IndexOf('.')) == name select p.Key) .ToArray() ) { Logger.Verbose($"Unloading Daemon '{d}'"); Daemon.Handler.UnregisterDaemon(d); } Command.Handler.ModIdToCommandKeyList.TryGetValue(name, out List <string> clist); if (clist != null) { foreach (var c in clist.ToArray()) { Logger.Verbose($"Unloading Command '{c}'"); Command.Handler.UnregisterCommand(c); } } foreach (var p in (from p in Port.Handler.PortTypes where p.Key.IndexOf('.') != -1 && p.Key.Remove(p.Key.IndexOf('.')) == name select p.Key) .ToArray() ) { Logger.Verbose($"Unloading PortType '{p}'"); Port.Handler.UnregisterPort(p); } foreach (var pair in EventManager.eventListeners.Reverse()) { var listenerObjs = pair.Value.FindAll(l => l.ModId == name); foreach (var obj in listenerObjs) { Logger.Verbose($"Unloading Event Listener '{obj.Options.DebugName}'"); EventManager.UnregisterListener(pair.Key, obj); } } GUI.ModOptions.Handler.ModOptions.Remove(name); mod.Unload(); UnloadedModIds.Add(name); LoadedMods.Remove(name); } }