Show quest dependencies in quest selection window, add /qst zone as shortcut to show...
authorLiza Carvelli <liza@carvel.li>
Mon, 15 Jul 2024 18:20:46 +0000 (20:20 +0200)
committerLiza Carvelli <liza@carvel.li>
Mon, 15 Jul 2024 18:20:46 +0000 (20:20 +0200)
35 files changed:
QuestPathGenerator/RoslynShortcuts.cs
QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5090_Preying Mantises.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5091_Getting to the Bottom of Things.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5092_The Crimson Cenote.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5093_Watching the Watchtowers.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5095_Hunters with Bite.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5096_Reminders of the Past.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5097_Sick Day.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5098_To Forge in the Forest.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5099_A Stomach for Change.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5100_Carved in Stone.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5101_Two Hearts Aflutter.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5102_Proper Respects.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5104_Spirit's Call.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5105_Seek the Sun.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5106_Secret of Sweetness.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5107_Growing Grove.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5108_Age Is Just a Number.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5109_I'm with Wivre.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5111_Hunting for the Family.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5112_A Hunter's Dream.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5113_The Trial Commences.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5115_Remembering a Dream.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5116_Budding Promise.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5117_Skill of a Veteran.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5118_One Forest.json [new file with mode: 0644]
QuestPaths/quest-v1.json
Questionable.Model/V1/ComplexCombatData.cs
Questionable/Controller/CommandHandler.cs
Questionable/Controller/QuestRegistry.cs
Questionable/Controller/Steps/Common/NextQuest.cs
Questionable/GameFunctions.cs
Questionable/Model/QuestInfo.cs
Questionable/Windows/QuestSelectionWindow.cs
Questionable/Windows/QuestWindow.cs

