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;
        }
Example #2
0
        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);
            }
        }