250 lines
9.2 KiB
C#
250 lines
9.2 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Numerics;
|
|
using System.Runtime.CompilerServices;
|
|
using System.Threading;
|
|
using Dalamud.Plugin.Services;
|
|
using LLib.Shop;
|
|
using Lumina.Excel;
|
|
using Lumina.Excel.Sheets;
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
namespace Questionable.Data;
|
|
|
|
internal sealed class MenderDataService(IDataManager dataManager, NpcPositionCache npcPositionCache, ILogger<MenderDataService> logger)
|
|
{
|
|
public static readonly IReadOnlyList<MenderNpc> CityFallbacks = new global::_003C_003Ez__ReadOnlyArray<MenderNpc>(new MenderNpc[3]
|
|
{
|
|
new MenderNpc(1003251u, 128, new Vector3(17.715698f, 40.200005f, 3.9520264f)),
|
|
new MenderNpc(1000394u, 132, new Vector3(24.826416f, -8f, 93.18677f)),
|
|
new MenderNpc(1004416u, 130, new Vector3(32.85266f, 6.999999f, -81.31531f))
|
|
});
|
|
|
|
private readonly object _lock = _202D_200B_206C_206F_206B_202D_202D_200C_206E_200B_202C_202E_202B_202B_202E_202B_206C_200E_200F_200D_202D_200F_206F_202D_200B_206D_200C_202D_206C_202D_200E_206C_200E_202E_206B_206D_202A_202A_206B_202D_202E();
|
|
|
|
private ILookup<ushort, MenderNpc>? _byTerritory;
|
|
|
|
public MenderNpc? FindNearestInTerritory(ushort territoryId, Vector3 nearPosition)
|
|
{
|
|
object obj = _lock;
|
|
bool flag = false;
|
|
ILookup<ushort, MenderNpc> lookup;
|
|
try
|
|
{
|
|
_206B_206E_200F_206B_206C_202D_202D_200F_200D_200D_202E_200B_202A_206C_202C_206F_202A_200F_206C_202E_202C_206E_200F_206C_200E_206F_202E_200F_202E_206E_200B_200E_202E_206D_202D_202B_200B_200E_206A_206D_202E(obj, ref flag);
|
|
int num = ((_byTerritory != null) ? 669180943 : 669180941);
|
|
while (true)
|
|
{
|
|
int num2 = num;
|
|
int num3 = 669180942;
|
|
int num4 = num2;
|
|
int num5 = num4 + num3;
|
|
int num6 = num4 & num3;
|
|
switch (num5 - (num6 + num6))
|
|
{
|
|
case 0:
|
|
num = 669180941;
|
|
break;
|
|
case 2:
|
|
return null;
|
|
case 3:
|
|
num = (_206C_206D_206D_202A_206C_206A_206F_202C_200B_202E_206D_200C_206F_202A_200C_202D_202D_202E_206E_200C_202D_206B_200D_202D_200F_202C_200B_206D_200C_206A_206B_202D_202D_200E_206B_202E_202B_206B_206B_206C_202E(npcPositionCache) ? 669180943 : 669180940);
|
|
break;
|
|
case 1:
|
|
lookup = _byTerritory ?? (_byTerritory = BuildIndex());
|
|
goto end_IL_0041;
|
|
}
|
|
continue;
|
|
end_IL_0041:
|
|
break;
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
int num = ((!flag) ? 242402811 : 242402808);
|
|
while (true)
|
|
{
|
|
int num7 = num;
|
|
int num3 = 242402810;
|
|
int num4 = num7;
|
|
switch ((num4 | num3) - (num4 & num3))
|
|
{
|
|
case 0:
|
|
num = 242402808;
|
|
break;
|
|
case 2:
|
|
_206A_202A_206B_200D_200F_206D_200B_202A_200E_206C_202B_200D_200E_202B_206D_200D_202D_200C_206C_200F_206F_206A_206A_206C_200C_206C_206B_200C_206A_202B_206A_202D_206A_206E_206C_206D_200F_206D_200B_206B_202E(obj);
|
|
num = 242402811;
|
|
break;
|
|
case 1:
|
|
goto end_IL_00fd;
|
|
}
|
|
continue;
|
|
end_IL_00fd:
|
|
break;
|
|
}
|
|
}
|
|
return lookup[territoryId].OrderBy((MenderNpc x) => Vector3.DistanceSquared(x.Position, nearPosition)).FirstOrDefault();
|
|
}
|
|
|
|
[MethodImpl(MethodImplOptions.NoInlining)]
|
|
private ILookup<ushort, MenderNpc> BuildIndex()
|
|
{
|
|
ExcelSheet<ENpcBase> excelSheet = dataManager.GetExcelSheet<ENpcBase>();
|
|
List<MenderNpc> list = new List<MenderNpc>();
|
|
IEnumerator<uint> enumerator = _200C_206D_202E_200C_202C_206C_200E_206C_206B_202C_200B_202B_206A_202C_206B_206E_202E_200E_202C_202D_202E_202B_206A_202D_200E_206C_206D_200C_202B_202C_202A_206B_200E_206E_200C_206C_200C_206A_206A_202E_202E(npcPositionCache).GetEnumerator();
|
|
try
|
|
{
|
|
int num = -898238961;
|
|
bool flag = default(bool);
|
|
int num5 = default(int);
|
|
(ushort, Vector3)? tuple = default((ushort, Vector3)?);
|
|
uint current = default(uint);
|
|
ENpcBase row = default(ENpcBase);
|
|
while (true)
|
|
{
|
|
int num2 = num;
|
|
int num3 = -898238961;
|
|
int num4 = num2;
|
|
switch ((num4 | num3) - (num4 & num3))
|
|
{
|
|
case 5:
|
|
flag = false;
|
|
num5 = 0;
|
|
num = -898238963;
|
|
break;
|
|
case 8:
|
|
tuple = _202E_202B_206D_200C_200B_200E_206F_200C_202B_202D_206A_206A_206A_206D_206B_200D_206B_206F_206A_206C_200E_206C_200F_202E_202B_206A_200B_206E_200D_206D_206F_206D_206E_206E_206A_206D_200E_200E_206B_206D_202E(npcPositionCache, current);
|
|
num = ((!tuple.HasValue) ? (-898238961) : (-898238971));
|
|
break;
|
|
case 3:
|
|
num = -898238961;
|
|
break;
|
|
case 9:
|
|
{
|
|
int num6 = num5;
|
|
num3 = 1;
|
|
num4 = num6;
|
|
int num7 = num4 ^ num3;
|
|
int num8 = num4 & num3;
|
|
num5 = num7 + (num8 + num8);
|
|
num = -898238963;
|
|
break;
|
|
}
|
|
case 1:
|
|
flag = true;
|
|
num = -898238967;
|
|
break;
|
|
case 0:
|
|
num = (_202D_202D_200C_200B_202B_206B_206E_206E_202B_206B_206D_206D_202A_206F_202C_200F_202E_206B_202A_206E_206A_200E_206F_200B_206B_200B_202A_200C_202E_200E_202C_206A_206F_206F_200D_206D_200B_200E_200C_202D_202E((IEnumerator)enumerator) ? (-898238965) : (-898238972));
|
|
break;
|
|
case 4:
|
|
current = enumerator.Current;
|
|
num = ((!excelSheet.TryGetRow(current, out row)) ? (-898238961) : (-898238966));
|
|
break;
|
|
case 2:
|
|
num = ((num5 < row.ENpcData.Count) ? (-898238968) : (-898238967));
|
|
break;
|
|
case 6:
|
|
num = ((!flag) ? (-898238961) : (-898238969));
|
|
break;
|
|
case 7:
|
|
num = ((row.ENpcData[num5].RowId != 720915) ? (-898238970) : (-898238962));
|
|
break;
|
|
case 10:
|
|
{
|
|
(ushort, Vector3) valueOrDefault = tuple.GetValueOrDefault();
|
|
list.Add(new MenderNpc(current, valueOrDefault.Item1, valueOrDefault.Item2));
|
|
num = -898238961;
|
|
break;
|
|
}
|
|
case 11:
|
|
goto end_IL_0039;
|
|
}
|
|
continue;
|
|
end_IL_0039:
|
|
break;
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
int num = ((enumerator == null) ? (-506737452) : (-506737451));
|
|
while (true)
|
|
{
|
|
int num9 = num;
|
|
int num3 = -506737452;
|
|
int num4 = num9;
|
|
int num10 = num4 + num3;
|
|
int num11 = num4 & num3;
|
|
switch (num10 - (num11 + num11))
|
|
{
|
|
case 2:
|
|
num = -506737451;
|
|
break;
|
|
case 0:
|
|
goto end_IL_023b;
|
|
case 1:
|
|
_206F_206B_206A_202C_200F_200D_206D_200B_202B_206A_202E_202E_200E_200C_200F_206C_202E_202E_206A_202B_200E_206A_206D_202E_206C_202A_206B_200D_202C_206B_202C_202C_202C_200D_206E_202B_202E_200E_206F_206B_202E((IDisposable)enumerator);
|
|
num = -506737452;
|
|
break;
|
|
}
|
|
continue;
|
|
end_IL_023b:
|
|
break;
|
|
}
|
|
}
|
|
_206D_206B_200C_206E_202E_200B_206B_202C_206A_202A_202E_200C_206A_200E_206C_202A_200B_206C_202B_202B_206C_206D_202D_206A_202D_206D_202B_206E_200B_206B_200B_206A_206D_200B_206C_206D_206A_200E_202B_206B_202E((ILogger)logger, global::_003CModule_003E._202E_206C_200F_206B_206A_202A_202C_206F_200C_206C_202B_206B_206D_206D_206D_202D_206E_202E_206C_206E_206D_202C_206F_200D_202D_202E_206A_206D_202A_206A_202B_200D_200C_206D_202B_200B_200D_200C_206E_206B_202E<string>(1337223984), new object[2]
|
|
{
|
|
list.Count,
|
|
list.Select((MenderNpc x) => x.TerritoryId).Distinct().Count()
|
|
});
|
|
return list.ToLookup((MenderNpc x) => x.TerritoryId);
|
|
}
|
|
|
|
static object _202D_200B_206C_206F_206B_202D_202D_200C_206E_200B_202C_202E_202B_202B_202E_202B_206C_200E_200F_200D_202D_200F_206F_202D_200B_206D_200C_202D_206C_202D_200E_206C_200E_202E_206B_206D_202A_202A_206B_202D_202E()
|
|
{
|
|
return new object();
|
|
}
|
|
|
|
static void _206B_206E_200F_206B_206C_202D_202D_200F_200D_200D_202E_200B_202A_206C_202C_206F_202A_200F_206C_202E_202C_206E_200F_206C_200E_206F_202E_200F_202E_206E_200B_200E_202E_206D_202D_202B_200B_200E_206A_206D_202E(object P_0, ref bool P_1)
|
|
{
|
|
Monitor.Enter(P_0, ref P_1);
|
|
}
|
|
|
|
static bool _206C_206D_206D_202A_206C_206A_206F_202C_200B_202E_206D_200C_206F_202A_200C_202D_202D_202E_206E_200C_202D_206B_200D_202D_200F_202C_200B_206D_200C_206A_206B_202D_202D_200E_206B_202E_202B_206B_206B_206C_202E(NpcPositionCache P_0)
|
|
{
|
|
return P_0.IsBuilt;
|
|
}
|
|
|
|
static void _206A_202A_206B_200D_200F_206D_200B_202A_200E_206C_202B_200D_200E_202B_206D_200D_202D_200C_206C_200F_206F_206A_206A_206C_200C_206C_206B_200C_206A_202B_206A_202D_206A_206E_206C_206D_200F_206D_200B_206B_202E(object P_0)
|
|
{
|
|
Monitor.Exit(P_0);
|
|
}
|
|
|
|
static IReadOnlyCollection<uint> _200C_206D_202E_200C_202C_206C_200E_206C_206B_202C_200B_202B_206A_202C_206B_206E_202E_200E_202C_202D_202E_202B_206A_202D_200E_206C_206D_200C_202B_202C_202A_206B_200E_206E_200C_206C_200C_206A_206A_202E_202E(NpcPositionCache P_0)
|
|
{
|
|
return P_0.GetAllNpcIds();
|
|
}
|
|
|
|
static (ushort, Vector3)? _202E_202B_206D_200C_200B_200E_206F_200C_202B_202D_206A_206A_206A_206D_206B_200D_206B_206F_206A_206C_200E_206C_200F_202E_202B_206A_200B_206E_200D_206D_206F_206D_206E_206E_206A_206D_200E_200E_206B_206D_202E(NpcPositionCache P_0, uint P_1)
|
|
{
|
|
return P_0.GetPosition(P_1);
|
|
}
|
|
|
|
static bool _202D_202D_200C_200B_202B_206B_206E_206E_202B_206B_206D_206D_202A_206F_202C_200F_202E_206B_202A_206E_206A_200E_206F_200B_206B_200B_202A_200C_202E_200E_202C_206A_206F_206F_200D_206D_200B_200E_200C_202D_202E(IEnumerator P_0)
|
|
{
|
|
return P_0.MoveNext();
|
|
}
|
|
|
|
static void _206F_206B_206A_202C_200F_200D_206D_200B_202B_206A_202E_202E_200E_200C_200F_206C_202E_202E_206A_202B_200E_206A_206D_202E_206C_202A_206B_200D_202C_206B_202C_202C_202C_200D_206E_202B_202E_200E_206F_206B_202E(IDisposable P_0)
|
|
{
|
|
P_0.Dispose();
|
|
}
|
|
|
|
static void _206D_206B_200C_206E_202E_200B_206B_202C_206A_202A_202E_200C_206A_200E_206C_202A_200B_206C_202B_202B_206C_206D_202D_206A_202D_206D_202B_206E_200B_206B_200B_206A_206D_200B_206C_206D_206A_200E_202B_206B_202E(ILogger P_0, string P_1, object[] P_2)
|
|
{
|
|
P_0.LogDebug(P_1, P_2);
|
|
}
|
|
}
|