diff --git a/Projects/Server/Serialization/GenericPersistence.cs b/Projects/Server/Serialization/GenericPersistence.cs index cd013b1a9..724f3a60f 100644 --- a/Projects/Server/Serialization/GenericPersistence.cs +++ b/Projects/Server/Serialization/GenericPersistence.cs @@ -78,7 +78,7 @@ namespace Server } } - Persistence.Register(Serialize, WriterSnapshot, Deserialize, priority); + Persistence.Register(name, Serialize, WriterSnapshot, Deserialize, priority); } } } diff --git a/Projects/Server/Serialization/Persistence.cs b/Projects/Server/Serialization/Persistence.cs index 9c93638c7..86b5e3e13 100644 --- a/Projects/Server/Serialization/Persistence.cs +++ b/Projects/Server/Serialization/Persistence.cs @@ -25,9 +25,10 @@ namespace Server { public const int DefaultPriority = 100; - public static readonly SortedSet _registry = new(new RegistryEntryComparer()); + private static readonly SortedSet _registry = new(new RegistryEntryComparer()); public static void Register( + string name, Action serializer, Action snapshotWriter, Action deserializer, @@ -37,6 +38,7 @@ namespace Server _registry.Add( new RegistryEntry { + Name = name, Priority = priority, Serialize = serializer, WriteSnapshot = snapshotWriter, @@ -67,8 +69,9 @@ namespace Server } } - public class RegistryEntry + public record RegistryEntry { + public string Name { get; init; } public int Priority { get; init; } public Action Serialize { get; init; } // Serializing to memory buffers public Action WriteSnapshot { get; init; } @@ -77,8 +80,29 @@ namespace Server internal class RegistryEntryComparer : IComparer { - public int Compare(RegistryEntry x, RegistryEntry y) => - x?.Priority.CompareTo(y?.Priority) ?? 1; + public int Compare(RegistryEntry x, RegistryEntry y) + { + if (x == y) + { + return 0; + } + + if (x == null) + { + return 1; + } + + if (y == null) + { + return -1; + } + + // First sort by priority + var cmp = x.Priority.CompareTo(y.Priority); + + // Then alphabetically. We won't allow the same entry (by name) twice in the SortedSet + return cmp != 0 ? cmp : x.Name?.CompareOrdinal(y.Name) ?? -1; + } } [MethodImpl(MethodImplOptions.AggressiveInlining)] diff --git a/Projects/Server/World/World.cs b/Projects/Server/World/World.cs index 164d8fc3f..fb1adf203 100644 --- a/Projects/Server/World/World.cs +++ b/Projects/Server/World/World.cs @@ -141,7 +141,7 @@ namespace Server _savePath = Path.Combine(Core.BaseDirectory, savePath); // Mobiles & Items - Persistence.Register(SaveEntities, WriteEntities, LoadEntities, 1); + Persistence.Register("Mobiles & Items", SaveEntities, WriteEntities, LoadEntities, 1); } [MethodImpl(MethodImplOptions.AggressiveInlining)] diff --git a/Projects/UOContent/Accounting/Accounts.cs b/Projects/UOContent/Accounting/Accounts.cs index 0425b644c..6e479701e 100644 --- a/Projects/UOContent/Accounting/Accounts.cs +++ b/Projects/UOContent/Accounting/Accounts.cs @@ -38,7 +38,7 @@ namespace Server.Accounting public static int Count => _accountsByName.Count; public static void Configure() => - Persistence.Register(Serialize, WriteSnapshot, Deserialize); + Persistence.Register("Accounts", Serialize, WriteSnapshot, Deserialize); internal static void Serialize() => EntityPersistence.SaveEntities(_accountsById.Values, account => account.Serialize());