From 3800ce8b69dfa842f941043a20731bf9a10de1cc Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sun, 14 Jul 2024 21:31:07 +0200 Subject: [PATCH] Combat (experimental) for overworld enemies, better quest list window, fix landing for certain quests, Kozama'uka quests --- .../Pixies/Dailies/3690_A Flowery Frolic.json | 3 +- .../Dailies/3691_Sharing Is Caring.json | 30 ++- .../Pixies/Dailies/3691_Sharing Is Caring.md | 10 + .../3692_The Aesthetician of Il Mheg.json | 33 +-- .../3692_The Aesthetician of Il Mheg.md | 7 + .../Dailies/3700_Best of Boat Worlds.json | 57 +++++ .../Pixies/Dailies/3701_Amazing Graze.json | 112 ++++++++++ .../Pixies/Dailies/3702_Pure Imagination.json | 64 ++++++ .../Dailies/4553_Do It for the Vine.json | 3 +- .../Dailies/4555_Flowers for Sanduruva.json | 1 + .../4562_Waste Not, Want None of That.json | 81 +++++++ .../Arkasodara/Dailies/4563_Seedy Affair.json | 70 ++++++ .../Dailies/4564_Olfactory Warfare.json | 2 +- .../Kozama'uka/5060_A Strong Foundation.json | 136 ++++++++++++ .../Kozama'uka/5061_Molting Season.json | 71 ++++++ .../Kozama'uka/5062_Danger at the Dock.json | 58 +++++ .../Kozama'uka/5063_Reeding the Room.json | 98 +++++++++ .../Kozama'uka/5065_Secrets of the Wind.json | 98 +++++++++ .../5066_Leap into the Unknown.json | 84 ++++++++ .../Kozama'uka/5067_Mesmerizing Moss.json | 74 +++++++ .../Side Quests/Kozama'uka/5068_Dry Run.json | 83 +++++++ .../Kozama'uka/5069_Dumpling Delivery.json | 99 +++++++++ .../Kozama'uka/5070_Stretched Thin.json | 52 +++++ .../Kozama'uka/5071_Broken Vessels.json | 79 +++++++ .../Kozama'uka/5072_Pole Apart.json | 103 +++++++++ .../5073_Twinkle Twinkle Little Stones.json | 118 ++++++++++ .../Kozama'uka/5075_Water Colors.json | 121 +++++++++++ .../Kozama'uka/5076_Take a Powder.json | 53 +++++ .../Kozama'uka/5077_Pact Away.json | 82 +++++++ .../5078_Last Call for Earthenshire.json | 116 ++++++++++ .../5079_Many Fires, Many Mouths.json | 113 ++++++++++ .../Kozama'uka/5080_Lost Property.json | 99 +++++++++ .../5082_One Feather at a Time.json | 107 ++++++++++ .../Kozama'uka/5083_The Wind's Blessing.json | 104 +++++++++ .../Kozama'uka/5084_Nahanshe's Answer.json | 154 +++++++++++++ .../Kozama'uka/5086_Movamuq's Treasure.json | 82 +++++++ .../Kozama'uka/5087_Helping the Helphand.json | 89 ++++++++ .../5088_Give as Good as You Get.json | 127 +++++++++++ .../5089_The Landsguard's New Clothes.json | 132 ++++++++++++ QuestPaths/quest-v1.json | 105 ++++++--- Questionable.Model/V1/ComplexCombatData.cs | 11 + Questionable.Model/V1/QuestStep.cs | 1 + Questionable/Controller/CombatController.cs | 91 +++++++- Questionable/Controller/CommandHandler.cs | 13 +- Questionable/Controller/GameUiController.cs | 35 ++- Questionable/Controller/QuestController.cs | 8 +- .../Controller/Steps/Interactions/Combat.cs | 21 +- Questionable/Controller/Steps/Shared/Move.cs | 7 +- Questionable/DalamudInitializer.cs | 4 +- Questionable/Data/QuestData.cs | 42 +--- Questionable/GameFunctions.cs | 23 +- Questionable/Model/QuestInfo.cs | 2 + Questionable/Questionable.csproj | 2 +- Questionable/QuestionablePlugin.cs | 2 + Questionable/Windows/QuestSelectionWindow.cs | 202 ++++++++++++++++++ Questionable/Windows/QuestWindow.cs | 28 ++- 56 files changed, 3464 insertions(+), 138 deletions(-) create mode 100644 QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3691_Sharing Is Caring.md create mode 100644 QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3692_The Aesthetician of Il Mheg.md create mode 100644 QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3700_Best of Boat Worlds.json create mode 100644 QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3701_Amazing Graze.json create mode 100644 QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3702_Pure Imagination.json create mode 100644 QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4562_Waste Not, Want None of That.json create mode 100644 QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4563_Seedy Affair.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5060_A Strong Foundation.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5061_Molting Season.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5062_Danger at the Dock.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5063_Reeding the Room.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5065_Secrets of the Wind.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5066_Leap into the Unknown.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5067_Mesmerizing Moss.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5068_Dry Run.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5069_Dumpling Delivery.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5070_Stretched Thin.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5071_Broken Vessels.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5072_Pole Apart.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5073_Twinkle Twinkle Little Stones.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5075_Water Colors.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5076_Take a Powder.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5077_Pact Away.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5078_Last Call for Earthenshire.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5079_Many Fires, Many Mouths.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5080_Lost Property.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5082_One Feather at a Time.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5083_The Wind's Blessing.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5084_Nahanshe's Answer.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5086_Movamuq's Treasure.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5087_Helping the Helphand.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5088_Give as Good as You Get.json create mode 100644 QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5089_The Landsguard's New Clothes.json create mode 100644 Questionable.Model/V1/ComplexCombatData.cs create mode 100644 Questionable/Windows/QuestSelectionWindow.cs diff --git a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3690_A Flowery Frolic.json b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3690_A Flowery Frolic.json index 7dc3f163..7235eb5b 100644 --- a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3690_A Flowery Frolic.json +++ b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3690_A Flowery Frolic.json @@ -32,7 +32,8 @@ "EnemySpawnType": "AfterInteraction", "KillEnemyDataIds": [ 11443 - ] + ], + "Fly": true } ] }, diff --git a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3691_Sharing Is Caring.json b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3691_Sharing Is Caring.json index 80b35d7f..9dc05e1c 100644 --- a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3691_Sharing Is Caring.json +++ b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3691_Sharing Is Caring.json @@ -20,6 +20,16 @@ { "Sequence": 1, "Steps": [ + { + "Position": { + "X": -466.72015, + "Y": 44.63006, + "Z": -310.0618 + }, + "TerritoryId": 816, + "InteractionType": "WalkTo", + "Fly": true + }, { "DataId": 1032140, "Position": { @@ -32,7 +42,25 @@ "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 index 00000000..26720aaa --- /dev/null +++ b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3691_Sharing Is Caring.md @@ -0,0 +1,10 @@ +## Sharing is Caring + +QuestWork: +``` +0 0 0 x 0 0 + 2 → 1032142 + +unknown + ? → 1032140 +``` diff --git a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3692_The Aesthetician of Il Mheg.json b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3692_The Aesthetician of Il Mheg.json index 330fd105..fdba712d 100644 --- a/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3692_The Aesthetician of Il Mheg.json +++ b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3692_The Aesthetician of Il Mheg.json @@ -29,15 +29,7 @@ }, "TerritoryId": 816, "InteractionType": "WalkTo", - "Fly": true, - "CompletionQuestVariablesFlags": [ - null, - null, - null, - null, - null, - -128 - ] + "Fly": true }, { "DataId": 2010860, @@ -48,13 +40,8 @@ }, "TerritoryId": 816, "InteractionType": "Interact", - "CompletionQuestVariablesFlags": [ - null, - null, - null, - null, - null, - 128 + "SkipIf": [ + "NotTargetable" ] }, { @@ -83,6 +70,20 @@ "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 index 00000000..78a9c16d --- /dev/null +++ b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3692_The Aesthetician of Il Mheg.md @@ -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 index 00000000..4ee0b527 --- /dev/null +++ b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3700_Best of Boat Worlds.json @@ -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 index 00000000..b67f3856 --- /dev/null +++ b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3701_Amazing Graze.json @@ -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 index 00000000..e3500f97 --- /dev/null +++ b/QuestPaths/5.x - Shadowbringers/Tribal/Pixies/Dailies/3702_Pure Imagination.json @@ -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 + } + ] + } + ] +} diff --git a/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4553_Do It for the Vine.json b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4553_Do It for the Vine.json index 9f22b896..2b4cb329 100644 --- a/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4553_Do It for the Vine.json +++ b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4553_Do It for the Vine.json @@ -33,7 +33,8 @@ "KillEnemyDataIds": [ 14674, 14675 - ] + ], + "Fly": true } ] }, diff --git a/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4555_Flowers for Sanduruva.json b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4555_Flowers for Sanduruva.json index 7cc9b39b..fdba92a8 100644 --- a/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4555_Flowers for Sanduruva.json +++ b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4555_Flowers for Sanduruva.json @@ -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 index 00000000..391185dc --- /dev/null +++ b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4562_Waste Not, Want None of That.json @@ -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 index 00000000..039d3c69 --- /dev/null +++ b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4563_Seedy Affair.json @@ -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 + } + ] + } + ] +} diff --git a/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4564_Olfactory Warfare.json b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4564_Olfactory Warfare.json index acfd58ad..4836ac56 100644 --- a/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4564_Olfactory Warfare.json +++ b/QuestPaths/6.x - Endwalker/Tribal/Arkasodara/Dailies/4564_Olfactory Warfare.json @@ -129,7 +129,7 @@ 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 index 00000000..ece4a810 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5060_A Strong Foundation.json @@ -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 index 00000000..94994626 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5061_Molting Season.json @@ -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 index 00000000..64c24d90 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5062_Danger at the Dock.json @@ -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 index 00000000..63f2a437 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5063_Reeding the Room.json @@ -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 index 00000000..5c6134d8 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5065_Secrets of the Wind.json @@ -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 index 00000000..c9253e9c --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5066_Leap into the Unknown.json @@ -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 index 00000000..8f14d49b --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5067_Mesmerizing Moss.json @@ -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 index 00000000..b53d29ea --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5068_Dry Run.json @@ -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 index 00000000..eab85764 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5069_Dumpling Delivery.json @@ -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 index 00000000..29fc271c --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5070_Stretched Thin.json @@ -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 index 00000000..ee367866 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5071_Broken Vessels.json @@ -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 index 00000000..51d1b675 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5072_Pole Apart.json @@ -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 index 00000000..42a33cdf --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5073_Twinkle Twinkle Little Stones.json @@ -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 index 00000000..ee26320b --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5075_Water Colors.json @@ -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 index 00000000..2ee099c2 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5076_Take a Powder.json @@ -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 index 00000000..4aa1ac91 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5077_Pact Away.json @@ -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 index 00000000..dd4526a4 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5078_Last Call for Earthenshire.json @@ -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 index 00000000..4dd5d9fd --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5079_Many Fires, Many Mouths.json @@ -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 index 00000000..6e22ef89 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5080_Lost Property.json @@ -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 index 00000000..d1aff456 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5082_One Feather at a Time.json @@ -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 index 00000000..7b9feecc --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5083_The Wind's Blessing.json @@ -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 index 00000000..b23ccd35 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5084_Nahanshe's Answer.json @@ -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 index 00000000..0090d411 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5086_Movamuq's Treasure.json @@ -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 index 00000000..b35d95e7 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5087_Helping the Helphand.json @@ -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 index 00000000..5759b0ca --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5088_Give as Good as You Get.json @@ -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 index 00000000..bebc9402 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5089_The Landsguard's New Clothes.json @@ -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" + } + ] + } + ] +} diff --git a/QuestPaths/quest-v1.json b/QuestPaths/quest-v1.json index 5ef8d74a..6c1d43ff 100644 --- a/QuestPaths/quest-v1.json +++ b/QuestPaths/quest-v1.json @@ -415,35 +415,7 @@ } }, "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", @@ -567,12 +539,48 @@ "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" + ] + } ] } }, @@ -1027,5 +1035,38 @@ "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 index 00000000..29d0f223 --- /dev/null +++ b/Questionable.Model/V1/ComplexCombatData.cs @@ -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 CompletionQuestVariablesFlags { get; set; } = new List(); +} diff --git a/Questionable.Model/V1/QuestStep.cs b/Questionable.Model/V1/QuestStep.cs index eb5aa0cc..55ee70c0 100644 --- a/Questionable.Model/V1/QuestStep.cs +++ b/Questionable.Model/V1/QuestStep.cs @@ -47,6 +47,7 @@ public sealed class QuestStep public EEnemySpawnType? EnemySpawnType { get; set; } public IList KillEnemyDataIds { get; set; } = new List(); + public IList ComplexCombatData { get; set; } = new List(); public JumpDestination? JumpDestination { get; set; } public uint? ContentFinderConditionId { get; set; } diff --git a/Questionable/Controller/CombatController.cs b/Questionable/Controller/CombatController.cs index 5b31530a..51f48385 100644 --- a/Questionable/Controller/CombatController.cs +++ b/Questionable/Controller/CombatController.cs @@ -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 _logger; private CurrentFight? _currentFight; public CombatController(IEnumerable combatModules, ITargetManager targetManager, - IObjectTable objectTable, ICondition condition, IClientState clientState, ILogger logger) + IObjectTable objectTable, ICondition condition, IClientState clientState, GameFunctions gameFunctions, + ILogger 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 KillEnemyDataIds { get; init; } + public required ushort QuestId { get; init; } + public required EEnemySpawnType SpawnType { get; init; } + public required List KillEnemyDataIds { get; init; } + public required List ComplexCombatDatas { get; init; } + + public HashSet CompletedComplexDatas { get; } = new(); } } diff --git a/Questionable/Controller/CommandHandler.cs b/Questionable/Controller/CommandHandler.cs index af894e8d..da002e2c 100644 --- a/Questionable/Controller/CommandHandler.cs +++ b/Questionable/Controller/CommandHandler.cs @@ -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: diff --git a/Questionable/Controller/GameUiController.cs b/Questionable/Controller/GameUiController.cs index 658be365..fa9f1afc 100644 --- a/Questionable/Controller/GameUiController.cs +++ b/Questionable/Controller/GameUiController.cs @@ -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)) { - // 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); + _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 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) + { + addonSelectIconString->AtkUnitBase.FireCallbackInt(questSelection); + return true; + } + + return false; } public static unsafe List GetChoices(AddonSelectIconString* addonSelectIconString) diff --git a/Questionable/Controller/QuestController.cs b/Questionable/Controller/QuestController.cs index 37f139d1..f4fe0cb4 100644 --- a/Questionable/Controller/QuestController.cs +++ b/Questionable/Controller/QuestController.cs @@ -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); diff --git a/Questionable/Controller/Steps/Interactions/Combat.cs b/Questionable/Controller/Steps/Interactions/Combat.cs index f4cac347..f52579c0 100644 --- a/Questionable/Controller/Steps/Interactions/Combat.cs +++ b/Questionable/Controller/Steps/Interactions/Combat.cs @@ -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() - .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 _completionQuestVariableFlags = null!; - public ITask With(ushort questId, bool isLastStep, IList killEnemyDataIds, - IList completionQuestVariablesFlags) + public ITask With(ushort questId, bool isLastStep, EEnemySpawnType enemySpawnType, IList killEnemyDataIds, + IList completionQuestVariablesFlags, IList 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; diff --git a/Questionable/Controller/Steps/Shared/Move.cs b/Questionable/Controller/Steps/Shared/Move.cs index a77fee9b..d6da1491 100644 --- a/Questionable/Controller/Steps/Shared/Move.cs +++ b/Questionable/Controller/Steps/Shared/Move.cs @@ -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; diff --git a/Questionable/DalamudInitializer.cs b/Questionable/DalamudInitializer.cs index cde25ef6..fa2cfed8 100644 --- a/Questionable/DalamudInitializer.cs +++ b/Questionable/DalamudInitializer.cs @@ -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; diff --git a/Questionable/Data/QuestData.cs b/Questionable/Data/QuestData.cs index bbaab3d0..ac63dc7e 100644 --- a/Questionable/Data/QuestData.cs +++ b/Questionable/Data/QuestData.cs @@ -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 _quests; - public QuestData(IDataManager dataManager, ITargetManager targetManager, IChatGui chatGui, IGameGui gameGui) + public QuestData(IDataManager dataManager) { - _targetManager = targetManager; - _chatGui = chatGui; - _gameGui = gameGui; - _quests = dataManager.GetExcelSheet()! .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 quests = GetAllByIssuerDataId(targetId.Value); - - if (_gameGui.TryGetAddonByName("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}"); - } } diff --git a/Questionable/GameFunctions.cs b/Questionable/GameFunctions.cs index f8e5fd2f..31e3a622 100644 --- a/Questionable/GameFunctions.cs +++ b/Questionable/GameFunctions.cs @@ -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); } diff --git a/Questionable/Model/QuestInfo.cs b/Questionable/Model/QuestInfo.cs index f0902fd1..14ac7e7c 100644 --- a/Questionable/Model/QuestInfo.cs +++ b/Questionable/Model/QuestInfo.cs @@ -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(), ' '); diff --git a/Questionable/Questionable.csproj b/Questionable/Questionable.csproj index 9857d827..b7c5f724 100644 --- a/Questionable/Questionable.csproj +++ b/Questionable/Questionable.csproj @@ -1,6 +1,6 @@  - 1.6 + 1.7 dist $(SolutionDir)=X:\ diff --git a/Questionable/QuestionablePlugin.cs b/Questionable/QuestionablePlugin.cs index c81eced2..9647fc3b 100644 --- a/Questionable/QuestionablePlugin.cs +++ b/Questionable/QuestionablePlugin.cs @@ -127,6 +127,8 @@ public sealed class QuestionablePlugin : IDalamudPlugin serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); diff --git a/Questionable/Windows/QuestSelectionWindow.cs b/Questionable/Windows/QuestSelectionWindow.cs new file mode 100644 index 00000000..a40ca54d --- /dev/null +++ b/Questionable/Windows/QuestSelectionWindow.cs @@ -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 _quests = []; + private List _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("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"); + } +} diff --git a/Questionable/Windows/QuestWindow.cs b/Questionable/Windows/QuestWindow.cs index 583cbf65..573b90eb 100644 --- a/Questionable/Windows/QuestWindow.cs +++ b/Questionable/Windows/QuestWindow.cs @@ -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 _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 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()