Combat (experimental) for overworld enemies, better quest list window, fix landing...
authorLiza Carvelli <liza@carvel.li>
Sun, 14 Jul 2024 19:31:07 +0000 (21:31 +0200)
committerLiza Carvelli <liza@carvel.li>
Sun, 14 Jul 2024 20:10:53 +0000 (22:10 +0200)
56 files changed:
QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3690_A Flowery Frolic.json
QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3691_Sharing Is Caring.json
QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3691_Sharing Is Caring.md [new file with mode: 0644]
QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3692_The Aesthetician of Il Mheg.json
QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3692_The Aesthetician of Il Mheg.md [new file with mode: 0644]
QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3700_Best of Boat Worlds.json [new file with mode: 0644]
QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3701_Amazing Graze.json [new file with mode: 0644]
QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3702_Pure Imagination.json [new file with mode: 0644]
QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4553_Do It for the Vine.json
QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4555_Flowers for Sanduruva.json
QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4562_Waste Not, Want None of That.json [new file with mode: 0644]
QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4563_Seedy Affair.json [new file with mode: 0644]
QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4564_Olfactory Warfare.json
QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5060_A Strong Foundation.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5061_Molting Season.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5062_Danger at the Dock.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5063_Reeding the Room.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5065_Secrets of the Wind.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5066_Leap into the Unknown.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5067_Mesmerizing Moss.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5068_Dry Run.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5069_Dumpling Delivery.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5070_Stretched Thin.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5071_Broken Vessels.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5072_Pole Apart.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5073_Twinkle Twinkle Little Stones.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5075_Water Colors.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5076_Take a Powder.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5077_Pact Away.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5078_Last Call for Earthenshire.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5079_Many Fires, Many Mouths.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5080_Lost Property.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5082_One Feather at a Time.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5083_The Wind's Blessing.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5084_Nahanshe's Answer.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5086_Movamuq's Treasure.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5087_Helping the Helphand.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5088_Give as Good as You Get.json [new file with mode: 0644]
QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5089_The Landsguard's New Clothes.json [new file with mode: 0644]
QuestPaths/quest-v1.json
Questionable.Model/V1/ComplexCombatData.cs [new file with mode: 0644]
Questionable.Model/V1/QuestStep.cs
Questionable/Controller/CombatController.cs
Questionable/Controller/CommandHandler.cs
Questionable/Controller/GameUiController.cs
Questionable/Controller/QuestController.cs
Questionable/Controller/Steps/Interactions/Combat.cs
Questionable/Controller/Steps/Shared/Move.cs
Questionable/DalamudInitializer.cs
Questionable/Data/QuestData.cs
Questionable/GameFunctions.cs
Questionable/Model/QuestInfo.cs
Questionable/Questionable.csproj
Questionable/QuestionablePlugin.cs
Questionable/Windows/QuestSelectionWindow.cs [new file with mode: 0644]
Questionable/Windows/QuestWindow.cs

index 7dc3f163bee2e0c68251aecb158ccf4eda36a041..7235eb5bad16290ef5e2946871009127cb57b649 100644 (file)
@@ -32,7 +32,8 @@
           "EnemySpawnType": "AfterInteraction",
           "KillEnemyDataIds": [
             11443
-          ]
+          ],
+          "Fly": true
         }
       ]
     },
index 80b35d7f6f6f3664a433f006cba15fe1e200bb0b..9dc05e1c527fdbb1f165bbb11f8df907d9e9205e 100644 (file)
     {
       "Sequence": 1,
       "Steps": [
+        {
+          "Position": {
+            "X": -466.72015,
+            "Y": 44.63006,
+            "Z": -310.0618
+          },
+          "TerritoryId": 816,
+          "InteractionType": "WalkTo",
+          "Fly": true
+        },
         {
           "DataId": 1032140,
           "Position": {
           "ChatMessage": {
             "Key": "TEXT_BANPIX103_03691_SAYTODO_000_030"
           },
-          "Fly": true
+          "SkipIf": [
+            "NotTargetable"
+          ]
+        },
+        {
+          "DataId": 1032142,
+          "Position": {
+            "X": -472.7398,
+            "Y": 50.10258,
+            "Z": -328.26733
+          },
+          "TerritoryId": 816,
+          "InteractionType": "Say",
+          "ChatMessage": {
+            "Key": "TEXT_BANPIX103_03691_SAYTODO_000_030"
+          },
+          "SkipIf": [
+            "NotTargetable"
+          ]
         }
       ]
     },
diff --git a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3691_Sharing Is Caring.md b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3691_Sharing Is Caring.md
new file mode 100644 (file)
index 0000000..26720aa
--- /dev/null
@@ -0,0 +1,10 @@
+## Sharing is Caring
+
+QuestWork:
+```
+0 0 0 x 0 0
+      2     → 1032142
+
+unknown
+      ?     → 1032140
+```
index 330fd10595de75a1c01e4c950b38a3fba9d7c4ec..fdba712d48cdf7b281f23580b28decb73fa19bcf 100644 (file)
           },
           "TerritoryId": 816,
           "InteractionType": "WalkTo",
-          "Fly": true,
-          "CompletionQuestVariablesFlags": [
-            null,
-            null,
-            null,
-            null,
-            null,
-            -128
-          ]
+          "Fly": true
         },
         {
           "DataId": 2010860,
           },
           "TerritoryId": 816,
           "InteractionType": "Interact",
-          "CompletionQuestVariablesFlags": [
-            null,
-            null,
-            null,
-            null,
-            null,
-            128
+          "SkipIf": [
+            "NotTargetable"
           ]
         },
         {
             "NotTargetable"
           ],
           "IgnoreDistanceToObject": true
+        },
+        {
+          "DataId": 2010862,
+          "Position": {
+            "X": -276.96655,
+            "Y": 42.893066,
+            "Z": 453.6659
+          },
+          "TerritoryId": 816,
+          "InteractionType": "Interact",
+          "SkipIf": [
+            "NotTargetable"
+          ],
+          "IgnoreDistanceToObject": true
         }
       ]
     },
diff --git a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3692_The Aesthetician of Il Mheg.md b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3692_The Aesthetician of Il Mheg.md
new file mode 100644 (file)
index 0000000..78a9c16
--- /dev/null
@@ -0,0 +1,7 @@
+## The Aesthetician of Il Mheg
+
+QuestWork:
+```
+0 x 0 0 0 0
+  5         → 2010861, 2010862
+```
diff --git a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3700_Best of Boat Worlds.json b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3700_Best of Boat Worlds.json
new file mode 100644 (file)
index 0000000..4ee0b52
--- /dev/null
@@ -0,0 +1,57 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1031809,
+          "Position": {
+            "X": -454.3069,
+            "Y": 71.43217,
+            "Z": 575.1278
+          },
+          "TerritoryId": 816,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 2010894,
+          "Position": {
+            "X": 268.51294,
+            "Y": 33.707153,
+            "Z": -78.14148
+          },
+          "TerritoryId": 816,
+          "InteractionType": "Combat",
+          "EnemySpawnType": "AfterInteraction",
+          "KillEnemyDataIds": [
+            11448
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1031809,
+          "Position": {
+            "X": -454.3069,
+            "Y": 71.43217,
+            "Z": 575.1278
+          },
+          "TerritoryId": 816,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Il Mheg - Lydha Lran",
+          "Fly": true
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3701_Amazing Graze.json b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3701_Amazing Graze.json
new file mode 100644 (file)
index 0000000..b67f385
--- /dev/null
@@ -0,0 +1,112 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1031809,
+          "Position": {
+            "X": -454.3069,
+            "Y": 71.43217,
+            "Z": 575.1278
+          },
+          "TerritoryId": 816,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1032261,
+          "Position": {
+            "X": -258.38104,
+            "Y": 50.977943,
+            "Z": 601.2206
+          },
+          "TerritoryId": 816,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 2010895,
+          "Position": {
+            "X": 718.28796,
+            "Y": 188.06738,
+            "Z": 296.77258
+          },
+          "TerritoryId": 816,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
+        },
+        {
+          "DataId": 2010897,
+          "Position": {
+            "X": 769.0698,
+            "Y": 191.60742,
+            "Z": 251.88062
+          },
+          "TerritoryId": 816,
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "DataId": 1032261,
+          "Position": {
+            "X": -258.38104,
+            "Y": 50.977943,
+            "Z": 601.2206
+          },
+          "TerritoryId": 816,
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Il Mheg - Lydha Lran",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1031809,
+          "Position": {
+            "X": -454.3069,
+            "Y": 71.43217,
+            "Z": 575.1278
+          },
+          "TerritoryId": 816,
+          "InteractionType": "CompleteQuest",
+          "Fly": true
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3702_Pure Imagination.json b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3702_Pure Imagination.json
new file mode 100644 (file)
index 0000000..e3500f9
--- /dev/null
@@ -0,0 +1,64 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1031809,
+          "Position": {
+            "X": -454.3069,
+            "Y": 71.43217,
+            "Z": 575.1278
+          },
+          "TerritoryId": 816,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 2010900,
+          "Position": {
+            "X": 787.92993,
+            "Y": 187.33496,
+            "Z": 174.33423
+          },
+          "TerritoryId": 816,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "Position": {
+            "X": 743.3476,
+            "Y": 186.89098,
+            "Z": 193.8602
+          },
+          "TerritoryId": 816,
+          "InteractionType": "WalkTo",
+          "Comment": "TODO it probably isn't necessary to walk that far"
+        },
+        {
+          "DataId": 1031809,
+          "Position": {
+            "X": -454.3069,
+            "Y": 71.43217,
+            "Z": 575.1278
+          },
+          "TerritoryId": 816,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Il Mheg - Lydha Lran",
+          "Fly": true
+        }
+      ]
+    }
+  ]
+}
index 9f22b8962a4cb17a55338b284b0dacd031f956fb..2b4cb329b8b7feddc44a73133f043412e841ebb4 100644 (file)
@@ -33,7 +33,8 @@
           "KillEnemyDataIds": [
             14674,
             14675
-          ]
+          ],
+          "Fly": true
         }
       ]
     },
