WKLib 0.2.3
A modding library for White Knuckle
Loading...
Searching...
No Matches
PluginConfigSearcher.cs
Go to the documentation of this file.
1using System;
2using System.Collections.Generic;
3using System.ComponentModel;
4using System.Linq;
5using System.Reflection;
6using BepInEx;
7using BepInEx.Bootstrap;
8using BepInEx.Configuration;
9using UnityEngine;
10using WKLib.API;
11using WKLib.Utilities;
12
13namespace WKLib.Core.Config;
14
15// https://github.com/BepInEx/BepInEx.ConfigurationManager/blob/master/ConfigurationManager/SettingSearcher.cs
16
17internal static class PluginConfigSearcher
18{
22 public static BaseUnityPlugin[] FindPlugins()
23 {
24 // Search for instances of BaseUnityPlugin to also find dynamically loaded plugins.
25 // Have to use FindObjectsOfType(Type) instead of FindObjectsOfType<T> because the latter is not available in some older unity versions.
26 // Still look inside Chainloader.PluginInfos in case the BepInEx_Manager GameObject uses HideFlags.HideAndDontSave, which hides it from Object.Find methods.
27 return Chainloader.PluginInfos.Values.Select(x => x.Instance)
28 .Where(plugin => plugin != null)
29 .Union(UnityEngine.Object.FindObjectsOfType(typeof(BaseUnityPlugin)).Cast<BaseUnityPlugin>())
30 .ToArray();
31 }
32
33 // Key = Plugin Info
34 // Values = Config entries
35 public static List<PluginContainer> GetPluginSettings()
36 {
37 var pluginContainers = new List<PluginContainer>();
38
39 foreach (var plugin in FindPlugins())
40 {
41 var GUID = plugin.Info.Metadata.GUID;
42 var WKLibAPIRef = WKLibAPI.internalAPIs.Find(api => string.Equals(api.GUID, GUID, StringComparison.Ordinal));
43
44 var type = plugin.GetType();
45 if (type.GetCustomAttributes(typeof(BrowsableAttribute), false).Cast<BrowsableAttribute>()
46 .Any(x => !x.Browsable)
47 && WKLibAPIRef == null)
48 continue;
49
50 PluginContainer pluginContainer = new()
51 {
52 PluginName = plugin.Info.Metadata.Name,
53 PluginInfo = plugin.Info,
54 APIReference = WKLibAPIRef
55 };
56
57 if (WKLibAPIRef == null || (WKLibAPIRef != null && WKLibAPIRef.ModTab == null))
58 {
59 var sections = new Dictionary<string, List<ConfigEntryBase>>();
60
61 foreach (var configEntryBase in plugin.Config.Select(configEntry => configEntry.Value))
62 {
63 var tags = configEntryBase.Description?.Tags;
64 if (tags != null && tags.Contains("Hidden"))
65 continue;
66
67 var sectionName = configEntryBase.Definition.Section;
68
69 if (!sections.TryGetValue(sectionName, out var list))
70 {
71 list = [];
72 sections[sectionName] = list;
73 }
74
75 list.Add(configEntryBase);
76 }
77
78 pluginContainer.ConfigSection = sections
79 .Select(section => new PluginContainer.ConfigEntrySection
80 {
81 Section = section.Key,
82 ConfigEntries = section.Value.ToArray()
83 })
84 .ToArray();
85
86 if (pluginContainer.ConfigSection.Length <= 0)
87 continue;
88 }
89
90 pluginContainers.Add(pluginContainer);
91 }
92
93 return pluginContainers;
94 }
95}