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