Rough Update for EW_C/D ('Gateway of the Gods' to 'At Worlds End')
authorLiza Carvelli <liza@carvel.li>
Tue, 28 May 2024 20:24:06 +0000 (22:24 +0200)
committerLiza Carvelli <liza@carvel.li>
Tue, 28 May 2024 20:24:06 +0000 (22:24 +0200)
32 files changed:
Questionable/Controller/MovementController.cs
Questionable/Controller/QuestController.cs
Questionable/GameFunctions.cs
Questionable/Model/V1/QuestStep.cs
Questionable/QuestPaths/Endwalker-B-Garlemald/4395_Gateway of the Gods.json
Questionable/QuestPaths/Endwalker-B-Garlemald/4396_A Trip to the Moon.json
Questionable/QuestPaths/Endwalker-B-Garlemald/4397_Sea of Sorrow.json
Questionable/QuestPaths/Endwalker-B-Garlemald/4398_The Martyr.json
Questionable/QuestPaths/Endwalker-C-MareLamentorum/4399_In_Shadows_Wake.json
Questionable/QuestPaths/Endwalker-C-MareLamentorum/4400_Helping Hands.json
Questionable/QuestPaths/Endwalker-C-MareLamentorum/4401_A Harey Situation.json
Questionable/QuestPaths/Endwalker-C-MareLamentorum/4402_A Taste of the Moon.json
Questionable/QuestPaths/Endwalker-C-MareLamentorum/4403_Styled a Hero.json
Questionable/QuestPaths/Endwalker-C-MareLamentorum/4404_Alls Vale That Endsvale.json
Questionable/QuestPaths/Endwalker-C-MareLamentorum/4405_Back to Old Tricks.json
Questionable/QuestPaths/Endwalker-C-MareLamentorum/4406_Settiing Things Straight.json
Questionable/QuestPaths/Endwalker-C-MareLamentorum/4407_Heart of the Matter.json
Questionable/QuestPaths/Endwalker-C-MareLamentorum/4408_Returning Home.json
Questionable/QuestPaths/Endwalker-D-Thavnair2/4409_Skies Aflame.json
Questionable/QuestPaths/Endwalker-D-Thavnair2/4410_The Blasphemy Unmasked.json
Questionable/QuestPaths/Endwalker-D-Thavnair2/4411_Amidst the Apocalypse.json
Questionable/QuestPaths/Endwalker-D-Thavnair2/4412_Beyond the Depths of Despair.json
Questionable/QuestPaths/Endwalker-D-Thavnair2/4413_That We Might Live.json
Questionable/QuestPaths/Endwalker-D-Thavnair2/4414_When All Hope Seems Lost.json
Questionable/QuestPaths/Endwalker-D-Thavnair2/4415_Warm Hearts, Rekindled Hopes.json
Questionable/QuestPaths/Endwalker-D-Thavnair2/4416_Simple Pleasures.json
Questionable/QuestPaths/Endwalker-D-Thavnair2/4417_Under His Wing.json
Questionable/QuestPaths/Endwalker-D-Thavnair2/4418_At Worlds End.json
Questionable/QuestPaths/Endwalker-E-Elpis/4419_Return to the Crystarium.json
Questionable/QuestSchema/schema_v1.json
Questionable/QuestionablePlugin.cs
Questionable/Windows/DebugWindow.cs

index 7d3d9f642ac4bd6973749106c11a99517ff91b0c..d376a3eaaec55ba73ab040c066b91dc34277b2b7 100644 (file)
@@ -6,6 +6,7 @@ using System.Numerics;
 using System.Threading;
 using System.Threading.Tasks;
 using Dalamud.Game.ClientState.Conditions;
+using Dalamud.Game.ClientState.Objects.Types;
 using Dalamud.Plugin.Services;
 using FFXIVClientStructs.FFXIV.Client.Game;
 using Questionable.External;
@@ -36,13 +37,11 @@ internal sealed class MovementController : IDisposable
     public bool IsNavmeshReady => _navmeshIpc.IsReady;
     public bool IsPathRunning => _navmeshIpc.IsPathRunning;
     public bool IsPathfinding => _pathfindTask is { IsCompleted: false };
-    public Vector3? Destination { get; private set; }
-    public float StopDistance { get; private set; }
-    public bool IsFlying { get; private set; }
+    public DestinationData? Destination { get; private set; }
 
     public void Update()
     {
-        if (_pathfindTask != null)
+        if (_pathfindTask != null && Destination != null)
         {
             if (_pathfindTask.IsCompletedSuccessfully)
             {
@@ -52,7 +51,7 @@ internal sealed class MovementController : IDisposable
 
                 var navPoints = _pathfindTask.Result.Skip(1).ToList();
                 Vector3 start = _clientState.LocalPlayer?.Position ?? navPoints[0];
-                if (IsFlying && !_condition[ConditionFlag.InFlight] && _condition[ConditionFlag.Mounted])
+                if (Destination.IsFlying && !_condition[ConditionFlag.InFlight] && _condition[ConditionFlag.Mounted])
                 {
                     if (IsOnFlightPath(start) || navPoints.Any(IsOnFlightPath))
                     {
@@ -62,7 +61,7 @@ internal sealed class MovementController : IDisposable
                         }
                     }
                 }
-                else if (!IsFlying && !_condition[ConditionFlag.Mounted] && navPoints.Count > 0 &&
+                else if (!Destination.IsFlying && !_condition[ConditionFlag.Mounted] && navPoints.Count > 0 &&
                          !_gameFunctions.HasStatusPreventingSprintOrMount())
                 {
                     float actualDistance = 0;
@@ -98,9 +97,22 @@ internal sealed class MovementController : IDisposable
         if (IsPathRunning && Destination != null)
         {
             Vector3 localPlayerPosition = _clientState.LocalPlayer?.Position ?? Vector3.Zero;
-            if ((localPlayerPosition - Destination.Value).Length() < StopDistance &&
-                Math.Abs(localPlayerPosition.Y - Destination.Value.Y) < 1.95f) // target is too far below you
-                Stop();
+            if ((localPlayerPosition - Destination.Position).Length() < Destination.StopDistance)
+            {
+                if (Destination.DataId != null)
+                {
+                    GameObject? gameObject = _gameFunctions.FindObjectByDataId(Destination.DataId.Value);
+                    if (gameObject != null && gameObject is Character)
+                    {
+                        if (Math.Abs(localPlayerPosition.Y - gameObject.Position.Y) < 1.95f)
+                            Stop();
+                    }
+                    else
+                        Stop();
+                }
+                else
+                    Stop();
+            }
         }
     }
 
@@ -110,29 +122,27 @@ internal sealed class MovementController : IDisposable
         return pointOnFloor != null && Math.Abs(pointOnFloor.Value.Y - p.Y) > 0.5f;
     }
 
-    private void PrepareNavigation(EMovementType type, Vector3 to, bool fly, float? stopDistance)
+    private void PrepareNavigation(EMovementType type, uint? dataId, Vector3 to, bool fly, float? stopDistance)
     {
         ResetPathfinding();
 
         _gameFunctions.ExecuteCommand("/automove off");
 
-        Destination = to;
-        StopDistance = stopDistance ?? (DefaultStopDistance - 0.2f);
-        IsFlying = fly;
+        Destination = new DestinationData(dataId, to, stopDistance ?? (DefaultStopDistance - 0.2f), fly);
     }
 
-    public void NavigateTo(EMovementType type, Vector3 to, bool fly, float? stopDistance = null)
+    public void NavigateTo(EMovementType type, uint? dataId, Vector3 to, bool fly, float? stopDistance = null)
     {
-        PrepareNavigation(type, to, fly, stopDistance);
+        PrepareNavigation(type, dataId, to, fly, stopDistance);
         _cancellationTokenSource = new();
         _cancellationTokenSource.CancelAfter(TimeSpan.FromSeconds(10));
         _pathfindTask =
             _navmeshIpc.Pathfind(_clientState.LocalPlayer!.Position, to, fly, _cancellationTokenSource.Token);
     }
 
-    public void NavigateTo(EMovementType type, List<Vector3> to, bool fly, float? stopDistance)
+    public void NavigateTo(EMovementType type, uint? dataId, List<Vector3> to, bool fly, float? stopDistance)
     {
-        PrepareNavigation(type, to.Last(), fly, stopDistance);
+        PrepareNavigation(type, dataId, to.Last(), fly, stopDistance);
         _navmeshIpc.MoveTo(to);
     }
 
@@ -164,4 +174,6 @@ internal sealed class MovementController : IDisposable
     {
         Stop();
     }
+
+    public sealed record DestinationData(uint? DataId, Vector3 Position, float StopDistance, bool IsFlying);
 }
index f699be61b9095195420464cb4bfb6cae73575f6a..3bc4b7ba390876d0c3becb9884c38568bccef9eb 100644 (file)
@@ -6,11 +6,10 @@ using System.IO;
 using System.Numerics;
 using System.Text.Json;
 using Dalamud.Game.ClientState.Conditions;
+using Dalamud.Game.ClientState.Objects.Types;
 using Dalamud.Plugin;
 using Dalamud.Plugin.Services;
 using FFXIVClientStructs.FFXIV.Client.Game;
-using FFXIVClientStructs.FFXIV.Client.Game.Object;
-using FFXIVClientStructs.FFXIV.Client.UI.Agent;
 using Questionable.Data;
 using Questionable.External;
 using Questionable.Model.V1;
@@ -49,6 +48,7 @@ internal sealed class QuestController
         _territoryData = new TerritoryData(dataManager);
 
         Reload();
+        _gameFunctions.QuestController = this;
     }
 
 
