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 _logger; private readonly Lazy> _boundaries; public LgbZoneBoundarySource(IDataManager dataManager, ILogger logger) { _dataManager = dataManager; _logger = logger; _boundaries = new Lazy>(Build, LazyThreadSafetyMode.ExecutionAndPublication); } public IReadOnlyList GetBoundaries() { return _boundaries.Value; } IReadOnlyList IZoneBoundarySource.GetBoundaries() { //ILSpy generated this explicit interface implementation from .override directive in GetBoundaries return this.GetBoundaries(); } [MethodImpl(MethodImplOptions.NoInlining)] private IReadOnlyList Build() { try { (List ExitRanges, Dictionary<(ushort TerritoryId, uint InstanceId), PopRangeEntry> PopRangeIndex) tuple = CollectLgbData(); List item = tuple.ExitRanges; Dictionary<(ushort, uint), PopRangeEntry> item2 = tuple.PopRangeIndex; List 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(-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(927516533), Array.Empty()); return Array.Empty(); } } private (List ExitRanges, Dictionary<(ushort TerritoryId, uint InstanceId), PopRangeEntry> PopRangeIndex) CollectLgbData() { List list = new List(); Dictionary<(ushort, uint), PopRangeEntry> dictionary = new Dictionary<(ushort, uint), PopRangeEntry>(); HashSet hashSet = new HashSet(); using (ExcelSheet.Enumerator enumerator = _dataManager.GetExcelSheet().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 excelSheet = _dataManager.GetExcelSheet(); HashSet visitedLgbPaths = new HashSet(); using (ExcelSheet.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.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 exitRanges, Dictionary<(ushort TerritoryId, uint InstanceId), PopRangeEntry> popRangeIndex, HashSet 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(-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(-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(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(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(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; } }