API 10; DT aetheryte/aethernet data
authorLiza Carvelli <liza@carvel.li>
Wed, 3 Jul 2024 19:00:04 +0000 (21:00 +0200)
committerLiza Carvelli <liza@carvel.li>
Wed, 3 Jul 2024 19:01:27 +0000 (21:01 +0200)
21 files changed:
LLib
QuestPaths/quest-v1.json
Questionable.Model/V1/Converter/AethernetShortcutConverter.cs
Questionable.Model/V1/Converter/AetheryteConverter.cs
Questionable.Model/V1/EAetheryteLocation.cs
Questionable/ChatFunctions.cs
Questionable/Controller/MovementController.cs
Questionable/Controller/QuestRegistry.cs
Questionable/Controller/Steps/BaseFactory/Move.cs
Questionable/Controller/Steps/InteractionFactory/EquipItem.cs
Questionable/Controller/Steps/InteractionFactory/Interact.cs
Questionable/DalamudInitializer.cs
Questionable/Data/AetheryteData.cs
Questionable/External/LifestreamIpc.cs
Questionable/External/NavmeshIpc.cs
Questionable/External/YesAlreadyIpc.cs
Questionable/GameFunctions.cs
Questionable/Questionable.csproj
Questionable/QuestionablePlugin.cs
Questionable/Windows/ConfigWindow.cs
Questionable/Windows/QuestWindow.cs

diff --git a/LLib b/LLib
index b5125d4b3f7cdc0c7514a01764e5b5d4d85f80a7..93fac6efb01a1272192d929fd863328271512ea4 160000 (submodule)
--- a/LLib
+++ b/LLib
@@ -1 +1 @@
-Subproject commit b5125d4b3f7cdc0c7514a01764e5b5d4d85f80a7
+Subproject commit 93fac6efb01a1272192d929fd863328271512ea4
index f5de559ec61aa6554409a7ff312e5ce0b0cfec7e..847be22f0c314044176e2c5b894876c6c85779c6 100644 (file)
                     "Elpis - Poieten Oikos",
                     "Ultima Thule - Reah Tahra",
                     "Ultima Thule - Abode of the Ea",