@@ -101,6 +101,8 @@ internal sealed class QuestController
     }
 #endif
 
+    public bool IsKnownQuest(ushort questId) => _quests.ContainsKey(questId);
+
     private void LoadFromDirectory(DirectoryInfo configDirectory)
     {
         foreach (FileInfo fileInfo in configDirectory.GetFiles("*.json"))
@@ -305,7 +307,9 @@ internal sealed class QuestController
 
         if (!CurrentQuest.StepProgress.AethernetShortcutUsed)
         {
-            if (step.AethernetShortcut != null)
+            if (step.AethernetShortcut != null &&
+                _gameFunctions.IsAetheryteUnlocked(step.AethernetShortcut.From) &&
+                _gameFunctions.IsAetheryteUnlocked(step.AethernetShortcut.To))
             {
                 EAetheryteLocation from = step.AethernetShortcut.From;
                 EAetheryteLocation to = step.AethernetShortcut.To;
@@ -325,7 +329,7 @@ internal sealed class QuestController
                         };
                     }
                     else
-                        _movementController.NavigateTo(EMovementType.Quest, _aetheryteData.Locations[from], false,
+                        _movementController.NavigateTo(EMovementType.Quest, null, _aetheryteData.Locations[from], false,
                             6.9f);
 
                     return;
@@ -333,7 +337,11 @@ internal sealed class QuestController
             }
         }
 
