1
0
Fork 0
forked from aly/qstbak
qstbak/SmartNav/SmartNav.Data/ZoneSubRegionService.cs
2026-08-17 20:29:32 +10:00

63 lines
1.6 KiB
C#

using System.Collections.Generic;
using Microsoft.Extensions.Logging;
using SmartNav.Model.Navigation;
namespace SmartNav.Data;
public sealed class ZoneSubRegionService
{
private readonly Dictionary<uint, TerritorySubRegions> _regions = new Dictionary<uint, TerritorySubRegions>();
public IReadOnlyDictionary<uint, TerritorySubRegions> AllRegions => _regions;
public ZoneSubRegionService(SmartNavDataOptions dataOptions, ILogger<ZoneSubRegionService> logger)
{
foreach (var (s, value) in AssemblyZoneSubRegionLoader.GetRegions(dataOptions.DevSourceDirectory?.FullName))
{
if (uint.TryParse(s, out var result))
{
_regions[result] = value;
}
}
logger.LogDebug("ZoneSubRegionService: {Count} territories with sub-regions loaded", _regions.Count);
}
public bool HasSubRegions(uint territoryId)
{
return _regions.ContainsKey(territoryId);
}
public string? GetSubRegionId(uint territoryId, float x, float y, float z)
{
if (!_regions.TryGetValue(territoryId, out TerritorySubRegions value))
{
return null;
}
foreach (SubRegionDefinition subRegion in value.SubRegions)
{
if (subRegion.Contains(x, y, z))
{
return subRegion.Id;
}
}
return "_default";
}
public IReadOnlyList<SubRegionDefinition>? GetSubRegions(uint territoryId)
{
if (!_regions.TryGetValue(territoryId, out TerritorySubRegions value))
{
return null;
}
return value.SubRegions;
}
public IReadOnlyList<SubRegionConnector>? GetConnectors(uint territoryId)
{
if (!_regions.TryGetValue(territoryId, out TerritorySubRegions value))
{
return null;
}
return value.Connectors;
}
}