diff --git a/Projects/Server/Regions/Region.cs b/Projects/Server/Regions/Region.cs index 85a1cb06c..f36b895cb 100644 --- a/Projects/Server/Regions/Region.cs +++ b/Projects/Server/Regions/Region.cs @@ -205,7 +205,7 @@ public class Region : IComparable public int Priority { get; } - public int ChildLevel { get; } + public int ChildLevel { get; internal set; } public bool Registered { get; private set; } diff --git a/Projects/Server/Regions/RegionJsonSerializer.cs b/Projects/Server/Regions/RegionJsonSerializer.cs index 1e03c9017..ab1312809 100644 --- a/Projects/Server/Regions/RegionJsonSerializer.cs +++ b/Projects/Server/Regions/RegionJsonSerializer.cs @@ -31,43 +31,50 @@ public static class RegionJsonSerializer private static JsonDerivedType[] _derivedTypes = { new(typeof(Region), nameof(Region)) }; + public static IJsonTypeInfoResolver RegionJsonTypeInfoResolver => new DefaultJsonTypeInfoResolver() + { + Modifiers = + { + static typeInfo => + { + if (typeInfo.Type != typeof(Region)) + { + return; + } + + typeInfo.PolymorphismOptions = new JsonPolymorphismOptions(); + for (var i = 0; i < _derivedTypes.Length; i++) + { + typeInfo.PolymorphismOptions.DerivedTypes.Add(_derivedTypes[i]); + } + }, + static typeInfo => + { + if (!typeInfo.Type.IsAssignableTo(typeof(Region))) + { + return; + } + + typeInfo.OnDeserialized = o => + { + if (o is Region region && Core.Expansion >= region.MinExpansion && Core.Expansion <= region.MaxExpansion) + { + // Set the child level since it is not part of the JSON data, and our constructor skips setting parent. + if (region.Parent != null) + { + region.ChildLevel = region.Parent.ChildLevel + 1; + } + region.Register(); + } + }; + } + } + }; + private static JsonSerializerOptions _options = new(JsonConfig.DefaultOptions) { DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingDefault, - TypeInfoResolver = new DefaultJsonTypeInfoResolver - { - Modifiers = - { - static typeInfo => - { - if (typeInfo.Type != typeof(Region)) - { - return; - } - - typeInfo.PolymorphismOptions = new JsonPolymorphismOptions(); - for (var i = 0; i < _derivedTypes.Length; i++) - { - typeInfo.PolymorphismOptions.DerivedTypes.Add(_derivedTypes[i]); - } - }, - static typeInfo => - { - if (!typeInfo.Type.IsAssignableTo(typeof(Region))) - { - return; - } - - typeInfo.OnDeserialized = o => - { - if (o is Region region && Core.Expansion >= region.MinExpansion && Core.Expansion <= region.MaxExpansion) - { - region.Register(); - } - }; - } - } - } + TypeInfoResolver = RegionJsonTypeInfoResolver, }; public static void Register() where TRegion : Region diff --git a/Projects/Server/Sector.cs b/Projects/Server/Sector.cs index be6b7de1f..474ca2928 100644 --- a/Projects/Server/Sector.cs +++ b/Projects/Server/Sector.cs @@ -125,6 +125,7 @@ public class Sector if (regRect.Region == region) { m_RegionRects.RemoveAt(i); + break; } }