-        if (step.Position != null)
+        if (step.TargetTerritoryId == _clientState.TerritoryType)
+        {
+            // no more movement
+        }
+        else if (step.Position != null)
         {
             float distance;
             if (step.InteractionType == EInteractionType.WalkTo)
@@ -375,7 +383,7 @@ internal sealed class QuestController
 
                 if (actualDistance > distance)
                 {
-                    _movementController.NavigateTo(EMovementType.Quest, step.Position.Value,
+                    _movementController.NavigateTo(EMovementType.Quest, step.DataId, step.Position.Value,
                         step.Fly && _gameFunctions.IsFlyingUnlocked(_clientState.TerritoryType), distance);
                     return;
                 }
@@ -384,25 +392,54 @@ internal sealed class QuestController
             {
                 if (actualDistance > distance)
                 {
-                    _movementController.NavigateTo(EMovementType.Quest, [step.Position.Value],
+                    _movementController.NavigateTo(EMovementType.Quest, step.DataId, [step.Position.Value],
                         step.Fly && _gameFunctions.IsFlyingUnlocked(_clientState.TerritoryType), distance);
                     return;
                 }
             }
         }
+        else if (step.DataId != null && step.StopDistance != null)
+        {
+            GameObject? gameObject = _gameFunctions.FindObjectByDataId(step.DataId.Value);
+            if (gameObject == null ||
+                (gameObject.Position - _clientState.LocalPlayer!.Position).Length() > step.StopDistance)
+            {
+                return;
+            }
+        }
 
         switch (step.InteractionType)
         {
             case EInteractionType.Interact:
-            case EInteractionType.AttuneAethernetShard:
                 if (step.DataId != null)
                 {
+                    GameObject? gameObject = _gameFunctions.FindObjectByDataId(step.DataId.Value);
+                    if (gameObject == null)
+                        return;
+
+                    if (!gameObject.IsTargetable && _condition[ConditionFlag.Mounted])
+                    {
+                        _gameFunctions.Unmount();
+                        return;
+                    }
+
                     _gameFunctions.InteractWith(step.DataId.Value);
                     IncreaseStepCount();
                 }
 
                 break;
 
+            case EInteractionType.AttuneAethernetShard:
+                if (step.DataId != null)
+                {
+                    if (!_gameFunctions.IsAetheryteUnlocked((EAetheryteLocation)step.DataId.Value))
+                        _gameFunctions.InteractWith(step.DataId.Value);
+
+                    IncreaseStepCount();
+                }
+
+                break;
+
             case EInteractionType.AttuneAetheryte:
                 if (step.DataId != null)
                 {
@@ -433,23 +470,28 @@ internal sealed class QuestController
                 break;
 
             case EInteractionType.UseItem:
+                if (_gameFunctions.Unmount())
+                    return;
+
                 if (step is { DataId: not null, ItemId: not null })
                 {
-                    if (_gameFunctions.Unmount())
-                        return;
-
                     _gameFunctions.UseItem(step.DataId.Value, step.ItemId.Value);
                     IncreaseStepCount();
                 }
+                else if (step.ItemId != null)
+                {
+                    _gameFunctions.UseItem(step.ItemId.Value);
+                    IncreaseStepCount();
+                }
 
                 break;
 
             case EInteractionType.Combat:
+                if (_gameFunctions.Unmount())
+                    return;
+
                 if (step.EnemySpawnType != null)
                 {
-                    if (_gameFunctions.Unmount())
-                        return;
-
                     if (step.DataId != null && step.EnemySpawnType == EEnemySpawnType.AfterInteraction)
                         _gameFunctions.InteractWith(step.DataId.Value);
 
@@ -470,7 +512,7 @@ internal sealed class QuestController
 
             case EInteractionType.WaitForObjectAtPosition:
                 if (step is { DataId: not null, Position: not null } &&
-                    !_gameFunctions.IsObbjectAtPosition(step.DataId.Value, step.Position.Value))
+                    !_gameFunctions.IsObjectAtPosition(step.DataId.Value, step.Position.Value))
                 {
                     return;
                 }
index 180aa66d1aff917e178a2b988a1e30e15943dd13..8619b5c9b34e1511bfa96186ac1305eb42eb9e1c 100644 (file)
@@ -11,6 +11,7 @@ using Dalamud.Game.ClientState.Conditions;
 using Dalamud.Game.ClientState.Objects;
 using Dalamud.Game.ClientState.Objects.Types;
 using Dalamud.Plugin.Services;
+using FFXIVClientStructs.FFXIV.Application.Network.WorkDefinitions;
 using FFXIVClientStructs.FFXIV.Client.Game;
 using FFXIVClientStructs.FFXIV.Client.Game.Control;
 using FFXIVClientStructs.FFXIV.Client.Game.Object;
@@ -20,6 +21,7 @@ using FFXIVClientStructs.FFXIV.Client.System.Memory;
 using FFXIVClientStructs.FFXIV.Client.System.String;
 using FFXIVClientStructs.FFXIV.Client.UI.Agent;
 using Lumina.Excel.GeneratedSheets;
+using Questionable.Controller;
 using Questionable.Model.V1;
 using BattleChara = FFXIVClientStructs.FFXIV.Client.Game.Character.BattleChara;
 using GameObject = Dalamud.Game.ClientState.Objects.Types.GameObject;
@@ -72,35 +74,61 @@ internal sealed unsafe class GameFunctions
             .AsReadOnly();
     }
 
+    public QuestController QuestController { private get; set; }
+
     public (ushort CurrentQuest, byte Sequence) GetCurrentQuest()
     {
-        var scenarioTree = AgentScenarioTree.Instance();
-        if (scenarioTree == null)
+        ushort currentQuest;
+
+        // if any quest that is currently tracked (i.e. in the to-do list) exists as mapped quest, we use that
+        var questManager = QuestManager.Instance();
+        if (questManager != null)
         {
-            //ImGui.Text("Scenario tree is null.");
-            return (0, 0);
+            foreach (var tracked in questManager->TrackedQuestsSpan)
+            {
+                switch (tracked.QuestType)
+                {
+                    default:
+                        continue;
+
+                    case 1: // normal quest
+                        currentQuest = questManager->NormalQuestsSpan[tracked.Index].QuestId;
+                        break;
+                }
+
+                if (QuestController.IsKnownQuest(currentQuest))
+                    return (currentQuest, QuestManager.GetQuestSequence(currentQuest));
+            }
         }
 
+        var scenarioTree = AgentScenarioTree.Instance();
+        if (scenarioTree == null)
+            return default;
+
         if (scenarioTree->Data == null)
-        {
-            //ImGui.Text("Scenario tree data is null.");
-            return (0, 0);
-        }
+            return default;
 
-        uint currentQuest = scenarioTree->Data->CurrentScenarioQuest;
+        currentQuest = scenarioTree->Data->CurrentScenarioQuest;
         if (currentQuest == 0)
-        {
-            //ImGui.Text("Current quest is 0.");
-            return (0, 0);
-        }
+            return default;
+
+        return (currentQuest, QuestManager.GetQuestSequence(currentQuest));
+    }
+
+    public QuestWork? GetQuestEx(ushort questId)
+    {
+        QuestWork* questWork = QuestManager.Instance()->GetQuestById(questId);
+        return questWork != null ? *questWork : null;
 
-        //ImGui.Text($"Current Quest: {currentQuest}");
-        //ImGui.Text($"Progress: {QuestManager.GetQuestSequence(currentQuest)}");
-        return ((ushort)currentQuest, QuestManager.GetQuestSequence(currentQuest));
     }
 
     public bool IsAetheryteUnlocked(uint aetheryteId, out byte subIndex)
     {
+        subIndex = 0;
+
+        var uiState = UIState.Instance();
+        return uiState != null && uiState->IsAetheryteUnlocked(aetheryteId);
+        /*
         var telepo = Telepo.Instance();
         if (telepo == null || telepo->UpdateAetheryteList() == null)
         {
@@ -120,6 +148,7 @@ internal sealed unsafe class GameFunctions
 
         subIndex = 0;
         return false;
+        */
     }
 
     public bool IsAetheryteUnlocked(EAetheryteLocation aetheryteLocation)
@@ -285,7 +314,7 @@ internal sealed unsafe class GameFunctions
 
     #endregion
 
-    private GameObject? FindObjectByDataId(uint dataId)
+    public GameObject? FindObjectByDataId(uint dataId)
     {
         foreach (var gameObject in _objectTable)
         {
@@ -311,6 +340,11 @@ internal sealed unsafe class GameFunctions
         }
     }
 
+    public void UseItem(uint itemId)
+    {
+        AgentInventoryContext.Instance()->UseItem(itemId);
+    }
+
     public void UseItem(uint dataId, uint itemId)
     {
         GameObject? gameObject = FindObjectByDataId(dataId);
@@ -331,7 +365,7 @@ internal sealed unsafe class GameFunctions
         }
     }
 
-    public bool IsObbjectAtPosition(uint dataId, Vector3 position)
+    public bool IsObjectAtPosition(uint dataId, Vector3 position)
     {
         GameObject? gameObject = FindObjectByDataId(dataId);
         return gameObject != null && (gameObject.Position - position).Length() < 0.05f;
index 499ba544ea0ca53bf9e6166956bcf6df4daeb97a..1a4dbfbc63f1be0987a9616a85632c7a919f8804 100644 (file)
@@ -17,6 +17,8 @@ public class QuestStep
 
     public float? StopDistance { get; set; }
     public ushort TerritoryId { get; set; }
+    public ushort? TargetTerritoryId { get; set; }
+
     public bool Disabled { get; set; }
     public bool DisableNavmesh { get; set; }
     public bool? Mount { get; set; }
index f764e99e1bc9b3c10160fb010b3fc02a82cba8c6..f491288ff94a412546068e1dd168092b8fcb15fd 100644 (file)
@@ -28,7 +28,8 @@
             "Z": 67.826294
           },
           "TerritoryId": 958,
-          "InteractionType": "AttuneAetherCurrent"
+          "InteractionType": "AttuneAetherCurrent",
+          "AetherCurrentId": 2818348
         },
         {
           "DataId": 1039942,
@@ -53,7 +54,8 @@
             "Z": -325.85645
           },
           "TerritoryId": 958,
-          "InteractionType": "AttuneAetherCurrent"
+          "InteractionType": "AttuneAetherCurrent",
+          "AetherCurrentId": 2818350
         },
         {
           "DataId": 1039946,
index 2ccafb3186b728f765fcdaa86ea00734cccf41c1..4ad77295e19d4149837a953fea11eccb183c212e 100644 (file)
@@ -1,7 +1,6 @@
 {
   "Version": 1,
   "Author": "liza",
-  "Comment": "TODO This should have an aetheryte?",
   "QuestSequence": [
     {
       "Sequence": 0,
     {
       "Sequence": 3,
       "Steps": [
+        {
+          "DataId": 174,
+          "Position": {
+            "X": -566.2438,
+            "Y": 134.6656,
+            "Z": 650.6459
+          },
+          "StopDistance": 10,
+          "TerritoryId": 959,
+          "InteractionType": "AttuneAetheryte",
+          "DisableNavmesh": true
+        },
         {
           "DataId": 1039977,
           "Position": {
           },
           "TerritoryId": 959,
           "InteractionType": "Interact",
+          "EnemySpawnType": "AfterInteraction",
           "KillEnemyDataIds": [
             14077
-          ],
-          "Comment": "TODO what happened to seq: 2"
+          ]
         }
       ]
     },
index daa059e16d64374512714c783f223573150168d3..071d807bd5bbb642c6280a169316c90479ab6c08 100644 (file)
@@ -28,7 +28,8 @@
             "Z": 514.4884
           },
           "TerritoryId": 959,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DisableNavmesh": true
         }
       ]
     },
