63 lines
1.6 KiB
C#
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;
|
|
}
|
|
}
|