From 81a0a0ee15c6cc0a93a404d2a083082ab22a16ff Mon Sep 17 00:00:00 2001 From: Nicholas Dunnaway Date: Sun, 17 Oct 2021 22:52:51 -0700 Subject: [PATCH] Fixed NexusId NRE --- .../ConfigurationManagerAttributes.cs | 106 ++++++++++++++++++ .../Digitalroot.Valheim.PluginInfo.csproj | 2 + src/Digitalroot.Valheim.PluginInfo/Main.cs | 18 ++- 3 files changed, 121 insertions(+), 5 deletions(-) create mode 100644 src/Digitalroot.Valheim.PluginInfo/ConfigurationManagerAttributes.cs diff --git a/src/Digitalroot.Valheim.PluginInfo/ConfigurationManagerAttributes.cs b/src/Digitalroot.Valheim.PluginInfo/ConfigurationManagerAttributes.cs new file mode 100644 index 0000000..b985fd0 --- /dev/null +++ b/src/Digitalroot.Valheim.PluginInfo/ConfigurationManagerAttributes.cs @@ -0,0 +1,106 @@ +namespace Digitalroot.Valheim.PluginInfo +{ + /// + /// Class that specifies how a setting should be displayed inside the ConfigurationManager settings window. + /// + /// Usage: + /// This class template has to be copied inside the plugin's project and referenced by its code directly. + /// make a new instance, assign any fields that you want to override, and pass it as a tag for your setting. + /// + /// If a field is null (default), it will be ignored and won't change how the setting is displayed. + /// If a field is non-null (you assigned a value to it), it will override default behavior. + /// + /// + /// + /// Here's an example of overriding order of settings and marking one of the settings as advanced: + /// + /// // Override IsAdvanced and Order + /// Config.AddSetting("X", "1", 1, new ConfigDescription("", null, new ConfigurationManagerAttributes { IsAdvanced = true, Order = 3 })); + /// // Override only Order, IsAdvanced stays as the default value assigned by ConfigManager + /// Config.AddSetting("X", "2", 2, new ConfigDescription("", null, new ConfigurationManagerAttributes { Order = 1 })); + /// Config.AddSetting("X", "3", 3, new ConfigDescription("", null, new ConfigurationManagerAttributes { Order = 2 })); + /// + /// + /// + /// + /// You can read more and see examples in the readme at https://github.com/BepInEx/BepInEx.ConfigurationManager + /// You can optionally remove fields that you won't use from this class, it's the same as leaving them null. + /// +#pragma warning disable 0169, 0414, 0649 + internal sealed class ConfigurationManagerAttributes + { + /// + /// Should the setting be shown as a percentage (only use with value range settings). + /// + public bool? ShowRangeAsPercent; + + /// + /// Custom setting editor (OnGUI code that replaces the default editor provided by ConfigurationManager). + /// See below for a deeper explanation. Using a custom drawer will cause many of the other fields to do nothing. + /// + public System.Action CustomDrawer; + + /// + /// Show this setting in the settings screen at all? If false, don't show. + /// + public bool? Browsable; + + /// + /// Category the setting is under. Null to be directly under the plugin. + /// + public string Category; + + /// + /// If set, a "Default" button will be shown next to the setting to allow resetting to default. + /// + public object DefaultValue; + + /// + /// Force the "Reset" button to not be displayed, even if a valid DefaultValue is available. + /// + public bool? HideDefaultButton; + + /// + /// Force the setting name to not be displayed. Should only be used with a to get more space. + /// Can be used together with to gain even more space. + /// + public bool? HideSettingName; + + /// + /// Optional description shown when hovering over the setting. + /// Not recommended, provide the description when creating the setting instead. + /// + public string Description; + + /// + /// Name of the setting. + /// + public string DispName; + + /// + /// Order of the setting on the settings list relative to other settings in a category. + /// 0 by default, higher number is higher on the list. + /// + public int? Order; + + /// + /// Only show the value, don't allow editing it. + /// + public bool? ReadOnly; + + /// + /// If true, don't show the setting by default. User has to turn on showing advanced settings or search for it. + /// + public bool? IsAdvanced; + + /// + /// Custom converter from setting type to string for the built-in editor textboxes. + /// + public System.Func ObjToStr; + + /// + /// Custom converter from string to setting type for the built-in editor textboxes. + /// + public System.Func StrToObj; + } +} diff --git a/src/Digitalroot.Valheim.PluginInfo/Digitalroot.Valheim.PluginInfo.csproj b/src/Digitalroot.Valheim.PluginInfo/Digitalroot.Valheim.PluginInfo.csproj index 5672174..095037c 100644 --- a/src/Digitalroot.Valheim.PluginInfo/Digitalroot.Valheim.PluginInfo.csproj +++ b/src/Digitalroot.Valheim.PluginInfo/Digitalroot.Valheim.PluginInfo.csproj @@ -40,6 +40,7 @@ ..\packages\HarmonyX.2.5.5\lib\net45\0Harmony.dll + False ..\packages\Pfhoenix.Valheim.ModProjectReferences.1.0.9\lib\net46\Assembly-CSharp.dll @@ -391,6 +392,7 @@ + diff --git a/src/Digitalroot.Valheim.PluginInfo/Main.cs b/src/Digitalroot.Valheim.PluginInfo/Main.cs index 81ab63a..886cd6a 100644 --- a/src/Digitalroot.Valheim.PluginInfo/Main.cs +++ b/src/Digitalroot.Valheim.PluginInfo/Main.cs @@ -1,4 +1,5 @@ using BepInEx; +using BepInEx.Bootstrap; using BepInEx.Configuration; using Digitalroot.Valheim.Common; using HarmonyLib; @@ -11,17 +12,18 @@ namespace Digitalroot.Valheim.PluginInfo { [BepInPlugin(Guid, Name, Version)] - [BepInDependency(Jotunn.Main.ModGuid, BepInDependency.DependencyFlags.SoftDependency)] + [BepInDependency(JVLGuid, BepInDependency.DependencyFlags.SoftDependency)] public class Main : BaseUnityPlugin, ITraceableLogging { private Harmony _harmony; - public const string Version = "1.3.0"; + public const string Version = "1.3.1"; public const string Name = "Digitalroot Plug-in Info"; // ReSharper disable once MemberCanBePrivate.Global public const string Guid = "digitalroot.mods.plugininfo"; public const string Namespace = "Digitalroot.Valheim." + nameof(PluginInfo); [UsedImplicitly] public static ConfigEntry NexusId; public static Main Instance; + private const string JVLGuid = "com.jotunn.jotunn"; #region Implementation of ITraceableLogging @@ -43,7 +45,7 @@ public Main() EnableTrace = false; #endif Instance = this; - NexusId = Config.Bind("General", "NexusID", 1302, new ConfigDescription("Nexus mod ID for updates", null, new ConfigurationManagerAttributes { IsAdminOnly = false, Browsable = false, ReadOnly = true })); + NexusId = Config.Bind("General", "NexusID", 1302, new ConfigDescription("Nexus mod ID for updates", null, new ConfigurationManagerAttributes { Browsable = false, ReadOnly = true })); Log.RegisterSource(Instance); Log.Trace(Instance, $"{GetType().Namespace}.{GetType().Name}.{MethodBase.GetCurrentMethod().Name}()"); } @@ -121,7 +123,11 @@ public void OnFejdStartupStart() } Log.Debug(Instance, $"***************************************"); - HandleJVLData(); + + if (Common.Utils.DoesPluginExist(JVLGuid)) + { + HandleJVLData(); + } } catch (Exception e) { @@ -129,12 +135,14 @@ public void OnFejdStartupStart() } } + public static bool DoesPluginExist(string pluginGuid) => Chainloader.PluginInfos.Any(keyValuePair => keyValuePair.Value.Metadata.GUID == pluginGuid); + private void HandleJVLData() { try { Log.Trace(Instance, $"{GetType().Namespace}.{GetType().Name}.{MethodBase.GetCurrentMethod().Name}()"); - if (!Common.Utils.DoesPluginExist(Jotunn.Main.ModGuid)) return; + Log.Debug(Instance, "******* [Digitalroot JVL Info ] *******"); foreach (var modInfo in Jotunn.Utils.ModRegistry.GetMods()) {