index 2df3a37c9825d899ddaf2337bf1b7e51b52e0441..1c88a27f2b8038d84bdbd123866ec16e189acf8f 100644 (file)
@@ -61,6 +61,7 @@
             "Y": 76.14732,
             "Z": 480.91858
           },
+          "StopDistance": 5,
           "TerritoryId": 959,
           "InteractionType": "Interact"
         }
index 9dbcfed0b19b8b28768cae07ca11f9e2650dcd6f..f0d0277c086a84f5592bcdb768d97bedee0d4608 100644 (file)
@@ -12,6 +12,7 @@
             "Y": 76.14732,
             "Z": 480.91858
           },
+          "StopDistance": 5,
           "TerritoryId": 959,
           "InteractionType": "Interact"
         }
@@ -42,6 +43,7 @@
             "Y": 172.25903,
             "Z": 548.94324
           },
+          "StopDistance": 5,
           "TerritoryId": 959,
           "InteractionType": "Interact"
         }
@@ -57,6 +59,7 @@
             "Y": 163.31726,
             "Z": 593.0419
           },
+          "StopDistance": 5,
           "TerritoryId": 959,
           "InteractionType": "Interact"
         }
@@ -72,6 +75,7 @@
             "Y": 156.8169,
             "Z": 594.23206
           },
+          "StopDistance": 5,
           "TerritoryId": 959,
           "InteractionType": "Interact"
         }
@@ -87,6 +91,7 @@
             "Y": 147.4784,
             "Z": 566.1554
           },
+          "StopDistance": 5,
           "TerritoryId": 959,
           "InteractionType": "Interact"
         }
index 04ce1d497401493c1a3350ca8aa3d6a5093a84f1..e0a0acbd5b6386feadd16c02525d85d792f695e1 100644 (file)
@@ -12,6 +12,7 @@
             "Y": 169.00394,
             "Z": 549.6758
           },
+          "StopDistance": 5,
           "TerritoryId": 959,
           "InteractionType": "Interact"
         }
     {
       "Sequence": 1,
       "Steps": [
+        {
+          "Position": {
+            "X": -326.42538,
+            "Y": 98.98749,
+            "Z": 526.5519
+          },
+          "TerritoryId": 959,
+          "InteractionType": "WalkTo",
+          "DisableNavmesh": true
+        },
+        {
+          "Position": {
+            "X": -50.482517,
+            "Y": 42.360725,
+            "Z": 466.64243
+          },
+          "TerritoryId": 959,
+          "InteractionType": "WalkTo"
+        },
+        {
+          "Position": {
+            "X": 113.70272,
+            "Y": 45.552776,
+            "Z": 460.49585
+          },
+          "TerritoryId": 959,
+          "InteractionType": "WalkTo"
+        },
+        {
+          "Position": {
+            "X": 129.9883,
+            "Y": 54.543076,
+            "Z": 468.93378
+          },
+          "TerritoryId": 959,
+          "InteractionType": "WalkTo"
+        },
+        {
+          "Position": {
+            "X": 126.817184,
+            "Y": 55.823048,
+            "Z": 476.34058
+          },
+          "TerritoryId": 959,
+          "InteractionType": "WalkTo"
+        },
         {
           "DataId": 1038884,
           "Position": {
             "Y": 59.911327,
             "Z": 411.42883
           },
+          "StopDistance": 5,
           "TerritoryId": 959,
           "InteractionType": "Interact"
         }
index db0915f02c818bc0254ebfc0d0ecfecad2ce9057..30586043b2532b9489237901859e414fb7e74ee1 100644 (file)
       "Sequence": 1,
       "Steps": [
         {
-          "DataId": 2012019,
           "Position": {
-            "X": 21.7081,
-            "Y": -133.5001,
-            "Z": -385.7313
+            "X": 1.131261,
+            "Y": -114.92335,
+            "Z": -418.2727
           },
           "TerritoryId": 959,
-          "InteractionType": "AttuneAetherCurrent"
+          "InteractionType": "WalkTo",
+          "DisableNavmesh": true
         },
         {
           "DataId": 1038897,
             "Y": -128.8109,
             "Z": -512.0165
           },
+          "StopDistance": 10,
           "TerritoryId": 959,
           "InteractionType": "AttuneAetheryte"
         },
+        {
+          "Position": {
+            "X": 36.500526,
+            "Y": -129.20917,
+            "Z": -521.85284
+          },
+          "TerritoryId": 959,
+          "InteractionType": "WalkTo"
+        },
         {
           "DataId": 1038901,
           "Position": {
@@ -63,7 +73,8 @@
             "Z": -555.0164
           },
           "TerritoryId": 959,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DisableNavmesh": true
         }
       ]
     },
     {
       "Sequence": 255,
       "Steps": [
+        {
+          "Position": {
+            "X": -72.39724,
+            "Y": -49.589592,
+            "Z": -336.63968
+          },
+          "TerritoryId": 959,
+          "InteractionType": "WalkTo"
+        },
+        {
+          "Position": {
+            "X": -105.34293,
+            "Y": -49.589592,
+            "Z": -367.6591
+          },
+          "TerritoryId": 959,
+          "InteractionType": "WalkTo",
+          "DisableNavmesh": true
+        },
         {
           "DataId": 1038903,
           "Position": {
index edb355106bdb8c137998637718b2455bb142d18d..8a31337b9849e3bf59541925e29f3e58573679b6 100644 (file)
     {
       "Sequence": 1,
       "Steps": [
+        {
+          "DataId": 2012013,
+          "Position": {
+            "X": 29.1046,
+            "Y": -47.739,
+            "Z": -550.4077
+          },
+          "TerritoryId": 959,
+          "InteractionType": "AttuneAetherCurrent",
+          "AetherCurrentId": 2818362
+        },
+        {
+          "Position": {
+            "X": 62.71022,
+            "Y": -46.99965,
+            "Z": -433.81802
+          },
+          "TerritoryId": 959,
+          "InteractionType": "WalkTo"
+        },
+        {
+          "Position": {
+            "X": 47.394165,
+            "Y": -133.50012,
+            "Z": -397.90225
+          },
+          "TerritoryId": 959,
+          "InteractionType": "WalkTo",
+          "DisableNavmesh": true
+        },
+        {
+          "DataId": 2012019,
+          "Position": {
+            "X": 21.7081,
+            "Y": -133.5001,
+            "Z": -385.7313
+          },
+          "TerritoryId": 959,
+          "InteractionType": "AttuneAetherCurrent",
+          "AetherCurrentId": 2818368,
+          "DisableNavmesh": true
+        },
         {
           "DataId": 1038908,
           "Position": {
@@ -28,7 +70,8 @@
             "Z": -618.7686
           },
           "TerritoryId": 959,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Mare Lamentorum - Bestways Burrow"
         }
       ]
     },
       "Steps": [
         {
           "DataId": 2012178,
-          "Position": {
-            "X": -486.59497,
-            "Y": -154.37555,
-            "Z": -689.26526
-          },
           "TerritoryId": 959,
-          "InteractionType": "ManualAction",
+          "InteractionType": "Interact",
           "Comment": "Navmesh can't jump"
         }
       ]
             "Z": -595.72754
           },
           "TerritoryId": 959,
-          "InteractionType": "AttuneAetherCurrent"
+          "InteractionType": "AttuneAetherCurrent",
+          "AetherCurrentId": 2818360
         },
         {
           "DataId": 1038912,
+          "StopDistance": 5,
+          "TerritoryId": 959,
+          "InteractionType": "Interact",
+          "Comment": "Navmesh can't jump"
+        }
+      ]
+    },
+    {
+      "Sequence": 4,
+      "Steps": [
+        {
           "Position": {
             "X": -455.40552,
             "Y": -168,
             "Z": -620.05035
           },
           "TerritoryId": 959,
-          "InteractionType": "Interact"
-        },
-        {
-          "ItemId": null,
-          "TerritoryId": 959,
-          "InteractionType": "UseItem"
+          "InteractionType": "UseItem",
+          "ItemId": 2003236
         }
       ]
     },
