2using System.Collections.Generic;
3using System.ComponentModel;
5using System.Reflection;
7using BepInEx.Bootstrap;
8using BepInEx.Configuration;
17internal static class PluginConfigSearcher
22 public static BaseUnityPlugin[] FindPlugins()
27 return Chainloader.PluginInfos.Values.Select(x => x.Instance)
28 .Where(plugin => plugin !=
null)
29 .Union(UnityEngine.Object.FindObjectsOfType(typeof(BaseUnityPlugin)).Cast<BaseUnityPlugin>())
35 public static List<PluginContainer> GetPluginSettings()
37 var pluginContainers =
new List<PluginContainer>();
39 foreach (var plugin
in FindPlugins())
41 var GUID = plugin.Info.Metadata.GUID;
42 var WKLibAPIRef =
WKLibAPI.internalAPIs.Find(api =>
string.Equals(api.GUID, GUID, StringComparison.Ordinal));
44 var type = plugin.GetType();
45 if (type.GetCustomAttributes(typeof(BrowsableAttribute),
false).Cast<BrowsableAttribute>()
46 .Any(x => !x.Browsable)
47 && WKLibAPIRef ==
null)
50 PluginContainer pluginContainer =
new()
52 PluginName = plugin.Info.Metadata.Name,
53 PluginInfo = plugin.Info,
54 APIReference = WKLibAPIRef
57 if (WKLibAPIRef ==
null || (WKLibAPIRef !=
null && WKLibAPIRef.ModTab ==
null))
59 var sections =
new Dictionary<string, List<ConfigEntryBase>>();
61 foreach (var configEntryBase
in plugin.Config.Select(configEntry => configEntry.Value))
63 var tags = configEntryBase.Description?.Tags;
64 if (tags !=
null && tags.Contains(
"Hidden"))
67 var sectionName = configEntryBase.Definition.Section;
69 if (!sections.TryGetValue(sectionName, out var list))
72 sections[sectionName] = list;
75 list.Add(configEntryBase);
78 pluginContainer.ConfigSection = sections
79 .Select(section =>
new PluginContainer.ConfigEntrySection
81 Section = section.Key,
82 ConfigEntries = section.Value.ToArray()
86 if (pluginContainer.ConfigSection.Length <= 0)
90 pluginContainers.Add(pluginContainer);
93 return pluginContainers;