1
0
Fork 0
forked from aly/qstbak
qstbak/SmartNav/SmartNav.Data/LgbZoneBoundarySource.cs
2026-08-17 20:27:25 +10:00

411 lines
16 KiB
C#

using System;
using System.Collections.Generic;
using System.Numerics;
using System.Runtime.CompilerServices;
using System.Threading;
using Dalamud.Plugin.Services;
using LLib.GameData;
using Lumina.Data.Files;
using Lumina.Data.Parsing.Layer;
using Lumina.Excel;
using Lumina.Excel.Sheets;
using Microsoft.Extensions.Logging;
using SmartNav.Model.Navigation;
namespace SmartNav.Data;
public sealed class LgbZoneBoundarySource : IZoneBoundarySource
{
private readonly IDataManager _dataManager;
private readonly ILogger<LgbZoneBoundarySource> _logger;
private readonly Lazy<IReadOnlyList<ZoneBoundary>> _boundaries;
public LgbZoneBoundarySource(IDataManager dataManager, ILogger<LgbZoneBoundarySource> logger)
{
_dataManager = dataManager;
_logger = logger;
_boundaries = new Lazy<IReadOnlyList<ZoneBoundary>>(Build, LazyThreadSafetyMode.ExecutionAndPublication);
}
public IReadOnlyList<ZoneBoundary> GetBoundaries()
{
return _boundaries.Value;
}
IReadOnlyList<ZoneBoundary> IZoneBoundarySource.GetBoundaries()
{
//ILSpy generated this explicit interface implementation from .override directive in GetBoundaries
return this.GetBoundaries();
}
[MethodImpl(MethodImplOptions.NoInlining)]
private IReadOnlyList<ZoneBoundary> Build()
{
try
{
(List<ExitRangeEntry> ExitRanges, Dictionary<(ushort TerritoryId, uint InstanceId), PopRangeEntry> PopRangeIndex) tuple = CollectLgbData();
List<ExitRangeEntry> item = tuple.ExitRanges;
Dictionary<(ushort, uint), PopRangeEntry> item2 = tuple.PopRangeIndex;
List<ZoneBoundary> list = ZoneBoundaryDerivation.Derive(item, item2, _logger);
ZoneBoundaryDerivation.ApplyOverrides(list, ZoneBoundaryOverrides.FlyingPairs, ZoneBoundaryOverrides.PositionOverrides, _logger);
_206C_200B_206A_202D_206B_206B_206B_202B_202C_202E_202D_206B_206B_202C_200E_202E_206A_202E_200D_206E_206E_206D_206A_206C_206A_202E_206B_202E_202B_206E_202C_200C_206B_202B_206F_206C_206C_202E_202C_206D_202E((ILogger)_logger, global::_003CModule_003E._206C_206C_200C_206D_206C_206F_202D_206B_206F_202C_200F_206A_200E_202A_202C_206F_200E_206A_200B_200F_202A_202C_206F_206A_200C_200D_200E_200E_202A_200C_206B_200E_206E_206C_200D_202B_206F_200C_202E_206E_202E<string>(-981985917), new object[2] { list.Count, item.Count });
return list;
}
catch (Exception ex)
{
_202A_200E_202B_202E_200D_200F_200E_206F_206A_206C_202C_202B_200B_200C_200E_206A_206A_200E_202C_206F_202D_200B_202D_206A_200C_206D_200B_206D_206D_202B_206E_206B_206F_200E_202B_202D_200E_206C_202C_202D_202E((ILogger)_logger, ex, global::_003CModule_003E._206C_200D_200D_206D_202E_200F_206A_206A_206D_202A_202D_200D_206F_206A_200F_206C_200F_202D_206B_202B_200B_202A_200B_202A_206A_206A_200D_206B_202E_206B_206F_206D_200E_202B_202C_202B_200B_202A_202C_206A_202E<string>(927516533), Array.Empty<object>());
return Array.Empty<ZoneBoundary>();
}
}
private (List<ExitRangeEntry> ExitRanges, Dictionary<(ushort TerritoryId, uint InstanceId), PopRangeEntry> PopRangeIndex) CollectLgbData()
{
List<ExitRangeEntry> list = new List<ExitRangeEntry>();
Dictionary<(ushort, uint), PopRangeEntry> dictionary = new Dictionary<(ushort, uint), PopRangeEntry>();
HashSet<uint> hashSet = new HashSet<uint>();
using (ExcelSheet<Aetheryte>.Enumerator enumerator = _dataManager.GetExcelSheet<Aetheryte>().GetEnumerator())
{
int num = 1763362761;
while (true)
{
int num2 = num;
int num3 = 1763362761;
int num4 = num2;
switch ((num4 | num3) - (num4 & num3))
{
case 3:
num = 1763362761;
break;
case 0:
num = (enumerator.MoveNext() ? 1763362760 : 1763362763);
break;
case 1:
hashSet.Add(enumerator.Current.Territory.RowId);
num = 1763362761;
break;
case 2:
goto end_IL_003b;
}
continue;
end_IL_003b:
break;
}
}
ExcelSheet<TerritoryType> excelSheet = _dataManager.GetExcelSheet<TerritoryType>();
HashSet<string> visitedLgbPaths = new HashSet<string>();
using (ExcelSheet<TerritoryType>.Enumerator enumerator2 = excelSheet.GetEnumerator())
{
int num = -1445218693;
TerritoryType current = default(TerritoryType);
while (true)
{
int num5 = num;
int num3 = -1445218689;
int num4 = num5;
int num6 = num4 + num3;
int num7 = num4 & num3;
switch (num6 - (num7 + num7))
{
case 3:
num = -1445218693;
break;
case 1:
current = enumerator2.Current;
num = ((!hashSet.Contains(current.RowId)) ? (-1445218693) : (-1445218691));
break;
case 2:
ScanTerritory(list, dictionary, visitedLgbPaths, current);
num = -1445218693;
break;
case 4:
num = (enumerator2.MoveNext() ? (-1445218690) : (-1445218689));
break;
case 0:
goto end_IL_010c;
}
continue;
end_IL_010c:
break;
}
}
using (ExcelSheet<TerritoryType>.Enumerator enumerator2 = excelSheet.GetEnumerator())
{
int num = -1007277372;
while (true)
{
int num8 = num;
int num3 = -1007277372;
int num4 = num8;
int num9 = num4 + num3;
int num10 = num4 & num3;
switch (num9 - (num10 + num10))
{
case 2:
num = -1007277372;
break;
case 1:
{
TerritoryType current2 = enumerator2.Current;
ScanTerritory(list, dictionary, visitedLgbPaths, current2);
num = -1007277372;
break;
}
case 0:
num = (enumerator2.MoveNext() ? (-1007277371) : (-1007277369));
break;
case 3:
goto end_IL_01e4;
}
continue;
end_IL_01e4:
break;
}
}
return (ExitRanges: list, PopRangeIndex: dictionary);
}
private static bool IsNavigableOverworld(ETerritoryIntendedUse use)
{
int num = ((use > ETerritoryIntendedUse.HousingOutdoor) ? (-754120289) : (-754120291));
bool result = default(bool);
while (true)
{
int num2 = num;
int num3 = -754120292;
int num4 = num2;
switch ((num4 | num3) - (num4 & num3))
{
case 5:
num = ((use == ETerritoryIntendedUse.Eureka) ? (-754120298) : (-754120294));
break;
case 12:
num = ((use - 21 <= ETerritoryIntendedUse.Inn) ? (-754120298) : (-754120295));
break;
case 11:
num = ((use - 60 > ETerritoryIntendedUse.Overworld) ? (-754120300) : (-754120298));
break;
case 0:
num = -754120291;
break;
case 6:
num = -754120300;
break;
case 3:
num = ((use > ETerritoryIntendedUse.Eureka) ? (-754120290) : (-754120304));
break;
case 1:
num = ((use <= ETerritoryIntendedUse.Overworld) ? (-754120298) : (-754120303));
break;
case 8:
result = false;
num = -754120296;
break;
case 10:
result = true;
num = -754120296;
break;
case 9:
num = ((use == ETerritoryIntendedUse.HousingOutdoor) ? (-754120298) : (-754120293));
break;
case 13:
num = ((use == ETerritoryIntendedUse.OpeningArea) ? (-754120298) : (-754120299));
break;
case 4:
return result;
case 2:
num = ((use - 48 <= ETerritoryIntendedUse.Overworld) ? (-754120298) : (-754120297));
break;
case 7:
num = -754120300;
break;
}
}
}
[MethodImpl(MethodImplOptions.NoInlining)]
private void ScanTerritory(List<ExitRangeEntry> exitRanges, Dictionary<(ushort TerritoryId, uint InstanceId), PopRangeEntry> popRangeIndex, HashSet<string> visitedLgbPaths, TerritoryType territory)
{
int num = ((territory.RowId != 0) ? 954333098 : 954333094);
string text4 = default(string);
int num16 = default(int);
string text = default(string);
int num9 = default(int);
LayerCommon.InstanceObject instanceObject = default(LayerCommon.InstanceObject);
int num11 = default(int);
LayerCommon.Layer[] array = default(LayerCommon.Layer[]);
LayerCommon.InstanceObject[] instanceObjects = default(LayerCommon.InstanceObject[]);
while (true)
{
int num2 = num;
int num3 = 954333091;
int num4 = num2;
int num5 = num4 + num3;
int num6 = num4 & num3;
switch (num5 - (num6 + num6))
{
case 0:
num = 954333094;
break;
case 5:
return;
case 4:
{
string text2 = global::_003CModule_003E._202E_200F_206C_202A_202D_200C_200C_200B_202B_200E_202C_202C_202D_206B_202E_206A_200D_206F_206F_200B_206F_206B_202E_206D_202C_202B_200B_206B_200E_202E_200D_200D_202A_206B_206C_202D_206B_202C_200B_200E_202E<string>(-747831667);
string text3 = text4;
int num15 = num16;
num3 = 1;
num4 = num15;
text = _206A_206C_202B_202E_200D_200B_206E_206D_206D_206E_200B_202A_200F_202C_202B_200F_202D_200F_200D_202A_206E_200B_200E_202A_202E_206C_206E_202C_200D_200F_200E_206F_200E_202A_206E_206B_206F_200B_200C_206D_202E(text2, _200F_200B_206F_202B_202D_206F_200D_202C_206F_206C_206E_202E_202D_206E_206B_206C_202E_202D_206E_202E_206D_200B_202D_200D_202A_202D_206C_200C_206B_206B_200C_200B_200F_200D_200C_206B_206B_206A_206B_200C_202E(text3, 0, (num4 | num3) + (num4 & num3)), global::_003CModule_003E._200B_200C_206E_200D_206E_206D_200D_206D_206B_206F_202C_206B_206D_202D_206D_206D_202D_202E_200B_200E_206D_206A_206F_202A_202A_200F_206F_202E_206F_206A_206C_206F_202B_202B_206C_200E_200E_200D_206E_206D_202E<string>(-1939239349));
num = (visitedLgbPaths.Add(text) ? 954333092 : 954333089);
break;
}
case 1:
num16 = _202A_206F_200D_202A_202C_206A_200C_202A_206C_206A_206F_200E_206D_206F_206C_200D_200B_202E_206F_202E_200E_206B_200C_206D_202A_202E_206E_200C_206E_206A_202B_206F_200F_206C_206A_200B_206B_202B_202E_200D_202E(text4, global::_003CModule_003E._202E_200F_206C_202A_202D_200C_200C_200B_202B_200E_202C_202C_202D_206B_202E_206A_200D_206F_206F_200B_206F_206B_202E_206D_202C_202B_200B_206B_200E_202E_200D_200D_202A_206B_206C_202D_206B_202C_200B_200E_202E<string>(16137996), StringComparison.Ordinal);
num = ((num16 >= 0) ? 954333095 : 954333099);
break;
case 9:
num = (IsNavigableOverworld((ETerritoryIntendedUse)territory.TerritoryIntendedUse.RowId) ? 954333093 : 954333088);
break;
case 8:
return;
case 10:
return;
case 3:
return;
case 2:
return;
case 6:
text4 = territory.Bg.ExtractText();
num = ((!_206E_206A_200C_200E_202E_202D_202C_200B_206E_206A_200F_206E_202C_206F_200D_200C_200D_200D_202E_206C_206D_202E_206F_206E_200D_202E_206A_206A_200E_206B_200C_202C_202B_200F_206D_200C_202E_206F_202A_206C_202E(text4)) ? 954333090 : 954333097);
break;
case 7:
{
ushort num7 = (ushort)territory.RowId;
LgbFile file;
try
{
file = _dataManager.GetFile<LgbFile>(text);
}
catch (Exception ex)
{
_206D_206B_200C_200C_200E_200F_202D_206E_200E_206C_206A_200C_200E_202E_202A_200B_206C_206B_206F_200D_202A_202B_206A_200C_202C_202D_200B_202A_202E_206F_206D_202A_206C_200D_200F_200B_200E_206F_206E_206B_202E((ILogger)_logger, ex, global::_003CModule_003E._206C_206C_200C_206D_206C_206F_202D_206B_206F_202C_200F_206A_200E_202A_202C_206F_200E_206A_200B_200F_202A_202C_206F_206A_200C_200D_200E_200E_202A_200C_206B_200E_206E_206C_200D_202B_206F_200C_202E_206E_202E<string>(422414557), new object[1] { text });
return;
}
num = ((file != null) ? (-1034574211) : (-1034574214));
while (true)
{
int num8 = num;
num3 = -1034574218;
num4 = num8;
switch ((num4 | num3) - (num4 & num3))
{
case 6:
{
int num12 = num9;
num3 = 1;
num4 = num12;
int num13 = num4 ^ num3;
int num14 = num4 & num3;
num9 = num13 + (num14 + num14);
num = -1034574220;
break;
}
case 0:
popRangeIndex[(num7, instanceObject.InstanceId)] = new PopRangeEntry(num7, instanceObject.InstanceId, new Vector3(instanceObject.Transform.Translation.X, instanceObject.Transform.Translation.Y, instanceObject.Transform.Translation.Z));
num = -1034574224;
break;
case 9:
num = ((num11 < array.Length) ? (-1034574210) : (-1034574219));
break;
case 11:
array = _206B_202A_206C_200B_200F_202D_200C_202D_206C_206E_206C_206E_202E_200B_202D_202C_206F_206F_202B_200E_202A_200C_202E_206E_206D_206E_202B_206E_200F_206F_200F_200E_206F_202D_202C_206E_200D_200F_202A_200E_202E(file);
num11 = 0;
num = -1034574209;
break;
case 12:
return;
case 8:
instanceObjects = array[num11].InstanceObjects;
num9 = 0;
num = -1034574220;
break;
case 7:
{
int num10 = num11;
num3 = 1;
num4 = num10;
num11 = (num4 | num3) + (num4 & num3);
num = -1034574209;
break;
}
case 3:
return;
case 10:
num = -1034574214;
break;
case 2:
num = ((num9 < instanceObjects.Length) ? (-1034574222) : (-1034574223));
break;
case 1:
{
LayerCommon.ExitRangeInstanceObject exitRangeInstanceObject = (LayerCommon.ExitRangeInstanceObject)(object)instanceObject.Object;
exitRanges.Add(new ExitRangeEntry(num7, instanceObject.InstanceId, new Vector3(instanceObject.Transform.Translation.X, instanceObject.Transform.Translation.Y, instanceObject.Transform.Translation.Z), exitRangeInstanceObject.TerritoryType, exitRangeInstanceObject.DestInstanceId, exitRangeInstanceObject.ReturnInstanceId, new Vector3(instanceObject.Transform.Rotation.X, instanceObject.Transform.Rotation.Y, instanceObject.Transform.Rotation.Z), new Vector3(instanceObject.Transform.Scale.X, instanceObject.Transform.Scale.Y, instanceObject.Transform.Scale.Z)));
num = -1034574224;
break;
}
case 5:
num = ((instanceObject.AssetType != LayerEntryType.PopRange) ? (-1034574224) : (-1034574218));
break;
case 4:
instanceObject = instanceObjects[num9];
num = ((instanceObject.AssetType != LayerEntryType.ExitRange) ? (-1034574221) : (-1034574217));
break;
}
}
}
}
}
}
static void _206C_200B_206A_202D_206B_206B_206B_202B_202C_202E_202D_206B_206B_202C_200E_202E_206A_202E_200D_206E_206E_206D_206A_206C_206A_202E_206B_202E_202B_206E_202C_200C_206B_202B_206F_206C_206C_202E_202C_206D_202E(ILogger P_0, string P_1, object[] P_2)
{
P_0.LogDebug(P_1, P_2);
}
static void _202A_200E_202B_202E_200D_200F_200E_206F_206A_206C_202C_202B_200B_200C_200E_206A_206A_200E_202C_206F_202D_200B_202D_206A_200C_206D_200B_206D_206D_202B_206E_206B_206F_200E_202B_202D_200E_206C_202C_202D_202E(ILogger P_0, Exception P_1, string P_2, object[] P_3)
{
P_0.LogError(P_1, P_2, P_3);
}
static bool _206E_206A_200C_200E_202E_202D_202C_200B_206E_206A_200F_206E_202C_206F_200D_200C_200D_200D_202E_206C_206D_202E_206F_206E_200D_202E_206A_206A_200E_206B_200C_202C_202B_200F_206D_200C_202E_206F_202A_206C_202E(string P_0)
{
return string.IsNullOrEmpty(P_0);
}
static int _202A_206F_200D_202A_202C_206A_200C_202A_206C_206A_206F_200E_206D_206F_206C_200D_200B_202E_206F_202E_200E_206B_200C_206D_202A_202E_206E_200C_206E_206A_202B_206F_200F_206C_206A_200B_206B_202B_202E_200D_202E(string P_0, string P_1, StringComparison P_2)
{
return P_0.IndexOf(P_1, P_2);
}
static string _200F_200B_206F_202B_202D_206F_200D_202C_206F_206C_206E_202E_202D_206E_206B_206C_202E_202D_206E_202E_206D_200B_202D_200D_202A_202D_206C_200C_206B_206B_200C_200B_200F_200D_200C_206B_206B_206A_206B_200C_202E(string P_0, int P_1, int P_2)
{
return P_0.Substring(P_1, P_2);
}
static string _206A_206C_202B_202E_200D_200B_206E_206D_206D_206E_200B_202A_200F_202C_202B_200F_202D_200F_200D_202A_206E_200B_200E_202A_202E_206C_206E_202C_200D_200F_200E_206F_200E_202A_206E_206B_206F_200B_200C_206D_202E(string P_0, string P_1, string P_2)
{
return P_0 + P_1 + P_2;
}
static void _206D_206B_200C_200C_200E_200F_202D_206E_200E_206C_206A_200C_200E_202E_202A_200B_206C_206B_206F_200D_202A_202B_206A_200C_202C_202D_200B_202A_202E_206F_206D_202A_206C_200D_200F_200B_200E_206F_206E_206B_202E(ILogger P_0, Exception P_1, string P_2, object[] P_3)
{
P_0.LogTrace(P_1, P_2, P_3);
}
static LayerCommon.Layer[] _206B_202A_206C_200B_200F_202D_200C_202D_206C_206E_206C_206E_202E_200B_202D_202C_206F_206F_202B_200E_202A_200C_202E_206E_206D_206E_202B_206E_200F_206F_200F_200E_206F_202D_202C_206E_200D_200F_202A_200E_202E(LgbFile P_0)
{
return P_0.Layers;
}
}