diff --git a/Projects/Server/Serialization/GenericEntityPersistence.cs b/Projects/Server/Serialization/GenericEntityPersistence.cs index e9ef932c1..12e929711 100644 --- a/Projects/Server/Serialization/GenericEntityPersistence.cs +++ b/Projects/Server/Serialization/GenericEntityPersistence.cs @@ -176,12 +176,12 @@ public class GenericEntityPersistence : GenericPersistence, IGenericEntityPer /** * Legacy ReadTypes for backward compatibility with old saves that still have a tdb file */ - private unsafe Dictionary ReadTypes(string savePath) + private unsafe Dictionary ReadTypes(string savePath) { string typesPath = Path.Combine(savePath, Name, $"{Name}.tdb"); if (!File.Exists(typesPath)) { - return null; + return []; } Type[] ctorArguments = [typeof(Serial)]; @@ -194,13 +194,13 @@ public class GenericEntityPersistence : GenericPersistence, IGenericEntityPer var dataReader = new UnmanagedDataReader(ptr, accessor.Length); var count = dataReader.ReadInt(); - var types = new Dictionary(count); + var types = new Dictionary(count); for (var i = 0; i < count; ++i) { // Legacy didn't have the null flag check var typeName = dataReader.ReadStringRaw(); - types.Add(i, GetConstructorFor(typeName, AssemblyHandler.FindTypeByName(typeName), ctorArguments)); + types.Add((ulong)i, GetConstructorFor(typeName, AssemblyHandler.FindTypeByName(typeName), ctorArguments)); } accessor.SafeMemoryMappedViewHandle.ReleasePointer(); @@ -258,14 +258,9 @@ public class GenericEntityPersistence : GenericPersistence, IGenericEntityPer var version = dataReader.ReadInt(); - Dictionary ctors = []; + var ctors = version < 2 ? ReadTypes(Path.GetDirectoryName(filePath)) : []; - if (version < 2) - { - ctors = ReadTypes(Path.GetDirectoryName(filePath)); - } - - if (typesDb == null && ctors == null) + if (typesDb == null && ctors.Count == 0) { return; } @@ -278,7 +273,7 @@ public class GenericEntityPersistence : GenericPersistence, IGenericEntityPer for (var i = 0; i < count; ++i) { - ConstructorInfo ctor; + ulong hash; // Version 2 & 3 with SerializedTypes.db if (version >= 2) { @@ -288,13 +283,16 @@ public class GenericEntityPersistence : GenericPersistence, IGenericEntityPer throw new Exception($"Invalid type flag, expected 2 but received {flag}."); } - var hash = dataReader.ReadULong(); - typesDb!.TryGetValue(hash, out var typeName); - ctor = GetConstructorFor(typeName, AssemblyHandler.FindTypeByHash(hash), ctorArguments); + hash = dataReader.ReadULong(); } else { - ctor = ctors?[dataReader.ReadInt()]; + hash = (ulong)dataReader.ReadInt(); // Legacy RunUO tdb index + } + + if (!ctors.TryGetValue(hash, out var ctor) && typesDb?.TryGetValue(hash, out var typeName) == true) + { + ctors[hash] = ctor = GetConstructorFor(typeName, AssemblyHandler.FindTypeByHash(hash), ctorArguments); } Serial serial = (Serial)dataReader.ReadUInt();