index 7cc9b39b5598eb4e4608232805910369cfc011aa..fdba92a8ca2e8c59d07c45f6645ce8274e8f8f00 100644 (file)
@@ -49,6 +49,7 @@
           },
           "TerritoryId": 957,
           "InteractionType": "Interact",
+          "Fly": true,
           "CompletionQuestVariablesFlags": [
             null,
             null,
diff --git a/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4562_Waste Not, Want None of That.json b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4562_Waste Not, Want None of That.json
new file mode 100644 (file)
index 0000000..391185d
--- /dev/null
@@ -0,0 +1,81 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1042301,
+          "Position": {
+            "X": -66.02582,
+            "Y": 39.994705,
+            "Z": 321.06494
+          },
+          "TerritoryId": 957,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1042390,
+          "Position": {
+            "X": 376.089,
+            "Y": 3.1168795,
+            "Z": -241.77924
+          },
+          "TerritoryId": 957,
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Thavnair - Palaka's Stand",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
+        },
+        {
+          "DataId": 1042389,
+          "Position": {
+            "X": -416.31195,
+            "Y": 10.9610405,
+            "Z": 11.48999
+          },
+          "TerritoryId": 957,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "AetheryteShortcut": "Thavnair - Great Work",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1042301,
+          "Position": {
+            "X": -66.02582,
+            "Y": 39.994705,
+            "Z": 321.06494
+          },
+          "TerritoryId": 957,
+          "InteractionType": "CompleteQuest",
+          "Fly": true
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4563_Seedy Affair.json b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4563_Seedy Affair.json
new file mode 100644 (file)
index 0000000..039d3c6
--- /dev/null
@@ -0,0 +1,70 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1042301,
+          "Position": {
+            "X": -66.02582,
+            "Y": 39.994705,
+            "Z": 321.06494
+          },
+          "TerritoryId": 957,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 2012884,
+          "Position": {
+            "X": 111.46704,
+            "Y": 5.935669,
+            "Z": -294.36182
+          },
+          "TerritoryId": 957,
+          "InteractionType": "UseItem",
+          "ItemId": 2003420,
+          "Fly": true,
+          "AetheryteShortcut": "Thavnair - Palaka's Stand"
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 2012884,
+          "Position": {
+            "X": 111.46704,
+            "Y": 5.935669,
+            "Z": -294.36182
+          },
+          "TerritoryId": 957,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1042301,
+          "Position": {
+            "X": -66.02582,
+            "Y": 39.994705,
+            "Z": 321.06494
+          },
+          "TerritoryId": 957,
+          "InteractionType": "CompleteQuest",
+          "Fly": true
+        }
+      ]
+    }
+  ]
+}
index acfd58ad79341139042749f6f315720205f1ec95..4836ac56a863903c57d8dac622ee0e1a95267402 100644 (file)
             null,
             null,
             null,