index 72a15a39c481d14fe56254925e73368254c443b1..186de3e0d82f9650d405f7f38f3a15eaa8ff73b9 100644 (file)
@@ -173,6 +173,8 @@ public static class RoslynShortcuts
                             SyntaxNodeList(
                                 Assignment(nameof(ComplexCombatData.DataId), complexCombatData.DataId, default(uint))
                                     .AsSyntaxNodeOrToken(),
+                                Assignment(nameof(ComplexCombatData.MinimumKillCount), complexCombatData.MinimumKillCount, null)
+                                    .AsSyntaxNodeOrToken(),
                                 Assignment(nameof(ComplexCombatData.RewardItemId), complexCombatData.RewardItemId, null)
                                     .AsSyntaxNodeOrToken(),
                                 Assignment(nameof(ComplexCombatData.RewardItemCount), complexCombatData.RewardItemCount, null)
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5090_Preying Mantises.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5090_Preying Mantises.json
new file mode 100644 (file)
index 0000000..3814284
--- /dev/null
@@ -0,0 +1,56 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1048960,
+          "Position": {
+            "X": -405.84424,
+            "Y": 23.562847,
+            "Z": -476.61554
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "Position": {
+            "X": -455.06216,
+            "Y": 20.027777,
+            "Z": 46.272446
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Combat",
+          "EnemySpawnType": "OverworldEnemies",
+          "KillEnemyDataIds": [
+            17268
+          ],
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048960,
+          "Position": {
+            "X": -405.84424,
+            "Y": 23.562847,
+            "Z": -476.61554
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Yak T'el - Iq Br'aax"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5091_Getting to the Bottom of Things.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5091_Getting to the Bottom of Things.json
new file mode 100644 (file)
index 0000000..98fffc2
--- /dev/null
@@ -0,0 +1,102 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1051071,
+          "Position": {
+            "X": -554.03986,
+            "Y": 1.3156406,
+            "Z": -489.3416
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "Position": {
+            "X": -596.55597,
+            "Y": 2.3708515,
+            "Z": -493.64908
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "WalkTo",
+          "Fly": true
+        },
+        {
+          "Position": {
+            "X": -615.2386,
+            "Y": -44.093876,
+            "Z": -495.7548
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "WalkTo",
+          "Fly": true,
+          "DisableNavmesh": true
+        },
+        {
+          "DataId": 2014307,
+          "Position": {
+            "X": -729.7932,
+            "Y": -107.83557,
+            "Z": -674.8608
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "Position": {
+            "X": -615.2386,
+            "Y": -44.093876,
+            "Z": -495.7548
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "WalkTo",
+          "Fly": true
+        },
+        {
+          "Position": {
+            "X": -596.55597,
+            "Y": 2.3708515,
+            "Z": -493.64908
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "WalkTo",
+          "Fly": true,
+          "DisableNavmesh": true
+        },
+        {
+          "DataId": 1051071,
+          "Position": {
+            "X": -554.03986,
+            "Y": 1.3156406,
+            "Z": -489.3416
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "CompleteQuest",
+          "Fly": true,
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_KINGZD002_05091_Q1_000_000",
+              "Answer": "TEXT_KINGZD002_05091_A1_000_001"
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5092_The Crimson Cenote.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5092_The Crimson Cenote.json
new file mode 100644 (file)
index 0000000..7648241
--- /dev/null
@@ -0,0 +1,78 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1051057,
+          "Position": {
+            "X": -343.67902,
+            "Y": 18.885578,
+            "Z": -404.22675
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "Position": {
+            "X": 158.97704,
+            "Y": 0.80940175,
+            "Z": -773.5188
+          },
+          "StopDistance": 1,
+          "TerritoryId": 1189,
+          "InteractionType": "Combat",
+          "AetheryteShortcut": "Tuliyollal",
+          "EnemySpawnType": "AutoOnEnterArea",
+          "KillEnemyDataIds": [
+            17663
+          ],
+          "AethernetShortcut": [
+            "[Tuliyollal] Aetheryte Plaza",
+            "[Tuliyollal] Dirigible Landing (Yak T'el)"
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 1051058,
+          "Position": {
+            "X": 159.47205,
+            "Y": 0.81595546,
+            "Z": -770.19916
+          },
+          "StopDistance": 7,
+          "TerritoryId": 1189,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1051057,
+          "Position": {
+            "X": -343.67902,
+            "Y": 18.885578,
+            "Z": -404.22675
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Yak T'el - Iq Br'aax",
+          "Fly": true
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5093_Watching the Watchtowers.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5093_Watching the Watchtowers.json
new file mode 100644 (file)
index 0000000..8b1c5c6
--- /dev/null
@@ -0,0 +1,67 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1048928,
+          "Position": {
+            "X": 36.301147,
+            "Y": 8.205902,
+            "Z": -645.1362
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1051072,
+          "Position": {
+            "X": -39.07837,
+            "Y": 4.3051004,
+            "Z": -332.87555
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 1051072,
+          "Position": {
+            "X": -39.07837,
+            "Y": 4.3051004,
+            "Z": -332.87555
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048928,
+          "Position": {
+            "X": 36.301147,
+            "Y": 8.205902,
+            "Z": -645.1362
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "CompleteQuest"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5095_Hunters with Bite.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5095_Hunters with Bite.json
new file mode 100644 (file)
index 0000000..5bc9a42
--- /dev/null
@@ -0,0 +1,75 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1051061,
+          "Position": {
+            "X": -407.79742,
+            "Y": 28.068892,
+            "Z": -360.55542
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1051062,
+          "Position": {
+            "X": -489.5247,
+            "Y": -29.96456,
+            "Z": -94.83484
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Combat",
+          "EnemySpawnType": "AfterInteraction",
+          "KillEnemyDataIds": [
+            17664,
+            17665
+          ],
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 1051062,
+          "Position": {
+            "X": -489.5247,
+            "Y": -29.96456,
+            "Z": -94.83484
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "StopDistance": 7
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1051061,
+          "Position": {
+            "X": -407.79742,
+            "Y": 28.068892,
+            "Z": -360.55542
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Yak T'el - Iq Br'aax",
+          "Fly": true
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5096_Reminders of the Past.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5096_Reminders of the Past.json
new file mode 100644 (file)
index 0000000..c4172c7
--- /dev/null
@@ -0,0 +1,99 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1051065,
+          "Position": {
+            "X": 380.7583,
+            "Y": 21.437008,
+            "Z": -496.84903
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 2014264,
+          "Position": {
+            "X": 405.1422,
+            "Y": 20.85907,
+            "Z": -482.10883
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
+        },
+        {
+          "DataId": 2014266,
+          "Position": {
+            "X": 430.83838,
+            "Y": 20.126648,
+            "Z": -456.71783
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
+        },
+        {
+          "DataId": 2014265,
+          "Position": {
+            "X": 395.92578,
+            "Y": 20.34021,
+            "Z": -453.02515
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Combat",
+          "EnemySpawnType": "AfterInteraction",
+          "KillEnemyDataIds": [
+            17666
+          ],
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1051065,
+          "Position": {
+            "X": 380.7583,
+            "Y": 21.437008,
+            "Z": -496.84903
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "CompleteQuest"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5097_Sick Day.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5097_Sick Day.json
new file mode 100644 (file)
index 0000000..c7e82c8
--- /dev/null
@@ -0,0 +1,103 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1051364,
+          "Position": {
+            "X": -9.353821,
+            "Y": 8.205902,
+            "Z": -652.9183
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1048961,
+          "Position": {
+            "X": -444.38855,
+            "Y": 28.068893,
+            "Z": -363.66827
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Yak T'el - Iq Br'aax",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
+        },
+        {
+          "Position": {
+            "X": -632.6718,
+            "Y": 25.245409,
+            "Z": -159.94264
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "WalkTo",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            -128
+          ]
+        },
+        {
+          "DataId": 1048995,
+          "Position": {
+            "X": -639.27673,
+            "Y": 26.716875,
+            "Z": -161.05902
+          },
+          "StopDistance": 7,
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1051410,
+          "Position": {
+            "X": -9.140198,
+            "Y": 8.205902,
+            "Z": -652.9183
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Tuliyollal",
+          "AethernetShortcut": [
+            "[Tuliyollal] Aetheryte Plaza",
+            "[Tuliyollal] Dirigible Landing (Yak T'el)"
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5098_To Forge in the Forest.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5098_To Forge in the Forest.json
new file mode 100644 (file)
index 0000000..118dc4c
--- /dev/null
@@ -0,0 +1,185 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1048996,
+          "Position": {
+            "X": -618.43286,
+            "Y": 25.709108,
+            "Z": -153.91785
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1051365,
+          "Position": {
+            "X": -738.3383,
+            "Y": 22.137896,
+            "Z": -85.404785
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "Position": {
+            "X": -580.44604,
+            "Y": 22.457048,
+            "Z": -3.286837
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "WalkTo",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            -128
+          ]
+        },
+        {
+          "DataId": 2014313,
+          "Position": {
+            "X": -581.75024,
+            "Y": 23.697266,
+            "Z": -2.9450073
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "UseItem",
+          "ItemId": 2003683,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
+        },
+        {
+          "Position": {
+            "X": -506.6366,
+            "Y": 22.817732,
+            "Z": 32.985153
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "WalkTo",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            -64
+          ]
+        },
+        {
+          "DataId": 2014314,
+          "Position": {
+            "X": -505.9129,
+            "Y": 23.88031,
+            "Z": 32.455933
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "UseItem",
+          "ItemId": 2003683,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
+        },
+        {
+          "Position": {
+            "X": -414.84598,
+            "Y": 20.493914,
+            "Z": 74.74898
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "WalkTo",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            -32
+          ]
+        },
+        {
+          "DataId": 2014315,
+          "Position": {
+            "X": -413.96204,
+            "Y": 21.896606,
+            "Z": 74.021484
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "UseItem",
+          "ItemId": 2003683,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "DataId": 1051365,
+          "Position": {
+            "X": -738.3383,
+            "Y": 22.137896,
+            "Z": -85.404785
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048996,
+          "Position": {
+            "X": -618.43286,
+            "Y": 25.709108,
+            "Z": -153.91785
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "CompleteQuest",
+          "Fly": true
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5099_A Stomach for Change.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5099_A Stomach for Change.json
new file mode 100644 (file)
index 0000000..66e5f31
--- /dev/null
@@ -0,0 +1,52 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1051366,
+          "Position": {
+            "X": -399.95422,
+            "Y": 20.145584,
+            "Z": -402.4262
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1051367,
+          "Position": {
+            "X": -503.95975,
+            "Y": 29.007706,
+            "Z": -394.43048
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1051368,
+          "Position": {
+            "X": -501.27414,
+            "Y": 28.982998,
+            "Z": -394.3084
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "CompleteQuest"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5100_Carved in Stone.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5100_Carved in Stone.json
new file mode 100644 (file)
index 0000000..a0143ab
--- /dev/null
@@ -0,0 +1,53 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1048982,
+          "Position": {
+            "X": 595.45276,
+            "Y": -137.17401,
+            "Z": 564.8126
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 2014250,
+          "Position": {
+            "X": 598.3214,
+            "Y": -137.19391,
+            "Z": 557.7018
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Instruction",
+          "Comment": "Inspect Flag, Red Head, Blue Head"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048982,
+          "Position": {
+            "X": 595.45276,
+            "Y": -137.17401,
+            "Z": 564.8126
+          },
+          "StopDistance": 7,
+          "TerritoryId": 1189,
+          "InteractionType": "CompleteQuest"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5101_Two Hearts Aflutter.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5101_Two Hearts Aflutter.json
new file mode 100644 (file)
index 0000000..570d2f2
--- /dev/null
@@ -0,0 +1,152 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1048984,
+          "Position": {
+            "X": 673.06006,
+            "Y": -135.17874,
+            "Z": 577.47766
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "Position": {
+            "X": -92.00457,
+            "Y": -212.91975,
+            "Z": 624.4216
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "WalkTo",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            -128
+          ]
+        },
+        {
+          "DataId": 1051049,
+          "Position": {
+            "X": -89.49426,
+            "Y": -213.64497,
+            "Z": 625.574
+          },
+          "StopDistance": 4,
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            -128
+          ]
+        },
+        {
+          "Position": {
+            "X": -122.188805,
+            "Y": -214.08376,
+            "Z": 674.54083
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "WalkTo",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            -32
+          ]
+        },
+        {
+          "DataId": 1051051,
+          "Position": {
+            "X": -122.88098,
+            "Y": -213.78055,
+            "Z": 673.39575
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ]
+        },
+        {
+          "Position": {
+            "X": -142.65875,
+            "Y": -213.42487,
+            "Z": 608.63165
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "WalkTo",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            -64
+          ]
+        },
+        {
+          "DataId": 1051050,
+          "Position": {
+            "X": -143.63324,
+            "Y": -213.18237,
+            "Z": 609.0028
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048984,
+          "Position": {
+            "X": 673.06006,
+            "Y": -135.17874,
+            "Z": 577.47766
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Yak T'el - Mamook",
+          "Fly": true
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5102_Proper Respects.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5102_Proper Respects.json
new file mode 100644 (file)
index 0000000..3bb5132
--- /dev/null
@@ -0,0 +1,116 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1048988,
+          "Position": {
+            "X": 584.4967,
+            "Y": -143.46597,
+            "Z": 648.64575
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 2014369,
+          "Position": {
+            "X": 328.20618,
+            "Y": -157.21375,
+            "Z": 429.4651
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            16
+          ]
+        },
+        {
+          "DataId": 2014368,
+          "Position": {
+            "X": 323.7201,
+            "Y": -157.76306,
+            "Z": 434.19543
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
+        },
+        {
+          "DataId": 2014256,
+          "Position": {
+            "X": 139.17749,
+            "Y": -162.24927,
+            "Z": 679.95715
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
+        },
+        {
+          "DataId": 2014257,
+          "Position": {
+            "X": 144.67078,
+            "Y": -163.25635,
+            "Z": 663.84375
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048988,
+          "Position": {
+            "X": 584.4967,
+            "Y": -143.46597,
+            "Z": 648.64575
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "CompleteQuest",
+          "Fly": true
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5104_Spirit's Call.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5104_Spirit's Call.json
new file mode 100644 (file)
index 0000000..42c30b8
--- /dev/null
@@ -0,0 +1,163 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1048987,
+          "Position": {
+            "X": 596.97876,
+            "Y": -142.60623,
+            "Z": 441.7334
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1051053,
+          "Position": {
+            "X": 257.1908,
+            "Y": -165.78062,
+            "Z": 146.74597
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_KINGZD105_05104_SYSTEM_100_004",
+              "Yes": true
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "Position": {
+            "X": 272.75598,
+            "Y": -161.77667,
+            "Z": 117.129616
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "WalkTo",
+          "Mount": true,
+          "DisableNavmesh": true
+        },
+        {
+          "Position": {
+            "X": 255.7041,
+            "Y": -161.34225,
+            "Z": 101.95002
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "WalkTo",
+          "DisableNavmesh": true
+        },
+        {
+          "DataId": 1051053,
+          "Position": {
+            "X": 218.3051,
+            "Y": -160.72849,
+            "Z": 78.95244
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "WaitForNpcAtPosition",
+          "DisableNavmesh": true
+        },
+        {
+          "DataId": 1051053,
+          "Position": {
+            "X": 168.0448,
+            "Y": -158.83824,
+            "Z": 31.171473
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "WaitForNpcAtPosition",
+          "DisableNavmesh": true
+        },
+        {
+          "DataId": 1051053,
+          "Position": {
+            "X": 144.163,
+            "Y": -156.25887,
+            "Z": -57.818764
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "WaitForNpcAtPosition",
+          "DisableNavmesh": true
+        },
+        {
+          "Position": {
+            "X": 83.32947,
+            "Y": -157.21858,
+            "Z": -67.64331
+          },
+          "StopDistance": 1,
+          "TerritoryId": 1189,
+          "InteractionType": "WalkTo",
+          "DisableNavmesh": true
+        }
+      ]
+    },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "DataId": 1051054,
+          "Position": {
+            "X": 83.32947,
+            "Y": -157.21858,
+            "Z": -67.64331
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 4,
+      "Steps": [
+        {
+          "DataId": 2014259,
+          "Position": {
+            "X": 65.049194,
+            "Y": -184.1612,
+            "Z": -70.237305
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "DisableNavmesh": true,
+          "Mount": false
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048987,
+          "Position": {
+            "X": 596.97876,
+            "Y": -142.60623,
+            "Z": 441.7334
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Yak T'el - Mamook",
+          "Fly": true
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5105_Seek the Sun.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5105_Seek the Sun.json
new file mode 100644 (file)
index 0000000..9a38e35
--- /dev/null
@@ -0,0 +1,92 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1051055,
+          "Position": {
+            "X": 563.5918,
+            "Y": -144.04688,
+            "Z": 702.26587
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "Position": {
+            "X": -45.87303,
+            "Y": -174.86252,
+            "Z": 649.25995
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "WalkTo",
+          "Fly": true
+        },
+        {
+          "DataId": 1051056,
+          "Position": {
+            "X": -49.149292,
+            "Y": -174.58734,
+            "Z": 651.4839
+          },
+          "StopDistance": 5,
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "DisableNavmesh": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 1051056,
+          "Position": {
+            "X": -49.149292,
+            "Y": -174.58734,
+            "Z": 651.4839
+          },
+          "StopDistance": 5,
+          "TerritoryId": 1189,
+          "InteractionType": "Say",
+          "ChatMessage": {
+            "Key": "TEXT_KINGZD106_05105_SAYTODO_000_011"
+          }
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1051055,
+          "Position": {
+            "X": 563.5918,
+            "Y": -144.04688,
+            "Z": 702.26587
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Yak T'el - Mamook",
+          "Fly": true
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5106_Secret of Sweetness.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5106_Secret of Sweetness.json
new file mode 100644 (file)
index 0000000..63f926c
--- /dev/null
@@ -0,0 +1,90 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1048991,
+          "Position": {
+            "X": 211.10852,
+            "Y": -160.27475,
+            "Z": 432.4253
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "Position": {
+            "X": 178.30347,
+            "Y": -195.42366,
+            "Z": 241.28633
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "WalkTo",
+          "Fly": true
+        },
+        {
+          "DataId": 2014260,
+          "Position": {
+            "X": 177.44714,
+            "Y": -194.11005,
+            "Z": 239.61243
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "UseItem",
+          "ItemId": 2003667,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
+        },
+        {
+          "DataId": 2014261,
+          "Position": {
+            "X": 164.47693,
+            "Y": -194.2627,
+            "Z": 237.50659
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "UseItem",
+          "ItemId": 2003667,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048991,
+          "Position": {
+            "X": 211.10852,
+            "Y": -160.27475,
+            "Z": 432.4253
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "CompleteQuest",
+          "Fly": true
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5107_Growing Grove.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5107_Growing Grove.json
new file mode 100644 (file)
index 0000000..ddcb322
--- /dev/null
@@ -0,0 +1,107 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1048998,
+          "Position": {
+            "X": 220.29443,
+            "Y": -156.80957,
+            "Z": 457.02295
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1051408,
+          "Position": {
+            "X": 631.2809,
+            "Y": -137.12654,
+            "Z": 509.6665
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Yak T'el - Mamook",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
+        },
+        {
+          "DataId": 1048974,
+          "Position": {
+            "X": 621.51514,
+            "Y": -135.12726,
+            "Z": 531.1207
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ]
+        },
+        {
+          "DataId": 1048989,
+          "Position": {
+            "X": 523.4302,
+            "Y": -135.12724,
+            "Z": 578.14905
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048998,
+          "Position": {
+            "X": 220.29443,
+            "Y": -156.80957,
+            "Z": 457.02295
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "CompleteQuest",
+          "Fly": true,
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_KINGZD108_05107_Q1_000_000",
+              "Answer": "TEXT_KINGZD108_05107_A1_000_001"
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5108_Age Is Just a Number.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5108_Age Is Just a Number.json
new file mode 100644 (file)
index 0000000..2bfe6c0
--- /dev/null
@@ -0,0 +1,60 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1051067,
+          "Position": {
+            "X": -372.70166,
+            "Y": -162.24626,
+            "Z": 546.25757
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "AcceptQuest",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 2014262,
+          "Position": {
+            "X": -443.83917,
+            "Y": -158.1903,
+            "Z": 343.34326
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Combat",
+          "EnemySpawnType": "AfterInteraction",
+          "KillEnemyDataIds": [
+            17743,
+            17744,
+            17745
+          ],
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1051067,
+          "Position": {
+            "X": -372.70166,
+            "Y": -162.24626,
+            "Z": 546.25757
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "CompleteQuest",
+          "Fly": true
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5109_I'm with Wivre.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5109_I'm with Wivre.json
new file mode 100644 (file)
index 0000000..1e3e90e
--- /dev/null
@@ -0,0 +1,97 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1048997,
+          "Position": {
+            "X": -363.9124,
+            "Y": -162.23582,
+            "Z": 550.01135
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "AcceptQuest",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1051387,
+          "Position": {
+            "X": -383.4745,
+            "Y": -166.23917,
+            "Z": 662.95874
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "Position": {
+            "X": -433.617,
+            "Y": -156.24463,
+            "Z": 776.9229
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Instruction",
+          "Comment": "TODO Needs item use; manual for now (also unsure on health percent)",
+          "EnemySpawnType": "OverworldEnemies",
+          "ComplexCombatData": [
+            {
+              "DataId": 17267,
+              "MinimumKillCount": 2,
+              "ItemId": 2003669,
+              "ItemUseHealthMaxPercent": 25,
+              "RewardItemId": 2003670,
+              "RewardItemCount": 2
+            }
+          ],
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "DataId": 1051387,
+          "Position": {
+            "X": -383.4745,
+            "Y": -166.23917,
+            "Z": 662.95874
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048997,
+          "Position": {
+            "X": -363.9124,
+            "Y": -162.23582,
+            "Z": 550.01135
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "CompleteQuest",
+          "Fly": true
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5111_Hunting for the Family.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5111_Hunting for the Family.json
new file mode 100644 (file)
index 0000000..b2e79a7
--- /dev/null
@@ -0,0 +1,97 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1050873,
+          "Position": {
+            "X": -455.10034,
+            "Y": 17.027555,
+            "Z": -478.8739
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1050874,
+          "Position": {
+            "X": -508.87314,
+            "Y": 29.61908,
+            "Z": -350.1183
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 1050876,
+          "Position": {
+            "X": -455.92438,
+            "Y": 30.374397,
+            "Z": -423.148
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
+        },
+        {
+          "DataId": 1050875,
+          "Position": {
+            "X": -391.01245,
+            "Y": 28.068893,
+            "Z": -365.0111
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1050874,
+          "Position": {
+            "X": -508.87314,
+            "Y": 29.61908,
+            "Z": -350.1183
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "CompleteQuest",
+          "Fly": true,
+          "NextQuestId": 5112
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5112_A Hunter's Dream.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5112_A Hunter's Dream.json
new file mode 100644 (file)
index 0000000..9afc64a
--- /dev/null
@@ -0,0 +1,77 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1050874,
+          "Position": {
+            "X": -508.87314,
+            "Y": 29.61908,
+            "Z": -350.1183
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "AcceptQuest",
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_KINGZD203_05112_Q1_000_000",
+              "Answer": "TEXT_KINGZD203_05112_A1_000_001"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1050877,
+          "Position": {
+            "X": -39.871887,
+            "Y": 0.35915944,
+            "Z": -312.1233
+          },
+          "StopDistance": 1,
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 2014144,
+          "Position": {
+            "X": -43.10681,
+            "Y": 0.503479,
+            "Z": -312.36743
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1050878,
+          "Position": {
+            "X": 475.30322,
+            "Y": 18.197147,
+            "Z": -326.95508
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "CompleteQuest",
+          "Fly": true,
+          "NextQuestId": 5113
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5113_The Trial Commences.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5113_The Trial Commences.json
new file mode 100644 (file)
index 0000000..732d1ec
--- /dev/null
@@ -0,0 +1,90 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1050878,
+          "Position": {
+            "X": 475.30322,
+            "Y": 18.197147,
+            "Z": -326.95508
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1050879,
+          "Position": {
+            "X": 595.7274,
+            "Y": 18.8562,
+            "Z": -85.55737
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "Position": {
+            "X": 705.4334,
+            "Y": 28.302685,
+            "Z": 2.3153868
+          },
+          "StopDistance": 1,
+          "TerritoryId": 1189,
+          "InteractionType": "Combat",
+          "EnemySpawnType": "AutoOnEnterArea",
+          "KillEnemyDataIds": [
+            17671,
+            17672
+          ],
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "DataId": 1050881,
+          "Position": {
+            "X": 595.6052,
+            "Y": 18.84498,
+            "Z": -85.55737
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1050882,
+          "Position": {
+            "X": -408.31616,
+            "Y": 20.383144,
+            "Z": -399.28284
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Yak T'el - Iq Br'aax"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5115_Remembering a Dream.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5115_Remembering a Dream.json
new file mode 100644 (file)
index 0000000..05dc026
--- /dev/null
@@ -0,0 +1,125 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1050888,
+          "Position": {
+            "X": 515.58704,
+            "Y": -146.73436,
+            "Z": 477.0122
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 2014147,
+          "Position": {
+            "X": 440.66528,
+            "Y": -150.77448,
+            "Z": 427.7256
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Combat",
+          "EnemySpawnType": "AfterInteraction",
+          "KillEnemyDataIds": [
+            17674
+          ],
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
+        },
+        {
+          "DataId": 2014148,
+          "Position": {
+            "X": 395.4679,
+            "Y": -152.42242,
+            "Z": 372.7931
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Combat",
+          "EnemySpawnType": "AfterInteraction",
+          "KillEnemyDataIds": [
+            17674
+          ],
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
+        },
+        {
+          "DataId": 2014149,
+          "Position": {
+            "X": 267.9026,
+            "Y": -160.05188,
+            "Z": 354.45166
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 2014150,
+          "Position": {
+            "X": 236.95728,
+            "Y": -167.52887,
+            "Z": 307.97278
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1050890,
+          "Position": {
+            "X": 661.7991,
+            "Y": -137.174,
+            "Z": 557.76294
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Yak T'el - Mamook",
+          "Fly": true,
+          "NextQuestId": 5116
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5116_Budding Promise.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5116_Budding Promise.json
new file mode 100644 (file)
index 0000000..1acb4ee
--- /dev/null
@@ -0,0 +1,80 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1050891,
+          "Position": {
+            "X": 662.8672,
+            "Y": -137.17401,
+            "Z": 556.115
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1048985,
+          "Position": {
+            "X": 595.11694,
+            "Y": -143.83003,
+            "Z": 710.68884
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "Position": {
+            "X": -61.729744,
+            "Y": -212.69492,
+            "Z": 523.0088
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "WalkTo",
+          "Fly": true
+        },
+        {
+          "DataId": 2014151,
+          "Position": {
+            "X": -60.95984,
+            "Y": -210.83392,
+            "Z": 522.02637
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1050891,
+          "Position": {
+            "X": 662.8672,
+            "Y": -137.17401,
+            "Z": 556.115
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Yak T'el - Mamook",
+          "Fly": true,
+          "NextQuestId": 5117
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5117_Skill of a Veteran.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5117_Skill of a Veteran.json
new file mode 100644 (file)
index 0000000..44fbb7f
--- /dev/null
@@ -0,0 +1,86 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1050891,
+          "Position": {
+            "X": 662.8672,
+            "Y": -137.17401,
+            "Z": 556.115
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 2014153,
+          "Position": {
+            "X": 500.5111,
+            "Y": -150.04199,
+            "Z": 704.12744
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "UseItem",
+          "ItemId": 2003624,
+          "GroundTarget": true,
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
+        },
+        {
+          "DataId": 2014152,
+          "Position": {
+            "X": 486.90015,
+            "Y": -150.04199,
+            "Z": 355.8556
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "UseItem",
+          "ItemId": 2003624,
+          "GroundTarget": true,
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1050891,
+          "Position": {
+            "X": 662.8672,
+            "Y": -137.17401,
+            "Z": 556.115
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Yak T'el - Mamook",
+          "Fly": true,
+          "NextQuestId": 5118
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5118_One Forest.json b/QuestPaths/7.x - Dawntrail/Side Quests/Yak T'el/5118_One Forest.json
new file mode 100644 (file)
index 0000000..2b3b981
--- /dev/null
@@ -0,0 +1,219 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1050891,
+          "Position": {
+            "X": 662.8672,
+            "Y": -137.17401,
+            "Z": 556.115
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1050897,
+          "Position": {
+            "X": 755.94714,
+            "Y": -132.59648,
+            "Z": 505.94324
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_KINGZD401_05118_Q1_000_000",
+              "Answer": "TEXT_KINGZD401_05118_A1_000_001"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 1050891,
+          "Position": {
+            "X": 662.8672,
+            "Y": -137.17401,
+            "Z": 556.115
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "DataId": 1050901,
+          "Position": {
+            "X": 627.25244,
+            "Y": -137.174,
+            "Z": 591.8517
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
+        },
+        {
+          "DataId": 1050900,
+          "Position": {
+            "X": 575.55493,
+            "Y": -137.174,
+            "Z": 540.0929
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 4,
+      "Steps": [
+        {
+          "DataId": 1048989,
+          "Position": {
+            "X": 523.4302,
+            "Y": -135.12724,
+            "Z": 578.14905
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 5,
+      "Steps": [
+        {
+          "DataId": 1050891,
+          "Position": {
+            "X": 662.8672,
+            "Y": -137.17401,
+            "Z": 556.115
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 6,
+      "Steps": [
+        {
+          "DataId": 1050904,
+          "Position": {
+            "X": 263.84375,
+            "Y": -157.31726,
+            "Z": 738.6129
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 7,
+      "Steps": [
+        {
+          "DataId": 2014154,
+          "Position": {
+            "X": 255.9701,
+            "Y": -150.68292,
+            "Z": 807.64465
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "UseItem",
+          "ItemId": 2003625,
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 8,
+      "Steps": [
+        {
+          "DataId": 2014248,
+          "Position": {
+            "X": 255.9701,
+            "Y": -150.68292,
+            "Z": 807.64465
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Combat",
+          "EnemySpawnType": "AfterInteraction",
+          "KillEnemyDataIds": [
+            17675
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 9,
+      "Steps": [
+        {
+          "DataId": 1050904,
+          "Position": {
+            "X": 263.84375,
+            "Y": -157.31726,
+            "Z": 738.6129
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1050903,
+          "Position": {
+            "X": 663.9962,
+            "Y": -137.17401,
+            "Z": 554.589
+          },
+          "TerritoryId": 1189,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Yak T'el - Mamook",
+          "Fly": true
+        }
+      ]
+    }
+  ]
+}
index 6c1d43fff4737aa7187a7bab4fe610da7d6eedc2..04b2a1fddd01f0086c3ba13ffa3ef91a9b9fe215 100644 (file)
                               "description": "The enemy data id which is supposed to be killed",
                               "type": "integer"
                             },
+                            "MinimumKillCount": {
+                              "description": "Overworld mobs: If this number of mobs has been killed, will wait a bit before attempting to pull another mob to see if the quest progresses",
+                              "type": "integer"
+                            },
                             "RewardItemId": {
                               "type": "integer"
                             },
index 29d0f2231b6f90d812d7f2cdd87de1eccd18af14..69949ef7d11b44c958e4cd9b5f92d449539677a9 100644 (file)
@@ -5,6 +5,10 @@ namespace Questionable.Model.V1;
 public sealed class ComplexCombatData
 {
     public uint DataId { get; set; }
+
+    // TODO Use this
+    public uint? MinimumKillCount { get; set; }
+
     public uint? RewardItemId { get; set; }
     public int? RewardItemCount { get; set; }
     public IList<short?> CompletionQuestVariablesFlags { get; set; } = new List<short?>();
index da002e2cade702e3cc039a827f2beb62bf5fb898..33ccf29a6fd64d27213683310490f64056b3d6dd 100644 (file)
@@ -22,11 +22,14 @@ internal sealed class CommandHandler : IDisposable
     private readonly QuestWindow _questWindow;
     private readonly QuestSelectionWindow _questSelectionWindow;
     private readonly ITargetManager _targetManager;
+    private readonly GameFunctions _gameFunctions;
+    private readonly IClientState _clientState;
 
     public CommandHandler(ICommandManager commandManager, IChatGui chatGui, QuestController questController,
         MovementController movementController, QuestRegistry questRegistry,
         ConfigWindow configWindow, DebugOverlay debugOverlay, QuestWindow questWindow,
-        QuestSelectionWindow questSelectionWindow, ITargetManager targetManager)
+        QuestSelectionWindow questSelectionWindow, ITargetManager targetManager, GameFunctions gameFunctions,
+        IClientState clientState)
     {
         _commandManager = commandManager;
         _chatGui = chatGui;
@@ -38,6 +41,8 @@ internal sealed class CommandHandler : IDisposable
         _questWindow = questWindow;
         _questSelectionWindow = questSelectionWindow;
         _targetManager = targetManager;
+        _gameFunctions = gameFunctions;
+        _clientState = clientState;
 
         _commandManager.AddHandler("/qst", new CommandInfo(ProcessCommand)
         {
@@ -77,7 +82,12 @@ internal sealed class CommandHandler : IDisposable
                 break;
 
             case "which":
-                _questSelectionWindow.Open(_targetManager.Target);
+                _questSelectionWindow.OpenForTarget(_targetManager.Target);
+                break;
+
+            case "z":
+            case "zone":
+                _questSelectionWindow.OpenForZone(_clientState.TerritoryType);
                 break;
 
             default:
@@ -96,7 +106,9 @@ internal sealed class CommandHandler : IDisposable
 
         if (arguments.Length >= 1 && ushort.TryParse(arguments[0], out ushort questId))
         {
-            if (_questRegistry.TryGetQuest(questId, out Quest? quest))
+            if (_gameFunctions.IsQuestLocked(questId, 0))
+                _chatGui.PrintError($"[Questionable] Quest {questId} is locked.");
+            else if (_questRegistry.TryGetQuest(questId, out Quest? quest))
             {
                 _debugOverlay.HighlightedQuest = questId;
                 _chatGui.Print($"[Questionable] Set highlighted quest to {questId} ({quest.Info.Name}).");
index f8a412539c39aa0072d83c012e30289f5571202d..dc656fbc63c2a2ecd239bfcc7c82b7d439fcda3a 100644 (file)
@@ -36,6 +36,7 @@ internal sealed class QuestRegistry
         _logger = logger;
     }
 
+    public IEnumerable<Quest> AllQuests => _quests.Values;
     public int Count => _quests.Count;
 
     public void Reload()
index 32d0f113ad51b53f492de5d687948a7fd3c61d8a..30a705e691663708c277478679e62cc23d295187 100644 (file)
@@ -18,24 +18,33 @@ internal static class NextQuest
             if (step.NextQuestId == null)
                 return null;
 
+            if (step.NextQuestId.Value == quest.QuestId)
+                return null;
+
             return serviceProvider.GetRequiredService<SetQuest>()
-                .With(step.NextQuestId.Value);
+                .With(step.NextQuestId.Value, quest.QuestId);
         }
     }
 
-    internal sealed class SetQuest(QuestRegistry questRegistry, QuestController questController, ILogger<SetQuest> logger) : ITask
+    internal sealed class SetQuest(QuestRegistry questRegistry, QuestController questController, GameFunctions gameFunctions, ILogger<SetQuest> logger) : ITask
     {
         public ushort NextQuestId { get; set; }
+        public ushort CurrentQuestId { get; set; }
 
-        public ITask With(ushort nextQuestId)
+        public ITask With(ushort nextQuestId, ushort currentQuestId)
         {
             NextQuestId = nextQuestId;
+            CurrentQuestId = currentQuestId;
             return this;
         }
 
         public bool Start()
         {
-            if (questRegistry.TryGetQuest(NextQuestId, out Quest? quest))
+            if (gameFunctions.IsQuestLocked(NextQuestId, CurrentQuestId))
+            {
+                logger.LogInformation("Can't set next quest to {QuestId}, quest is locked", NextQuestId);
+            }
+            else if (questRegistry.TryGetQuest(NextQuestId, out Quest? quest))
             {
                 logger.LogInformation("Setting next quest to {QuestId}: '{QuestName}'", NextQuestId, quest.Info.Name);
                 questController.SetNextQuest(quest);
index 31e3a6229e6e9858cb6261b963c801b2732af65f..f25cec483d3a67670d8e9b895337bdd917aca5d1 100644 (file)
@@ -21,6 +21,8 @@ using Lumina.Excel.CustomSheets;
 using Lumina.Excel.GeneratedSheets2;
 using Microsoft.Extensions.Logging;
 using Questionable.Controller;
+using Questionable.Data;
+using Questionable.Model;
 using Questionable.Model.V1;
 using Action = Lumina.Excel.GeneratedSheets2.Action;
 using BattleChara = FFXIVClientStructs.FFXIV.Client.Game.Character.BattleChara;
@@ -45,6 +47,7 @@ internal sealed unsafe class GameFunctions
     private readonly ICondition _condition;
     private readonly IClientState _clientState;
     private readonly QuestRegistry _questRegistry;
+    private readonly QuestData _questData;
     private readonly IGameGui _gameGui;
     private readonly Configuration _configuration;
     private readonly ILogger<GameFunctions> _logger;
@@ -55,6 +58,7 @@ internal sealed unsafe class GameFunctions
         ICondition condition,
         IClientState clientState,
         QuestRegistry questRegistry,
+        QuestData questData,
         IGameGui gameGui,
         Configuration configuration,
         ILogger<GameFunctions> logger)
@@ -65,6 +69,7 @@ internal sealed unsafe class GameFunctions
         _condition = condition;
         _clientState = clientState;
         _questRegistry = questRegistry;
+        _questData = questData;
         _gameGui = gameGui;
         _configuration = configuration;
         _logger = logger;
@@ -246,7 +251,7 @@ internal sealed unsafe class GameFunctions
 
     public bool IsQuestAcceptedOrComplete(ushort questId)
     {
-        return QuestManager.IsQuestComplete(questId) || IsQuestAccepted(questId);
+        return IsQuestComplete(questId) || IsQuestAccepted(questId);
     }
 
     public bool IsQuestAccepted(ushort questId)
@@ -255,6 +260,38 @@ internal sealed unsafe class GameFunctions
         return questManager->IsQuestAccepted(questId);
     }
 
+    public bool IsQuestComplete(ushort questId)
+    {
+        return QuestManager.IsQuestComplete(questId);
+    }
+
+    public bool IsQuestLocked(ushort questId, ushort? extraCompletedQuest = null)
+    {
+        var questInfo = _questData.GetQuestInfo(questId);
+        if (questInfo.QuestLocks.Count > 0)
+        {
+            var completedQuests = questInfo.QuestLocks.Count(x => IsQuestComplete(x) || x == extraCompletedQuest);
+            if (questInfo.QuestLockJoin == QuestInfo.QuestJoin.All && questInfo.QuestLocks.Count == completedQuests)
+                return true;
+            else if (questInfo.QuestLockJoin == QuestInfo.QuestJoin.AtLeastOne && completedQuests > 0)
+                return true;
+        }
+
+        if (questInfo.PreviousQuests.Count > 0)
+        {
+            var completedQuests = questInfo.PreviousQuests.Count(x => IsQuestComplete(x) || x == extraCompletedQuest);
+            if (questInfo.PreviousQuestJoin == QuestInfo.QuestJoin.All &&
+                questInfo.PreviousQuests.Count == completedQuests)
+                return false;
+            else if (questInfo.PreviousQuestJoin == QuestInfo.QuestJoin.AtLeastOne && completedQuests > 0)
+                return false;
+            else
+                return true;
+        }
+
+        return false;
+    }
+
     public bool IsAetheryteUnlocked(uint aetheryteId, out byte subIndex)
     {
         subIndex = 0;
index 14ac7e7caf0b020adc254041c179a13d92cc4bdc..5b7523e81d6759f22d80942e516546d38440d141 100644 (file)
@@ -1,5 +1,9 @@
 using System;
+using System.Collections.Generic;
+using System.Collections.Immutable;
+using System.Linq;
 using Dalamud.Game.Text;
+using JetBrains.Annotations;
 using ExcelQuest = Lumina.Excel.GeneratedSheets.Quest;
 
 namespace Questionable.Model;
@@ -13,6 +17,11 @@ internal sealed class QuestInfo
         Level = quest.ClassJobLevel0;
         IssuerDataId = quest.IssuerStart;
         IsRepeatable = quest.IsRepeatable;
+        PreviousQuests = quest.PreviousQuest.Select(x => (ushort)(x.Row & 0xFFFF)).Where(x => x != 0).ToImmutableList();
+        PreviousQuestJoin = (QuestJoin)quest.PreviousQuestJoin;
+        QuestLocks = quest.QuestLock.Select(x => (ushort)(x.Row & 0xFFFFF)).Where(x => x != 0).ToImmutableList();
+        QuestLockJoin = (QuestJoin)quest.QuestLockJoin;
+        IsMainScenarioQuest = quest.JournalGenre?.Value?.JournalCategory?.Value?.JournalSection?.Row is 0 or 1;
     }
 
     public ushort QuestId { get; }
@@ -20,7 +29,20 @@ internal sealed class QuestInfo
     public ushort Level { get; }
     public uint IssuerDataId { get; }
     public bool IsRepeatable { get; }
+    public ImmutableList<ushort> PreviousQuests { get; }
+    public QuestJoin PreviousQuestJoin { get; }
+    public bool IsMainScenarioQuest { get; }
+    public ImmutableList<ushort> QuestLocks { get; set; }
+    public QuestJoin QuestLockJoin { get; set; }
 
     public string SimplifiedName => Name
         .TrimStart(SeIconChar.QuestSync.ToIconChar(), SeIconChar.QuestRepeatable.ToIconChar(), ' ');
+
+    [UsedImplicitly(ImplicitUseKindFlags.Assign, ImplicitUseTargetFlags.Members)]
+    public enum QuestJoin : byte
+    {
+        None = 0,
+        All = 1,
+        AtLeastOne = 2,
+    }
 }
index a40ca54d0a645c44d8a7c92b2794e895ccd24a31..8e0bd9714506fca27c330ba30af1a4a15aa8da9f 100644 (file)
@@ -29,13 +29,15 @@ internal sealed class QuestSelectionWindow : LWindow
     private readonly QuestController _questController;
     private readonly QuestRegistry _questRegistry;
     private readonly IDalamudPluginInterface _pluginInterface;
+    private readonly TerritoryData _territoryData;
 
     private List<QuestInfo> _quests = [];
     private List<QuestInfo> _offeredQuests = [];
     private bool _onlyAvailableQuests = true;
 
     public QuestSelectionWindow(QuestData questData, IGameGui gameGui, IChatGui chatGui, GameFunctions gameFunctions,
-        QuestController questController, QuestRegistry questRegistry, IDalamudPluginInterface pluginInterface)
+        QuestController questController, QuestRegistry questRegistry, IDalamudPluginInterface pluginInterface,
+        TerritoryData territoryData)
         : base($"Quest Selection{WindowId}")
     {
         _questData = questData;
@@ -45,6 +47,7 @@ internal sealed class QuestSelectionWindow : LWindow
         _questController = questController;
         _questRegistry = questRegistry;
         _pluginInterface = pluginInterface;
+        _territoryData = territoryData;
 
         Size = new Vector2(500, 200);
         SizeCondition = ImGuiCond.Once;
@@ -57,7 +60,7 @@ internal sealed class QuestSelectionWindow : LWindow
     public uint TargetId { get; private set; }
     public string TargetName { get; private set; } = string.Empty;
 
-    public unsafe void Open(IGameObject? gameObject)
+    public unsafe void OpenForTarget(IGameObject? gameObject)
     {
         if (gameObject != null)
         {
@@ -85,6 +88,28 @@ internal sealed class QuestSelectionWindow : LWindow
         IsOpen = _quests.Count > 0;
     }
 
+    public void OpenForZone(ushort territoryId)
+    {
+        TargetId = territoryId;
+        TargetName = _territoryData.GetNameAndId(territoryId);
+        WindowName = $"Quests starting in {TargetName}{WindowId}";
+
+        _quests = _questRegistry.AllQuests
+            .Where(x => x.FindSequence(0)?.FindStep(0)?.TerritoryId == territoryId)
+            .Select(x => _questData.GetQuestInfo(x.QuestId))
+            .ToList();
+        _offeredQuests = [];
+        IsOpen = true;
+    }
+
+    public override void OnClose()
+    {
+        TargetId = default;
+        TargetName = default;
+        _quests = [];
+        _offeredQuests = [];
+    }
+
     public override void Draw()
     {
         if (_offeredQuests.Count != 0)
@@ -119,30 +144,40 @@ internal sealed class QuestSelectionWindow : LWindow
             if (ImGui.TableNextColumn())
             {
                 ImGui.AlignTextToFramePadding();
-                using var font = _pluginInterface.UiBuilder.IconFontFixedWidthHandle.Push();
-
-                FontAwesomeIcon icon;
-                Vector4 color;
-                if (_gameFunctions.IsQuestAccepted(quest.QuestId))
+                var (color, icon, tooltipText) = GetQuestStyle(quest.QuestId);
+                using (var _ = _pluginInterface.UiBuilder.IconFontFixedWidthHandle.Push())
                 {
-                    color = ImGuiColors.DalamudYellow;
-                    icon = FontAwesomeIcon.Running;
+                    if (isKnownQuest)
+                        ImGui.TextColored(color, icon.ToIconString());
+                    else
+                        ImGui.TextColored(ImGuiColors.DalamudGrey, icon.ToIconString());
                 }
-                else if (_gameFunctions.IsQuestAcceptedOrComplete(quest.QuestId))
-                {
-                    color = ImGuiColors.ParsedGreen;
-                    icon = FontAwesomeIcon.Check;
-                }
-                else
+
+                if (ImGui.IsItemHovered())
                 {
-                    color = ImGuiColors.DalamudRed;
-                    icon = FontAwesomeIcon.Times;
-                }
+                    using var tooltip = ImRaii.Tooltip();
+                    if (tooltip)
+                    {
+                        ImGui.TextColored(color, tooltipText);
+                        if (quest.IsRepeatable)
+                        {
+                            ImGui.SameLine();
+                            ImGui.TextUnformatted("Repeatable");
+                        }
+
+                        if (!_questRegistry.IsKnownQuest(quest.QuestId))
+                        {
+                            ImGui.SameLine();
+                            ImGui.TextUnformatted("NoQuestPath");
+                        }
 
-                if (isKnownQuest)
-                    ImGui.TextColored(color, icon.ToIconString());
-                else
-                    ImGui.TextColored(ImGuiColors.DalamudGrey, icon.ToIconString());
+                        if (quest.PreviousQuests.Count > 0)
+                        {
+                            ImGui.Separator();
+                            DrawQuestUnlocks(quest, 0);
+                        }
+                    }
+                }
             }
 
             if (ImGui.TableNextColumn())
@@ -165,7 +200,9 @@ internal sealed class QuestSelectionWindow : LWindow
 
                 ImGui.SameLine();
 
-                if (knownQuest != null && !_gameFunctions.IsQuestAccepted(quest.QuestId) &&
+                if (knownQuest != null &&
+                    !_gameFunctions.IsQuestAccepted(quest.QuestId) &&
+                    !_gameFunctions.IsQuestLocked(quest.QuestId) &&
                     (quest.IsRepeatable || !_gameFunctions.IsQuestAcceptedOrComplete(quest.QuestId)))
                 {
                     ImGui.BeginDisabled(_questController.NextQuest != null || _questController.SimulatedQuest != null);
@@ -199,4 +236,97 @@ internal sealed class QuestSelectionWindow : LWindow
         ImGui.SetClipboardText(fileName);
         _chatGui.Print($"Copied '{fileName}' to clipboard");
     }
+
+    private (Vector4 color, FontAwesomeIcon icon, string status) GetQuestStyle(ushort questId)
+    {
+        if (_gameFunctions.IsQuestAccepted(questId))
+            return (ImGuiColors.DalamudYellow, FontAwesomeIcon.Running, "Active");
+        else if (_gameFunctions.IsQuestAcceptedOrComplete(questId))
+            return (ImGuiColors.ParsedGreen, FontAwesomeIcon.Check, "Complete");
+        else if (_gameFunctions.IsQuestLocked(questId))
+            return (ImGuiColors.DalamudRed, FontAwesomeIcon.Times, "Locked");
+        else
+            return (ImGuiColors.DalamudYellow, FontAwesomeIcon.PersonWalkingArrowRight, "Available");
+    }
+
+    private void DrawQuestUnlocks(QuestInfo quest, int counter)
+    {
+        if (counter >= 10)
+            return;
+
+        if (counter != 0 && quest.IsMainScenarioQuest)
+            return;
+
+        if (counter > 0)
+            ImGui.Indent();
+
+        if (quest.PreviousQuests.Count > 0)
+        {
+            if (quest.PreviousQuests.Count > 1)
+            {
+                if (quest.PreviousQuestJoin == QuestInfo.QuestJoin.All)
+                    ImGui.Text("Requires all:");
+                else if (quest.PreviousQuestJoin == QuestInfo.QuestJoin.AtLeastOne)
+                    ImGui.Text("Requires one:");
+            }
+
+            foreach (var q in quest.PreviousQuests)
+            {
+                var qInfo = _questData.GetQuestInfo(q);
+                var (iconColor, icon, _) = GetQuestStyle(q);
+                using (var font = _pluginInterface.UiBuilder.IconFontFixedWidthHandle.Push())
+                {
+                    if (_questRegistry.IsKnownQuest(qInfo.QuestId))
+                        ImGui.TextColored(iconColor, icon.ToIconString());
+                    else
+                        ImGui.TextColored(ImGuiColors.DalamudGrey, icon.ToIconString());
+                }
+
+                ImGui.SameLine();
+                ImGui.TextUnformatted(FormatQuestUnlockName(qInfo));
+
+                DrawQuestUnlocks(qInfo, counter + 1);
+            }
+        }
+
+        if (counter == 0 && quest.QuestLocks.Count > 0)
+        {
+            if (quest.QuestLocks.Count > 1)
+            {
+                if (quest.QuestLockJoin == QuestInfo.QuestJoin.All)
+                    ImGui.Text("Blocked if all completed:");
+                else if (quest.QuestLockJoin == QuestInfo.QuestJoin.AtLeastOne)
+                    ImGui.Text("Blocked if at least completed:");
+            }
+            else
+                ImGui.Text("Blocked by (if completed):");
+
+            foreach (var q in quest.QuestLocks)
+            {
+                var qInfo = _questData.GetQuestInfo(q);
+                var (iconColor, icon, _) = GetQuestStyle(q);
+                using (var font = _pluginInterface.UiBuilder.IconFontFixedWidthHandle.Push())
+                {
+                    if (_questRegistry.IsKnownQuest(qInfo.QuestId))
+                        ImGui.TextColored(iconColor, icon.ToIconString());
+                    else
+                        ImGui.TextColored(ImGuiColors.DalamudGrey, icon.ToIconString());
+                }
+
+                ImGui.SameLine();
+                ImGui.TextUnformatted(FormatQuestUnlockName(qInfo));
+            }
+        }
+
+        if (counter > 0)
+            ImGui.Unindent();
+    }
+
+    private static string FormatQuestUnlockName(QuestInfo questInfo)
+    {
+        if (questInfo.IsMainScenarioQuest)
+            return $"{questInfo.Name} ({questInfo.QuestId}, MSQ)";
+        else
+            return $"{questInfo.Name} ({questInfo.QuestId})";
+    }
 }
index 573b90eb078135a9a2b18051225c441d2536c2ed..69793cc29d56c06e067f079ee358378737461686 100644 (file)
@@ -452,7 +452,7 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
             if (ImGui.IsItemHovered())
                 ImGui.SetTooltip("Show all Quests starting with your current target.");
             if (showQuests)
-                _questSelectionWindow.Open(_targetManager.Target);
+                _questSelectionWindow.OpenForTarget(_targetManager.Target);
 
             ImGui.EndDisabled();