index 45cdc6fcd84374d3ded8388ffe6ce4be6fb573d0..da1c0fd4690001b01b5d05e213ae8ccf5baae278 100644 (file)
             "Z": -253.94832
           },
           "TerritoryId": 959,
-          "InteractionType": "ManualAction",
-          "Comment": "Navmesh can't jump"
+          "InteractionType": "WalkTo"
         },
         {
           "DataId": 1038923,
-          "Position": {
-            "X": -376.27222,
-            "Y": -151.67168,
-            "Z": -267.90265
-          },
+          "StopDistance": 5,
           "TerritoryId": 959,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "Comment": "Navmesh can't jump"
         }
       ]
     },
             "Z": -361.57114
           },
           "TerritoryId": 959,
-          "InteractionType": "ManualAction",
-          "Comment": "Navmesh can't jump"
+          "InteractionType": "WalkTo"
         },
         {
           "DataId": 1038924,
-          "Position": {
-            "X": -329.97632,
-            "Y": -151.67169,
-            "Z": -333.76062
-          },
+          "StopDistance": 5,
           "TerritoryId": 959,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "Comment": "Navmesh can't jump"
         }
       ]
     },
index b489dab5f5f75ac7688f953414b92e2f6704e216..09739dcb9827b327309acd262b81bdb526a56ea2 100644 (file)
     {
       "Sequence": 1,
       "Steps": [
+        {
+          "Position": {
+            "X": 68.93551,
+            "Y": -48.912445,
+            "Z": -683.716
+          },
+          "TerritoryId": 959,
+          "InteractionType": "WalkTo",
+          "DisableNavmesh": true,
+          "Mount": true
+        },
+        {
+          "Position": {
+            "X": 86.32549,
+            "Y": -137.4167,
+            "Z": -619.77936
+          },
+          "TerritoryId": 959,
+          "InteractionType": "WalkTo",
+          "DisableNavmesh": true
+        },
         {
           "DataId": 1038928,
           "Position": {
             "Z": -405.08124
           },
           "TerritoryId": 959,
-          "InteractionType": "AttuneAetherCurrent"
+          "InteractionType": "AttuneAetherCurrent",
+          "AetherCurrentId": 2818366
         },
         {
           "DataId": 1038929,
           "Position": {
-            "X": 596.2294,
+            "X": 595.4731,
             "Y": -167.50227,
-            "Z": -510.33884
+            "Z": -511.4072
           },
+          "StopDistance": 0.25,
           "TerritoryId": 959,
           "InteractionType": "Interact"
         }
         {
           "DataId": 1038929,
           "Position": {
-            "X": 547.2717,
+            "X": 547.8397,
             "Y": -167.50174,
-            "Z": -525.274
+            "Z": -526.3702
           },
+          "StopDistance": 0.25,
           "TerritoryId": 959,
           "InteractionType": "Interact"
         }
         {
           "DataId": 1038929,
           "Position": {
-            "X": 572.0069,
+            "X": 572.45984,
             "Y": -167.50163,
-            "Z": -574.98785
+            "Z": -577.03906
           },
+          "StopDistance": 0.25,
           "TerritoryId": 959,
           "InteractionType": "Interact"
         }
         {
           "DataId": 1038929,
           "Position": {
-            "X": 616.97437,
+            "X": 617.89886,
             "Y": -167.50163,
-            "Z": -593.1553
+            "Z": -594.92847
           },
+          "StopDistance": 0.25,
           "TerritoryId": 959,
           "InteractionType": "Interact"
         }
         {
           "DataId": 1038929,
           "Position": {
-            "X": 623.16296,
+            "X": 622.8754,
             "Y": -167.50217,
-            "Z": -657.5506
+            "Z": -659.45184
           },
+          "StopDistance": 0.25,
           "TerritoryId": 959,
           "InteractionType": "Interact"
         }
             "Y": -168.00002,
             "Z": -656.58044
           },
+          "StopDistance": 7,
           "TerritoryId": 959,
           "InteractionType": "Interact"
         }
index 70c71c662162d114d09ad62ce0115752941ba50e..8a2a54f116d5d38ba613b2a6678f0c7a6ea428e0 100644 (file)
@@ -1,7 +1,6 @@
 {
   "Version": 1,
   "Author": "liza",
-  "Comment": "Sequence 3 is the end of the chase marker",
   "QuestSequence": [
     {
       "Sequence": 0,
@@ -29,7 +28,8 @@
             "Z": -512.2606
           },
           "TerritoryId": 959,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Mare Lamentorum - Bestways Burrow"
         }
       ]
     },
         }
       ]
     },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "DataId": 2012185,