-            32
+            -32
           ]
         },
         {
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5060_A Strong Foundation.json b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5060_A Strong Foundation.json
new file mode 100644 (file)
index 0000000..ece4a81
--- /dev/null
@@ -0,0 +1,136 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1048779,
+          "Position": {
+            "X": -231.15894,
+            "Y": 3.221878,
+            "Z": -453.17773
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "Position": {
+            "X": -93.41179,
+            "Y": 15.238003,
+            "Z": -677.9412
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "WalkTo",
+          "Fly": true
+        },
+        {
+          "DataId": 2014160,
+          "Position": {
+            "X": -95.23157,
+            "Y": 16.464417,
+            "Z": -677.8821
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "Position": {
+            "X": 183.02583,
+            "Y": -0.40592146,
+            "Z": -568.2219
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "WalkTo",
+          "Fly": true
+        },
+        {
+          "DataId": 2014163,
+          "Position": {
+            "X": 181.8722,
+            "Y": 0.99176025,
+            "Z": -568.5359
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "UseItem",
+          "ItemId": 2003626,
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ]
+        },
+        {
+          "DataId": 2014161,
+          "Position": {
+            "X": 221.57617,
+            "Y": 0.99176025,
+            "Z": -610.7423
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "UseItem",
+          "ItemId": 2003626,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
+        },
+        {
+          "DataId": 2014162,
+          "Position": {
+            "X": 244.953,
+            "Y": 1.1138916,
+            "Z": -569.2684
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "UseItem",
+          "ItemId": 2003626,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048779,
+          "Position": {
+            "X": -231.15894,
+            "Y": 3.221878,
+            "Z": -453.17773
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Kozama'uka - Ok'hanu",
+          "Fly": true
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5061_Molting Season.json b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5061_Molting Season.json
new file mode 100644 (file)
index 0000000..9499462
--- /dev/null
@@ -0,0 +1,71 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1048780,
+          "Position": {
+            "X": -103.868225,
+            "Y": 25.199324,
+            "Z": -525.41394
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "Position": {
+            "X": -95.05529,
+            "Y": 25.199324,
+            "Z": -523.8404
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "WalkTo",
+          "Mount": true,
+          "SkipIf": [
+            "FlyingLocked"
+          ]
+        },
+        {
+          "DataId": 2014195,
+          "Position": {
+            "X": -314.2901,
+            "Y": 0.38146973,
+            "Z": -211.26117
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Combat",
+          "EnemySpawnType": "AfterInteraction",
+          "KillEnemyDataIds": [
+            17656
+          ],
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048780,
+          "Position": {
+            "X": -103.868225,
+            "Y": 25.199324,
+            "Z": -525.41394
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Kozama'uka - Ok'hanu",
+          "Fly": true
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5062_Danger at the Dock.json b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5062_Danger at the Dock.json
new file mode 100644 (file)
index 0000000..64c24d9
--- /dev/null
@@ -0,0 +1,58 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1048781,
+          "Position": {
+            "X": -213.09229,
+            "Y": 6.2771482,
+            "Z": -510.70422
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 2014196,
+          "Position": {
+            "X": 728.7556,
+            "Y": 8.010925,
+            "Z": -287.95306
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Combat",
+          "EnemySpawnType": "AfterInteraction",
+          "KillEnemyDataIds": [
+            17657,
+            17658
+          ],
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048781,
+          "Position": {
+            "X": -213.09229,
+            "Y": 6.2771482,
+            "Z": -510.70422
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Kozama'uka - Ok'hanu"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5063_Reeding the Room.json b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5063_Reeding the Room.json
new file mode 100644 (file)
index 0000000..63f2a43
--- /dev/null
@@ -0,0 +1,98 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1048815,
+          "Position": {
+            "X": 127.03125,
+            "Y": 3.8414035,
+            "Z": -279.92682
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 2014165,
+          "Position": {
+            "X": 255.57336,
+            "Y": -0.015319824,
+            "Z": -350.57605
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
+        },
+        {
+          "DataId": 2014166,
+          "Position": {
+            "X": 198.74878,
+            "Y": -0.015319824,
+            "Z": -385.39716
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ]
+        },
+        {
+          "DataId": 2014164,
+          "Position": {
+            "X": 92.69849,
+            "Y": -0.015319824,
+            "Z": -409.26227
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048821,
+          "Position": {
+            "X": -39.35309,
+            "Y": 21.48717,
+            "Z": -69.44385
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "CompleteQuest"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5065_Secrets of the Wind.json b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5065_Secrets of the Wind.json
new file mode 100644 (file)
index 0000000..5c6134d
--- /dev/null
@@ -0,0 +1,98 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1048831,
+          "Position": {
+            "X": 252.76562,
+            "Y": 13.481276,
+            "Z": -579.30884
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1048786,
+          "Position": {
+            "X": -193.3471,
+            "Y": 6.277148,
+            "Z": -443.50348
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Kozama'uka - Ok'hanu",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
+        },
+        {
+          "DataId": 1048787,
+          "Position": {
+            "X": -143.51111,
+            "Y": 9.842161,
+            "Z": -425.7115
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ]
+        },
+        {
+          "DataId": 1048785,
+          "Position": {
+            "X": -121.26343,
+            "Y": 9.773314,
+            "Z": -551.1406
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048831,
+          "Position": {
+            "X": 252.76562,
+            "Y": 13.481276,
+            "Z": -579.30884
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "CompleteQuest"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5066_Leap into the Unknown.json b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5066_Leap into the Unknown.json
new file mode 100644 (file)
index 0000000..c9253e9
--- /dev/null
@@ -0,0 +1,84 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1048836,
+          "Position": {
+            "X": -578.91205,
+            "Y": 6.1739964,
+            "Z": -472.80084
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1048837,
+          "Position": {
+            "X": -613.2754,
+            "Y": 93.595924,
+            "Z": -476.95123
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "Position": {
+            "X": -607.3569,
+            "Y": 93.57029,
+            "Z": -472.15475
+          },
+          "StopDistance": 0.5,
+          "TerritoryId": 1188,
+          "InteractionType": "Emote",
+          "Emote": "pray"
+        }
+      ]
+    },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "Position": {
+            "X": -585.36694,
+            "Y": 6.317712,
+            "Z": -463.53406
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "WalkTo",
+          "DisableNavmesh": true
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048836,
+          "Position": {
+            "X": -578.91205,
+            "Y": 6.1739964,
+            "Z": -472.80084
+          },
+          "StopDistance": 7,
+          "TerritoryId": 1188,
+          "InteractionType": "CompleteQuest"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5067_Mesmerizing Moss.json b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5067_Mesmerizing Moss.json
new file mode 100644 (file)
index 0000000..8f14d49
--- /dev/null
@@ -0,0 +1,74 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1048783,
+          "Position": {
+            "X": -269.91687,
+            "Y": 5.9870257,
+            "Z": -431.47937
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1050705,
+          "Position": {
+            "X": -218.24988,
+            "Y": 0.4,
+            "Z": -41.519836
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Combat",
+          "EnemySpawnType": "AfterInteraction",
+          "KillEnemyDataIds": [
+            17659
+          ],
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 1050705,
+          "Position": {
+            "X": -218.24988,
+            "Y": 0.4,
+            "Z": -41.519836
+          },
+          "StopDistance": 7,
+          "TerritoryId": 1188,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048783,
+          "Position": {
+            "X": -269.91687,
+            "Y": 5.9870257,
+            "Z": -431.47937
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Kozama'uka - Ok'hanu",
+          "Fly": true
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5068_Dry Run.json b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5068_Dry Run.json
new file mode 100644 (file)
index 0000000..b53d29e
--- /dev/null
@@ -0,0 +1,83 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1050707,
+          "Position": {
+            "X": -183.73395,
+            "Y": 10.893587,
+            "Z": -584.2832
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 2014172,
+          "Position": {
+            "X": -70.96979,
+            "Y": 6.515503,
+            "Z": -496.2692
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "Position": {
+            "X": 623.9169,
+            "Y": 46.050114,
+            "Z": -526.32715
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "WalkTo",
+          "Fly": true,
+          "SkipIf": [
+            "FlyingLocked"
+          ]
+        },
+        {
+          "DataId": 2014173,
+          "Position": {
+            "X": 670.5576,
+            "Y": 42.923584,
+            "Z": -515.55664
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1050707,
+          "Position": {
+            "X": -183.73395,
+            "Y": 10.893587,
+            "Z": -584.2832
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Kozama'uka - Ok'hanu",
+          "Fly": true
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5069_Dumpling Delivery.json b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5069_Dumpling Delivery.json
new file mode 100644 (file)
index 0000000..eab8576
--- /dev/null
@@ -0,0 +1,99 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1048784,
+          "Position": {
+            "X": -115.617676,
+            "Y": 25.086319,
+            "Z": -551.5984
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1048898,
+          "Position": {
+            "X": 524.1931,
+            "Y": 15.639493,
+            "Z": 5.4473877
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Kozama'uka - Many Fires",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ]
+        },
+        {
+          "DataId": 1048897,
+          "Position": {
+            "X": 551.6593,
+            "Y": 12.326415,
+            "Z": -32.852783
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
+        },
+        {
+          "DataId": 1048896,
+          "Position": {
+            "X": 513.0541,
+            "Y": 15.9776535,
+            "Z": -54.36792
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048784,
+          "Position": {
+            "X": -115.617676,
+            "Y": 25.086319,
+            "Z": -551.5984
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Kozama'uka - Ok'hanu"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5070_Stretched Thin.json b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5070_Stretched Thin.json
new file mode 100644 (file)
index 0000000..29fc271
--- /dev/null
@@ -0,0 +1,52 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1051372,
+          "Position": {
+            "X": -183.79492,
+            "Y": 6.5185943,
+            "Z": -498.0392
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1051373,
+          "Position": {
+            "X": -232.07446,
+            "Y": 10.1700535,
+            "Z": -395.68176
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1051374,
+          "Position": {
+            "X": -229.02264,
+            "Y": 10.041226,
+            "Z": -396.2005
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "CompleteQuest"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5071_Broken Vessels.json b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5071_Broken Vessels.json
new file mode 100644 (file)
index 0000000..ee36786
--- /dev/null
@@ -0,0 +1,79 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1048853,
+          "Position": {
+            "X": -431.99817,
+            "Y": 121.63345,
+            "Z": 304.3412
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 2014174,
+          "Position": {
+            "X": -756.89325,
+            "Y": 135.66797,
+            "Z": 83.78723
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
+        },
+        {
+          "DataId": 2014175,
+          "Position": {
+            "X": -786.3432,
+            "Y": 135.66797,
+            "Z": 121.9043
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048853,
+          "Position": {
+            "X": -431.99817,
+            "Y": 121.63345,
+            "Z": 304.3412
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Kozama'uka - Earthenshire"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5072_Pole Apart.json b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5072_Pole Apart.json
new file mode 100644 (file)
index 0000000..51d1b67
--- /dev/null
@@ -0,0 +1,103 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1048867,
+          "Position": {
+            "X": -489.0364,
+            "Y": 121.63345,
+            "Z": 368.00183
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "Position": {
+            "X": -298.1575,
+            "Y": 112.88461,
+            "Z": 684.6612
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "WalkTo",
+          "Fly": true
+        },
+        {
+          "DataId": 1050708,
+          "Position": {
+            "X": -296.52863,
+            "Y": 112.804924,
+            "Z": 686.2439
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 2014176,
+          "Position": {
+            "X": -127.15344,
+            "Y": 109.57495,
+            "Z": 523.7964
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "Position": {
+            "X": -298.1575,
+            "Y": 112.88461,
+            "Z": 684.6612
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "WalkTo",
+          "Fly": true
+        },
+        {
+          "DataId": 1050708,
+          "Position": {
+            "X": -296.52863,
+            "Y": 112.804924,
+            "Z": 686.2439
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048867,
+          "Position": {
+            "X": -489.0364,
+            "Y": 121.63345,
+            "Z": 368.00183
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Kozama'uka - Earthenshire"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5073_Twinkle Twinkle Little Stones.json b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5073_Twinkle Twinkle Little Stones.json
new file mode 100644 (file)
index 0000000..42a33cd
--- /dev/null
@@ -0,0 +1,118 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1048854,
+          "Position": {
+            "X": -514.1833,
+            "Y": 121.63345,
+            "Z": 293.38513
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 2014177,
+          "Position": {
+            "X": -351.40002,
+            "Y": 109.57495,
+            "Z": 62.210938
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
+        },
+        {
+          "DataId": 2014178,
+          "Position": {
+            "X": -172.32019,
+            "Y": 109.54443,
+            "Z": 128.67932
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
+        },
+        {
+          "DataId": 2014179,
+          "Position": {
+            "X": 142.96167,
+            "Y": 109.57495,
+            "Z": 169.604
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ]
+        },
+        {
+          "DataId": 2014180,
+          "Position": {
+            "X": 214.86218,
+            "Y": 109.54443,
+            "Z": 138.68921
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            16
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048854,
+          "Position": {
+            "X": -514.1833,
+            "Y": 121.63345,
+            "Z": 293.38513
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Kozama'uka - Earthenshire"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5075_Water Colors.json b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5075_Water Colors.json
new file mode 100644 (file)
index 0000000..ee26320
--- /dev/null
@@ -0,0 +1,121 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1048856,
+          "Position": {
+            "X": -499.6262,
+            "Y": 121.63344,
+            "Z": 347.70728
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "Position": {
+            "X": -74.84617,
+            "Y": 116.64437,
+            "Z": 590.74945
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "WalkTo",
+          "Fly": true,
+          "SkipIf": [
+            "FlyingLocked"
+          ],
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            -32
+          ]
+        },
+        {
+          "DataId": 2014184,
+          "Position": {
+            "X": -5.1728516,
+            "Y": -6.729248,
+            "Z": 619.98914
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "DisableNavmesh": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ]
+        },
+        {
+          "DataId": 2014182,
+          "Position": {
+            "X": 112.93201,
+            "Y": -2.7314453,
+            "Z": 542.9617
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
+        },
+        {
+          "DataId": 2014183,
+          "Position": {
+            "X": 266.3462,
+            "Y": -1.9684448,
+            "Z": 498.58838
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048856,
+          "Position": {
+            "X": -499.6262,
+            "Y": 121.63344,
+            "Z": 347.70728
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Kozama'uka - Many Fires"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5076_Take a Powder.json b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5076_Take a Powder.json
new file mode 100644 (file)
index 0000000..2ee099c
--- /dev/null
@@ -0,0 +1,53 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1048857,
+          "Position": {
+            "X": -515.7092,
+            "Y": 122.40314,
+            "Z": 342.9159
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1048843,
+          "Position": {
+            "X": 588.7998,
+            "Y": 121.14124,
+            "Z": 176.98938
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Kozama'uka - Many Fires"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048857,
+          "Position": {
+            "X": -515.7092,
+            "Y": 122.40314,
+            "Z": 342.9159
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Kozama'uka - Earthenshire"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5077_Pact Away.json b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5077_Pact Away.json
new file mode 100644 (file)
index 0000000..4aa1ac9
--- /dev/null
@@ -0,0 +1,82 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1048858,
+          "Position": {
+            "X": -426.87115,
+            "Y": 121.63345,
+            "Z": 320.88184
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 2014185,
+          "Position": {
+            "X": -427.38995,
+            "Y": 122.91138,
+            "Z": 319.38647
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 2014187,
+          "Position": {
+            "X": -548.2719,
+            "Y": 133.83679,
+            "Z": 698.1765
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "DataId": 1048880,
+          "Position": {
+            "X": -552.3613,
+            "Y": 133.86514,
+            "Z": 696.16235
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048858,
+          "Position": {
+            "X": -426.87115,
+            "Y": 121.63345,
+            "Z": 320.88184
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Kozama'uka - Earthenshire"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5078_Last Call for Earthenshire.json b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5078_Last Call for Earthenshire.json
new file mode 100644 (file)
index 0000000..dd4526a
--- /dev/null
@@ -0,0 +1,116 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1048843,
+          "Position": {
+            "X": 588.7998,
+            "Y": 121.14124,
+            "Z": 176.98938
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1048847,
+          "Position": {
+            "X": 615.2589,
+            "Y": 119.49003,
+            "Z": 197.58899
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            16
+          ]
+        },
+        {
+          "DataId": 1048845,
+          "Position": {
+            "X": 568.7495,
+            "Y": 119.49004,
+            "Z": 159.53308
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
+        },
+        {
+          "DataId": 1048846,
+          "Position": {
+            "X": 512.2606,
+            "Y": 114.99095,
+            "Z": 183.85596
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ]
+        },
+        {
+          "DataId": 1048844,
+          "Position": {
+            "X": 476.40186,
+            "Y": 119.9383,
+            "Z": 101.79285
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048843,
+          "Position": {
+            "X": 588.7998,
+            "Y": 121.14124,
+            "Z": 176.98938
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "CompleteQuest",
+          "Fly": true
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5079_Many Fires, Many Mouths.json b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5079_Many Fires, Many Mouths.json
new file mode 100644 (file)
index 0000000..4dd5d9f
--- /dev/null
@@ -0,0 +1,113 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1048848,
+          "Position": {
+            "X": 621.51514,
+            "Y": 119.49004,
+            "Z": 175.00574
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "Position": {
+            "X": 444.93774,
+            "Y": 112.59213,
+            "Z": 206.74438
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Combat",
+          "EnemySpawnType": "OverworldEnemies",
+          "ComplexCombatData": [
+            {
+              "DataId": 17241,
+              "RewardItemId": 2003643,
+              "RewardItemCount": 1,
+              "CompletionQuestVariablesFlags": [
+                null,
+                null,
+                16,
+                null,
+                null,
+                null
+              ]
+            }
+          ],
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            16,
+            null,
+            null,
+            null
+          ],
+          "$": "16 0 16 0 0 0"
+        },
+        {
+          "Position": {
+            "X": -21.622044,
+            "Y": 109.937355,
+            "Z": 217.64447
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Combat",
+          "EnemySpawnType": "OverworldEnemies",
+          "ComplexCombatData": [
+            {
+              "DataId": 17242,
+              "RewardItemId": 2003642,
+              "RewardItemCount": 1,
+              "CompletionQuestVariablesFlags": [
+                null,
+                1,
+                null,
+                null,
+                null,
+                null
+              ]
+            }
+          ],
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            1,
+            null,
+            null,
+            null,
+            null
+          ],
+          "$": "16 1 0 0 0 0"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1048848,
+          "Position": {
+            "X": 621.51514,
+            "Y": 119.49004,
+            "Z": 175.00574
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Kozama'uka - Many Fires",
+          "Fly": true
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5080_Lost Property.json b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5080_Lost Property.json
new file mode 100644 (file)
index 0000000..6e22ef8
--- /dev/null
@@ -0,0 +1,99 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1050714,
+          "Position": {
+            "X": 495.6587,
+            "Y": 113.678986,
+            "Z": 181.23132
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 2014189,
+          "Position": {
+            "X": 194.93396,
+            "Y": 109.4834,
+            "Z": 145.25061
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
+        },
+        {
+          "DataId": 2014191,
+          "Position": {
+            "X": 53.3302,
+            "Y": 109.17822,
+            "Z": 246.3263
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ]
+        },
+        {
+          "DataId": 2014190,
+          "Position": {
+            "X": -19.119629,
+            "Y": 109.57495,
+            "Z": 182.02478
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1050714,
+          "Position": {
+            "X": 495.6587,
+            "Y": 113.678986,
+            "Z": 181.23132
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Kozama'uka - Many Fires"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5082_One Feather at a Time.json b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5082_One Feather at a Time.json
new file mode 100644 (file)
index 0000000..d1aff45
--- /dev/null
@@ -0,0 +1,107 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1051243,
+          "Position": {
+            "X": -128.893,
+            "Y": 9.842161,
+            "Z": -416.95276
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1051244,
+          "Position": {
+            "X": 224.01758,
+            "Y": 10.257621,
+            "Z": -570.64166
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 2014281,
+          "Position": {
+            "X": 222.58337,
+            "Y": 10.72699,
+            "Z": -568.44434
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "Position": {
+            "X": 37.763844,
+            "Y": 1.8493831,
+            "Z": -555.61774
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "WalkTo"
+        },
+        {
+          "DataId": 2014284,
+          "Position": {
+            "X": -123.30823,
+            "Y": 9.84198,
+            "Z": -419.11957
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 4,
+      "Steps": [
+        {
+          "DataId": 1051243,
+          "Position": {
+            "X": -128.893,
+            "Y": 9.842161,
+            "Z": -416.95276
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1051246,
+          "Position": {
+            "X": -127.45862,
+            "Y": 9.842161,
+            "Z": -419.6994
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "CompleteQuest",
+          "NextQuestId": 5083
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5083_The Wind's Blessing.json b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5083_The Wind's Blessing.json
new file mode 100644 (file)
index 0000000..7b9feec
--- /dev/null
@@ -0,0 +1,104 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1051243,
+          "Position": {
+            "X": -128.893,
+            "Y": 9.842161,
+            "Z": -416.95276
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1051247,
+          "Position": {
+            "X": 341.66467,
+            "Y": 9.178029,
+            "Z": -213.15332
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 2014198,
+          "Position": {
+            "X": 438.04077,
+            "Y": -0.015319824,
+            "Z": -395.43762
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Combat",
+          "EnemySpawnType": "AfterInteraction",
+          "KillEnemyDataIds": [
+            17661
+          ],
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "DataId": 2014286,
+          "Position": {
+            "X": 440.78735,
+            "Y": 1.1749268,
+            "Z": -397.1161
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 4,
+      "Steps": [
+        {
+          "DataId": 1051247,
+          "Position": {
+            "X": 341.66467,
+            "Y": 9.178029,
+            "Z": -213.15332
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1051251,
+          "Position": {
+            "X": 654.7798,
+            "Y": 26.32866,
+            "Z": -490.95905
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "CompleteQuest",
+          "NextQuestId": 5084
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5084_Nahanshe's Answer.json b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5084_Nahanshe's Answer.json
new file mode 100644 (file)
index 0000000..b23ccd3
--- /dev/null
@@ -0,0 +1,154 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1051252,
+          "Position": {
+            "X": 654.6272,
+            "Y": 26.32866,
+            "Z": -491.02008
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "AcceptQuest",
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_KINGZC204_05084_Q1_000_100",
+              "Answer": "TEXT_KINGZC204_05084_A2_000_100"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1051253,
+          "Position": {
+            "X": -122.972534,
+            "Y": 9.842161,
+            "Z": -421.1643
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Kozama'uka - Ok'hanu"
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 1048786,
+          "Position": {
+            "X": -193.3471,
+            "Y": 6.277148,
+            "Z": -443.50348
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            32
+          ]
+        },
+        {
+          "DataId": 1048783,
+          "Position": {
+            "X": -269.91687,
+            "Y": 5.9870257,
+            "Z": -431.47937
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            128
+          ]
+        },
+        {
+          "DataId": 1048785,
+          "Position": {
+            "X": -121.26343,
+            "Y": 9.773314,
+            "Z": -551.1406
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "CompletionQuestVariablesFlags": [
+            null,
+            null,
+            null,
+            null,
+            null,
+            64
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "DataId": 1051255,
+          "Position": {
+            "X": -128.98456,
+            "Y": 9.84216,
+            "Z": -420.58447
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 4,
+      "Steps": [
+        {
+          "DataId": 1051258,
+          "Position": {
+            "X": 658.7167,
+            "Y": 5.2940493,
+            "Z": -335.07288
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1051261,
+          "Position": {
+            "X": -130.9682,
+            "Y": 9.842161,
+            "Z": -416.58655
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Kozama'uka - Ok'hanu"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5086_Movamuq's Treasure.json b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5086_Movamuq's Treasure.json
new file mode 100644 (file)
index 0000000..0090d41
--- /dev/null
@@ -0,0 +1,82 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1051265,
+          "Position": {
+            "X": -444.78522,
+            "Y": 122.89024,
+            "Z": 342.8855
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1048850,
+          "Position": {
+            "X": -472.5567,
+            "Y": 121.77377,
+            "Z": 271.229
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 1051263,
+          "Position": {
+            "X": -521.0193,
+            "Y": 121.63345,
+            "Z": 319.38647
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "DataId": 1051265,
+          "Position": {
+            "X": -444.78522,
+            "Y": 122.89024,
+            "Z": 342.8855
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1051263,
+          "Position": {
+            "X": -521.0193,
+            "Y": 121.63345,
+            "Z": 319.38647
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "CompleteQuest",
+          "NextQuestId": 5087
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5087_Helping the Helphand.json b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5087_Helping the Helphand.json
new file mode 100644 (file)
index 0000000..b35d95e
--- /dev/null
@@ -0,0 +1,89 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1051263,
+          "Position": {
+            "X": -521.0193,
+            "Y": 121.63345,
+            "Z": 319.38647
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1051266,
+          "Position": {
+            "X": 565.8197,
+            "Y": 115.49999,
+            "Z": 195.30017
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Kozama'uka - Many Fires"
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "Position": {
+            "X": 627.93854,
+            "Y": 110.09355,
+            "Z": 334.26776
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Combat",
+          "EnemySpawnType": "OverworldEnemies",
+          "KillEnemyDataIds": [
+            17244
+          ],
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "DataId": 1051266,
+          "Position": {
+            "X": 565.8197,
+            "Y": 115.49999,
+            "Z": 195.30017
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Kozama'uka - Many Fires"
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1051267,
+          "Position": {
+            "X": -447.5014,
+            "Y": 122.95055,
+            "Z": 343.099
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "CompleteQuest",
+          "AetheryteShortcut": "Kozama'uka - Earthenshire",
+          "NextQuestId": 5088
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5088_Give as Good as You Get.json b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5088_Give as Good as You Get.json
new file mode 100644 (file)
index 0000000..5759b0c
--- /dev/null
@@ -0,0 +1,127 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1051267,
+          "Position": {
+            "X": -447.5014,
+            "Y": 122.95055,
+            "Z": 343.099
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "AcceptQuest",
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_KINGZC304_05088_Q1_000_100",
+              "Answer": "TEXT_KINGZC304_05088_A2_000_100"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 2014289,
+          "Position": {
+            "X": -422.50708,
+            "Y": 122.88086,
+            "Z": 338.88757
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Mount": true
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 2014290,
+          "Position": {
+            "X": -519.4629,
+            "Y": 123.88794,
+            "Z": 252.61304
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "Position": {
+            "X": -759,
+            "Y": 129.30363,
+            "Z": 237.35704
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Combat",
+          "EnemySpawnType": "AutoOnEnterArea",
+          "KillEnemyDataIds": [
+            17662
+          ],
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 4,
+      "Steps": [
+        {
+          "DataId": 1051268,
+          "Position": {
+            "X": -756.80176,
+            "Y": 129.29285,
+            "Z": 240.7721
+          },
+          "StopDistance": 7,
+          "TerritoryId": 1188,
+          "InteractionType": "Interact"
+        }
+      ]
+    },
+    {
+      "Sequence": 5,
+      "Steps": [
+        {
+          "DataId": 1051269,
+          "Position": {
+            "X": -566.73535,
+            "Y": 133.78297,
+            "Z": 721.3396
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1051267,
+          "Position": {
+            "X": -447.5014,
+            "Y": 122.95055,
+            "Z": 343.099
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "CompleteQuest",
+          "NextQuestId": 5089,
+          "AetheryteShortcut": "Kozama'uka - Earthenshire"
+        }
+      ]
+    }
+  ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5089_The Landsguard's New Clothes.json b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5089_The Landsguard's New Clothes.json
new file mode 100644 (file)
index 0000000..bebc940
--- /dev/null
@@ -0,0 +1,132 @@
+{
+  "$schema": "https://carvel.li/questionable/quest-1.0",
+  "Author": "liza",
+  "QuestSequence": [
+    {
+      "Sequence": 0,
+      "Steps": [
+        {
+          "DataId": 1051271,
+          "Position": {
+            "X": -447.04358,
+            "Y": 122.95054,
+            "Z": 343.4348
+          },
+          "StopDistance": 5,
+          "TerritoryId": 1188,
+          "InteractionType": "AcceptQuest"
+        }
+      ]
+    },
+    {
+      "Sequence": 1,
+      "Steps": [
+        {
+          "DataId": 1051273,
+          "Position": {
+            "X": 565.54517,
+            "Y": 115.5,
+            "Z": 193.22498
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Kozama'uka - Many Fires"
+        }
+      ]
+    },
+    {
+      "Sequence": 2,
+      "Steps": [
+        {
+          "DataId": 1051275,
+          "Position": {
+            "X": -645.7771,
+            "Y": 127.95559,
+            "Z": 661.76843
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Kozama'uka - Earthenshire",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 3,
+      "Steps": [
+        {
+          "DataId": 1051270,
+          "Position": {
+            "X": -565.2705,
+            "Y": 133.77481,
+            "Z": 720.7294
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true,
+          "DialogueChoices": [
+            {
+              "Type": "List",
+              "Prompt": "TEXT_KINGZC401_05089_Q1_000_100",
+              "Answer": "TEXT_KINGZC401_05089_A1_000_100"
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 4,
+      "Steps": [
+        {
+          "DataId": 1051277,
+          "Position": {
+            "X": -647.0283,
+            "Y": 127.88751,
+            "Z": 660.57825
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "Fly": true
+        }
+      ]
+    },
+    {
+      "Sequence": 5,
+      "Steps": [
+        {
+          "DataId": 1051278,
+          "Position": {
+            "X": -130.69354,
+            "Y": 9.84216,
+            "Z": -415.21326
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "Interact",
+          "AetheryteShortcut": "Kozama'uka - Ok'hanu",
+          "DialogueChoices": [
+            {
+              "Type": "YesNo",
+              "Prompt": "TEXT_KINGZC401_05089_Q100_000_100",
+              "Yes": true
+            }
+          ]
+        }
+      ]
+    },
+    {
+      "Sequence": 255,
+      "Steps": [
+        {
+          "DataId": 1051280,
+          "Position": {
+            "X": -125.20032,
+            "Y": 9.842161,
+            "Z": -418.08197
+          },
+          "TerritoryId": 1188,
+          "InteractionType": "CompleteQuest"
+        }
+      ]
+    }
+  ]
+}
index 5ef8d74acb62a2bb168006754a355b3e08647430..6c1d43fff4737aa7187a7bab4fe610da7d6eedc2 100644 (file)
                   }
                 },
                 "CompletionQuestVariablesFlags": {
-                  "type": "array",
-                  "description": "Quest Variables that dictate whether or not this step is skipped: null is don't check, positive values need to be set, negative values need to be unset",
-                  "items": {
-                    "type": [
-                      "integer",
-                      "null"
-                    ],
-                    "enum": [
-                      null,
-                      1,
-                      2,
-                      4,
-                      8,
-                      16,
-                      32,
-                      64,
-                      128,
-                      -1,
-                      -2,
-                      -4,
-                      -8,
-                      -16,
-                      -32,
-                      -64,
-                      -128
-                    ]
-                  },
-                  "minItems": 6,
-                  "maxItems": 6
+                  "$ref": "#/$defs/CompletionFlags"
                 },
                 "DelaySecondsAtStart": {
                   "description": "Time to wait before starting",
                         "items": {
                           "type": "integer"
                         }
+                      },
+                      "ComplexCombatData": {
+                        "description": "If multiple different enemies are supposed to be killed in a single quest step, this typically is handled via items",
+                        "type": "array",
+                        "items": {
+                          "type": "object",
+                          "properties": {
+                            "DataId": {
+                              "description": "The enemy data id which is supposed to be killed",
+                              "type": "integer"
+                            },
+                            "RewardItemId": {
+                              "type": "integer"
+                            },
+                            "RewardItemCount": {
+                              "type": "integer"
+                            },
+                            "CompletionQuestVariablesFlags": {
+                              "$ref": "#/$defs/CompletionFlags"
+                            }
+                          },
+                          "required": [
+                            "DataId"
+                          ]
+                        }
                       }
                     },
                     "required": [
                       "Position",
-                      "EnemySpawnType",
-                      "KillEnemyDataIds"
+                      "EnemySpawnType"
+                    ],
+                    "oneOf": [
+                      {
+                        "required": [
+                          "KillEnemyDataIds"
+                        ]
+                      },
+                      {
+                        "required": [
+                          "ComplexCombatData"
+                        ]
+                      }
                     ]
                   }
                 },
     "QuestSequence",
     "Author"
   ],
-  "additionalProperties": false
+  "additionalProperties": false,
+  "$defs": {
+    "CompletionFlags": {
+      "type": "array",
+      "description": "Quest Variables that dictate whether or not this step is skipped: null is don't check, positive values need to be set, negative values need to be unset",
+      "items": {
+        "type": [
+          "integer",
+          "null"
+        ],
+        "enum": [
+          null,
+          1,
+          2,
+          4,
+          8,
+          16,
+          32,
+          64,
+          128,
+          -1,
+          -2,
+          -4,
+          -8,
+          -16,
+          -32,
+          -64,
+          -128
+        ]
+      },
+      "minItems": 6,
+      "maxItems": 6
+    }
+  }
 }
diff --git a/Questionable.Model/V1/ComplexCombatData.cs b/Questionable.Model/V1/ComplexCombatData.cs
new file mode 100644 (file)
index 0000000..29d0f22
--- /dev/null
@@ -0,0 +1,11 @@
+using System.Collections.Generic;
+
+namespace Questionable.Model.V1;
+
+public sealed class ComplexCombatData
+{
+    public uint DataId { get; set; }
+    public uint? RewardItemId { get; set; }
+    public int? RewardItemCount { get; set; }
+    public IList<short?> CompletionQuestVariablesFlags { get; set; } = new List<short?>();
+}
index eb5aa0ccaeb290ee418e4d2dcf3f3de6a46913e6..55ee70c0d427702070340833e97fbc16a609f411 100644 (file)
@@ -47,6 +47,7 @@ public sealed class QuestStep
 
     public EEnemySpawnType? EnemySpawnType { get; set; }
     public IList<uint> KillEnemyDataIds { get; set; } = new List<uint>();
+    public IList<ComplexCombatData> ComplexCombatData { get; set; } = new List<ComplexCombatData>();
 
     public JumpDestination? JumpDestination { get; set; }
     public uint? ContentFinderConditionId { get; set; }
index 5b31530a8190c67f39d613f54e24967ee14ebb77..51f48385082056bd12e31e63b9b395933223cc3c 100644 (file)
@@ -6,9 +6,12 @@ using Dalamud.Game.ClientState.Objects;
 using Dalamud.Game.ClientState.Objects.Enums;
 using Dalamud.Game.ClientState.Objects.Types;
 using Dalamud.Plugin.Services;
+using FFXIVClientStructs.FFXIV.Client.Game;
 using FFXIVClientStructs.FFXIV.Client.Game.Object;
 using Microsoft.Extensions.Logging;
 using Questionable.Controller.CombatModules;
+using Questionable.Controller.Utils;
+using Questionable.Model.V1;
 
 namespace Questionable.Controller;
 
@@ -19,18 +22,21 @@ internal sealed class CombatController
     private readonly IObjectTable _objectTable;
     private readonly ICondition _condition;
     private readonly IClientState _clientState;
+    private readonly GameFunctions _gameFunctions;
     private readonly ILogger<CombatController> _logger;
 
     private CurrentFight? _currentFight;
 
     public CombatController(IEnumerable<ICombatModule> combatModules, ITargetManager targetManager,
-        IObjectTable objectTable, ICondition condition, IClientState clientState, ILogger<CombatController> logger)
+        IObjectTable objectTable, ICondition condition, IClientState clientState, GameFunctions gameFunctions,
+        ILogger<CombatController> logger)
     {
         _combatModules = combatModules.ToList();
         _targetManager = targetManager;
         _objectTable = objectTable;
         _condition = condition;
         _clientState = clientState;
+        _gameFunctions = gameFunctions;
         _logger = logger;
     }
 
@@ -100,6 +106,50 @@ internal sealed class CombatController
 
     private IGameObject? FindNextTarget()
     {
+        if (_currentFight == null)
+            return null;
+
+        // check if any complex combat conditions are fulfilled
+        var complexCombatData = _currentFight.Data.ComplexCombatDatas;
+        if (complexCombatData.Count > 0)
+        {
+            for (int i = 0; i < complexCombatData.Count; ++i)
+            {
+                if (_currentFight.Data.CompletedComplexDatas.Contains(i))
+                    continue;
+
+                var condition = complexCombatData[i];
+                if (condition.RewardItemId != null && condition.RewardItemCount != null)
+                {
+                    unsafe
+                    {
+                        var inventoryManager = InventoryManager.Instance();
+                        if (inventoryManager->GetInventoryItemCount(condition.RewardItemId.Value) >=
+                            condition.RewardItemCount.Value)
+                        {
+                            _logger.LogInformation(
+                                "Complex combat condition fulfilled: itemCount({ItemId}) >= {ItemCount}",
+                                condition.RewardItemId, condition.RewardItemCount);
+                            _currentFight.Data.CompletedComplexDatas.Add(i);
+                            continue;
+                        }
+                    }
+                }
+
+                if (QuestWorkUtils.HasCompletionFlags(condition.CompletionQuestVariablesFlags))
+                {
+                    var questWork = _gameFunctions.GetQuestEx(_currentFight.Data.QuestId);
+                    if (questWork != null && QuestWorkUtils.MatchesQuestWork(condition.CompletionQuestVariablesFlags,
+                            questWork.Value, false))
+                    {
+                        _logger.LogInformation("Complex combat condition fulfilled: QuestWork matches");
+                        _currentFight.Data.CompletedComplexDatas.Add(i);
+                        continue;
+                    }
+                }
+            }
+        }
+
         return _objectTable.Where(IsEnemyToKill).MinBy(x => (x.Position - _clientState.LocalPlayer!.Position).Length());
     }
 
@@ -107,8 +157,14 @@ internal sealed class CombatController
     {
         if (gameObject is IBattleChara battleChara)
         {
-            if (battleChara.IsDead)
-                return false;
+            // TODO this works as somewhat of a delay between killing enemies if certain items/flags are checked
+            // but also delays killing the next enemy a little
+            if (_currentFight == null || _currentFight.Data.SpawnType != EEnemySpawnType.OverworldEnemies ||
+                _currentFight.Data.ComplexCombatDatas.Count == 0)
+            {
+                if (battleChara.IsDead)
+                    return false;
+            }
 
             if (!battleChara.IsTargetable)
                 return false;
@@ -116,8 +172,26 @@ internal sealed class CombatController
             if (battleChara.TargetObjectId == _clientState.LocalPlayer?.GameObjectId)
                 return true;
 
-            if (_currentFight != null && _currentFight.Data.KillEnemyDataIds.Contains(battleChara.DataId))
-                return true;
+            if (_currentFight != null)
+            {
+                var complexCombatData = _currentFight.Data.ComplexCombatDatas;
+                if (complexCombatData.Count >= 0)
+                {
+                    for (int i = 0; i < complexCombatData.Count; ++i)
+                    {
+                        if (_currentFight.Data.CompletedComplexDatas.Contains(i))
+                            continue;
+
+                        if (complexCombatData[i].DataId == battleChara.DataId)
+                            return true;
+                    }
+                }
+                else
+                {
+                    if (_currentFight.Data.KillEnemyDataIds.Contains(battleChara.DataId))
+                        return true;
+                }
+            }
 
             if (battleChara.StatusFlags.HasFlag(StatusFlags.Hostile))
             {
@@ -150,6 +224,11 @@ internal sealed class CombatController
 
     public sealed class CombatData
     {
-        public required ReadOnlyCollection<uint> KillEnemyDataIds { get; init; }
+        public required ushort QuestId { get; init; }
+        public required EEnemySpawnType SpawnType { get; init; }
+        public required List<uint> KillEnemyDataIds { get; init; }
+        public required List<ComplexCombatData> ComplexCombatDatas { get; init; }
+
+        public HashSet<int> CompletedComplexDatas { get; } = new();
     }
 }
index af894e8d0461f279366d6fad406b9c6b2537ef7e..da002e2cade702e3cc039a827f2beb62bf5fb898 100644 (file)
@@ -17,24 +17,27 @@ internal sealed class CommandHandler : IDisposable
     private readonly QuestController _questController;
     private readonly MovementController _movementController;
     private readonly QuestRegistry _questRegistry;
-    private readonly QuestData _questData;
     private readonly ConfigWindow _configWindow;
     private readonly DebugOverlay _debugOverlay;
     private readonly QuestWindow _questWindow;
+    private readonly QuestSelectionWindow _questSelectionWindow;
+    private readonly ITargetManager _targetManager;
 
     public CommandHandler(ICommandManager commandManager, IChatGui chatGui, QuestController questController,
-        MovementController movementController, QuestRegistry questRegistry, QuestData questData,
-        ConfigWindow configWindow, DebugOverlay debugOverlay, QuestWindow questWindow)
+        MovementController movementController, QuestRegistry questRegistry,
+        ConfigWindow configWindow, DebugOverlay debugOverlay, QuestWindow questWindow,
+        QuestSelectionWindow questSelectionWindow, ITargetManager targetManager)
     {
         _commandManager = commandManager;
         _chatGui = chatGui;
         _questController = questController;
         _movementController = movementController;
         _questRegistry = questRegistry;
-        _questData = questData;
         _configWindow = configWindow;
         _debugOverlay = debugOverlay;
         _questWindow = questWindow;
+        _questSelectionWindow = questSelectionWindow;
+        _targetManager = targetManager;
 
         _commandManager.AddHandler("/qst", new CommandInfo(ProcessCommand)
         {
@@ -74,7 +77,7 @@ internal sealed class CommandHandler : IDisposable
                 break;
 
             case "which":
-                _questData.ShowQuestsIssuedByTarget();
+                _questSelectionWindow.Open(_targetManager.Target);
                 break;
 
             default:
index 658be365200ed9d846cf8c6c3d63bb4fd94b4569..fa9f1afcd67c11e0428c97b2a9868835422cf27d 100644 (file)
@@ -159,15 +159,38 @@ internal sealed class GameUiController : IDisposable
             return;
         }
 
+        // this is 'Daily Quests' for tribal quests, but not set for normal selections
+        string? title = addonSelectIconString->AtkValues[0].ReadAtkString();
+
         var currentQuest = _questController.StartedQuest;
-        if (currentQuest != null && actualPrompt == null)
+        if (currentQuest != null && (actualPrompt == null || title != null))
+        {
+            _logger.LogInformation("Checking if current quest {Name} is on the list", currentQuest.Quest.Info.Name);
+            if (CheckQuestSelection(addonSelectIconString, currentQuest.Quest, answers))
+                return;
+        }
+
+        var nextQuest = _questController.NextQuest;
+        if (nextQuest != null && (actualPrompt == null || title != null))
+        {
+            _logger.LogInformation("Checking if next quest {Name} is on the list", nextQuest.Quest.Info.Name);
+            if (CheckQuestSelection(addonSelectIconString, nextQuest.Quest, answers))
+                return;
+        }
+    }
+
+    private unsafe bool CheckQuestSelection(AddonSelectIconString* addonSelectIconString, Quest quest, List<string?> answers)
+    {
+        // it is possible for this to be a quest selection
+        string questName = quest.Info.Name;
+        int questSelection = answers.FindIndex(x => GameStringEquals(questName, x));
+        if (questSelection >= 0)
         {
-            // it is possible for this to be a quest selection
-            string questName = currentQuest.Quest.Info.Name;
-            int questSelection = answers.FindIndex(x => GameStringEquals(questName, x));
-            if (questSelection >= 0)
-                addonSelectIconString->AtkUnitBase.FireCallbackInt(questSelection);
+            addonSelectIconString->AtkUnitBase.FireCallbackInt(questSelection);
+            return true;
         }
+
+        return false;
     }
 
     public static unsafe List<string?> GetChoices(AddonSelectIconString* addonSelectIconString)
index 37f139d16e100542b2c31d79daa09b23a09aa5b3..f4fe0cb4f4e8748c930d16b5ce90ec011b5fc141 100644 (file)
@@ -148,7 +148,13 @@ internal sealed class QuestController
             else if (_nextQuest != null)
             {
                 // if the quest is accepted, we no longer track it
-                if (_gameFunctions.IsQuestAcceptedOrComplete(_nextQuest.Quest.QuestId))
+                bool canUseNextQuest;
+                if (_nextQuest.Quest.Info.IsRepeatable)
+                    canUseNextQuest = !_gameFunctions.IsQuestAccepted(_nextQuest.Quest.QuestId);
+                else
+                    canUseNextQuest = !_gameFunctions.IsQuestAcceptedOrComplete(_nextQuest.Quest.QuestId);
+
+                if (!canUseNextQuest)
                 {
                     _logger.LogInformation("Next quest {QuestId} accepted or completed", _nextQuest.Quest.QuestId);
 
index f4cac34786b2287c39d7f606a2adef64ea886b70..f52579c092af8091216f9474fad57c70cd3698a4 100644 (file)
@@ -47,8 +47,7 @@ internal static class Combat
                     return [unmount, CreateTask(quest, sequence, step)];
 
                 case EEnemySpawnType.OverworldEnemies:
-                    // TODO currently not handled
-                    return [unmount];
+                    return [unmount, CreateTask(quest, sequence, step)];
 
                 default:
                     throw new ArgumentOutOfRangeException(nameof(step), $"Unknown spawn type {step.EnemySpawnType}");
@@ -57,27 +56,31 @@ internal static class Combat
 
         public ITask CreateTask(Quest quest, QuestSequence sequence, QuestStep step)
         {
+            ArgumentNullException.ThrowIfNull(step.EnemySpawnType);
+
             bool isLastStep = sequence.Steps.Last() == step;
             return serviceProvider.GetRequiredService<HandleCombat>()
-                .With(quest.QuestId, isLastStep, step.KillEnemyDataIds, step.CompletionQuestVariablesFlags);
+                .With(quest.QuestId, isLastStep, step.EnemySpawnType.Value, step.KillEnemyDataIds,
+                    step.CompletionQuestVariablesFlags, step.ComplexCombatData);
         }
     }
 
     internal sealed class HandleCombat(CombatController combatController, GameFunctions gameFunctions) : ITask
     {
-        private ushort _questId;
         private bool _isLastStep;
         private CombatController.CombatData _combatData = null!;
         private IList<short?> _completionQuestVariableFlags = null!;
 
-        public ITask With(ushort questId, bool isLastStep, IList<uint> killEnemyDataIds,
-            IList<short?> completionQuestVariablesFlags)
+        public ITask With(ushort questId, bool isLastStep, EEnemySpawnType enemySpawnType, IList<uint> killEnemyDataIds,
+            IList<short?> completionQuestVariablesFlags, IList<ComplexCombatData> complexCombatData)
         {
-            _questId = questId;
             _isLastStep = isLastStep;
             _combatData = new CombatController.CombatData
             {
-                KillEnemyDataIds = killEnemyDataIds.AsReadOnly(),
+                QuestId = questId,
+                SpawnType = enemySpawnType,
+                KillEnemyDataIds = killEnemyDataIds.ToList(),
+                ComplexCombatDatas = complexCombatData.ToList(),
             };
             _completionQuestVariableFlags = completionQuestVariablesFlags;
             return this;
@@ -93,7 +96,7 @@ internal static class Combat
             // if our quest step has any completion flags, we need to check if they are set
             if (QuestWorkUtils.HasCompletionFlags(_completionQuestVariableFlags))
             {
-                var questWork = gameFunctions.GetQuestEx(_questId);
+                var questWork = gameFunctions.GetQuestEx(_combatData.QuestId);
                 if (questWork == null)
                     return ETaskResult.StillRunning;
 
index a77fee9b84a3aa4e245ceb9366f615634596e757..d6da1491d60a8e550bdda3ac62f06501ec1f6da5 100644 (file)
@@ -228,8 +228,11 @@ internal static class Move
             var character = (Character*)(clientState.LocalPlayer?.Address ?? 0);
             if (character != null)
             {
-                logger.LogInformation("Attempting to land");
-                return ActionManager.Instance()->UseAction(ActionType.Mount, character->Mount.MountId);
+                if (ActionManager.Instance()->GetActionStatus(ActionType.GeneralAction, 23) == 0)
+                {
+                    logger.LogInformation("Attempting to land");
+                    return ActionManager.Instance()->UseAction(ActionType.GeneralAction, 23);
+                }
             }
 
             return false;
index cde25ef6263f61227930998c12ed5f02555cfeeb..fa2cfed83fa1474249012d4456a14c129b16a672 100644 (file)
@@ -28,7 +28,8 @@ internal sealed class DalamudInitializer : IDisposable
         WindowSystem windowSystem,
         QuestWindow questWindow,
         DebugOverlay debugOverlay,
-        ConfigWindow configWindow)
+        ConfigWindow configWindow,
+        QuestSelectionWindow questSelectionWindow)
     {
         _pluginInterface = pluginInterface;
         _framework = framework;
@@ -42,6 +43,7 @@ internal sealed class DalamudInitializer : IDisposable
         _windowSystem.AddWindow(questWindow);
         _windowSystem.AddWindow(configWindow);
         _windowSystem.AddWindow(debugOverlay);
+        _windowSystem.AddWindow(questSelectionWindow);
 
         _pluginInterface.UiBuilder.Draw += _windowSystem.Draw;
         _pluginInterface.UiBuilder.OpenMainUi += _questWindow.Toggle;
index bbaab3d0effd59c8ddae9dd6df931b85a1be292d..ac63dc7e23f7cd903fee900afa4f9294e00fd9a4 100644 (file)
@@ -2,12 +2,7 @@
 using System.Collections.Generic;
 using System.Collections.Immutable;
 using System.Linq;
-using Dalamud.Game.ClientState.Objects;
-using Dalamud.Game.Text;
 using Dalamud.Plugin.Services;
-using FFXIVClientStructs.FFXIV.Client.UI;
-using LLib.GameUI;
-using Questionable.Controller;
 using Questionable.Model;
 using Quest = Lumina.Excel.GeneratedSheets.Quest;
 
@@ -15,18 +10,10 @@ namespace Questionable.Data;
 
 internal sealed class QuestData
 {
-    private readonly ITargetManager _targetManager;
-    private readonly IChatGui _chatGui;
-    private readonly IGameGui _gameGui;
-
     private readonly ImmutableDictionary<ushort, QuestInfo> _quests;
 
-    public QuestData(IDataManager dataManager, ITargetManager targetManager, IChatGui chatGui, IGameGui gameGui)
+    public QuestData(IDataManager dataManager)
     {
-        _targetManager = targetManager;
-        _chatGui = chatGui;
-        _gameGui = gameGui;
-
         _quests = dataManager.GetExcelSheet<Quest>()!
             .Where(x => x.RowId > 0)
             .Where(x => x.IssuerLocation.Row > 0)
@@ -47,31 +34,4 @@ internal sealed class QuestData
     }
 
     public bool IsIssuerOfAnyQuest(uint targetId) => _quests.Values.Any(x => x.IssuerDataId == targetId);
-
-    public unsafe void ShowQuestsIssuedByTarget()
-    {
-        var targetId = _targetManager.Target?.DataId;
-        if (targetId == null)
-        {
-            _chatGui.PrintError("[Questionable] No target selected.");
-            return;
-        }
-
-        List<QuestInfo> quests = GetAllByIssuerDataId(targetId.Value);
-
-        if (_gameGui.TryGetAddonByName<AddonSelectIconString>("SelectIconString", out var addonSelectIconString))
-        {
-            var answers = GameUiController.GetChoices(addonSelectIconString);
-            quests = quests.Where(x => answers.Any(y => GameUiController.GameStringEquals(x.Name, y))).ToList();
-
-            _chatGui.Print($"{quests.Count} quest(s) currently offered by target {_targetManager.Target?.Name}:");
-        }
-        else
-        {
-            _chatGui.Print($"{quests.Count} quest(s) issued by target {_targetManager.Target?.Name}:");
-        }
-
-        foreach (QuestInfo quest in quests)
-                _chatGui.Print($"  {quest.QuestId}_{quest.SimplifiedName}");
-    }
 }
index f8e5fd2fd1a91a01daa315c0f4f3b53bac639978..31e3a6229e6e9858cb6261b963c801b2732af65f 100644 (file)
@@ -224,14 +224,21 @@ internal sealed unsafe class GameFunctions
 
     public bool IsReadyToAcceptQuest(ushort questId)
     {
-        if (IsQuestAcceptedOrComplete(questId))
-            return false;
+        _questRegistry.TryGetQuest(questId, out var quest);
+        if (quest is { Info.IsRepeatable: true })
+        {
+            if (IsQuestAccepted(questId))
+                return false;
+        }
+        else
+        {
+            if (IsQuestAcceptedOrComplete(questId))
+                return false;
+        }
 
         // if we're not at a high enough level to continue, we also ignore it
         var currentLevel = _clientState.LocalPlayer?.Level ?? 0;
-        if (currentLevel != 0 &&
-            _questRegistry.TryGetQuest(questId, out Quest? quest) &&
-            quest.Info.Level > currentLevel)
+        if (currentLevel != 0 && quest != null && quest.Info.Level > currentLevel)
             return false;
 
         return true;
@@ -239,9 +246,11 @@ internal sealed unsafe class GameFunctions
 
     public bool IsQuestAcceptedOrComplete(ushort questId)
     {
-        if (QuestManager.IsQuestComplete(questId))
-            return true;
+        return QuestManager.IsQuestComplete(questId) || IsQuestAccepted(questId);
+    }
 
+    public bool IsQuestAccepted(ushort questId)
+    {
         QuestManager* questManager = QuestManager.Instance();
         return questManager->IsQuestAccepted(questId);
     }
index f0902fd1530915dc59e0c73c4387484b7da4e3e2..14ac7e7caf0b020adc254041c179a13d92cc4bdc 100644 (file)
@@ -12,12 +12,14 @@ internal sealed class QuestInfo
         Name = quest.Name.ToString();
         Level = quest.ClassJobLevel0;
         IssuerDataId = quest.IssuerStart;
+        IsRepeatable = quest.IsRepeatable;
     }
 
     public ushort QuestId { get; }
     public string Name { get; }
     public ushort Level { get; }
     public uint IssuerDataId { get; }
+    public bool IsRepeatable { get; }
 
     public string SimplifiedName => Name
         .TrimStart(SeIconChar.QuestSync.ToIconChar(), SeIconChar.QuestRepeatable.ToIconChar(), ' ');
index 9857d8278dd9d1eed796e8c597475e53982db7f9..b7c5f72419eaac5081f12615f3cc3cae5812fc71 100644 (file)
@@ -1,6 +1,6 @@
 <Project Sdk="Dalamud.NET.Sdk/9.0.2">
     <PropertyGroup>
-        <Version>1.6</Version>
+        <Version>1.7</Version>
         <OutputPath>dist</OutputPath>
         <PathMap Condition="$(SolutionDir) != ''">$(SolutionDir)=X:\</PathMap>
     </PropertyGroup>
index c81eced2d0f1c152acb4251446032417326729cb..9647fc3ba52f6be25d4c9605db3853df9418df6e 100644 (file)
@@ -127,6 +127,8 @@ public sealed class QuestionablePlugin : IDalamudPlugin
         serviceCollection.AddSingleton<QuestWindow>();
         serviceCollection.AddSingleton<ConfigWindow>();
         serviceCollection.AddSingleton<DebugOverlay>();
+        serviceCollection.AddSingleton<QuestSelectionWindow>();
+
         serviceCollection.AddSingleton<CommandHandler>();
         serviceCollection.AddSingleton<DalamudInitializer>();
 
diff --git a/Questionable/Windows/QuestSelectionWindow.cs b/Questionable/Windows/QuestSelectionWindow.cs
new file mode 100644 (file)
index 0000000..a40ca54
--- /dev/null
@@ -0,0 +1,202 @@
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Numerics;
+using Dalamud.Game.ClientState.Objects.Types;
+using Dalamud.Interface;
+using Dalamud.Interface.Colors;
+using Dalamud.Interface.Components;
+using Dalamud.Interface.Utility.Raii;
+using Dalamud.Plugin;
+using Dalamud.Plugin.Services;
+using FFXIVClientStructs.FFXIV.Client.UI;
+using ImGuiNET;
+using LLib.GameUI;
+using LLib.ImGui;
+using Questionable.Controller;
+using Questionable.Data;
+using Questionable.Model;
+
+namespace Questionable.Windows;
+
+internal sealed class QuestSelectionWindow : LWindow
+{
+    private const string WindowId = "###QuestionableQuestSelection";
+    private readonly QuestData _questData;
+    private readonly IGameGui _gameGui;
+    private readonly IChatGui _chatGui;
+    private readonly GameFunctions _gameFunctions;
+    private readonly QuestController _questController;
+    private readonly QuestRegistry _questRegistry;
+    private readonly IDalamudPluginInterface _pluginInterface;
+
+    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)
+        : base($"Quest Selection{WindowId}")
+    {
+        _questData = questData;
+        _gameGui = gameGui;
+        _chatGui = chatGui;
+        _gameFunctions = gameFunctions;
+        _questController = questController;
+        _questRegistry = questRegistry;
+        _pluginInterface = pluginInterface;
+
+        Size = new Vector2(500, 200);
+        SizeCondition = ImGuiCond.Once;
+        SizeConstraints = new WindowSizeConstraints
+        {
+            MinimumSize = new Vector2(500, 200),
+        };
+    }
+
+    public uint TargetId { get; private set; }
+    public string TargetName { get; private set; } = string.Empty;
+
+    public unsafe void Open(IGameObject? gameObject)
+    {
+        if (gameObject != null)
+        {
+            TargetId = gameObject.DataId;
+            TargetName = gameObject.Name.ToString();
+            WindowName = $"Quests starting with {TargetName} [{TargetId}]{WindowId}";
+
+            _quests = _questData.GetAllByIssuerDataId(TargetId);
+            if (_gameGui.TryGetAddonByName<AddonSelectIconString>("SelectIconString", out var addonSelectIconString))
+            {
+                var answers = GameUiController.GetChoices(addonSelectIconString);
+                _offeredQuests = _quests
+                    .Where(x => answers.Any(y => GameUiController.GameStringEquals(x.Name, y)))
+                    .ToList();
+            }
+            else
+                _offeredQuests = [];
+        }
+        else
+        {
+            _quests = [];
+            _offeredQuests = [];
+        }
+
+        IsOpen = _quests.Count > 0;
+    }
+
+    public override void Draw()
+    {
+        if (_offeredQuests.Count != 0)
+            ImGui.Checkbox("Only show quests currently offered", ref _onlyAvailableQuests);
+
+        using var table = ImRaii.Table("QuestSelection", 4, ImGuiTableFlags.Borders | ImGuiTableFlags.ScrollY);
+        if (!table)
+        {
+            ImGui.Text("Not table");
+            return;
+        }
+
+        ImGui.TableSetupColumn("Id", ImGuiTableColumnFlags.WidthFixed, 50);
+        ImGui.TableSetupColumn("", ImGuiTableColumnFlags.WidthFixed, 18);
+        ImGui.TableSetupColumn("Name", ImGuiTableColumnFlags.None, 200);
+        ImGui.TableSetupColumn("Actions", ImGuiTableColumnFlags.WidthFixed, 100);
+        ImGui.TableHeadersRow();
+
+        foreach (QuestInfo quest in (_offeredQuests.Count != 0 && _onlyAvailableQuests) ? _offeredQuests : _quests)
+        {
+            ImGui.TableNextRow();
+
+            string questId = quest.QuestId.ToString(CultureInfo.InvariantCulture);
+            bool isKnownQuest = _questRegistry.TryGetQuest(quest.QuestId, out var knownQuest);
+
+            if (ImGui.TableNextColumn())
+            {
+                ImGui.AlignTextToFramePadding();
+                ImGui.TextUnformatted(questId);
+            }
+
+            if (ImGui.TableNextColumn())
+            {
+                ImGui.AlignTextToFramePadding();
+                using var font = _pluginInterface.UiBuilder.IconFontFixedWidthHandle.Push();
+
+                FontAwesomeIcon icon;
+                Vector4 color;
+                if (_gameFunctions.IsQuestAccepted(quest.QuestId))
+                {
+                    color = ImGuiColors.DalamudYellow;
+                    icon = FontAwesomeIcon.Running;
+                }
+                else if (_gameFunctions.IsQuestAcceptedOrComplete(quest.QuestId))
+                {
+                    color = ImGuiColors.ParsedGreen;
+                    icon = FontAwesomeIcon.Check;
+                }
+                else
+                {
+                    color = ImGuiColors.DalamudRed;
+                    icon = FontAwesomeIcon.Times;
+                }
+
+                if (isKnownQuest)
+                    ImGui.TextColored(color, icon.ToIconString());
+                else
+                    ImGui.TextColored(ImGuiColors.DalamudGrey, icon.ToIconString());
+            }
+
+            if (ImGui.TableNextColumn())
+            {
+                ImGui.AlignTextToFramePadding();
+                ImGui.TextUnformatted(quest.Name);
+            }
+
+            if (ImGui.TableNextColumn())
+            {
+                using var id = ImRaii.PushId(questId);
+
+                bool copy = ImGuiComponents.IconButton(FontAwesomeIcon.Copy);
+                if (ImGui.IsItemHovered())
+                    ImGui.SetTooltip("Copy as file name");
+                if (copy)
+                    CopyToClipboard(quest, true);
+                else if (ImGui.IsItemClicked(ImGuiMouseButton.Right))
+                    CopyToClipboard(quest, false);
+
+                ImGui.SameLine();
+
+                if (knownQuest != null && !_gameFunctions.IsQuestAccepted(quest.QuestId) &&
+                    (quest.IsRepeatable || !_gameFunctions.IsQuestAcceptedOrComplete(quest.QuestId)))
+                {
+                    ImGui.BeginDisabled(_questController.NextQuest != null || _questController.SimulatedQuest != null);
+
+                    bool startNextQuest = ImGuiComponents.IconButton(FontAwesomeIcon.Play);
+                    if (ImGui.IsItemHovered())
+                        ImGui.SetTooltip("Start as next quest");
+                    if (startNextQuest)
+                    {
+                        _questController.SetNextQuest(knownQuest);
+                        _questController.ExecuteNextStep(true);
+                    }
+
+                    ImGui.SameLine();
+
+                    bool setNextQuest = ImGuiComponents.IconButton(FontAwesomeIcon.AngleDoubleRight);
+                    if (ImGui.IsItemHovered())
+                        ImGui.SetTooltip("Set as next quest");
+                    if (setNextQuest)
+                        _questController.SetNextQuest(knownQuest);
+
+                    ImGui.EndDisabled();
+                }
+            }
+        }
+    }
+
+    private void CopyToClipboard(QuestInfo quest, bool suffix)
+    {
+        string fileName = $"{quest.QuestId}_{quest.SimplifiedName}{(suffix ? ".json" : "")}";
+        ImGui.SetClipboardText(fileName);
+        _chatGui.Print($"Copied '{fileName}' to clipboard");
+    }
+}
index 583cbf654a32df4d9ee509394d443a25378af395..573b90eb078135a9a2b18051225c441d2536c2ed 100644 (file)
@@ -46,6 +46,8 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
     private readonly QuestData _questData;
     private readonly TerritoryData _territoryData;
     private readonly ICondition _condition;
+    private readonly IGameGui _gameGui;
+    private readonly QuestSelectionWindow _questSelectionWindow;
     private readonly ILogger<QuestWindow> _logger;
 
     public QuestWindow(IDalamudPluginInterface pluginInterface,
@@ -64,6 +66,8 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
         QuestData questData,
         TerritoryData territoryData,
         ICondition condition,
+        IGameGui gameGui,
+        QuestSelectionWindow questSelectionWindow,
         ILogger<QuestWindow> logger)
         : base("Questionable###Questionable", ImGuiWindowFlags.AlwaysAutoResize)
     {
@@ -83,6 +87,8 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
         _questData = questData;
         _territoryData = territoryData;
         _condition = condition;
+        _gameGui = gameGui;
+        _questSelectionWindow = questSelectionWindow;
         _logger = logger;
 
 #if DEBUG
@@ -442,11 +448,12 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
 
             ImGui.SameLine();
             ImGui.BeginDisabled(!_questData.IsIssuerOfAnyQuest(_targetManager.Target.DataId));
-            bool showQuests = ImGuiComponents.IconButton(FontAwesomeIcon.Bars);
+            bool showQuests = ImGuiComponents.IconButton(FontAwesomeIcon.MapMarkerAlt);
             if (ImGui.IsItemHovered())
                 ImGui.SetTooltip("Show all Quests starting with your current target.");
             if (showQuests)
-                _questData.ShowQuestsIssuedByTarget();
+                _questSelectionWindow.Open(_targetManager.Target);
+
             ImGui.EndDisabled();
 
             ImGui.SameLine();
@@ -462,10 +469,10 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
 
             ImGui.SameLine();
 
-            ImGuiComponents.IconButton(FontAwesomeIcon.Copy);
+            bool copy = ImGuiComponents.IconButton(FontAwesomeIcon.Copy);
             if (ImGui.IsItemHovered())
                 ImGui.SetTooltip("Left click: Copy target position as JSON.\nRight click: Copy target position as C# code.");
-            if (ImGui.IsItemClicked(ImGuiMouseButton.Left))
+            if (copy)
             {
                 string interactionType = gameObject->NamePlateIconId switch
                 {
@@ -500,10 +507,10 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
         }
         else
         {
-            ImGuiComponents.IconButton(FontAwesomeIcon.Copy);
+            bool copy = ImGuiComponents.IconButton(FontAwesomeIcon.Copy);
             if (ImGui.IsItemHovered())
-                ImGui.SetTooltip("Left click: Copy target position as JSON.\nRight click: Copy target position as C# code.");
-            if (ImGui.IsItemClicked(ImGuiMouseButton.Left))
+                ImGui.SetTooltip("Left click: Copy your position as JSON.\nRight click: Copy your position as C# code.");
+            if (copy)
             {
                 ImGui.SetClipboardText($$"""
                                          "Position": {
@@ -522,6 +529,13 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
                     $"new({position.X}f, {position.Y}f, {position.Z}f)"));
             }
         }
+
+        ulong hoveredItemId = _gameGui.HoveredItem;
+        if (hoveredItemId != 0)
+        {
+            ImGui.Separator();
+            ImGui.Text($"Hovered Item: {hoveredItemId}");
+        }
     }
 
     private unsafe void DrawQuickAccessButtons()