diff --git a/SecretAPI/Features/UserSettings/CustomSetting.cs b/SecretAPI/Features/UserSettings/CustomSetting.cs index 95e681b..9280015 100644 --- a/SecretAPI/Features/UserSettings/CustomSetting.cs +++ b/SecretAPI/Features/UserSettings/CustomSetting.cs @@ -2,10 +2,12 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Linq; using global::UserSettings.ServerSpecific; using LabApi.Events.Handlers; +using LabApi.Features.Console; using LabApi.Features.Enums; using LabApi.Features.Wrappers; using Mirror; @@ -155,13 +157,22 @@ public bool IsShared /// Registers a collection of settings. /// /// The settings to register. - public static void Register(params CustomSetting[] settings) => CustomSettings.AddRange(settings); + public static void Register(params CustomSetting[] settings) + { + settings.ForEach(setting => ReportSettingIssue(setting, null)); + CustomSettings.AddRange(settings); + } /// /// Registers a collection of settings. /// /// The settings to register. - public static void Register(IEnumerable settings) => CustomSettings.AddRange(settings); + public static void Register(IEnumerable settings) + { + foreach (CustomSetting? setting in settings) + ReportSettingIssue(setting, null); + CustomSettings.AddRange(settings); + } /// /// Unregisters collection of settings. @@ -322,6 +333,28 @@ public static void SendSettingsToPlayer(Player player, int? version = null) ListPool.Shared.Return(playerSettings); } + /// + /// Reports issues with settings being registered. + /// + /// The to validate. + /// The to validate. + internal static void ReportSettingIssue(CustomSetting? setting, ServerSpecificSettingBase? settingBase) + { + if (settingBase == null && setting == null) + { + Logger.Error("[CustomSetting.TryValidateSetting] Failed to validate null setting! " + new StackTrace()); + return; + } + + int id = setting?.Id ?? settingBase!.SettingId; + string? sharedIdInfo = CustomSettings.FirstOrDefault(s => s.Id == id)?.GetType().FullName ?? ServerSpecificSettingsSync.DefinedSettings.FirstOrDefault(s => s.SettingId == id)?.Label; + if (sharedIdInfo != null) + { + Logger.Error($"[CustomSetting.TryValidateSetting] {setting?.GetType().FullName ?? settingBase?.Label ?? "UNKNOWN"} is being registered with a duplicate ID ({id}) shared by {sharedIdInfo} {new StackTrace()}"); + return; + } + } + /// /// Checks whether a is equal to . /// diff --git a/SecretAPI/Patches/Features/ReportDefinedSettingPatch.cs b/SecretAPI/Patches/Features/ReportDefinedSettingPatch.cs new file mode 100644 index 0000000..cfe6581 --- /dev/null +++ b/SecretAPI/Patches/Features/ReportDefinedSettingPatch.cs @@ -0,0 +1,19 @@ +namespace SecretAPI.Patches.Features; + +using HarmonyLib; +using SecretAPI.Attributes; +using SecretAPI.Features.UserSettings; +using UserSettings.ServerSpecific; + +/// +/// Logs issues with . +/// +[HarmonyPatchCategory(nameof(CustomSetting))] +[HarmonyPatch(typeof(ServerSpecificSettingsSync), nameof(ServerSpecificSettingsSync.DefinedSettings), MethodType.Setter)] +internal static class ReportDefinedSettingPatch +{ + private static void Postfix(ref ServerSpecificSettingBase[] value) + { + value.ForEach(setting => CustomSetting.ReportSettingIssue(null, setting)); + } +} \ No newline at end of file