+          "Position": {
+            "X": -5.416992,
+            "Y": -49.05786,
+            "Z": -269.24548
+          },
+          "TerritoryId": 959,
+          "InteractionType": "ManualAction",
+          "Comment": "Duty - Follow Urianger (but you failed the first time)"
+        }
+      ]
+    },
     {
       "Sequence": 255,
       "Steps": [
index 404979cc20d919a0a96c5716f88382f451ef7c47..5c463a7605755e517c3255e7ed05f010141cca9f 100644 (file)
     {
       "Sequence": 1,
       "Steps": [
+        {
+          "Position": {
+            "X": -126.76068,
+            "Y": 61.04055,
+            "Z": -76.382324
+          },
+          "TerritoryId": 959,
+          "InteractionType": "WalkTo"
+        },
+        {
+          "DataId": 2012014,
+          "Position": {
+            "X": -128.008,
+            "Y": 66.33093,
+            "Z": -68.2536
+          },
+          "StopDistance": 5,
+          "TerritoryId": 959,
+          "InteractionType": "AttuneAetherCurrent",
+          "AetherCurrentId": 2818363
+        },
+        {
+          "Position": {
+            "X": -116.83438,
+            "Y": 63.151585,
+            "Z": -71.81973
+          },
+          "TerritoryId": 959,
+          "InteractionType": "WalkTo"
+        },
+        {
+          "DataId": 2012010,
+          "Position": {
+            "X": 42.58789,
+            "Y": 124.01001,
+            "Z": -167.04059
+          },
+          "TerritoryId": 959,
+          "InteractionType": "AttuneAetherCurrent",
+          "AetherCurrentId": 2818359
+        },
         {
           "DataId": 1038936,
           "Position": {
@@ -44,6 +85,7 @@
           },
           "TerritoryId": 959,
           "InteractionType": "Combat",
+          "EnemySpawnType": "AfterInteraction",
           "KillEnemyDataIds": [
             13998,
             14093,
           },
           "TerritoryId": 959,
           "InteractionType": "ManualAction",
+          "AetheryteShortcut": "Mare Lamentorum - Bestways Burrow",
           "Comment": "Navmesh can't jump"
         },
         {
             "Y": -154.98596,
             "Z": -595.5444
           },
+          "StopDistance": 3,
+          "TerritoryId": 959,
+          "InteractionType": "AttuneAetherCurrent",
+          "AetherCurrentId": 2818361
+        },
+        {
+          "Position": {
+            "X": 351.1467,
+            "Y": -167.87698,
+            "Z": -605.0467
+          },
           "TerritoryId": 959,
-          "InteractionType": "AttuneAetherCurrent"
+          "InteractionType": "WalkTo"
         },
         {
           "DataId": 1038937,
index 99ea86cf68a378d673b5d1f9e7ec4d6038470865..70f42da98cb8fb3516196f763017a6b280fff077 100644 (file)
           "InteractionType": "Interact",
           "Comment": "Teleporter"
         },
+        {
+          "Position": {
+            "X": 65.32143,
+            "Y": -49.589592,
+            "Z": -690.11676
+          },
+          "TerritoryId": 959,
+          "InteractionType": "WalkTo"
+        },
         {
           "DataId": 1038947,
           "Position": {
@@ -55,6 +64,7 @@
           },
           "TerritoryId": 959,
           "InteractionType": "Combat",
+          "EnemySpawnType": "AutoOnEnterArea",
           "KillEnemyDataIds": [
             13996,
             13997,
     {
       "Sequence": 3,
       "Steps": [
+        {
+          "Position": {
+            "X": 18.495846,
+            "Y": -49.589592,
+            "Z": -301.7225
+          },
+          "TerritoryId": 959,
+          "InteractionType": "WalkTo"
+        },
         {
           "DataId": 1038950,
           "Position": {
             "Y": 128.67769,
             "Z": 572.0454
           },
+          "StopDistance": 5,
           "TerritoryId": 959,
-          "InteractionType": "Interact",
-          "Comment": "Unsure if this is the correct data id"
+          "InteractionType": "Interact"
         }
       ]
     }
index 4f2323f4f59abbfadaaf4273b6111bf3ce853896..f308f0f32b6336f5127c33cacb2805932dfe1b4d 100644 (file)
@@ -12,6 +12,7 @@
             "Y": 128.6778,
             "Z": 566.8573
           },
+          "StopDistance": 5,
           "TerritoryId": 959,
           "InteractionType": "Interact"
         }
     {
       "Sequence": 1,
       "Steps": [
+        {
+          "Position": {
+            "X": -614.86835,
+            "Y": 128.67761,
+            "Z": 677.33923
+          },
+          "TerritoryId": 959,
+          "InteractionType": "WalkTo",
+          "Comment": "Avoids Combat"
+        },
         {
           "DataId": 2012531,
           "Position": {
@@ -53,7 +64,8 @@
             "Z": 407.79736
           },
           "TerritoryId": 958,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Garlemald - Camp Broken Glass"
         }
       ]
     },
@@ -69,6 +81,7 @@
           },
           "TerritoryId": 962,
           "InteractionType": "Interact",
+          "AetheryteShortcut": "Old Sharlayan",
           "AethernetShortcut": [
             "[Old Sharlayan] Aetheryte Plaza",
             "[Old Sharlayan] The Baldesion Annex"
index 59d0ee28e17a00480bee07be8fdb7daebd1e7c51..2db8fdb2fac37ea4e11d0095d5e169b0d1bfa4da 100644 (file)
@@ -12,6 +12,7 @@
             "Y": 3.8989394,
             "Z": 7.003784
           },
+          "StopDistance": 5,
           "TerritoryId": 962,
           "InteractionType": "Interact"
         }
       "Sequence": 2,
       "Steps": [
         {
-          "DataId": 1038978,
-          "Position": {
-            "X": 202.34985,
-            "Y": 1.7699993,
-            "Z": 757.71716
-          },
           "TerritoryId": 957,
-          "InteractionType": "Interact",
-          "Comment": "Does this get completed automatically on teleport? Using the coords from the next step"
+          "AetheryteShortcut": "Thavnair - Yedlihmad",
+          "InteractionType": "WalkTo",
+          "Comment": "Quest automatically progresses once teleported to Yedlihmad"
         }
       ]
     },
index 87cc42bc82c5e0c73d270d02da2367b2b4fc8998..2b9b6306d13b6e1c894c46c78e28e6b65438eb62 100644 (file)
         {
           "DataId": 1038997,
           "Position": {
-            "X": -37.70625,
-            "Y": -9.957219E-05,
-            "Z": -134.90237
+            "X": -37.667046,
+            "Y": -0.00014948845,
+            "Z": -136.80333
           },
+          "StopDistance": 0.25,
           "TerritoryId": 963,
           "InteractionType": "Interact"
         }
index 95816917ef18e16e8498788e559f0d8f4dac5aa5..ed89c42f672f20ed73c891286fcce92bb1b84376 100644 (file)
         {
           "DataId": 1039002,
           "Position": {
-            "X": 56.012253,
+            "X": 57.04193,
             "Y": 26.99999,
-            "Z": 44.92237
+            "Z": 46.383568
           },
+          "StopDistance": 0.25,
           "TerritoryId": 963,
           "InteractionType": "Interact",
           "AethernetShortcut": [
index 714cec060d92110c74cfe6048a102c7df32d6235..f6c492df5c0f32d5aa54b7bc078e2e71169c6d24 100644 (file)
@@ -42,6 +42,7 @@
             "Y": 51.57471,
             "Z": -597.1924
           },
+          "StopDistance": 5,
           "TerritoryId": 957,
           "InteractionType": "Interact"
         }
@@ -59,6 +60,7 @@
           },
           "TerritoryId": 957,
           "InteractionType": "Combat",
+          "EnemySpawnType": "AfterInteraction",
           "KillEnemyDataIds": [
             13994
           ]
@@ -77,6 +79,7 @@
           },
           "TerritoryId": 957,
           "InteractionType": "Combat",
+          "EnemySpawnType": "AfterInteraction",
           "KillEnemyDataIds": [
             13992,
             13993
             "Y": 5.2643433,
             "Z": -244.4953
           },