-                    "Ultima Thule - Base Omicron"
+                    "Ultima Thule - Base Omicron",
+                    "Tuliyollal",
+                    "Solution Nine",
+                    "Urqopacha - Wachunpelo",
+                    "Urqopacha - Worlar's Echo",
+                    "Kozama'uka - Ok'hanu",
+                    "Kozama'uka - Many Fires",
+                    "Kozama'uka - Earthenshire",
+                    "Yak T'el - Iq Br'aax",
+                    "Yak T'el - Mamook",
+                    "Shaaloani - Hhusatahwi",
+                    "Shaaloani - Sheshenewezi Springs",
+                    "Shaaloani - Mehwahhetsoan",
+                    "Heritage Found - Yyasulani Station",
+                    "Heritage Found - The Outskirts",
+                    "Heritage Found - Electrope Strike",
+                    "Living Memory - Leynode Mnemo",
+                    "Living Memory - Leynode Pyro",
+                    "Living Memory - Leynode Aero"
                   ]
                 },
                 "AethernetShortcut": {
                       "[Radz-at-Han] Mehryde's Meyhane",
                       "[Radz-at-Han] Kama",
                       "[Radz-at-Han] The High Crucible of Al-Kimiya",
-                      "[Radz-at-Han] The Gate of First Sight (Thavnair)"
+                      "[Radz-at-Han] The Gate of First Sight (Thavnair)",
+                      "[Tuliyollal] Aetheryte Plaza",
+                      "[Tuliyollal] Dirigible Landing",
+                      "[Tuliyollal] The Resplendent Quarter",
+                      "[Tuliyollal] The For'ard Cabins",
+                      "[Tuliyollal] Bayside Bevy Marketplace",
+                      "[Tuliyollal] Vollok Shoonsa",
+                      "[Tuliyollal] Wachumeqimeqi",
+                      "[Tuliyollal] Brightploom Post",
+                      "[Tuliyollal] Arch of the Dawn (Urqopacha)",
+                      "[Tuliyollal] Arch of the Dawn (Kozama'uka)",
+                      "[Tuliyollal] Ihuykatumu (Kozama'uka)",
+                      "[Tuliyollal] Dirigible Landing (Yak T'el)",
+                      "[Tuliyollal] Xak Tural Skygate (Shaaloani)",
+                      "[Solution Nine] Aetheryte Plaza",
+                      "[Solution Nine] Information Center",
+                      "[Solution Nine] True Vue",
+                      "[Solution Nine] Neon Stein",
+                      "[Solution Nine] The Arcadion",
+                      "[Solution Nine] Resolution",
+                      "[Solution Nine] Nexus Arcade",
+                      "[Solution Nine] Residential Sector",
+                      "[Solution Nine] Scanning Port Nine (Heritage Found)"
                     ]
                   }
                 },
                 },
                 "SkipIf": {
                   "type": "array",
-                  "description": "TODO Not implemented",
                   "items": {
                     "type": "string",
                     "enum": [
index 76a06550a37902abe94ca4b9f21325ed789781c2..d85f7479be96e2451a672f3139ac01c7108440fa 100644 (file)
@@ -118,6 +118,30 @@ public sealed class AethernetShortcutConverter : JsonConverter<AethernetShortcut
         { EAetheryteLocation.RadzAtHanKama, "[Radz-at-Han] Kama" },
         { EAetheryteLocation.RadzAtHanHighCrucible, "[Radz-at-Han] The High Crucible of Al-Kimiya" },
         { EAetheryteLocation.RadzAtHanGateOfFirstSight, "[Radz-at-Han] The Gate of First Sight (Thavnair)" },
+
+        { EAetheryteLocation.Tuliyollal, "[Tuliyollal] Aetheryte Plaza" },
+        { EAetheryteLocation.TuliyollalDirigibleLanding, "[Tuliyollal] Dirigible Landing" },
+        { EAetheryteLocation.TuliyollalTheResplendentQuarter, "[Tuliyollal] The Resplendent Quarter" },
+        { EAetheryteLocation.TuliyollalTheForardCabins, "[Tuliyollal] The For'ard Cabins" },
+        { EAetheryteLocation.TuliyollalBaysideBevyMarketplace, "[Tuliyollal] Bayside Bevy Marketplace" },
+        { EAetheryteLocation.TuliyollalVollokShoonsa, "[Tuliyollal] Vollok Shoonsa" },
+        { EAetheryteLocation.TuliyollalWachumeqimeqi, "[Tuliyollal] Wachumeqimeqi" },
+        { EAetheryteLocation.TuliyollalBrightploomPost, "[Tuliyollal] Brightploom Post" },
+        { EAetheryteLocation.TuliyollalArchOfTheDawnUrqopacha, "[Tuliyollal] Arch of the Dawn (Urqopacha)" },
+        { EAetheryteLocation.TuliyollalArchOfTheDawnKozamauka, "[Tuliyollal] Arch of the Dawn (Kozama'uka)" },
+        { EAetheryteLocation.TuliyollalIhuykatumu, "[Tuliyollal] Ihuykatumu (Kozama'uka)" },
+        { EAetheryteLocation.TuliyollalDirigibleLandingYakTel, "[Tuliyollal] Dirigible Landing (Yak T'el)" },
+        { EAetheryteLocation.TuliyollalXakTuralSkygate, "[Tuliyollal] Xak Tural Skygate (Shaaloani)" },
+
+        { EAetheryteLocation.SolutionNine, "[Solution Nine] Aetheryte Plaza" },
+        { EAetheryteLocation.SolutionNineInformationCenter, "[Solution Nine] Information Center" },
+        { EAetheryteLocation.SolutionNineTrueVue, "[Solution Nine] True Vue" },
+        { EAetheryteLocation.SolutionNineNeonStein, "[Solution Nine] Neon Stein" },
+        { EAetheryteLocation.SolutionNineTheArcadion, "[Solution Nine] The Arcadion" },
+        { EAetheryteLocation.SolutionNineResolution, "[Solution Nine] Resolution" },
+        { EAetheryteLocation.SolutionNineNexusArcade, "[Solution Nine] Nexus Arcade" },
+        { EAetheryteLocation.SolutionNineResidentialSector, "[Solution Nine] Residential Sector" },
+        { EAetheryteLocation.SolutionNineScanningPortNine, "[Solution Nine] Scanning Port Nine (Heritage Found)" },
     };
 
     private static readonly Dictionary<string, EAetheryteLocation> StringToEnum =
index 80b92f7d32d5e2be8e24878ea99cae0d467a4b4f..ab0dd549d94ab602a091c3b586db250f12c1e2aa 100644 (file)
@@ -7,7 +7,6 @@ public sealed class AetheryteConverter() : EnumConverter<EAetheryteLocation>(Val
     private static readonly Dictionary<EAetheryteLocation, string> Values = new()
     {
         { EAetheryteLocation.Gridania, "Gridania" },
-
         { EAetheryteLocation.CentralShroudBentbranchMeadows, "Central Shroud - Bentbranch Meadows" },
         { EAetheryteLocation.EastShroudHawthorneHut, "East Shroud - Hawthorne Hut" },
         { EAetheryteLocation.SouthShroudQuarrymill, "South Shroud - Quarrymill" },
@@ -101,7 +100,26 @@ public sealed class AetheryteConverter() : EnumConverter<EAetheryteLocation>(Val
         { EAetheryteLocation.ElpisPoietenOikos, "Elpis - Poieten Oikos" },
         { EAetheryteLocation.UltimaThuleReahTahra, "Ultima Thule - Reah Tahra" },
         { EAetheryteLocation.UltimaThuleAbodeOfTheEa, "Ultima Thule - Abode of the Ea" },
-        { EAetheryteLocation.UltimaThuleBaseOmicron, "Ultima Thule - Base Omicron" }
+        { EAetheryteLocation.UltimaThuleBaseOmicron, "Ultima Thule - Base Omicron" },
+
+        { EAetheryteLocation.Tuliyollal, "Tuliyollal" },
+        { EAetheryteLocation.SolutionNine, "Solution Nine" },
+        { EAetheryteLocation.UrqopachaWachunpelo, "Urqopacha - Wachunpelo" },
+        { EAetheryteLocation.UrqopachaWorlarsEcho, "Urqopacha - Worlar's Echo" },
+        { EAetheryteLocation.KozamaukaOkHanu, "Kozama'uka - Ok'hanu" },
+        { EAetheryteLocation.KozamaukaManyFires, "Kozama'uka - Many Fires" },
+        { EAetheryteLocation.KozamaukaEarthenshire, "Kozama'uka - Earthenshire" },
+        { EAetheryteLocation.YakTelIqBraax, "Yak T'el - Iq Br'aax" },
+        { EAetheryteLocation.YakTelMamook, "Yak T'el - Mamook" },
+        { EAetheryteLocation.ShaaloaniHhusatahwi, "Shaaloani - Hhusatahwi" },
+        { EAetheryteLocation.ShaaloaniShesheneweziSprings, "Shaaloani - Sheshenewezi Springs" },
+        { EAetheryteLocation.ShaaloaniMehwahhetsoan, "Shaaloani - Mehwahhetsoan" },
+        { EAetheryteLocation.HeritageFoundYyasulaniStation, "Heritage Found - Yyasulani Station" },
+        { EAetheryteLocation.HeritageFoundTheOutskirts, "Heritage Found - The Outskirts" },
+        { EAetheryteLocation.HeritageFoundElectropeStrike, "Heritage Found - Electrope Strike" },
+        { EAetheryteLocation.LivingMemoryLeynodeMnemo, "Living Memory - Leynode Mnemo" },
+        { EAetheryteLocation.LivingMemoryLeynodePyro, "Living Memory - Leynode Pyro" },
+        { EAetheryteLocation.LivingMemoryLeynodeAero, "Living Memory - Leynode Aero" },
     };
 
     public static bool IsLargeAetheryte(EAetheryteLocation aetheryte) => Values.ContainsKey(aetheryte);
index a49a471e97c29e2c6cc0179d5fb6ce4eb4390b13..dc51f5752e9a3d018167488698eab1e571eb2f2c 100644 (file)
@@ -205,5 +205,47 @@ public enum EAetheryteLocation
     ElpisPoietenOikos = 178,
     UltimaThuleReahTahra = 179,
     UltimaThuleAbodeOfTheEa = 180,
-    UltimaThuleBaseOmicron = 181
+    UltimaThuleBaseOmicron = 181,
+
+    Tuliyollal = 216,
+
+    TuliyollalDirigibleLanding = 218,
+    TuliyollalTheResplendentQuarter = 219,
+    TuliyollalTheForardCabins = 220,
+    TuliyollalBaysideBevyMarketplace = 221,
+    TuliyollalVollokShoonsa = 222,
+    TuliyollalWachumeqimeqi = 223,
+    TuliyollalBrightploomPost = 224,
+    TuliyollalArchOfTheDawnUrqopacha = 225,
+    TuliyollalArchOfTheDawnKozamauka = 226,
+    TuliyollalIhuykatumu = 227,
+    TuliyollalDirigibleLandingYakTel = 228,
+    TuliyollalXakTuralSkygate = 229,
+
+    SolutionNine = 217,
+    SolutionNineInformationCenter = 230,
+    SolutionNineTrueVue = 231,
+    SolutionNineNeonStein = 232,
+    SolutionNineTheArcadion = 233,
+    SolutionNineResolution = 234,
+    SolutionNineNexusArcade = 235,
+    SolutionNineResidentialSector = 236,
+    SolutionNineScanningPortNine = 237,
+
+    UrqopachaWachunpelo = 200,
+    UrqopachaWorlarsEcho = 201,
+    KozamaukaOkHanu = 202,
+    KozamaukaManyFires = 203,
+    KozamaukaEarthenshire = 204,
+    YakTelIqBraax = 205,
+    YakTelMamook = 206,
+    ShaaloaniHhusatahwi = 207,
+    ShaaloaniShesheneweziSprings = 208,
+    ShaaloaniMehwahhetsoan = 209,
+    HeritageFoundYyasulaniStation = 210,
+    HeritageFoundTheOutskirts = 211,
+    HeritageFoundElectropeStrike = 212,
+    LivingMemoryLeynodeMnemo = 213,
+    LivingMemoryLeynodePyro = 214,
+    LivingMemoryLeynodeAero = 215,
 }
index 5d7abf3f66e1370ecc32c715be15c12c0fe7dc21..26ca9a2232cb706234502d47619832191332a37c 100644 (file)
@@ -65,7 +65,7 @@ internal sealed unsafe class ChatFunctions
     /// <exception cref="InvalidOperationException">If the signature for this function could not be found</exception>
     private void SendMessageUnsafe(byte[] message)
     {
-        var uiModule = (IntPtr)Framework.Instance()->GetUiModule();
+        var uiModule = (IntPtr)Framework.Instance()->GetUIModule();
 
         using var payload = new ChatPayload(message);
         var mem1 = Marshal.AllocHGlobal(400);
@@ -141,7 +141,7 @@ internal sealed unsafe class ChatFunctions
 
     public void UseEmote(uint dataId, EEmote emote)
     {
-        GameObject? gameObject = _gameFunctions.FindObjectByDataId(dataId);
+        IGameObject? gameObject = _gameFunctions.FindObjectByDataId(dataId);
         if (gameObject != null)
         {
             _targetManager.Target = gameObject;
@@ -157,7 +157,7 @@ internal sealed unsafe class ChatFunctions
     private static class Signatures
     {
         internal const string SendChat = "48 89 5C 24 ?? 57 48 83 EC 20 48 8B FA 48 8B D9 45 84 C9";
-        internal const string SanitiseString = "E8 ?? ?? ?? ?? EB 0A 48 8D 4C 24 ?? E8 ?? ?? ?? ?? 48 8D 8D";
+        internal const string SanitiseString = "E8 ?? ?? ?? ?? 48 8D 4C 24 ?? 0F B6 F0 E8 ?? ?? ?? ?? 48 8D 4D C0";
     }
 
     [StructLayout(LayoutKind.Explicit)]
index dc9ce459bdb9e798f603b92e9811edda8619ed2a..b87afa622a6bb9e0d7c518964918628d54789fec 100644 (file)
@@ -9,6 +9,7 @@ using Dalamud.Game.ClientState.Conditions;
 using Dalamud.Game.ClientState.Objects.Enums;
 using Dalamud.Game.ClientState.Objects.SubKinds;
 using Dalamud.Game.ClientState.Objects.Types;
+using Dalamud.Plugin.Ipc.Exceptions;
 using Dalamud.Plugin.Services;
 using FFXIVClientStructs.FFXIV.Client.Game;
 using FFXIVClientStructs.FFXIV.Client.Game.Control;
@@ -43,8 +44,36 @@ internal sealed class MovementController : IDisposable
         _logger = logger;
     }
 
-    public bool IsNavmeshReady => _navmeshIpc.IsReady;
-    public bool IsPathRunning => _navmeshIpc.IsPathRunning;
+    public bool IsNavmeshReady
+    {
+        get
+        {
+            try
+            {
+                return _navmeshIpc.IsReady;
+            }
+            catch (IpcNotReadyError)
+            {
+                return false;
+            }
+        }
+    }
+
+    public bool IsPathRunning
+    {
+        get
+        {
+            try
+            {
+                return _navmeshIpc.IsPathRunning;
+            }
+            catch (IpcNotReadyError)
+            {
+                return false;
+            }
+        }
+    }
+
     public bool IsPathfinding => _pathfindTask is { IsCompleted: false };
     public DestinationData? Destination { get; set; }
     public DateTime MovementStartedAt { get; private set; } = DateTime.MaxValue;
@@ -121,8 +150,8 @@ internal sealed class MovementController : IDisposable
                 }
                 else if (Destination.DataId != null)
                 {
-                    GameObject? gameObject = _gameFunctions.FindObjectByDataId(Destination.DataId.Value);
-                    if (gameObject is Character or EventObj)
+                    IGameObject? gameObject = _gameFunctions.FindObjectByDataId(Destination.DataId.Value);
+                    if (gameObject is ICharacter or IEventObj)
                     {
                         if (Math.Abs(localPlayerPosition.Y - gameObject.Position.Y) < 1.95f)
                             Stop();
index 9c919258c66dfefe70d81b16e56c4c2a8e8940ab..501e44d6c2f2bd35499508fc5f27508e7819a420 100644 (file)
@@ -14,13 +14,13 @@ namespace Questionable.Controller;
 
 internal sealed class QuestRegistry
 {
-    private readonly DalamudPluginInterface _pluginInterface;
+    private readonly IDalamudPluginInterface _pluginInterface;
     private readonly IDataManager _dataManager;
     private readonly ILogger<QuestRegistry> _logger;
 
     private readonly Dictionary<ushort, Quest> _quests = new();
 
-    public QuestRegistry(DalamudPluginInterface pluginInterface, IDataManager dataManager,
+    public QuestRegistry(IDalamudPluginInterface pluginInterface, IDataManager dataManager,
         ILogger<QuestRegistry> logger)
     {
         _pluginInterface = pluginInterface;
index 4cd51559da7e5c20e78715d9821d8fcf18cc87c7..8388df8f82e545d1cc11600bf1707f5208f25188 100644 (file)
@@ -161,7 +161,7 @@ internal static class Move
 
         public ETaskResult Update()
         {
-            GameObject? gameObject = gameFunctions.FindObjectByDataId(DataId);
+            IGameObject? gameObject = gameFunctions.FindObjectByDataId(DataId);
             if (gameObject == null ||
                 (gameObject.Position - clientState.LocalPlayer!.Position).Length() > StopDistance)
             {
index 865c171fe889ad8afadd1fc3d6d6f771ad56d3c9..22e339eb7d849f72fc3f6e5a2850b33546bf83ce 100644 (file)
@@ -82,7 +82,7 @@ internal static class EquipItem
                 return ETaskResult.StillRunning;
 
             if (_targetSlots.Any(x =>
-                    inventoryManager->GetInventorySlot(InventoryType.EquippedItems, x)->ItemID == _itemId))
+                    inventoryManager->GetInventorySlot(InventoryType.EquippedItems, x)->ItemId == _itemId))
                 return ETaskResult.TaskComplete;
 
             Equip();
@@ -100,7 +100,7 @@ internal static class EquipItem
             if (equippedContainer == null)
                 return false;
 
-            if (_targetSlots.Any(slot => equippedContainer->GetInventorySlot(slot)->ItemID == _itemId))
+            if (_targetSlots.Any(slot => equippedContainer->GetInventorySlot(slot)->ItemId == _itemId))
             {
                 logger.LogInformation("Already equipped {Item}, skipping step", _item.Name?.ToString());
                 return false;
@@ -119,12 +119,12 @@ internal static class EquipItem
                 for (ushort sourceSlot = 0; sourceSlot < sourceContainer->Size; sourceSlot++)
                 {
                     var sourceItem = sourceContainer->GetInventorySlot(sourceSlot);
-                    if (sourceItem == null || sourceItem->ItemID != _itemId)
+                    if (sourceItem == null || sourceItem->ItemId != _itemId)
                         continue;
 
                     // Move the item to the first available slot
                     ushort targetSlot = _targetSlots
-                        .Where(x => inventoryManager->GetInventorySlot(InventoryType.EquippedItems, x)->ItemID == 0)
+                        .Where(x => inventoryManager->GetInventorySlot(InventoryType.EquippedItems, x)->ItemId == 0)
                         .Concat(_targetSlots).First();
 
                     logger.LogInformation(
index de6701c13b5f56bf65acef0163bc8270db49874d..ea55513e6c4003db23ebf69601a117619fa10d0d 100644 (file)
@@ -59,7 +59,7 @@ internal static class Interact
 
         public bool Start()
         {
-            GameObject? gameObject = gameFunctions.FindObjectByDataId(DataId);
+            IGameObject? gameObject = gameFunctions.FindObjectByDataId(DataId);
             if (gameObject == null)
             {
                 logger.LogWarning("No game object with dataId {DataId}", DataId);
@@ -104,7 +104,7 @@ internal static class Interact
 
             if (!_interacted)
             {
-                GameObject? gameObject = gameFunctions.FindObjectByDataId(DataId);
+                IGameObject? gameObject = gameFunctions.FindObjectByDataId(DataId);
                 if (gameObject == null || !gameObject.IsTargetable || !HasAnyMarker(gameObject))
                     return ETaskResult.StillRunning;
 
@@ -116,7 +116,7 @@ internal static class Interact
             return ETaskResult.TaskComplete;
         }
 
-        private unsafe bool HasAnyMarker(GameObject gameObject)
+        private unsafe bool HasAnyMarker(IGameObject gameObject)
         {
             if (SkipMarkerCheck || gameObject.ObjectKind != ObjectKind.EventNpc)
                 return true;
index 509bae55c7ab615ac9e2244abba1bab3ecf3db94..996aa88643fa3c0dfce8f2e0d0415a65d91b579c 100644 (file)
@@ -10,7 +10,7 @@ namespace Questionable;
 
 internal sealed class DalamudInitializer : IDisposable
 {
-    private readonly DalamudPluginInterface _pluginInterface;
+    private readonly IDalamudPluginInterface _pluginInterface;
     private readonly IFramework _framework;
     private readonly ICommandManager _commandManager;
     private readonly QuestController _questController;
@@ -20,7 +20,7 @@ internal sealed class DalamudInitializer : IDisposable
     private readonly QuestWindow _questWindow;
     private readonly ConfigWindow _configWindow;
 
-    public DalamudInitializer(DalamudPluginInterface pluginInterface, IFramework framework,
+    public DalamudInitializer(IDalamudPluginInterface pluginInterface, IFramework framework,
         ICommandManager commandManager, QuestController questController, MovementController movementController,
         GameUiController gameUiController, NavigationShortcutController navigationShortcutController,
         WindowSystem windowSystem, QuestWindow questWindow, DebugOverlay debugOverlay, ConfigWindow configWindow)
index cebbd2839d54921684d0b47e5868da592c2709e9..e69adc4a3899cea5e61c3bf112d3c04993f51a51 100644 (file)
@@ -28,7 +28,7 @@ internal sealed class AetheryteData
         TerritoryIds = territoryIds.AsReadOnly();
 
         TownTerritoryIds = dataManager.GetExcelSheet<TerritoryType>()!
-            .Where(x => x.RowId > 0 && !string.IsNullOrEmpty(x.Name) && x.TerritoryIntendedUse == 0)
+            .Where(x => x.RowId > 0 && !string.IsNullOrEmpty(x.Name) && x.TerritoryIntendedUse.Row == 0)
             .Select(x => (ushort)x.RowId)
             .ToList();
     }
@@ -214,6 +214,41 @@ internal sealed class AetheryteData
                 { EAetheryteLocation.UltimaThuleReahTahra, new(-544.152f, 74.32666f, 269.6421f) },
                 { EAetheryteLocation.UltimaThuleAbodeOfTheEa, new(64.286255f, 272.48022f, -657.49603f) },
                 { EAetheryteLocation.UltimaThuleBaseOmicron, new(489.2804f, 437.5829f, 333.63843f) },
+
+                { EAetheryteLocation.Tuliyollal, new(-24.093994f, 0.77819824f, 7.583679f) },
+                { EAetheryteLocation.TuliyollalDirigibleLanding, new(-413.68738f, 2.9754639f, -45.975464f) },
+                { EAetheryteLocation.TuliyollalTheResplendentQuarter, new(-187.1214f, 39.93274f, 6.088318f) },
+                { EAetheryteLocation.TuliyollalTheForardCabins, new(-149.73682f, -15.030151f, 198.90125f) },
+                { EAetheryteLocation.TuliyollalBaysideBevyMarketplace, new(-14.999634f, -10.025269f, 135.57642f) },
+                { EAetheryteLocation.TuliyollalVollokShoonsa, new(-99.13794f, 100.72473f, -222.03406f) },
+                { EAetheryteLocation.TuliyollalWachumeqimeqi, new(166.27747f, -17.990417f, 38.742676f) },
+                { EAetheryteLocation.TuliyollalBrightploomPost, new(71.7937f, 47.074097f, -333.21124f) },
+
+                { EAetheryteLocation.SolutionNine, new(-0.015319824f, 8.987488f, -0.015319824f) },
+                { EAetheryteLocation.SolutionNineInformationCenter, new(-30.441833f, -6.0579224f, 209.3385f) },
+                { EAetheryteLocation.SolutionNineTrueVue, new(382.6809f, 59.983154f, 76.67651f) },
+                { EAetheryteLocation.SolutionNineNeonStein, new(258.28943f, 50.736206f, 148.72961f) },
+                { EAetheryteLocation.SolutionNineTheArcadion, new(374.77686f, 60.01367f, 325.67322f) },
+                { EAetheryteLocation.SolutionNineResolution, new(-32.059265f, 38.04065f, -345.2354f) },
+                { EAetheryteLocation.SolutionNineNexusArcade, new(-160.05188f, -0.015319824f, 21.591492f) },
+                { EAetheryteLocation.SolutionNineResidentialSector, new(-378.13385f, 13.992493f, 136.49194f) },
+
+                { EAetheryteLocation.UrqopachaWachunpelo, new(332.96704f, -160.11298f, -416.22034f) },
+                { EAetheryteLocation.UrqopachaWorlarsEcho, new(465.62903f, 114.94617f, 634.9126f) },
+                { EAetheryteLocation.KozamaukaOkHanu, new(-169.51251f, 6.576599f, -479.42322f) },
+                { EAetheryteLocation.KozamaukaManyFires, new(541.16125f, 117.41809f, 203.60107f) },
+                { EAetheryteLocation.KozamaukaEarthenshire, new(-477.53113f, 124.04053f, 311.32983f) },
+                { EAetheryteLocation.YakTelIqBraax, new(-397.05505f, 23.5141f, -431.93713f) },
+                { EAetheryteLocation.YakTelMamook, new(721.40076f, -132.31104f, 526.1769f) },
+                { EAetheryteLocation.ShaaloaniHhusatahwi, new(386.40417f, -0.19836426f, 467.61267f) },
+                { EAetheryteLocation.ShaaloaniShesheneweziSprings, new(-291.70673f, 19.08899f, -114.54956f) },
+                { EAetheryteLocation.ShaaloaniMehwahhetsoan, new(311.36023f, -14.175659f, -567.74243f) },
+                { EAetheryteLocation.HeritageFoundYyasulaniStation, new(514.6105f, 145.86096f, 207.56836f) },
+                { EAetheryteLocation.HeritageFoundTheOutskirts, new(-223.0412f, 31.937134f, -584.03906f) },
+                { EAetheryteLocation.HeritageFoundElectropeStrike, new(-219.53156f, 32.913696f, 120.77515f) },
+                { EAetheryteLocation.LivingMemoryLeynodeMnemo, new(-0.22894287f, 57.175537f, 796.9634f) },
+                { EAetheryteLocation.LivingMemoryLeynodePyro, new(657.98413f, 28.976807f, -284.01617f) },
+                { EAetheryteLocation.LivingMemoryLeynodeAero, new(-255.26825f, 59.433838f, -397.6654f) },
             }
             .AsReadOnly();
 
index 2ba2a35b95bb4e6e305b88c5f988d12ed6282c9c..deab3a247b401c164f902f8d0ffd89ea4ea9a38a 100644 (file)
@@ -10,7 +10,7 @@ internal sealed class LifestreamIpc
     private readonly AetheryteData _aetheryteData;
     private readonly ICallGateSubscriber<string, bool> _aethernetTeleport;
 
-    public LifestreamIpc(DalamudPluginInterface pluginInterface, AetheryteData aetheryteData)
+    public LifestreamIpc(IDalamudPluginInterface pluginInterface, AetheryteData aetheryteData)
     {
         _aetheryteData = aetheryteData;
         _aethernetTeleport = pluginInterface.GetIpcSubscriber<string, bool>("Lifestream.AethernetTeleport");
index cc7bbdd46439be5cf2d30aabe3613eb37aeea80c..eb8c5b31a6ccc479e61fcb0dabae90cf89f28ed0 100644 (file)
@@ -20,7 +20,7 @@ internal sealed class NavmeshIpc
     private readonly ICallGateSubscriber<float, object> _pathSetTolerance;
     private readonly ICallGateSubscriber<Vector3, bool, float, Vector3?> _queryPointOnFloor;
 
-    public NavmeshIpc(DalamudPluginInterface pluginInterface)
+    public NavmeshIpc(IDalamudPluginInterface pluginInterface)
     {
         _isNavReady = pluginInterface.GetIpcSubscriber<bool>("vnavmesh.Nav.IsReady");
         _navPathfind =
index a9d20c03e7f9a689e76ff8171b1483cbb9ab1b41..820e0e9545f6c0e2830e62e1d6f162fce75bc7c4 100644 (file)
@@ -7,10 +7,10 @@ namespace Questionable.External;
 
 internal sealed class YesAlreadyIpc : IDisposable
 {
-    private readonly DalamudPluginInterface _pluginInterface;
+    private readonly IDalamudPluginInterface _pluginInterface;
     private readonly IPluginLog _pluginLog;
 
-    public YesAlreadyIpc(DalamudPluginInterface pluginInterface, IPluginLog pluginLog)
+    public YesAlreadyIpc(IDalamudPluginInterface pluginInterface, IPluginLog pluginLog)
     {
         _pluginInterface = pluginInterface;
         _pluginLog = pluginLog;
index a1e974924fc9b34dd3651587c2b64409e902b340..e1777259db40b4d651d7b915852211627f78a135 100644 (file)
@@ -6,6 +6,7 @@ using System.Numerics;
 using Dalamud.Game;
 using Dalamud.Game.ClientState.Conditions;
 using Dalamud.Game.ClientState.Objects;
+using Dalamud.Game.ClientState.Objects.Types;
 using Dalamud.Memory;
 using Dalamud.Plugin.Services;
 using Dalamud.Utility;
@@ -25,8 +26,6 @@ using Questionable.Model.V1;
 using BattleChara = FFXIVClientStructs.FFXIV.Client.Game.Character.BattleChara;
 using ContentFinderCondition = Lumina.Excel.GeneratedSheets.ContentFinderCondition;
 using ContentTalk = Lumina.Excel.GeneratedSheets.ContentTalk;
-using Emote = Lumina.Excel.GeneratedSheets.Emote;
-using GameObject = Dalamud.Game.ClientState.Objects.Types.GameObject;
 using GrandCompany = FFXIVClientStructs.FFXIV.Client.UI.Agent.GrandCompany;
 using Quest = Questionable.Model.Quest;
 using TerritoryType = Lumina.Excel.GeneratedSheets.TerritoryType;
@@ -140,17 +139,17 @@ internal sealed unsafe class GameFunctions
             // do the MSQ; if a side quest is the first item do that side quest.
             //
             // If no quests are marked as 'priority', accepting a new quest adds it to the top of the list.
-            for (int i = questManager->TrackedQuestsSpan.Length - 1; i >= 0; --i)
+            for (int i = questManager->TrackedQuests.Length - 1; i >= 0; --i)
             {
                 ushort currentQuest;
-                var trackedQuest = questManager->TrackedQuestsSpan[i];
+                var trackedQuest = questManager->TrackedQuests[i];
                 switch (trackedQuest.QuestType)
                 {
                     default:
                         continue;
 
                     case 1: // normal quest
-                        currentQuest = questManager->NormalQuestsSpan[trackedQuest.Index].QuestId;
+                        currentQuest = questManager->NormalQuests[trackedQuest.Index].QuestId;
                         break;
                 }
 
@@ -284,7 +283,7 @@ internal sealed unsafe class GameFunctions
                playerState->IsAetherCurrentUnlocked(aetherCurrentId);
     }
 
-    public GameObject? FindObjectByDataId(uint dataId)
+    public IGameObject? FindObjectByDataId(uint dataId)
     {
         foreach (var gameObject in _objectTable)
         {
@@ -300,15 +299,14 @@ internal sealed unsafe class GameFunctions
 
     public bool InteractWith(uint dataId)
     {
-        GameObject? gameObject = FindObjectByDataId(dataId);
+        IGameObject? gameObject = FindObjectByDataId(dataId);
         if (gameObject != null)
         {
-            _logger.LogInformation("Setting target with {DataId} to {ObjectId}", dataId, gameObject.ObjectId);
+            _logger.LogInformation("Setting target with {DataId} to {ObjectId}", dataId, gameObject.EntityId);
             _targetManager.Target = null;
             _targetManager.Target = gameObject;
 
-            long result = (long)TargetSystem.Instance()->InteractWithObject(
-                (FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject*)gameObject.Address, false);
+            long result = (long)TargetSystem.Instance()->InteractWithObject((GameObject*)gameObject.Address, false);
 
             _logger.LogInformation("Interact result: {Result}", result);
             return result > 0;
@@ -328,7 +326,7 @@ internal sealed unsafe class GameFunctions
 
     public bool UseItem(uint dataId, uint itemId)
     {
-        GameObject? gameObject = FindObjectByDataId(dataId);
+        IGameObject? gameObject = FindObjectByDataId(dataId);
         if (gameObject != null)
         {
             _targetManager.Target = gameObject;
@@ -343,10 +341,10 @@ internal sealed unsafe class GameFunctions
 
     public bool UseItemOnGround(uint dataId, uint itemId)
     {
-        GameObject? gameObject = FindObjectByDataId(dataId);
+        IGameObject? gameObject = FindObjectByDataId(dataId);
         if (gameObject != null)
         {
-            var position = (FFXIVClientStructs.FFXIV.Common.Math.Vector3)gameObject.Position;
+            Vector3 position = gameObject.Position;
             return ActionManager.Instance()->UseActionLocation(ActionType.KeyItem, itemId, location: &position);
         }
 
@@ -355,7 +353,7 @@ internal sealed unsafe class GameFunctions
 
     public bool IsObjectAtPosition(uint dataId, Vector3 position, float distance)
     {
-        GameObject? gameObject = FindObjectByDataId(dataId);
+        IGameObject? gameObject = FindObjectByDataId(dataId);
         return gameObject != null && (gameObject.Position - position).Length() < distance;
     }
 
@@ -376,18 +374,16 @@ internal sealed unsafe class GameFunctions
 
     private bool HasCharacterStatusPreventingMountOrSprint()
     {
-        var gameObject = GameObjectManager.GetGameObjectByIndex(0);
-        if (gameObject != null && gameObject->ObjectKind == 1)
-        {
-            var battleChara = (BattleChara*)gameObject;
-            StatusManager* statusManager = battleChara->GetStatusManager;
-            return statusManager->HasStatus(565) ||
-                   statusManager->HasStatus(404) ||
-                   statusManager->HasStatus(2729) ||
-                   statusManager->HasStatus(2730);
-        }
+        var localPlayer = _clientState.LocalPlayer;
+        if (localPlayer == null)
+            return false;
 
-        return false;
+        var battleChara = (BattleChara*)localPlayer.Address;
+        StatusManager* statusManager = battleChara->GetStatusManager();
+        return statusManager->HasStatus(565) ||
+               statusManager->HasStatus(404) ||
+               statusManager->HasStatus(2729) ||
+               statusManager->HasStatus(2730);
     }
 
     public bool Mount()
index 86530b51ad7b58868659ca3f775b87a0d6d37e58..3c0699b0ff1e4fc2e5602d8566de02665dc23430 100644 (file)
@@ -1,62 +1,20 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Dalamud.NET.Sdk/9.0.2">
     <PropertyGroup>
-        <TargetFramework>net8.0-windows</TargetFramework>
-        <Version>0.20</Version>
-        <LangVersion>12</LangVersion>
-        <Nullable>enable</Nullable>
-        <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
-        <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
-        <AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
+        <Version>1.0</Version>
         <OutputPath>dist</OutputPath>
-        <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
         <PathMap Condition="$(SolutionDir) != ''">$(SolutionDir)=X:\</PathMap>
-        <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
-        <DebugType>portable</DebugType>
     </PropertyGroup>
 
-    <PropertyGroup>
-        <DalamudLibPath>$(appdata)\XIVLauncher\addon\Hooks\dev\</DalamudLibPath>
-    </PropertyGroup>
-
-    <PropertyGroup Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Linux)))'">
-        <DalamudLibPath>$(DALAMUD_HOME)/</DalamudLibPath>
-    </PropertyGroup>
+    <Import Project="..\LLib\LLib.targets"/>
+    <Import Project="..\LLib\RenameZip.targets"/>
 
     <ItemGroup>
         <PackageReference Include="Dalamud.Extensions.MicrosoftLogging" Version="4.0.1"/>
-        <PackageReference Include="DalamudPackager" Version="2.1.12"/>
         <PackageReference Include="JetBrains.Annotations" Version="2023.3.0" ExcludeAssets="runtime"/>
         <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0"/>
         <PackageReference Include="System.Text.Json" Version="8.0.3"/>
     </ItemGroup>
 
-    <ItemGroup>
-        <Reference Include="Dalamud">
-            <HintPath>$(DalamudLibPath)Dalamud.dll</HintPath>
-            <Private>false</Private>
-        </Reference>
-        <Reference Include="ImGui.NET">
-            <HintPath>$(DalamudLibPath)ImGui.NET.dll</HintPath>
-            <Private>false</Private>
-        </Reference>
-        <Reference Include="Lumina">
-            <HintPath>$(DalamudLibPath)Lumina.dll</HintPath>
-            <Private>false</Private>
-        </Reference>
-        <Reference Include="Lumina.Excel">
-            <HintPath>$(DalamudLibPath)Lumina.Excel.dll</HintPath>
-            <Private>false</Private>
-        </Reference>
-        <Reference Include="Newtonsoft.Json">
-            <HintPath>$(DalamudLibPath)Newtonsoft.Json.dll</HintPath>
-            <Private>false</Private>
-        </Reference>
-        <Reference Include="FFXIVClientStructs">
-            <HintPath>$(DalamudLibPath)FFXIVClientStructs.dll</HintPath>
-            <Private>false</Private>
-        </Reference>
-    </ItemGroup>
-
     <ItemGroup>
         <ProjectReference Include="..\LLib\LLib.csproj"/>
         <ProjectReference Include="..\Questionable.Model\Questionable.Model.csproj"/>
index 96d633d8bd3bacf11441d107da67fa7e665a07da..2b8e07a603e0744aad4141628f299f2cfab3e4e7 100644 (file)
@@ -7,7 +7,6 @@ using Dalamud.Interface.Windowing;
 using Dalamud.Plugin;
 using Dalamud.Plugin.Services;
 using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.DependencyInjection.Extensions;
 using Microsoft.Extensions.Logging;
 using Questionable.Controller;
 using Questionable.Controller.Steps;
@@ -25,7 +24,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin
 {
     private readonly ServiceProvider? _serviceProvider;
 
-    public QuestionablePlugin(DalamudPluginInterface pluginInterface,
+    public QuestionablePlugin(IDalamudPluginInterface pluginInterface,
         IClientState clientState,
         ITargetManager targetManager,
         IFramework framework,
index 4262f39cc4b191ca6aff5a19be734cdff7b78b90..48ef339f38fdca2e5e5410a8605f7d320fee51e4 100644 (file)
@@ -13,7 +13,7 @@ namespace Questionable.Windows;
 
 internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig
 {
-    private readonly DalamudPluginInterface _pluginInterface;
+    private readonly IDalamudPluginInterface _pluginInterface;
     private readonly Configuration _configuration;
 
     private readonly uint[] _mountIds;
@@ -23,7 +23,7 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig
         ["None (manually pick quest)", "Maelstrom", "Twin Adder" /*, "Immortal Flames"*/];
 
     [SuppressMessage("Performance", "CA1861", Justification = "One time initialization")]
-    public ConfigWindow(DalamudPluginInterface pluginInterface, Configuration configuration, IDataManager dataManager)
+    public ConfigWindow(IDalamudPluginInterface pluginInterface, Configuration configuration, IDataManager dataManager)
         : base("Config - Questionable###QuestionableConfig", ImGuiWindowFlags.AlwaysAutoResize)
     {
         _pluginInterface = pluginInterface;
index 665a158b836f2a4efe18a1732951444a46414cef..0126f18094b6e4eb151455bc55c2853137d947e0 100644 (file)
@@ -26,7 +26,7 @@ namespace Questionable.Windows;
 
 internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
 {
-    private readonly DalamudPluginInterface _pluginInterface;
+    private readonly IDalamudPluginInterface _pluginInterface;
     private readonly MovementController _movementController;
     private readonly QuestController _questController;
     private readonly GameFunctions _gameFunctions;
@@ -40,7 +40,7 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
     private readonly QuestRegistry _questRegistry;
     private readonly ILogger<QuestWindow> _logger;
 
-    public QuestWindow(DalamudPluginInterface pluginInterface,
+    public QuestWindow(IDalamudPluginInterface pluginInterface,
         MovementController movementController,
         QuestController questController,
         GameFunctions gameFunctions,