diff --git a/AetheryteLinkInChat/AetheryteLinkInChat.cs b/AetheryteLinkInChat/AetheryteLinkInChat.cs index f8ae2df27..e782200ca 100644 --- a/AetheryteLinkInChat/AetheryteLinkInChat.cs +++ b/AetheryteLinkInChat/AetheryteLinkInChat.cs @@ -93,7 +93,7 @@ private void AppendNearestAetheryteLink(ref SeString message) solver.AppendGrandCompanyAetheryte(paths, (uint)Enum.GetValues()[Config.PreferredGrandCompanyAetheryte], message, - Dalamud.ClientState.LocalPlayer?.CurrentWorld.GameData, + Dalamud.ClientState.LocalPlayer?.CurrentWorld.Value, Dalamud.ClientState.TerritoryType); } @@ -109,7 +109,7 @@ private void AppendNearestAetheryteLink(ref SeString message) new UIForegroundPayload(069), ..SeString.TextArrowPayloads, aetheryteLinkPayload, - new TextPayload(aetheryte.Aetheryte.PlaceName.Value?.Name.RawString), + new TextPayload(aetheryte.Aetheryte.PlaceName.Value.Name.ExtractText()), new AetherytePayload(aetheryte.Aetheryte).ToRawPayload(), RawPayload.LinkTerminator, UIForegroundPayload.UIForegroundOff, @@ -119,14 +119,14 @@ private void AppendNearestAetheryteLink(ref SeString message) case AetheryteTeleportPath { Aetheryte.IsAetheryte: false } aetheryte: payloads.AddRange([ new IconPayload(BitmapFontIcon.Aethernet), - new TextPayload(aetheryte.Aetheryte.AethernetName.Value?.Name.RawString), + new TextPayload(aetheryte.Aetheryte.AethernetName.Value.Name.ExtractText()), ]); break; // マップ境界 case BoundaryTeleportPath boundary: payloads.AddRange([ new IconPayload(BitmapFontIcon.FlyZone), - new TextPayload(boundary.ConnectedMarker.PlaceNameSubtext.Value?.Name.RawString), + new TextPayload(boundary.ConnectedMarker.PlaceNameSubtext.Value.Name.ExtractText()), ]); break; // ワールド間テレポ @@ -135,13 +135,13 @@ private void AppendNearestAetheryteLink(ref SeString message) new IconPayload(BitmapFontIcon.Aetheryte), new UIForegroundPayload(069), aetheryteLinkPayload, - new TextPayload(world.Aetheryte.PlaceName.Value?.Name.RawString), + new TextPayload(world.Aetheryte.PlaceName.Value.Name.ExtractText()), new AetherytePayload(world.Aetheryte).ToRawPayload(), RawPayload.LinkTerminator, UIForegroundPayload.UIForegroundOff, new TextPayload($" {SeIconChar.ArrowRight.ToIconString()} "), new IconPayload(BitmapFontIcon.CrossWorld), - new TextPayload(world.World.Name.RawString), + new TextPayload(world.World.Name.ExtractText()), ]); break; } @@ -154,7 +154,7 @@ private void AppendNearestAetheryteLink(ref SeString message) if (Config.EnableLifestreamIntegration && teleporter.IsLifestreamAvailable()) { - var world = solver.DetectWorld(message, Dalamud.ClientState.LocalPlayer?.CurrentWorld.GameData); + var world = solver.DetectWorld(message, Dalamud.ClientState.LocalPlayer?.CurrentWorld.Value); payloads.AddRange([ new TextPayload(" ["), @@ -261,12 +261,12 @@ private void OnTeleportGcCommand(string command, string arguments) } var aetheryte = solver.GetAetheryteById(aetheryteId); - if (aetheryte == default) + if (!aetheryte.HasValue) { return; } - teleporter.TeleportToAetheryte(aetheryte); + teleporter.TeleportToAetheryte(aetheryte.Value); } protected override void ReleaseManaged() diff --git a/AetheryteLinkInChat/AetheryteLinkInChat.csproj b/AetheryteLinkInChat/AetheryteLinkInChat.csproj index 8ea894109..a00885bb2 100644 --- a/AetheryteLinkInChat/AetheryteLinkInChat.csproj +++ b/AetheryteLinkInChat/AetheryteLinkInChat.csproj @@ -26,7 +26,7 @@ False - + all diff --git a/AetheryteLinkInChat/AetheryteLinkInChat.json b/AetheryteLinkInChat/AetheryteLinkInChat.json index 4fb8a060d..8e9f09a8e 100644 --- a/AetheryteLinkInChat/AetheryteLinkInChat.json +++ b/AetheryteLinkInChat/AetheryteLinkInChat.json @@ -4,6 +4,5 @@ "Punchline": "Quick teleport for mob hunts and treasure hunts!", "Description": "Display a teleport link to the nearest aetherite for the map link from the in-game chat. Type /alic to configure the plugin.", "Tags": ["teleporter"], - "CategoryTags": ["utility"], - "DalamudApiLevel": 10 + "CategoryTags": ["utility"] } diff --git a/AetheryteLinkInChat/Config/PluginConfigWindow.cs b/AetheryteLinkInChat/Config/PluginConfigWindow.cs index 1d4795bd9..0f0a58f27 100644 --- a/AetheryteLinkInChat/Config/PluginConfigWindow.cs +++ b/AetheryteLinkInChat/Config/PluginConfigWindow.cs @@ -4,7 +4,7 @@ using System.Numerics; using Dalamud.Divination.Common.Api.Ui.Window; using ImGuiNET; -using Lumina.Excel.GeneratedSheets; +using Lumina.Excel.Sheets; namespace Divination.AetheryteLinkInChat.Config; @@ -25,9 +25,11 @@ public PluginConfigWindow() } grandCompanyAetheryteNames = Enum.GetValues() - .Select(x => sheet?.GetRow((uint)x)?.PlaceName.Value?.Name.RawString ?? Enum.GetName(x) ?? string.Empty) + .Select(x => sheet.HasRow((uint)x) ? + sheet.GetRow((uint)x).PlaceName.Value.Name.ExtractText() : + Enum.GetName(x) ?? string.Empty) .ToArray(); - aetherytes = sheet.Where(x => x.IsAetheryte && !x.Invisible && x.RowId != 1).ToImmutableList(); + aetherytes = sheet.Where(x => x is { IsAetheryte: true, Invisible: false } && x.RowId != 1).ToImmutableList(); } public override void Draw() @@ -128,8 +130,18 @@ private void DrawAetheryteListTab() ImGui.Text(aetheryte.RowId.ToString()); ImGui.TableNextColumn(); - var aetheryteName = aetheryte.PlaceName.Value?.Name.RawString ?? "???"; - var zoneName = aetheryte.Map.Value?.PlaceName.Value?.Name.RawString ?? "???"; + var aetheryteName = "???"; + var zoneName = "???"; + + if (aetheryte.PlaceName.IsValid) + { + aetheryteName = aetheryte.PlaceName.Value.Name.ExtractText(); + } + + if (aetheryte.Map is { IsValid: true, Value.PlaceName.IsValid: true }) + { + zoneName = aetheryte.Map.Value.PlaceName.Value.Name.ExtractText(); + } if (Config.IgnoredAetheryteIds.Contains(aetheryte.RowId)) { diff --git a/AetheryteLinkInChat/Ipc/IpcProvider.cs b/AetheryteLinkInChat/Ipc/IpcProvider.cs index 07d8a6649..ad8aac242 100644 --- a/AetheryteLinkInChat/Ipc/IpcProvider.cs +++ b/AetheryteLinkInChat/Ipc/IpcProvider.cs @@ -8,7 +8,7 @@ using Dalamud.Plugin.Services; using Divination.AetheryteLinkInChat.IpcModel; using Divination.AetheryteLinkInChat.Solver; -using Lumina.Excel.GeneratedSheets; +using Lumina.Excel.Sheets; namespace Divination.AetheryteLinkInChat.Ipc; @@ -36,10 +36,10 @@ private bool OnTeleport(TeleportPayload payload) { DalamudLog.Log.Debug("OnTeleport: {Payload}", payload); - var world = clientState.LocalPlayer?.CurrentWorld?.GameData; + var world = clientState.LocalPlayer?.CurrentWorld.Value; if (payload.WorldId.HasValue) { - world = dataManager.GetExcelSheet()?.GetRow(payload.WorldId.Value); + world = dataManager.GetExcelSheet().GetRow(payload.WorldId.Value); } var mapLink = new MapLinkPayload(payload.TerritoryTypeId, payload.MapId, payload.Coordinates.X, payload.Coordinates.Y); diff --git a/AetheryteLinkInChat/Payloads/AetherytePayload.cs b/AetheryteLinkInChat/Payloads/AetherytePayload.cs index d3c15cf33..b814aec42 100644 --- a/AetheryteLinkInChat/Payloads/AetherytePayload.cs +++ b/AetheryteLinkInChat/Payloads/AetherytePayload.cs @@ -2,7 +2,7 @@ using System.IO; using Dalamud.Game.Text.SeStringHandling; using Dalamud.Game.Text.SeStringHandling.Payloads; -using Lumina.Excel.GeneratedSheets; +using Lumina.Excel.Sheets; namespace Divination.AetheryteLinkInChat.Payloads; @@ -12,7 +12,9 @@ public sealed class AetherytePayload : DalamudLinkPayload internal const byte EmbeddedInfoTypeByte = (byte)(EmbeddedInfoType.DalamudLink + 1); public uint AetheryteId { get; set; } - public Aetheryte Aetheryte => DataResolver.GetExcelSheet()?.GetRow(AetheryteId) ?? throw new InvalidOperationException("invalid aetheryte ID"); + public Aetheryte Aetheryte => AetheryteLinkInChat.Instance.Dalamud.DataManager.GetExcelSheet().HasRow(AetheryteId) + ? AetheryteLinkInChat.Instance.Dalamud.DataManager.GetExcelSheet().GetRow(AetheryteId) + : throw new InvalidOperationException("invalid aetheryte ID"); public override PayloadType Type => PayloadType.Unknown; @@ -30,13 +32,15 @@ protected override byte[] EncodeImpl() var data = MakeInteger(AetheryteId); var length = 2 + (byte)data.Length; - return [ + return + [ START_BYTE, (byte)SeStringChunkType.Interactable, (byte)length, EmbeddedInfoTypeByte, .. data, - END_BYTE]; + END_BYTE + ]; } protected override void DecodeImpl(BinaryReader reader, long _) diff --git a/AetheryteLinkInChat/Payloads/LifestreamPayload.cs b/AetheryteLinkInChat/Payloads/LifestreamPayload.cs index f38e07626..f14b86cca 100644 --- a/AetheryteLinkInChat/Payloads/LifestreamPayload.cs +++ b/AetheryteLinkInChat/Payloads/LifestreamPayload.cs @@ -2,7 +2,7 @@ using System.IO; using Dalamud.Game.Text.SeStringHandling; using Dalamud.Game.Text.SeStringHandling.Payloads; -using Lumina.Excel.GeneratedSheets; +using Lumina.Excel.Sheets; namespace Divination.AetheryteLinkInChat.Payloads; diff --git a/AetheryteLinkInChat/Solver/AetheryteSolver.cs b/AetheryteLinkInChat/Solver/AetheryteSolver.cs index 28bcbdc44..f9bbd5f3f 100644 --- a/AetheryteLinkInChat/Solver/AetheryteSolver.cs +++ b/AetheryteLinkInChat/Solver/AetheryteSolver.cs @@ -3,13 +3,14 @@ using System.Linq; using System.Text.RegularExpressions; using Dalamud.Divination.Common.Api.Dalamud; +using Dalamud.Divination.Common.Api.Utilities; using Dalamud.Game.Text; using Dalamud.Game.Text.SeStringHandling; using Dalamud.Game.Text.SeStringHandling.Payloads; using Dalamud.Plugin.Services; using Divination.AetheryteLinkInChat.Config; using Lumina.Excel; -using Lumina.Excel.GeneratedSheets; +using Lumina.Excel.Sheets; namespace Divination.AetheryteLinkInChat.Solver; @@ -21,15 +22,15 @@ public class AetheryteSolver(IDataManager dataManager) private readonly ExcelSheet aetheryteSheet = dataManager.GetExcelSheet() ?? throw new ApplicationException("aetheryteSheet == null"); private readonly ExcelSheet mapSheet = dataManager.GetExcelSheet() ?? throw new ApplicationException("mapSheet == null"); - private readonly ExcelSheet mapMarkerSheet = - dataManager.GetExcelSheet() ?? throw new ApplicationException("mapMarkerSheet == null"); + private readonly SubrowExcelSheet mapMarkerSheet = + dataManager.GetSubrowExcelSheet() ?? throw new ApplicationException("mapMarkerSheet == null"); private readonly ExcelSheet worldSheet = dataManager.GetExcelSheet() ?? throw new ApplicationException("worldSheet == null"); private readonly ExcelSheet territoryTypeSheet = dataManager.GetExcelSheet() ?? throw new ApplicationException("territoryTypeSheet == null"); public IEnumerable CalculateTeleportPathsForMapLink(MapLinkPayload payload) { - var paths = CalculateTeleportPaths(payload.TerritoryType, payload.Map) + var paths = CalculateTeleportPaths(payload.TerritoryType.Value, payload.Map.Value) .MinBy(paths => { var distance = 0.0; @@ -41,7 +42,7 @@ public IEnumerable CalculateTeleportPathsForMapLink(MapLinkPayloa DalamudLog.Log.Verbose("P1 = ({X1}, {Y1}), P2 = ({X2}, {Y2})", x, y, markerX, markerY); DalamudLog.Log.Verbose("path = {S}", path); - if (path is AetheryteTeleportPath { Aetheryte.AethernetGroup: > 0 }) + if (path is AetheryteTeleportPath {Aetheryte.AethernetGroup: > 0}) { DalamudLog.Log.Verbose("skip distance calculation: this is aethernet: {S}", path); } @@ -75,18 +76,20 @@ public void AppendGrandCompanyAetheryte(List paths, World? currentWorld, ushort currentTerritoryTypeId) { - var territory = territoryTypeSheet.GetRow(currentTerritoryTypeId); - if (territory == default) + var isTerritoryTypeFound = territoryTypeSheet.TryGetRow(currentTerritoryTypeId, out var territory); + if (!isTerritoryTypeFound) { - DalamudLog.Log.Debug("AppendGrandCompanyAetheryte: territory == default"); + DalamudLog.Log.Debug("AppendGrandCompanyAetheryte: TryGetRow failed"); return; } var grandCompanyAetheryteIds = Enum.GetValues().Select(x => (uint)x).ToList(); - var aetheryte = GetAetherytesInTerritoryType(territory) + Aetheryte aetheryte; + var isAetheryteFound = GetAetherytesInTerritoryType(territory) .Select(x => x.aetheryte) - .FirstOrDefault(x => grandCompanyAetheryteIds.Contains(x.RowId)); - if (aetheryte == default) + .TryGetFirst(x => grandCompanyAetheryteIds.Contains(x.RowId), out aetheryte); + + if (!isAetheryteFound) { if (grandCompanyAetheryteId == default) { @@ -94,41 +97,33 @@ public void AppendGrandCompanyAetheryte(List paths, return; } - aetheryte = aetheryteSheet.GetRow(grandCompanyAetheryteId); - if (aetheryte == default) + if (!aetheryteSheet.TryGetRow(grandCompanyAetheryteId, out aetheryte)) { DalamudLog.Log.Debug("AppendGrandCompanyAetheryte: aetheryte == null"); return; } } - var world = DetectWorld(message, currentWorld); - if (world == default) + World? world = DetectWorld(message, currentWorld); + if (!world.HasValue) { DalamudLog.Log.Debug("AppendGrandCompanyAetheryte: world == null"); return; } - if (world.RowId == currentWorld?.RowId) + if (world.Value.RowId == currentWorld?.RowId) { DalamudLog.Log.Debug("AppendGrandCompanyAetheryte: world == currentWorld"); return; } - var (marker, map) = GetMarkerFromAetheryte(aetheryte); - if (marker == default) + if (!TryGetMarkerFromAetheryte(aetheryte, out var marker, out var map)) { - DalamudLog.Log.Debug("AppendGrandCompanyAetheryte: marker == null"); + DalamudLog.Log.Debug("AppendGrandCompanyAetheryte: marker == null | map == null"); return; } - if (map == default) - { - DalamudLog.Log.Debug("AppendGrandCompanyAetheryte: map == null"); - return; - } - - paths.Insert(0, new WorldTeleportPath(aetheryte, world, marker, map)); + paths.Insert(0, new WorldTeleportPath(aetheryte, world.Value, marker, map)); } public World? DetectWorld(SeString message, World? currentWorld) @@ -143,8 +138,9 @@ public void AppendGrandCompanyAetheryte(List paths, text = string.Join(string.Empty, text.Select(ReplaceSeIconChar)); return worldSheet.Where(x => x.IsPublic) - .FirstOrDefault(x => text.Contains(x.Name.RawString, StringComparison.OrdinalIgnoreCase)) - ?? currentWorld; + .TryGetFirst(x => text.Contains(x.Name.ExtractText(), StringComparison.OrdinalIgnoreCase), out var world) + ? world + : currentWorld; } private static char ReplaceSeIconChar(char c) @@ -201,25 +197,26 @@ private IEnumerable CalculateTeleportPaths(TerritoryType territ // エリア内のマップ境界を探す foreach (var marker in GetBoundariesInMap(map)) { - var connectedMap = mapSheet.GetRow(marker.DataKey); - var connectedTerritoryType = connectedMap?.TerritoryType.Value; - var connectedMarker = mapMarkerSheet + var connectedMap = mapSheet.GetRow(marker.DataKey.RowId); + var connectedTerritoryType = connectedMap.TerritoryType.Value; + var isMapMarkerFound = mapMarkerSheet // エリア境界のマーカー + .SelectMany(x => x) .Where(x => x.DataType == 1) // 近接エリアに移動した先のマーカーを探す - .FirstOrDefault(x => x.RowId == connectedMap?.MapMarkerRange && x.DataKey == map.RowId); + .TryGetFirst(x => x.RowId == connectedMap.MapMarkerRange && x.DataKey.RowId == map.RowId, out var connectedMarker); + + DalamudLog.Log.Verbose("marker = {S} ({N})", marker.PlaceNameSubtext.Value.Name.ExtractText(), marker.DataKey); + DalamudLog.Log.Verbose("connectedTerritoryType = {S}", connectedTerritoryType.PlaceName.Value.Name.ExtractText()); + DalamudLog.Log.Verbose("connectedMap = {S}", connectedMap.PlaceName.Value.Name.ExtractText()); + DalamudLog.Log.Verbose("connectedMarker = {S}", isMapMarkerFound ? connectedMarker.PlaceNameSubtext.Value.Name.ExtractText() : ""); - DalamudLog.Log.Verbose("marker = {S} ({N})", marker.PlaceNameSubtext.Value?.Name.RawString ?? "", marker.DataKey); - DalamudLog.Log.Verbose("connectedTerritoryType = {S}", connectedTerritoryType?.PlaceName.Value?.Name.RawString ?? ""); - DalamudLog.Log.Verbose("connectedMap = {S}", connectedMap?.PlaceName.Value?.Name.RawString ?? ""); - DalamudLog.Log.Verbose("connectedMarker = {S}", connectedMarker?.PlaceNameSubtext.Value?.Name.RawString ?? ""); + if (!isMapMarkerFound) + continue; - if (connectedTerritoryType != default && connectedMap != default && connectedMarker != default) + foreach (var paths in CalculateTeleportPaths(connectedTerritoryType, connectedMap, ++depth)) { - foreach (var paths in CalculateTeleportPaths(connectedTerritoryType, connectedMap, ++depth)) - { - yield return paths.Prepend(new BoundaryTeleportPath(connectedMarker, connectedMap, marker, map)).ToArray(); - } + yield return paths.Prepend(new BoundaryTeleportPath(connectedMarker, connectedMap, marker, map)).ToArray(); } } } @@ -229,7 +226,7 @@ private IEnumerable CalculateTeleportPaths(TerritoryType territ foreach (var aetheryte in aetheryteSheet) { // 対象のエリア内に限定 - if (aetheryte.Territory.Row != territoryType.RowId) + if (aetheryte.Territory.RowId != territoryType.RowId) { continue; } @@ -247,11 +244,12 @@ private IEnumerable CalculateTeleportPaths(TerritoryType territ } // エーテライトのマップマーカーを探す - var marker = mapMarkerSheet + var isMapMarkerFound = mapMarkerSheet // エーテライトのマーカーに限定 + .SelectMany(x => x) .Where(x => x.DataType is 3 or 4) - .FirstOrDefault(x => x.DataKey == aetheryte.RowId); - if (marker == default) + .TryGetFirst(x => x.DataKey.RowId == aetheryte.RowId, out var marker); + if (!isMapMarkerFound) { continue; } @@ -264,6 +262,7 @@ private IEnumerable GetBoundariesInMap(Map map) { return mapMarkerSheet // エリア境界のマーカー + .SelectMany(x => x) .Where(x => x.DataType == 1) // 現在のマップのマーカー .Where(x => x.RowId == map.MapMarkerRange); @@ -281,15 +280,28 @@ private static double CalculateEuclideanDistance(double x1, double y1, double x2 return Math.Sqrt(Math.Pow(x2 - x1, 2) + Math.Pow(y2 - y1, 2)); } - private (MapMarker? marker, Map? map) GetMarkerFromAetheryte(Aetheryte aetheryte) + private bool TryGetMarkerFromAetheryte(Aetheryte aetheryte, out MapMarker resultMarker, out Map resultMap) { - var marker = mapMarkerSheet.Where(x => x.DataType == 3).FirstOrDefault(x => x.DataKey == aetheryte.RowId); - var map = mapSheet.FirstOrDefault(x => x.MapMarkerRange == marker?.RowId); - return (marker, map); + resultMarker = default; + resultMap = default; + + var isMapMarkerFound = mapMarkerSheet + .SelectMany(x => x) + .Where(x => x.DataType == 3) + .TryGetFirst(x => x.DataKey.RowId == aetheryte.RowId, out var marker); + + if (!isMapMarkerFound) + return false; + + var isMapFound = mapSheet.TryGetFirst(x => x.MapMarkerRange == marker.RowId, out var map); + + resultMarker = marker; + resultMap = map; + return isMapFound; } public Aetheryte? GetAetheryteById(uint id) { - return aetheryteSheet.GetRow(id); + return aetheryteSheet.GetRowOrDefault(id); } } diff --git a/AetheryteLinkInChat/Solver/TeleportPath.cs b/AetheryteLinkInChat/Solver/TeleportPath.cs index c40fc2efa..6779e27ba 100644 --- a/AetheryteLinkInChat/Solver/TeleportPath.cs +++ b/AetheryteLinkInChat/Solver/TeleportPath.cs @@ -1,4 +1,4 @@ -using Lumina.Excel.GeneratedSheets; +using Lumina.Excel.Sheets; namespace Divination.AetheryteLinkInChat.Solver; @@ -10,17 +10,17 @@ public interface ITeleportPath public record AetheryteTeleportPath(Aetheryte Aetheryte, MapMarker Marker, Map Map) : ITeleportPath { - public override string? ToString() + public override string ToString() { - return Aetheryte.PlaceName.Value?.Name.RawString ?? Marker.PlaceNameSubtext.Value?.Name.RawString; + return Aetheryte.PlaceName.IsValid ? Aetheryte.PlaceName.Value.Name.ExtractText() : Marker.PlaceNameSubtext.Value.Name.ExtractText(); } } public record BoundaryTeleportPath(MapMarker ConnectedMarker, Map ConnectedMap, MapMarker Marker, Map Map) : ITeleportPath { - public override string? ToString() + public override string ToString() { - return ConnectedMarker.PlaceNameSubtext.Value?.Name.RawString; + return ConnectedMarker.PlaceNameSubtext.Value.Name.ExtractText(); } } @@ -28,6 +28,6 @@ public record WorldTeleportPath(Aetheryte Aetheryte, World World, MapMarker Mark { public override string ToString() { - return World.Name.RawString; + return World.Name.ExtractText(); } } diff --git a/AetheryteLinkInChat/Teleporter.cs b/AetheryteLinkInChat/Teleporter.cs index d20c6e5f2..209502aeb 100644 --- a/AetheryteLinkInChat/Teleporter.cs +++ b/AetheryteLinkInChat/Teleporter.cs @@ -12,7 +12,7 @@ using Divination.AetheryteLinkInChat.Solver; using FFXIVClientStructs.FFXIV.Client.Game; using FFXIVClientStructs.FFXIV.Client.Game.UI; -using Lumina.Excel.GeneratedSheets; +using Lumina.Excel.Sheets; namespace Divination.AetheryteLinkInChat; @@ -49,7 +49,8 @@ public sealed class Teleporter : IDisposable private readonly IDalamudPluginInterface pluginInterface; private readonly IToastGui toastGui; private readonly PluginConfig config; - private volatile Aetheryte? queuedAetheryte; + // Huh, cant use volatile here anymore... well hope nothing explodes :) + private Aetheryte? queuedAetheryte; public Teleporter(ICondition condition, IAetheryteList aetheryteList, IChatClient chatClient, ICommandManager commandManager, IClientState clientState, IDalamudPluginInterface pluginInterface, IToastGui toastGui, PluginConfig config) { @@ -73,7 +74,7 @@ public unsafe bool TeleportToAetheryte(Aetheryte aetheryte) { if (QueueTeleport(aetheryte)) { - DisplayQueueTeleportingNotification(aetheryte.PlaceName.Value?.Name.RawString); + DisplayQueueTeleportingNotification(aetheryte.PlaceName.Value.Name.ExtractText()); return true; } @@ -83,7 +84,7 @@ public unsafe bool TeleportToAetheryte(Aetheryte aetheryte) queuedAetheryte = default; if (ExecuteTeleport(aetheryte)) { - DisplayTeleportingNotification(aetheryte.PlaceName.Value?.Name.RawString, false); + DisplayTeleportingNotification(aetheryte.PlaceName.Value.Name.ExtractText(), false); return true; } @@ -147,9 +148,9 @@ private void TeleportToQueuedAetheryte() var aetheryte = queuedAetheryte; queuedAetheryte = default; - if (aetheryte != default && ExecuteTeleport(aetheryte)) + if (aetheryte.HasValue && ExecuteTeleport(aetheryte.Value)) { - DisplayTeleportingNotification(aetheryte.PlaceName.Value?.Name.RawString, true); + DisplayTeleportingNotification(aetheryte.Value.PlaceName.Value.Name.ExtractText(), true); return; } } @@ -175,32 +176,32 @@ public async Task TeleportToPaths(IEnumerable paths, World? await Task.Delay(500, cancellationToken); } - if (world != default) + if (world.HasValue) { - if (world.RowId == clientState.LocalPlayer?.CurrentWorld?.Id) + if (world.Value.RowId == clientState.LocalPlayer?.CurrentWorld.RowId) { DalamudLog.Log.Debug("TeleportToPaths: world == currentWorld"); } else { - DalamudLog.Log.Debug("TeleportToPaths: teleporting to {World}", world.Name.RawString); + DalamudLog.Log.Debug("TeleportToPaths: teleporting to {World}", world.Value.Name.ExtractText()); - if (!TeleportToWorld(world)) + if (!TeleportToWorld(world.Value)) { - DalamudLog.Log.Warning("TeleportToPaths: teleport to {World} failed", world.Name.RawString); + DalamudLog.Log.Warning("TeleportToPaths: teleport to {World} failed", world.Value.Name.ExtractText()); return false; } - DisplayTeleportingNotification(world.Name.RawString, false); - DalamudLog.Log.Debug("TeleportToPaths: waiting for {World}", world.Name.RawString); + DisplayTeleportingNotification(world.Value.Name.ExtractText(), false); + DalamudLog.Log.Debug("TeleportToPaths: waiting for {World}", world.Value.Name.ExtractText()); // wait until world changed - while (world.RowId != clientState.LocalPlayer?.CurrentWorld.Id || IsTeleportUnavailable) + while (world.Value.RowId != clientState.LocalPlayer?.CurrentWorld.RowId || IsTeleportUnavailable) { await Task.Delay(500, cancellationToken); } - DalamudLog.Log.Debug("TeleportToPaths: world changed: {World}", world.Name.RawString); + DalamudLog.Log.Debug("TeleportToPaths: world changed: {World}", world.Value.Name.ExtractText()); } } @@ -221,7 +222,7 @@ public async Task TeleportToPaths(IEnumerable paths, World? return false; } - DisplayTeleportingNotification(aetheryte.Aetheryte.PlaceName.Value?.Name.RawString, false); + DisplayTeleportingNotification(aetheryte.Aetheryte.PlaceName.Value.Name.ExtractText(), false); break; case AetheryteTeleportPath { Aetheryte.IsAetheryte: false } aetheryte: if (!TeleportToAethernet(aetheryte.Aetheryte)) @@ -230,7 +231,7 @@ public async Task TeleportToPaths(IEnumerable paths, World? return false; } - DisplayTeleportingNotification(aetheryte.Aetheryte.AethernetName.Value?.Name.RawString, false); + DisplayTeleportingNotification(aetheryte.Aetheryte.AethernetName.Value.Name.ExtractText(), false); break; case BoundaryTeleportPath boundary: throw new NotImplementedException("boundary teleport is not implemented."); @@ -244,12 +245,12 @@ public async Task TeleportToPaths(IEnumerable paths, World? private bool TeleportToAethernet(Aetheryte aetheryte) { - return commandManager.ProcessCommand($"/li {aetheryte.AethernetName.Value?.Name.RawString}"); + return commandManager.ProcessCommand($"/li {aetheryte.AethernetName.Value.Name.ExtractText()}"); } private bool TeleportToWorld(World world) { - return commandManager.ProcessCommand($"/li {world.Name.RawString}"); + return commandManager.ProcessCommand($"/li {world.Name.ExtractText()}"); } public bool IsLifestreamAvailable() diff --git a/AetheryteLinkInChat/packages.lock.json b/AetheryteLinkInChat/packages.lock.json index c20ab3490..fd1a2f248 100644 --- a/AetheryteLinkInChat/packages.lock.json +++ b/AetheryteLinkInChat/packages.lock.json @@ -4,9 +4,9 @@ "net8.0-windows7.0": { "DalamudPackager": { "type": "Direct", - "requested": "[2.1.13, )", - "resolved": "2.1.13", - "contentHash": "rMN1omGe8536f4xLMvx9NwfvpAc9YFFfeXJ1t4P4PE6Gu8WCIoFliR1sh07hM+bfODmesk/dvMbji7vNI+B/pQ==" + "requested": "[11.0.0, )", + "resolved": "11.0.0", + "contentHash": "bjT7XUlhIJSmsE/O76b7weUX+evvGQctbQB8aKXt94o+oPWxHpCepxAGMs7Thow3AzCyqWs7cOpp9/2wcgRRQA==" }, "GitVersion.MsBuild": { "type": "Direct", diff --git a/Common/Api/Utilities/IEnumerableExtension.cs b/Common/Api/Utilities/IEnumerableExtension.cs new file mode 100644 index 000000000..fca9fc601 --- /dev/null +++ b/Common/Api/Utilities/IEnumerableExtension.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +namespace Dalamud.Divination.Common.Api.Utilities; + +public static class IEnumerableExtension +{ + public static bool TryGetFirst(this IEnumerable values, out T result) where T : struct { + using var e = values.GetEnumerator(); + if (e.MoveNext()) { + result = e.Current; + return true; + } + result = default; + return false; + } + + public static bool TryGetFirst(this IEnumerable values, Predicate predicate, out T result) where T : struct { + using var e = values.GetEnumerator(); + while (e.MoveNext()) { + if (predicate(e.Current)) { + result = e.Current; + return true; + } + } + result = default; + return false; + } +} diff --git a/Debugger/Debugger.ColorCommand.cs b/Debugger/Debugger.ColorCommand.cs index 99dbd7e5e..73c44500e 100644 --- a/Debugger/Debugger.ColorCommand.cs +++ b/Debugger/Debugger.ColorCommand.cs @@ -2,7 +2,7 @@ using Dalamud.Divination.Common.Api.Command.Attributes; using Dalamud.Game.Text.SeStringHandling; using Dalamud.Game.Text.SeStringHandling.Payloads; -using Lumina.Excel.GeneratedSheets; +using Lumina.Excel.Sheets; namespace Divination.Debugger; diff --git a/Debugger/Debugger.csproj b/Debugger/Debugger.csproj index 2f708859c..720865f01 100644 --- a/Debugger/Debugger.csproj +++ b/Debugger/Debugger.csproj @@ -24,6 +24,6 @@ - + diff --git a/Debugger/packages.lock.json b/Debugger/packages.lock.json index 412afdcbd..2befdf863 100644 --- a/Debugger/packages.lock.json +++ b/Debugger/packages.lock.json @@ -4,9 +4,9 @@ "net8.0-windows7.0": { "DalamudPackager": { "type": "Direct", - "requested": "[2.1.13, )", - "resolved": "2.1.13", - "contentHash": "rMN1omGe8536f4xLMvx9NwfvpAc9YFFfeXJ1t4P4PE6Gu8WCIoFliR1sh07hM+bfODmesk/dvMbji7vNI+B/pQ==" + "requested": "[11.0.0, )", + "resolved": "11.0.0", + "contentHash": "bjT7XUlhIJSmsE/O76b7weUX+evvGQctbQB8aKXt94o+oPWxHpCepxAGMs7Thow3AzCyqWs7cOpp9/2wcgRRQA==" }, "GitVersion.MsBuild": { "type": "Direct", diff --git a/FaloopIntegration/FaloopIntegration.cs b/FaloopIntegration/FaloopIntegration.cs index 4ab5baf75..ba2415082 100644 --- a/FaloopIntegration/FaloopIntegration.cs +++ b/FaloopIntegration/FaloopIntegration.cs @@ -16,7 +16,7 @@ using Divination.FaloopIntegration.Faloop.Model; using Divination.FaloopIntegration.Ipc; using Divination.FaloopIntegration.Ui; -using Lumina.Excel.GeneratedSheets; +using Lumina.Excel.Sheets; using SocketIOClient; namespace Divination.FaloopIntegration; @@ -66,8 +66,8 @@ public FaloopIntegration(IDalamudPluginInterface pluginInterface) : base(pluginI private void OnLogin() { - currentWorld = Dalamud.ClientState.LocalPlayer?.CurrentWorld?.GameData; - homeWorld = Dalamud.ClientState.LocalPlayer?.HomeWorld?.GameData; + currentWorld = Dalamud.ClientState.LocalPlayer?.CurrentWorld.Value; + homeWorld = Dalamud.ClientState.LocalPlayer?.HomeWorld.Value; } private void OnConnected() @@ -196,11 +196,15 @@ private void OnMobReport(MobReportData data) private bool CheckSpawnNotificationCondition(PluginConfig.PerRankConfig config, uint worldId, GameExpansion expansion) { - var world = Dalamud.DataManager.GetExcelSheet()?.GetRow(worldId); - var dataCenter = world?.DataCenter?.Value; - if (world == default || dataCenter == default) + if (!Dalamud.DataManager.GetExcelSheet().TryGetRow(worldId, out var world)) { - DalamudLog.Log.Debug("OnMobReport: world == null || dataCenter == null"); + DalamudLog.Log.Debug("OnMobReport: world == null"); + return false; + } + var dataCenter = world.DataCenter.ValueNullable; + if (!dataCenter.HasValue) + { + DalamudLog.Log.Debug("dataCenter == null"); return false; } @@ -216,9 +220,9 @@ private bool CheckSpawnNotificationCondition(PluginConfig.PerRankConfig config, return false; } - var currentDataCenter = currentWorld?.DataCenter?.Value; - var homeDataCenter = homeWorld?.DataCenter.Value; - if (currentWorld == default || currentDataCenter == default || homeDataCenter == default) + var currentDataCenter = currentWorld?.DataCenter.ValueNullable; + var homeDataCenter = homeWorld?.DataCenter.ValueNullable; + if (!currentWorld.HasValue || !currentDataCenter.HasValue|| !homeDataCenter.HasValue) { DalamudLog.Log.Debug("OnMobReport: currentWorld == null || currentDataCenter == null || homeDataCenter == null"); return false; @@ -227,10 +231,10 @@ private bool CheckSpawnNotificationCondition(PluginConfig.PerRankConfig config, switch (jurisdiction) { case Jurisdiction.All: - case Jurisdiction.Travelable when dataCenter.Region == 4 || dataCenter.Region == homeDataCenter.Region: - case Jurisdiction.Region when dataCenter.Region == currentDataCenter.Region: - case Jurisdiction.DataCenter when dataCenter.RowId == currentDataCenter.RowId: - case Jurisdiction.World when world.RowId == currentWorld.RowId: + case Jurisdiction.Travelable when dataCenter.Value.Region == 4 || dataCenter.Value.Region == homeDataCenter.Value.Region: + case Jurisdiction.Region when dataCenter.Value.Region == currentDataCenter.Value.Region: + case Jurisdiction.DataCenter when dataCenter.Value.RowId == currentDataCenter.Value.RowId: + case Jurisdiction.World when world.RowId == currentWorld.Value.RowId: return true; default: DalamudLog.Log.Verbose("OnMobReport: unmatched"); @@ -250,7 +254,7 @@ private void OnMobSpawn(MobSpawnEvent ev, int channel) payloads.Add(new TextPayload($"{SeIconChar.BoxedPlus.ToIconString()}")); } payloads.Add(new TextPayload(Utils.GetRankIcon(ev.Rank))); - payloads.Add(new TextPayload($" {ev.Mob.Singular.RawString} ")); + payloads.Add(new TextPayload($" {ev.Mob.Singular.ExtractText()} ")); // append MapLink only if pop location is known if (ev.Coordinates.HasValue) @@ -310,7 +314,7 @@ private void OnMobDeath(MobDeathEvent ev, int channel, bool skipOrphanReport, bo payloads.AddRange( [ new TextPayload($"{SeIconChar.Cross.ToIconString()}"), - new TextPayload($" {ev.Mob.Singular.RawString}"), + new TextPayload($" {ev.Mob.Singular.ExtractText()}"), new TextPayload(Utils.GetInstanceIcon(ev.ZoneInstance)), new IconPayload(BitmapFontIcon.CrossWorld), new TextPayload($"{ev.World.Name}".TrimEnd()), @@ -321,7 +325,7 @@ private void OnMobDeath(MobDeathEvent ev, int channel, bool skipOrphanReport, bo payloads.AddRange( [ new TextPayload(Utils.GetRankIcon(ev.Rank)), - new TextPayload($" {ev.Mob.Singular.RawString}"), + new TextPayload($" {ev.Mob.Singular.ExtractText()}"), new TextPayload(Utils.GetInstanceIcon(ev.ZoneInstance)), new IconPayload(BitmapFontIcon.CrossWorld), new TextPayload($"{ev.World.Name} {Localization.WasKilled} {Utils.FormatTimeSpan(ev.KilledAt)}".TrimEnd()), diff --git a/FaloopIntegration/FaloopIntegration.csproj b/FaloopIntegration/FaloopIntegration.csproj index e26d9bb1e..c5a9221c0 100644 --- a/FaloopIntegration/FaloopIntegration.csproj +++ b/FaloopIntegration/FaloopIntegration.csproj @@ -32,7 +32,7 @@ - + all diff --git a/FaloopIntegration/FaloopIntegration.json b/FaloopIntegration/FaloopIntegration.json index c2390708d..06e29c7c9 100644 --- a/FaloopIntegration/FaloopIntegration.json +++ b/FaloopIntegration/FaloopIntegration.json @@ -4,6 +4,5 @@ "Punchline": "Faloop Notification in Chat", "Description": "Show Faloop mob spawn notifications in in-game chat. Type /faloop to configure the plugin.", "Tags": ["mobhunt"], - "CategoryTags": ["social", "utility"], - "DalamudApiLevel": 10 + "CategoryTags": ["social", "utility"] } diff --git a/FaloopIntegration/MobDeathEvent.cs b/FaloopIntegration/MobDeathEvent.cs index f2b84adb8..53ab309c1 100644 --- a/FaloopIntegration/MobDeathEvent.cs +++ b/FaloopIntegration/MobDeathEvent.cs @@ -1,5 +1,5 @@ using System; -using Lumina.Excel.GeneratedSheets; +using Lumina.Excel.Sheets; namespace Divination.FaloopIntegration; diff --git a/FaloopIntegration/MobSpawnEvent.cs b/FaloopIntegration/MobSpawnEvent.cs index 6dacde8da..8d0940bf3 100644 --- a/FaloopIntegration/MobSpawnEvent.cs +++ b/FaloopIntegration/MobSpawnEvent.cs @@ -1,7 +1,7 @@ using System; using System.Linq; using System.Numerics; -using Lumina.Excel.GeneratedSheets; +using Lumina.Excel.Sheets; using Newtonsoft.Json; namespace Divination.FaloopIntegration; @@ -23,7 +23,7 @@ public record MobSpawnEvent( [JsonIgnore] public TerritoryType TerritoryType => FaloopIntegration.Instance.Dalamud.DataManager.GetExcelSheet()?.GetRow(TerritoryTypeId) ?? throw new InvalidOperationException("invalid territory type ID"); [JsonIgnore] - public Map Map => TerritoryType.Map.Value ?? throw new InvalidOperationException("invalid map ID"); + public Map Map => TerritoryType.Map.ValueNullable ?? throw new InvalidOperationException("invalid map ID"); [JsonIgnore] public string Id => $"{MobId}_{WorldId}_{ZoneInstance}"; diff --git a/FaloopIntegration/Ui/ActiveMobUi.cs b/FaloopIntegration/Ui/ActiveMobUi.cs index 96a735cdb..3c9f58488 100644 --- a/FaloopIntegration/Ui/ActiveMobUi.cs +++ b/FaloopIntegration/Ui/ActiveMobUi.cs @@ -79,7 +79,7 @@ public void Draw() private void DrawRow(MobSpawnEvent mob) { ImGui.TableNextColumn(); - var mobText = $"{Utils.GetRankIcon(mob.Rank)} {mob.Mob.Singular.RawString} {Utils.GetInstanceIcon(mob.ZoneInstance)} {SeIconChar.CrossWorld.ToIconString()} {mob.World.Name.RawString}"; + var mobText = $"{Utils.GetRankIcon(mob.Rank)} {mob.Mob.Singular.ExtractText()} {Utils.GetInstanceIcon(mob.ZoneInstance)} {SeIconChar.CrossWorld.ToIconString()} {mob.World.Name.ExtractText()}"; ImGui.Text(mobText); ImGui.TableNextColumn(); @@ -89,7 +89,7 @@ private void DrawRow(MobSpawnEvent mob) ImGui.TableNextColumn(); if (ImGui.Button($"{Localization.TableButtonTeleport}##{mob.Id}")) { - if (ipc.Teleport(mob.TerritoryTypeId, mob.TerritoryType.Map.Row, mob.Coordinates ?? default, mob.WorldId)) + if (ipc.Teleport(mob.TerritoryTypeId, mob.TerritoryType.Map.RowId, mob.Coordinates ?? default, mob.WorldId)) { chatClient.Print(Localization.TeleportingMessage.Format(mobText)); } diff --git a/FaloopIntegration/Utils.cs b/FaloopIntegration/Utils.cs index c0f129247..b70824319 100644 --- a/FaloopIntegration/Utils.cs +++ b/FaloopIntegration/Utils.cs @@ -6,7 +6,7 @@ using Dalamud.Game.Text.SeStringHandling; using Dalamud.Game.Text.SeStringHandling.Payloads; using Dalamud.Plugin.Services; -using Lumina.Excel.GeneratedSheets; +using Lumina.Excel.Sheets; namespace Divination.FaloopIntegration; diff --git a/FaloopIntegration/packages.lock.json b/FaloopIntegration/packages.lock.json index 8d63676bf..cfb26b8dc 100644 --- a/FaloopIntegration/packages.lock.json +++ b/FaloopIntegration/packages.lock.json @@ -4,9 +4,9 @@ "net8.0-windows7.0": { "DalamudPackager": { "type": "Direct", - "requested": "[2.1.13, )", - "resolved": "2.1.13", - "contentHash": "rMN1omGe8536f4xLMvx9NwfvpAc9YFFfeXJ1t4P4PE6Gu8WCIoFliR1sh07hM+bfODmesk/dvMbji7vNI+B/pQ==" + "requested": "[11.0.0, )", + "resolved": "11.0.0", + "contentHash": "bjT7XUlhIJSmsE/O76b7weUX+evvGQctbQB8aKXt94o+oPWxHpCepxAGMs7Thow3AzCyqWs7cOpp9/2wcgRRQA==" }, "GitVersion.MsBuild": { "type": "Direct", @@ -33,11 +33,6 @@ "System.Text.Json": "8.0.0" } }, - "JetBrains.Annotations": { - "type": "Transitive", - "resolved": "2021.2.0", - "contentHash": "kKSyoVfndMriKHLfYGmr0uzQuI4jcc3TKGyww7buJFCYeHb/X0kodYBPL7n9454q7v6ASiRmDgpPGaDGerg/Hg==" - }, "Microsoft.NETCore.Platforms": { "type": "Transitive", "resolved": "1.1.0", @@ -85,16 +80,6 @@ }, "Dalamud.Divination.Common": { "type": "Project" - }, - "ffxivclientstructs": { - "type": "Project", - "dependencies": { - "InteropGenerator.Runtime": "[1.0.0, )", - "JetBrains.Annotations": "[2021.2.0, )" - } - }, - "interopgenerator.runtime": { - "type": "Project" } } } diff --git a/Horoscope/Horoscope.csproj b/Horoscope/Horoscope.csproj index 60626b21e..565132544 100644 --- a/Horoscope/Horoscope.csproj +++ b/Horoscope/Horoscope.csproj @@ -29,7 +29,7 @@ False - + all diff --git a/Horoscope/packages.lock.json b/Horoscope/packages.lock.json index 8cbbbb8eb..4d31f4362 100644 --- a/Horoscope/packages.lock.json +++ b/Horoscope/packages.lock.json @@ -4,9 +4,9 @@ "net8.0-windows7.0": { "DalamudPackager": { "type": "Direct", - "requested": "[2.1.13, )", - "resolved": "2.1.13", - "contentHash": "rMN1omGe8536f4xLMvx9NwfvpAc9YFFfeXJ1t4P4PE6Gu8WCIoFliR1sh07hM+bfODmesk/dvMbji7vNI+B/pQ==" + "requested": "[11.0.0, )", + "resolved": "11.0.0", + "contentHash": "bjT7XUlhIJSmsE/O76b7weUX+evvGQctbQB8aKXt94o+oPWxHpCepxAGMs7Thow3AzCyqWs7cOpp9/2wcgRRQA==" }, "GitVersion.MsBuild": { "type": "Direct", @@ -22,7 +22,7 @@ "clicklib": { "type": "Project", "dependencies": { - "ECommons": "[2.2.0.2, )", + "ECommons": "[2.1.0.7, )", "Reloaded.Memory": "[7.1.0, )" } }, diff --git a/InstanceIDViewer/InstanceIDViewer.csproj b/InstanceIDViewer/InstanceIDViewer.csproj index 0f038eab4..a1103b13b 100644 --- a/InstanceIDViewer/InstanceIDViewer.csproj +++ b/InstanceIDViewer/InstanceIDViewer.csproj @@ -11,6 +11,6 @@ - + diff --git a/InstanceIDViewer/packages.lock.json b/InstanceIDViewer/packages.lock.json index 412afdcbd..2befdf863 100644 --- a/InstanceIDViewer/packages.lock.json +++ b/InstanceIDViewer/packages.lock.json @@ -4,9 +4,9 @@ "net8.0-windows7.0": { "DalamudPackager": { "type": "Direct", - "requested": "[2.1.13, )", - "resolved": "2.1.13", - "contentHash": "rMN1omGe8536f4xLMvx9NwfvpAc9YFFfeXJ1t4P4PE6Gu8WCIoFliR1sh07hM+bfODmesk/dvMbji7vNI+B/pQ==" + "requested": "[11.0.0, )", + "resolved": "11.0.0", + "contentHash": "bjT7XUlhIJSmsE/O76b7weUX+evvGQctbQB8aKXt94o+oPWxHpCepxAGMs7Thow3AzCyqWs7cOpp9/2wcgRRQA==" }, "GitVersion.MsBuild": { "type": "Direct", diff --git a/Voiceroid2Talker/Voiceroid2Talker.csproj b/Voiceroid2Talker/Voiceroid2Talker.csproj index 5393e845d..04d2abb47 100644 --- a/Voiceroid2Talker/Voiceroid2Talker.csproj +++ b/Voiceroid2Talker/Voiceroid2Talker.csproj @@ -14,6 +14,6 @@ - + diff --git a/Voiceroid2Talker/packages.lock.json b/Voiceroid2Talker/packages.lock.json index 412afdcbd..2befdf863 100644 --- a/Voiceroid2Talker/packages.lock.json +++ b/Voiceroid2Talker/packages.lock.json @@ -4,9 +4,9 @@ "net8.0-windows7.0": { "DalamudPackager": { "type": "Direct", - "requested": "[2.1.13, )", - "resolved": "2.1.13", - "contentHash": "rMN1omGe8536f4xLMvx9NwfvpAc9YFFfeXJ1t4P4PE6Gu8WCIoFliR1sh07hM+bfODmesk/dvMbji7vNI+B/pQ==" + "requested": "[11.0.0, )", + "resolved": "11.0.0", + "contentHash": "bjT7XUlhIJSmsE/O76b7weUX+evvGQctbQB8aKXt94o+oPWxHpCepxAGMs7Thow3AzCyqWs7cOpp9/2wcgRRQA==" }, "GitVersion.MsBuild": { "type": "Direct", diff --git a/lib/ECommons b/lib/ECommons index da957b3eb..bd59e094b 160000 --- a/lib/ECommons +++ b/lib/ECommons @@ -1 +1 @@ -Subproject commit da957b3eb8a50a6101a86467567ec4e34de9c8f3 +Subproject commit bd59e094ba0a9da2d0e3fc2839e47bdde7cd9cfa