+          "StopDistance": 10,
           "TerritoryId": 957,
           "InteractionType": "AttuneAetheryte"
         },
index a0a4d1eac84687f904688d0878f79bb1d651615c..3a013475696e45384bf73bd45e04230974ac6b3f 100644 (file)
@@ -28,7 +28,8 @@
             "Z": -272.84656
           },
           "TerritoryId": 957,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "DisableNavmesh": true
         }
       ]
     },
@@ -43,7 +44,8 @@
             "Z": -343.89258
           },
           "TerritoryId": 957,
-          "InteractionType": "AttuneAetherCurrent"
+          "InteractionType": "AttuneAetherCurrent",
+          "AetherCurrentId": 2818331
         },
         {
           "DataId": 2011997,
@@ -53,7 +55,8 @@
             "Z": -447.8676
           },
           "TerritoryId": 957,
-          "InteractionType": "AttuneAetherCurrent"
+          "InteractionType": "AttuneAetherCurrent",
+          "AetherCurrentId": 2818336
         },
         {
           "DataId": 1039023,
@@ -79,6 +82,7 @@
           },
           "TerritoryId": 957,
           "InteractionType": "Combat",
+          "EnemySpawnType": "AutoOnEnterArea",
           "KillEnemyDataIds": [
             13991,
             13990
           },
           "TerritoryId": 957,
           "InteractionType": "Combat",
+          "EnemySpawnType": "AfterInteraction",
           "KillEnemyDataIds": [
             13989
           ]
index 72e05684b66a1187f3ac29a4a71ac197ba299eda..9483f4386185c130b157b5e5ea3ec3a8e40ed122 100644 (file)
     {
       "Sequence": 3,
       "Steps": [
+        {
+          "Position": {
+            "X": 543.0377,
+            "Y": 15.147404,
+            "Z": -147.8739
+          },
+          "TerritoryId": 957,
+          "InteractionType": "WalkTo"
+        },
         {
           "DataId": 2011996,
           "Position": {
             "Z": -159.1059
           },
           "TerritoryId": 957,
-          "InteractionType": "AttuneAetherCurrent"
+          "InteractionType": "AttuneAetherCurrent",
+          "AetherCurrentId": 2818332,
+          "DisableNavmesh": true
+        },
+        {
+          "Position": {
+            "X": 536.3203,
+            "Y": 12.722106,
+            "Z": -95.65565
+          },
+          "TerritoryId": 957,
+          "InteractionType": "WalkTo"
         },
         {
           "Position": {
@@ -68,6 +88,7 @@
           },
           "TerritoryId": 957,
           "InteractionType": "Combat",
+          "EnemySpawnType": "AutoOnEnterArea",
           "KillEnemyDataIds": [
             13988
           ]
           },
           "TerritoryId": 957,
           "InteractionType": "Combat",
+          "EnemySpawnType": "AutoOnEnterArea",
           "KillEnemyDataIds": [
             13987
-          ]
+          ],
+          "$": "QuestVariables after: 16 1 0 0 0 128"
         },
         {
           "Position": {
           },
           "TerritoryId": 957,
           "InteractionType": "Combat",
+          "EnemySpawnType": "AutoOnEnterArea",
           "KillEnemyDataIds": [
             13986
-          ]
+          ],
+          "$": "QuestVariables after: 33 1 0 0 0 192"
         },
         {
           "Position": {
           },
           "TerritoryId": 957,
           "InteractionType": "Combat",
+          "EnemySpawnType": "AutoOnEnterArea",
           "KillEnemyDataIds": [
             13985,
             13984
index c6d08665482a4321051d93d0b38656f2fccb0941..d91fd5b2405dcca721cce673923dff330612b669 100644 (file)
@@ -28,7 +28,8 @@
             "Z": 425.10107
           },
           "TerritoryId": 957,
-          "InteractionType": "AttuneAetherCurrent"
+          "InteractionType": "AttuneAetherCurrent",
+          "AetherCurrentId": 2818337
         },
         {
           "DataId": 2012207,
@@ -53,8 +54,8 @@
             "Z": 141.25269
           },
           "TerritoryId": 957,
-          "InteractionType": "ManualAction",
-          "Comment": "Navmesh can't swim"
+          "InteractionType": "Interact",
+          "DisableNavmesh": true
         }
       ]
     },
             "Y": -60.471558,
             "Z": 133.25696
           },
+          "StopDistance": 0.5,
           "TerritoryId": 957,
-          "InteractionType": "ManualAction",
-          "Comment": "Navmesh can't swim"
+          "InteractionType": "Interact",
+          "DisableNavmesh": true
         }
       ]
     },
     {
       "Sequence": 4,
       "Steps": [
+        {
+          "Position": {
+            "X": 235.94444,
+            "Y": -0.6,
+            "Z": 145.83025
+          },
+          "TerritoryId": 957,
+          "InteractionType": "WalkTo",
+          "DisableNavmesh": true,
+          "Mount": true
+        },
+        {
+          "Position": {
+            "X": 252.0308,
+            "Y": 0.57823455,
+            "Z": 150.66217
+          },
+          "TerritoryId": 957,
+          "InteractionType": "WalkTo",
+          "DisableNavmesh": true
+        },
+        {
+          "DataId": 2011999,
+          "Position": {
+            "X": 53.177612,
+            "Y": 11.36792,
+            "Z": 187.396
+          },
+          "TerritoryId": 957,
+          "InteractionType": "AttuneAetherCurrent",
+          "AetherCurrentId": 2818338
+        },
         {
           "DataId": 1039052,
           "Position": {
             "Z": 217.85303
           },
           "TerritoryId": 957,
-          "InteractionType": "ManualAction",
-          "Comment": "Navmesh can't swim; should *probably* collect the aether current before interacting here"
+          "InteractionType": "Interact"
         }
       ]
     },
             "Y": 25.65825,
             "Z": -319.87494
           },
+          "StopDistance": 5,
           "TerritoryId": 957,
           "InteractionType": "Interact"
         }
index 647da291bde0cb1bd1a9743b1bfdb815a8f8ff81..ca97ca0b27cf2e4dd86f5d893aac5c32ff92dd8d 100644 (file)
             "Y": 3.1168795,
             "Z": -262.0432
           },
+          "StopDistance": 15,
           "TerritoryId": 957,
-          "InteractionType": "Interact"
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Thavnair - Palaka's Stand"
         }
       ]
     },
@@ -42,6 +44,7 @@
             "Y": 3.1168792,
             "Z": -262.62305
           },
+          "StopDistance": 7,
           "TerritoryId": 957,
           "InteractionType": "Interact"
         }
     {
       "Sequence": 255,
       "Steps": [
+        {
+          "Position": {
+            "X": 425.544,
+            "Y": 3.1257756,
+            "Z": -218.32741
+          },
+          "TerritoryId": 957,
+          "InteractionType": "WalkTo",
+          "DisableNavmesh": true
+        },
         {
           "DataId": 1039064,
           "Position": {
index ae71bb354cb0d12690e6be4e71fc09a4dedb3a22..477c4d10c993ca7499be4a98cccd76fa51f37805 100644 (file)
@@ -12,6 +12,7 @@
             "Y": 3.1168795,
             "Z": -262.62305
           },
+          "StopDistance": 5,
           "TerritoryId": 957,
           "InteractionType": "Interact"
         }
@@ -42,8 +43,9 @@
             "Z": -683.829
           },
           "TerritoryId": 957,
-          "InteractionType": "Interact",
-          "Comment": "Travel to Radz-at-Han"
+          "InteractionType": "WalkTo",
+          "Comment": "Travel to Radz-at-Han",
+          "TargetTerritoryId": 963
         },
         {
           "DataId": 1040354,
             "Y": 36,
             "Z": 71.70203
           },
+          "StopDistance": 5,
           "TerritoryId": 963,
           "InteractionType": "Interact"
         }
index fc480a1e414e94d1b0dd6d909674c00511520825..aa9123363fae9816124977dbac002501fb70f0d0 100644 (file)
@@ -43,7 +43,9 @@
             "Z": -27.023743
           },
           "TerritoryId": 963,
-          "InteractionType": "AttuneAetheryte"
+          "InteractionType": "AttuneAetheryte",
+          "StopDistance": 10,
+          "DisableNavmesh": true
         },
         {
           "DataId": 195,
index 94de9928faac06e74335949b61928f12631aa871..b295c1e153c47cb6a02cc9938496bf507952aecf 100644 (file)
@@ -12,6 +12,7 @@
             "Y": -1.9999962,
             "Z": 88.12085
           },
+          "StopDistance": 5,
           "TerritoryId": 963,
           "InteractionType": "Interact"
         }
index 10f895deb486175a525ac440740bd281b0c347a6..45cd7534ef3be335dee72514ab60b028dd49215a 100644 (file)
                   "description": "The territory id associated with the location",
                   "exclusiveMinimum": 0
                 },
+                "TargetTerritoryId": {
+                  "type": "integer",
+                  "description": "If set, this step is complete (movement-wise) if this territory id is reached",
+                  "exclusiveMinimum": 0
+                },
                 "InteractionType": {
                   "type": "string",
                   "description": "What to do at the position",
index 7f738f826cf0a66370f8e99b519482ae4112cff3..72e7e53098d343e2e8b1c6dda4a4552b6d1551bd 100644 (file)
@@ -1,7 +1,9 @@
 using System;
+using System.Linq;
 using System.Numerics;
 using Dalamud.Game;
 using Dalamud.Game.ClientState.Objects;
+using Dalamud.Game.Command;
 using Dalamud.Interface.Windowing;
 using Dalamud.Plugin;
 using Dalamud.Plugin.Services;
@@ -21,6 +23,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin
     private readonly IClientState _clientState;
     private readonly IFramework _framework;
     private readonly IGameGui _gameGui;
+    private readonly ICommandManager _commandManager;
     private readonly GameFunctions _gameFunctions;
     private readonly QuestController _questController;
 
@@ -40,6 +43,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin
         _clientState = clientState;
         _framework = framework;
         _gameGui = gameGui;
+        _commandManager = commandManager;
         _gameFunctions = new GameFunctions(dataManager, objectTable, sigScanner, targetManager, condition, pluginLog);
 
         AetheryteData aetheryteData = new AetheryteData(dataManager);
@@ -54,6 +58,8 @@ public sealed class QuestionablePlugin : IDalamudPlugin
 
         _pluginInterface.UiBuilder.Draw += _windowSystem.Draw;
         _framework.Update += FrameworkUpdate;
+        _commandManager.AddHandler("/qst", new CommandInfo(ProcessCommand));
+
     }
 
     private void FrameworkUpdate(IFramework framework)
@@ -64,6 +70,11 @@ public sealed class QuestionablePlugin : IDalamudPlugin
         _movementController.Update();
     }
 
+    private void ProcessCommand(string command, string arguments)
+    {
+        _windowSystem.Windows.Single(x => x is DebugWindow).Toggle();
+    }
+
     private unsafe void HandleNavigationShortcut()
     {
         var inputData = UIInputData.Instance();
@@ -76,7 +87,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin
             _gameGui.ScreenToWorld(new Vector2(inputData->CursorXPosition, inputData->CursorYPosition),
                 out Vector3 worldPos))
         {
-            _movementController.NavigateTo(EMovementType.Shortcut, worldPos,
+            _movementController.NavigateTo(EMovementType.Shortcut, null, worldPos,
                 _gameFunctions.IsFlyingUnlocked(_clientState.TerritoryType));
         }
     }
@@ -84,6 +95,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin
 
     public void Dispose()
     {
+        _commandManager.RemoveHandler("/qst");
         _framework.Update -= FrameworkUpdate;
         _pluginInterface.UiBuilder.Draw -= _windowSystem.Draw;
 
index 1f26255d094e541802c3d7555b6c1de86995bad2..daf1ea2f0b03c97a53a64e9e68502c1b9700f828 100644 (file)
@@ -1,10 +1,12 @@
 using System.Globalization;
+using System.Linq;
 using System.Numerics;
 using Dalamud.Game.ClientState.Objects;
 using Dalamud.Interface;
 using Dalamud.Interface.Components;
 using Dalamud.Interface.Windowing;
 using Dalamud.Plugin.Services;
+using FFXIVClientStructs.FFXIV.Client.Game;
 using FFXIVClientStructs.FFXIV.Client.Game.Control;
 using FFXIVClientStructs.FFXIV.Client.UI.Agent;
 using ImGuiNET;
@@ -52,6 +54,27 @@ internal sealed class DebugWindow : Window
         if (currentQuest != null)
         {
             ImGui.TextUnformatted($"Quest: {currentQuest.Quest.Name} / {currentQuest.Sequence} / {currentQuest.Step}");
+
+            var questWork = _gameFunctions.GetQuestEx(currentQuest.Quest.QuestId);
+            if (questWork != null)
+            {
+                var qw = questWork.Value;
+                string vars = "";
+                for (int i = 0; i < 6; ++i)
+                    vars += qw.Variables[i] + " ";
+
+                // For combat quests, a sequence to kill 3 enemies works a bit like this:
+                // Trigger enemies → 0
+                // Kill first enemy → 1
+                // Kill second enemy → 2
+                // Last enemy → increase sequence, reset variable to 0
+                // The order in which enemies are killed doesn't seem to matter.
+                // If multiple waves spawn, this continues to count up (e.g. 1 enemy from wave 1, 2 enemies from wave 2, 1 from wave 3) would count to 3 then 0
+                ImGui.Text($"QW: {vars.Trim()} / {qw.Flags}");
+            }
+            else
+                ImGui.TextUnformatted("(Not accepted)");
+
             ImGui.TextUnformatted(_questController.DebugState ?? "--");
             ImGui.TextUnformatted(_questController.Comment ?? "--");
 
@@ -95,8 +118,8 @@ internal sealed class DebugWindow : Window
             {
                 if (ImGui.Button("Move to Target"))
                 {
-                    _movementController.NavigateTo(EMovementType.DebugWindow, _targetManager.Target.Position,
-                        _gameFunctions.IsFlyingUnlocked(_clientState.TerritoryType));
+                    _movementController.NavigateTo(EMovementType.DebugWindow, _targetManager.Target.DataId,
+                        _targetManager.Target.Position, _gameFunctions.IsFlyingUnlocked(_clientState.TerritoryType));
                 }
             }
             else