From 7ae2bdcc45b53c7865ae6b32e040188df9ba1812 Mon Sep 17 00:00:00 2001 From: MrGuffels Date: Sat, 4 Jan 2025 15:18:22 -0600 Subject: [PATCH 01/29] Namazu Dailies Friendly v1 First Namazu push. Contains: Most of the unlock quests (Aside from 'Something Fishy This Way Comes' and 'One Size Fits All' because the alt doesn't have non-combat) 6 of 6 Friendly Rep Quests (DoH/Min/Bot) First Story Quest 6 of 6 Trusted Rep Quests (DoH/Min/Bot) Small Change to Aether Current quest since Same Territory isn't a valid skip condition in Azim Steppe if you don't have flying. --- .../543_Sea of Blades_MIN.json | 61 +++++ .../The Azim Steppe/545_Onsal Hakair_BTN.json | 60 +++++ .../547_Sea of Blades_BTN.json | 60 +++++ .../The Azim Steppe/549_Onsal Hakair_MIN.json | 60 +++++ .../The Azim Steppe/550_Onsal Hakair_BTN.json | 60 +++++ .../2782_Forty Years and Counting.json | 10 +- ...3103_The Importance of Being Yes, Yes.json | 141 +++++++++++ .../Dailies/3104_Pilgrim's Regress.json | 109 +++++++++ .../3105_Unidentified Festive Objects.json | 99 ++++++++ .../Namazu/Dailies/3106_Carry That Crate.json | 99 ++++++++ .../Namazu/Dailies/3107_Free for Most.json | 129 ++++++++++ .../Namazu/Dailies/3108_Simpler Gifts.json | 168 +++++++++++++ .../Namazu/Dailies/3109_Catching Catfish.json | 142 +++++++++++ .../Dailies/3110_Wood You Believe It.json | 160 +++++++++++++ .../Namazu/Dailies/3111_Ghosts of Honor.json | 143 +++++++++++ .../Namazu/Dailies/3113_Great Buuz Up.json | 141 +++++++++++ .../Dailies/3114_Local Special Tea.json | 141 +++++++++++ .../Dailies/3120_Surprise Offerings.json | 125 ++++++++++ .../Namazu/Story/3098_Big, Big Fish.json | 225 ++++++++++++++++++ .../Yanxia/2734_Perchance to Hanami.json | 94 ++++++++ .../2736_Courage the Cowardly Lupin.json | 139 +++++++++++ .../2737_Kurobana vs the Rice Sacks.json | 131 ++++++++++ .../2738_Kurobana vs the Arrowheads.json | 167 +++++++++++++ .../Yanxia/2739_Kurobana Holmes.json | 150 ++++++++++++ .../Yanxia/2740_Kurobana vs Gyorin.json | 99 ++++++++ .../Side Quests/Yanxia/2747_Amber Alert.json | 92 +++++++ .../2749_No Wealth Like Mineral Wealth.json | 121 ++++++++++ .../Side Quests/Yanxia/2750_Fresh Flesh.json | 106 +++++++++ .../Yanxia/2751_Show Me the New Money.json | 120 ++++++++++ 29 files changed, 3351 insertions(+), 1 deletion(-) create mode 100644 GatheringPaths/4.x - Stormblood/The Azim Steppe/543_Sea of Blades_MIN.json create mode 100644 GatheringPaths/4.x - Stormblood/The Azim Steppe/545_Onsal Hakair_BTN.json create mode 100644 GatheringPaths/4.x - Stormblood/The Azim Steppe/547_Sea of Blades_BTN.json create mode 100644 GatheringPaths/4.x - Stormblood/The Azim Steppe/549_Onsal Hakair_MIN.json create mode 100644 GatheringPaths/4.x - Stormblood/The Azim Steppe/550_Onsal Hakair_BTN.json create mode 100644 QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3103_The Importance of Being Yes, Yes.json create mode 100644 QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3104_Pilgrim's Regress.json create mode 100644 QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3105_Unidentified Festive Objects.json create mode 100644 QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3106_Carry That Crate.json create mode 100644 QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3107_Free for Most.json create mode 100644 QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3108_Simpler Gifts.json create mode 100644 QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3109_Catching Catfish.json create mode 100644 QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3110_Wood You Believe It.json create mode 100644 QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3111_Ghosts of Honor.json create mode 100644 QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3113_Great Buuz Up.json create mode 100644 QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3114_Local Special Tea.json create mode 100644 QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3120_Surprise Offerings.json create mode 100644 QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Story/3098_Big, Big Fish.json create mode 100644 QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2734_Perchance to Hanami.json create mode 100644 QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2736_Courage the Cowardly Lupin.json create mode 100644 QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2737_Kurobana vs the Rice Sacks.json create mode 100644 QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2738_Kurobana vs the Arrowheads.json create mode 100644 QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2739_Kurobana Holmes.json create mode 100644 QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2740_Kurobana vs Gyorin.json create mode 100644 QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2747_Amber Alert.json create mode 100644 QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2749_No Wealth Like Mineral Wealth.json create mode 100644 QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2750_Fresh Flesh.json create mode 100644 QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2751_Show Me the New Money.json diff --git a/GatheringPaths/4.x - Stormblood/The Azim Steppe/543_Sea of Blades_MIN.json b/GatheringPaths/4.x - Stormblood/The Azim Steppe/543_Sea of Blades_MIN.json new file mode 100644 index 00000000..f6940546 --- /dev/null +++ b/GatheringPaths/4.x - Stormblood/The Azim Steppe/543_Sea of Blades_MIN.json @@ -0,0 +1,61 @@ +{ + "schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/GatheringPaths/gatheringlocation-v1.json", + "Author": "Theo", + "Steps": [ + { + "TerritoryId": 622, + "InteractionType": "None" + } + ], + "Groups": [ + { + "Nodes": [ + { + "DataId": 32320, + "Locations": [ + { + "Position": { + "X": 609.3118, + "Y": -21.51083, + "Z": 558.524 + }, + "StopDistance": 0 + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 32321, + "Locations": [ + { + "Position": { + "X": 609.9794, + "Y": -21.53052, + "Z": 579.6443 + } + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 32322, + "Locations": [ + { + "Position": { + "X": 588.3865, + "Y": -20.42655, + "Z": 561.5663 + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/GatheringPaths/4.x - Stormblood/The Azim Steppe/545_Onsal Hakair_BTN.json b/GatheringPaths/4.x - Stormblood/The Azim Steppe/545_Onsal Hakair_BTN.json new file mode 100644 index 00000000..cccc0b2e --- /dev/null +++ b/GatheringPaths/4.x - Stormblood/The Azim Steppe/545_Onsal Hakair_BTN.json @@ -0,0 +1,60 @@ +{ + "schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/GatheringPaths/gatheringlocation-v1.json", + "Author": "Theo", + "Steps": [ + { + "TerritoryId": 622, + "InteractionType": "None" + } + ], + "Groups": [ + { + "Nodes": [ + { + "DataId": 32326, + "Locations": [ + { + "Position": { + "X": -515.5125, + "Y": 65.79073, + "Z": -386.0356 + } + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 32327, + "Locations": [ + { + "Position": { + "X": -527.5466, + "Y": 64.7018, + "Z": -379.2951 + } + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 32328, + "Locations": [ + { + "Position": { + "X": -505.5859, + "Y": 64.95732, + "Z": -367.5692 + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/GatheringPaths/4.x - Stormblood/The Azim Steppe/547_Sea of Blades_BTN.json b/GatheringPaths/4.x - Stormblood/The Azim Steppe/547_Sea of Blades_BTN.json new file mode 100644 index 00000000..6bf13b75 --- /dev/null +++ b/GatheringPaths/4.x - Stormblood/The Azim Steppe/547_Sea of Blades_BTN.json @@ -0,0 +1,60 @@ +{ + "schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/GatheringPaths/gatheringlocation-v1.json", + "Author": "Theo", + "Steps": [ + { + "TerritoryId": 622, + "InteractionType": "None" + } + ], + "Groups": [ + { + "Nodes": [ + { + "DataId": 32332, + "Locations": [ + { + "Position": { + "X": 573.6873, + "Y": -20.41718, + "Z": 582.5559 + } + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 32333, + "Locations": [ + { + "Position": { + "X": 579.1252, + "Y": -20.40873, + "Z": 565.84 + } + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 32334, + "Locations": [ + { + "Position": { + "X": 608.5944, + "Y": -21.23272, + "Z": 571.2001 + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/GatheringPaths/4.x - Stormblood/The Azim Steppe/549_Onsal Hakair_MIN.json b/GatheringPaths/4.x - Stormblood/The Azim Steppe/549_Onsal Hakair_MIN.json new file mode 100644 index 00000000..9ba93d28 --- /dev/null +++ b/GatheringPaths/4.x - Stormblood/The Azim Steppe/549_Onsal Hakair_MIN.json @@ -0,0 +1,60 @@ +{ + "schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/GatheringPaths/gatheringlocation-v1.json", + "Author": "Theo", + "Steps": [ + { + "TerritoryId": 622, + "InteractionType": "None" + } + ], + "Groups": [ + { + "Nodes": [ + { + "DataId": 32338, + "Locations": [ + { + "Position": { + "X": 727.463, + "Y": 14.92286, + "Z": -477.1528 + } + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 32339, + "Locations": [ + { + "Position": { + "X": 721.5626, + "Y": 24.81664, + "Z": -499.1444 + } + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 32340, + "Locations": [ + { + "Position": { + "X": 702.1278, + "Y": 27.92893, + "Z": -505.186 + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/GatheringPaths/4.x - Stormblood/The Azim Steppe/550_Onsal Hakair_BTN.json b/GatheringPaths/4.x - Stormblood/The Azim Steppe/550_Onsal Hakair_BTN.json new file mode 100644 index 00000000..c7928395 --- /dev/null +++ b/GatheringPaths/4.x - Stormblood/The Azim Steppe/550_Onsal Hakair_BTN.json @@ -0,0 +1,60 @@ +{ + "schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/GatheringPaths/gatheringlocation-v1.json", + "Author": "Theo", + "Steps": [ + { + "TerritoryId": 622, + "InteractionType": "None" + } + ], + "Groups": [ + { + "Nodes": [ + { + "DataId": 32341, + "Locations": [ + { + "Position": { + "X": 615.4055, + "Y": 31.42307, + "Z": -475.3718 + } + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 32342, + "Locations": [ + { + "Position": { + "X": 612.0082, + "Y": 25.45944, + "Z": -442.0886 + } + } + ] + } + ] + }, + { + "Nodes": [ + { + "DataId": 32343, + "Locations": [ + { + "Position": { + "X": 634.1258, + "Y": 21.76424, + "Z": -436.3917 + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Aether Currents/The Azim Steppe/2782_Forty Years and Counting.json b/QuestPaths/4.x - Stormblood/Aether Currents/The Azim Steppe/2782_Forty Years and Counting.json index 98a16015..94328f5c 100644 --- a/QuestPaths/4.x - Stormblood/Aether Currents/The Azim Steppe/2782_Forty Years and Counting.json +++ b/QuestPaths/4.x - Stormblood/Aether Currents/The Azim Steppe/2782_Forty Years and Counting.json @@ -17,7 +17,15 @@ "AetheryteShortcut": "Azim Steppe - Dawn Throne", "SkipConditions": { "AetheryteShortcutIf": { - "InSameTerritory": true + "NearPosition": { + "Position": { + "X": 79.24011, + "Y": 114.90497, + "Z": 95.994385 + }, + "TerritoryId": 622, + "MaximumDistance": 50 + } } } } diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3103_The Importance of Being Yes, Yes.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3103_The Importance of Being Yes, Yes.json new file mode 100644 index 00000000..20da7a54 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3103_The Importance of Being Yes, Yes.json @@ -0,0 +1,141 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Theo", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "WalkTo" + }, + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1025769, + "Position": { + "X": 511.43652, + "Y": 29.907833, + "Z": -404.9287 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "StopDistance": 5, + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1025770, + "Position": { + "X": 511.65015, + "Y": 30.105957, + "Z": -407.24805 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "RequiredQuestAcceptedJob": [ + "DoH" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Craft", + "ItemId": 22725, + "ItemCount": 2, + "RequiredQuestAcceptedJob": [ + "DoH" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Gather", + "ItemsToGather": [ + { + "ItemId": 22621, + "ItemCount": 3 + } + ], + "RequiredQuestAcceptedJob": [ + "Miner" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Gather", + "ItemsToGather": [ + { + "ItemId": 22647, + "ItemCount": 3 + } + ], + "RequiredQuestAcceptedJob": [ + "Botanist" + ] + }, + { + "DataId": 1025769, + "Position": { + "X": 511.43652, + "Y": 29.907833, + "Z": -404.9287 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "CompleteQuest", + "Mount": true, + "AetheryteShortcut": "Azim Steppe - Dhoro Iloh", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "MaximumDistance": 50 + } + } + } + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3104_Pilgrim's Regress.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3104_Pilgrim's Regress.json new file mode 100644 index 00000000..08fbd6a5 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3104_Pilgrim's Regress.json @@ -0,0 +1,109 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Theo", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "WalkTo" + }, + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2009491, + "Position": { + "X": -70.81714, + "Y": 66.9718, + "Z": -421.89673 + }, + "TerritoryId": 622, + "InteractionType": "Say", + "Fly": true, + "ChatMessage": { + "Key": "TEXT_BANNAM302_03104_SAYTODO_000_050" + }, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 2009492, + "Position": { + "X": 725.307, + "Y": -1.5717163, + "Z": -423.81934 + }, + "TerritoryId": 622, + "InteractionType": "Say", + "Fly": true, + "ChatMessage": { + "Key": "TEXT_BANNAM302_03104_SAYTODO_000_050" + }, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "CompleteQuest", + "Mount": true, + "AetheryteShortcut": "Azim Steppe - Dhoro Iloh", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "MaximumDistance": 50 + } + } + } + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3105_Unidentified Festive Objects.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3105_Unidentified Festive Objects.json new file mode 100644 index 00000000..a0945b92 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3105_Unidentified Festive Objects.json @@ -0,0 +1,99 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Theo", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "WalkTo" + }, + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1025641, + "Position": { + "X": -54.398438, + "Y": 76.83682, + "Z": -560.8148 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "StopDistance": 5, + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1025642, + "Position": { + "X": -50.370117, + "Y": 76.798584, + "Z": -558.77014 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "RequiredQuestAcceptedJob": [ + "DoH" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Craft", + "ItemId": 22726, + "ItemCount": 1, + "RequiredQuestAcceptedJob": [ + "DoH" + ] + }, + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "CompleteQuest", + "Mount": true, + "AetheryteShortcut": "Azim Steppe - Dhoro Iloh", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "MaximumDistance": 50 + } + } + } + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3106_Carry That Crate.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3106_Carry That Crate.json new file mode 100644 index 00000000..06571a60 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3106_Carry That Crate.json @@ -0,0 +1,99 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Theo", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "WalkTo" + }, + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1025773, + "Position": { + "X": -311.29932, + "Y": 50.549908, + "Z": -225.8183 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "StopDistance": 5, + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1025774, + "Position": { + "X": -308.73578, + "Y": 50.247925, + "Z": -226.09296 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "RequiredQuestAcceptedJob": [ + "DoH" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Craft", + "ItemId": 22727, + "ItemCount": 2, + "RequiredQuestAcceptedJob": [ + "DoH" + ] + }, + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "CompleteQuest", + "Mount": true, + "AetheryteShortcut": "Azim Steppe - Dhoro Iloh", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "MaximumDistance": 50 + } + } + } + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3107_Free for Most.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3107_Free for Most.json new file mode 100644 index 00000000..f88df652 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3107_Free for Most.json @@ -0,0 +1,129 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Theo", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "WalkTo" + }, + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1025775, + "Position": { + "X": -145.4032, + "Y": 27.922167, + "Z": -36.05713 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "StopDistance": 5, + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1025776, + "Position": { + "X": -143.45007, + "Y": 27.66455, + "Z": -39.139465 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "RequiredQuestAcceptedJob": [ + "DoH" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Craft", + "ItemId": 22728, + "ItemCount": 3, + "RequiredQuestAcceptedJob": [ + "DoH" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Gather", + "ItemsToGather": [ + { + "ItemId": 22624, + "ItemCount": 3 + } + ], + "RequiredQuestAcceptedJob": [ + "Miner" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Gather", + "ItemsToGather": [ + { + "ItemId": 22650, + "ItemCount": 3 + } + ], + "RequiredQuestAcceptedJob": [ + "Botanist" + ] + }, + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "CompleteQuest", + "Mount": true, + "AetheryteShortcut": "Azim Steppe - Dhoro Iloh", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "MaximumDistance": 50 + } + } + } + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3108_Simpler Gifts.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3108_Simpler Gifts.json new file mode 100644 index 00000000..65bf1b0c --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3108_Simpler Gifts.json @@ -0,0 +1,168 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Theo", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "WalkTo" + }, + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1025777, + "Position": { + "X": -596.9177, + "Y": 64.000984, + "Z": -285.0843 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "StopDistance": 5, + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1025778, + "Position": { + "X": -597.0398, + "Y": 63.82837, + "Z": -288.65497 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "RequiredQuestAcceptedJob": [ + "DoH" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Craft", + "ItemId": 22729, + "ItemCount": 1, + "RequiredQuestAcceptedJob": [ + "DoH" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Gather", + "ItemsToGather": [ + { + "ItemId": 22625, + "ItemCount": 3 + } + ], + "RequiredQuestAcceptedJob": [ + "Miner" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Gather", + "ItemsToGather": [ + { + "ItemId": 22651, + "ItemCount": 3 + } + ], + "RequiredQuestAcceptedJob": [ + "Botanist" + ] + }, + { + "DataId": 1025777, + "Position": { + "X": -596.9177, + "Y": 64.000984, + "Z": -285.0843 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": -642.094, + "Y": 18.562637, + "Z": 399.83704 + }, + "TerritoryId": 622, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 1019330, + "Position": { + "X": -746.7918, + "Y": 7.8459983, + "Z": 398.27563 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "StopDistance": 5, + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "CompleteQuest", + "Mount": true, + "AetheryteShortcut": "Azim Steppe - Dhoro Iloh", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "MaximumDistance": 50 + } + } + } + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3109_Catching Catfish.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3109_Catching Catfish.json new file mode 100644 index 00000000..db11cf31 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3109_Catching Catfish.json @@ -0,0 +1,142 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Theo", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "WalkTo" + }, + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1025779, + "Position": { + "X": 194.04845, + "Y": 13.27476, + "Z": 121.84426 + }, + "StopDistance": 0.5, + "TerritoryId": 622, + "InteractionType": "Interact", + "AetheryteShortcut": "Azim Steppe - Dawn Throne", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1025780, + "Position": { + "X": 192.30945, + "Y": 13.260071, + "Z": 122.545166 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "RequiredQuestAcceptedJob": [ + "DoH" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Craft", + "ItemId": 22730, + "ItemCount": 2, + "RequiredQuestAcceptedJob": [ + "DoH" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Gather", + "ItemsToGather": [ + { + "ItemId": 22626, + "ItemCount": 3 + } + ], + "RequiredQuestAcceptedJob": [ + "Miner" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Gather", + "ItemsToGather": [ + { + "ItemId": 22652, + "ItemCount": 3 + } + ], + "RequiredQuestAcceptedJob": [ + "Botanist" + ] + }, + { + "DataId": 1025779, + "Position": { + "X": 193.04187, + "Y": 13.040566, + "Z": 120.19531 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "CompleteQuest", + "Mount": true, + "AetheryteShortcut": "Azim Steppe - Dhoro Iloh", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "MaximumDistance": 50 + } + } + } + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3110_Wood You Believe It.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3110_Wood You Believe It.json new file mode 100644 index 00000000..2c09321f --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3110_Wood You Believe It.json @@ -0,0 +1,160 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Theo", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Azim Steppe - Dhoro Iloh", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "MaximumDistance": 50 + } + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1025781, + "Position": { + "X": 573.96814, + "Y": -19.505817, + "Z": 427.66455 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "AetheryteShortcut": "Azim Steppe - Reunion" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1025782, + "Position": { + "X": 573.7544, + "Y": -19.516357, + "Z": 430.10596 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "RequiredQuestAcceptedJob": [ + "DoH" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Craft", + "ItemId": 22731, + "ItemCount": 1, + "RequiredQuestAcceptedJob": [ + "DoH" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Gather", + "ItemsToGather": [ + { + "ItemId": 22627, + "ItemCount": 3 + } + ], + "RequiredQuestAcceptedJob": [ + "Miner" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Gather", + "ItemsToGather": [ + { + "ItemId": 22653, + "ItemCount": 3 + } + ], + "RequiredQuestAcceptedJob": [ + "Botanist" + ] + }, + { + "DataId": 1025781, + "Position": { + "X": 573.96814, + "Y": -19.505817, + "Z": 427.66455 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2009494, + "Position": { + "X": 575.09717, + "Y": -19.272217, + "Z": 424.97888 + }, + "TerritoryId": 622, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "CompleteQuest", + "Mount": true, + "AetheryteShortcut": "Azim Steppe - Dhoro Iloh", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "MaximumDistance": 50 + } + } + } + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3111_Ghosts of Honor.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3111_Ghosts of Honor.json new file mode 100644 index 00000000..4bfa2050 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3111_Ghosts of Honor.json @@ -0,0 +1,143 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Theo", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Azim Steppe - Dhoro Iloh", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "MaximumDistance": 50 + } + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1025783, + "Position": { + "X": 122.6062, + "Y": 39.55857, + "Z": -336.5683 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "Fly": true, + "AetheryteShortcut": "Azim Steppe - Dawn Throne", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": 122.6062, + "Y": 39.55857, + "Z": -336.5683 + }, + "TerritoryId": 622, + "MaximumDistance": 50 + } + } + } + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1025784, + "Position": { + "X": 125.68848, + "Y": 39.96338, + "Z": -335.8969 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "RequiredQuestAcceptedJob": [ + "DoH" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Craft", + "ItemId": 22732, + "ItemCount": 2, + "RequiredQuestAcceptedJob": [ + "DoH" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Gather", + "ItemsToGather": [ + { + "ItemId": 22628, + "ItemCount": 3 + } + ], + "RequiredQuestAcceptedJob": [ + "Miner" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Gather", + "ItemsToGather": [ + { + "ItemId": 22654, + "ItemCount": 3 + } + ], + "RequiredQuestAcceptedJob": [ + "Botanist" + ] + }, + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "CompleteQuest", + "Mount": true, + "AetheryteShortcut": "Azim Steppe - Dhoro Iloh", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "MaximumDistance": 50 + } + } + } + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3113_Great Buuz Up.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3113_Great Buuz Up.json new file mode 100644 index 00000000..ab2f39f2 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3113_Great Buuz Up.json @@ -0,0 +1,141 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Theo", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "WalkTo" + }, + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1025787, + "Position": { + "X": 389.70007, + "Y": -8.514979, + "Z": 487.93762 + }, + "AetheryteShortcut": "Azim Steppe - Reunion", + "TerritoryId": 622, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1025788, + "Position": { + "X": 391.9889, + "Y": -8.529846, + "Z": 489.55518 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "RequiredQuestAcceptedJob": [ + "DoH" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Craft", + "ItemId": 22734, + "ItemCount": 2, + "RequiredQuestAcceptedJob": [ + "DoH" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Gather", + "ItemsToGather": [ + { + "ItemId": 22630, + "ItemCount": 3 + } + ], + "RequiredQuestAcceptedJob": [ + "Miner" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Gather", + "ItemsToGather": [ + { + "ItemId": 22656, + "ItemCount": 3 + } + ], + "RequiredQuestAcceptedJob": [ + "Botanist" + ] + }, + { + "DataId": 1025787, + "Position": { + "X": 389.70007, + "Y": -8.514979, + "Z": 487.93762 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "CompleteQuest", + "Mount": true, + "AetheryteShortcut": "Azim Steppe - Dhoro Iloh", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "MaximumDistance": 50 + } + } + } + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3114_Local Special Tea.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3114_Local Special Tea.json new file mode 100644 index 00000000..081a6f87 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3114_Local Special Tea.json @@ -0,0 +1,141 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Theo", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "WalkTo" + }, + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1025789, + "Position": { + "X": 594.93384, + "Y": 23.164816, + "Z": -421.80518 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "AetheryteShortcut": "Azim Steppe - Dawn Throne", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1025790, + "Position": { + "X": 594.41516, + "Y": 23.208984, + "Z": -423.81934 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "RequiredQuestAcceptedJob": [ + "DoH" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Craft", + "ItemId": 22735, + "ItemCount": 3, + "RequiredQuestAcceptedJob": [ + "DoH" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Gather", + "ItemsToGather": [ + { + "ItemId": 22631, + "ItemCount": 3 + } + ], + "RequiredQuestAcceptedJob": [ + "Miner" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Gather", + "ItemsToGather": [ + { + "ItemId": 22657, + "ItemCount": 3 + } + ], + "RequiredQuestAcceptedJob": [ + "Botanist" + ] + }, + { + "DataId": 1025789, + "Position": { + "X": 594.93384, + "Y": 23.164816, + "Z": -421.80518 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "CompleteQuest", + "Mount": true, + "AetheryteShortcut": "Azim Steppe - Dhoro Iloh", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "MaximumDistance": 50 + } + } + } + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3120_Surprise Offerings.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3120_Surprise Offerings.json new file mode 100644 index 00000000..c3055787 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3120_Surprise Offerings.json @@ -0,0 +1,125 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Theo", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "WalkTo" + }, + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1025805, + "Position": { + "X": 733.6079, + "Y": 0.64432836, + "Z": -164.78223 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "AetheryteShortcut": "Azim Steppe - Dawn Throne", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1025806, + "Position": { + "X": 733.15015, + "Y": 0.5340576, + "Z": -162.21869 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "RequiredQuestAcceptedJob": [ + "DoH" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Craft", + "ItemId": 22739, + "ItemCount": 1, + "RequiredQuestAcceptedJob": [ + "DoH" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Gather", + "ItemsToGather": [ + { + "ItemId": 22635, + "ItemCount": 3 + } + ], + "RequiredQuestAcceptedJob": [ + "Miner" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Gather", + "ItemsToGather": [ + { + "ItemId": 22661, + "ItemCount": 3 + } + ], + "RequiredQuestAcceptedJob": [ + "Botanist" + ] + }, + { + "DataId": 1025602, + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "InteractionType": "CompleteQuest", + "Mount": true, + "AetheryteShortcut": "Azim Steppe - Dhoro Iloh", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "MaximumDistance": 50 + } + } + } + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Story/3098_Big, Big Fish.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Story/3098_Big, Big Fish.json new file mode 100644 index 00000000..f8d13ce8 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Story/3098_Big, Big Fish.json @@ -0,0 +1,225 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Theo", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1025605, + "Position": { + "X": -766.7506, + "Y": 127.43907, + "Z": 91.11157 + }, + "TerritoryId": 622, + "InteractionType": "WalkTo", + "Fly": true, + "AetheryteShortcut": "Azim Steppe - Dhoro Iloh", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "MaximumDistance": 50 + } + } + } + }, + { + "DataId": 1025601, + "Position": { + "X": -766.7506, + "Y": 127.43907, + "Z": 91.11157 + }, + "TerritoryId": 622, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -283.0104, + "Y": 17.31996, + "Z": 508.54376 + }, + "TerritoryId": 614, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Yanxia - Namai", + "Fly": true + }, + { + "DataId": 1025702, + "Position": { + "X": -279.25543, + "Y": 17.31996, + "Z": 489.2804 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 1025768, + "Position": { + "X": -292.2561, + "Y": 17.31996, + "Z": 489.76868 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1025701, + "Position": { + "X": -280.81183, + "Y": 17.31996, + "Z": 524.52893 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1025605, + "Position": { + "X": -766.7506, + "Y": 127.43907, + "Z": 91.11157 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "AetheryteShortcut": "Azim Steppe - Dhoro Iloh" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1025703, + "Position": { + "X": -734.0658, + "Y": 127.41788, + "Z": 100.8468 + }, + "TerritoryId": 622, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1025609, + "Position": { + "X": -770.4738, + "Y": 127.42798, + "Z": 85.28259 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "RequiredQuestAcceptedJob": [ + "DoH" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Craft", + "ItemId": 22721, + "ItemCount": 2, + "RequiredQuestAcceptedJob": [ + "DoH" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Gather", + "ItemsToGather": [ + { + "ItemId": 22617, + "ItemCount": 3 + } + ], + "RequiredQuestAcceptedJob": [ + "Miner" + ] + }, + { + "TerritoryId": 622, + "InteractionType": "Gather", + "ItemsToGather": [ + { + "ItemId": 22643, + "ItemCount": 3 + } + ], + "RequiredQuestAcceptedJob": [ + "Botanist" + ] + }, + { + "DataId": 1025704, + "Position": { + "X": -734.8898, + "Y": 127.42169, + "Z": 99.99231 + }, + "TerritoryId": 622, + "InteractionType": "CompleteQuest", + "Mount": true, + "AetheryteShortcut": "Azim Steppe - Dhoro Iloh", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": -780.148, + "Y": 128.25195, + "Z": 97.154175 + }, + "TerritoryId": 622, + "MaximumDistance": 50 + } + } + } + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2734_Perchance to Hanami.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2734_Perchance to Hanami.json new file mode 100644 index 00000000..4c41c9a6 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2734_Perchance to Hanami.json @@ -0,0 +1,94 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Theo", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1019262, + "Position": { + "X": 445.76172, + "Y": 58.67623, + "Z": -155.62683 + }, + "TerritoryId": 614, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Yanxia - Namai", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": 445.76172, + "Y": 58.67623, + "Z": -155.62683 + }, + "TerritoryId": 614, + "MaximumDistance": 50 + } + } + }, + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2008520, + "Position": { + "X": 476.85962, + "Y": 58.304688, + "Z": -178.08807 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "Mount": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 2008521, + "Position": { + "X": 477.8667, + "Y": 59.098145, + "Z": -177.66083 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1019302, + "Position": { + "X": -279.347, + "Y": 17.31996, + "Z": 498.49683 + }, + "TerritoryId": 614, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2736_Courage the Cowardly Lupin.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2736_Courage the Cowardly Lupin.json new file mode 100644 index 00000000..a319d70c --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2736_Courage the Cowardly Lupin.json @@ -0,0 +1,139 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Theo", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1019312, + "Position": { + "X": 473.80774, + "Y": 58.448307, + "Z": -182.78784 + }, + "TerritoryId": 614, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Yanxia - Namai", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": 472.4036, + "Y": 58.568016, + "Z": -181.87 + }, + "TerritoryId": 614, + "MaximumDistance": 50 + } + } + }, + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2008459, + "Position": { + "X": 394.5525, + "Y": 80.88806, + "Z": -194.17108 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1022399, + "Position": { + "X": 392.69092, + "Y": 80.90235, + "Z": -194.9035 + }, + "TerritoryId": 614, + "InteractionType": "Emote", + "Emote": "rally" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": 497.38757, + "Y": 55.17306, + "Z": 191.36812 + }, + "TerritoryId": 614, + "InteractionType": "Combat", + "Fly": true, + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 7539 + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1022400, + "Position": { + "X": 499.9618, + "Y": 55.28981, + "Z": 191.18018 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1019312, + "Position": { + "X": 473.80774, + "Y": 58.448307, + "Z": -182.78784 + }, + "TerritoryId": 614, + "InteractionType": "CompleteQuest", + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_STMBDZ413_02736_Q1_000_000", + "Answer": "TEXT_STMBDZ413_02736_A1_000_002" + } + ], + "AetheryteShortcut": "Yanxia - Namai", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": 435.81787, + "Y": 68.84845, + "Z": -94.02999 + }, + "TerritoryId": 614, + "MaximumDistance": 150 + } + } + }, + "Fly": true + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2737_Kurobana vs the Rice Sacks.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2737_Kurobana vs the Rice Sacks.json new file mode 100644 index 00000000..76c060a6 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2737_Kurobana vs the Rice Sacks.json @@ -0,0 +1,131 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Theo", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1019312, + "Position": { + "X": 473.80774, + "Y": 58.448307, + "Z": -182.78784 + }, + "TerritoryId": 614, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Yanxia - Namai", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": 472.4036, + "Y": 58.568016, + "Z": -181.87 + }, + "TerritoryId": 614, + "MaximumDistance": 50 + } + } + }, + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1022399, + "Position": { + "X": 392.69092, + "Y": 80.90235, + "Z": -194.9035 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1022421, + "Position": { + "X": 634.5464, + "Y": 86.07644, + "Z": -146.74603 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1022423, + "Position": { + "X": 499.71765, + "Y": 66.36111, + "Z": -16.586609 + }, + "TerritoryId": 614, + "Fly": true, + "InteractionType": "Emote", + "Emote": "psych" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1022424, + "Position": { + "X": 475.51685, + "Y": 68.02852, + "Z": -106.30963 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1019312, + "Position": { + "X": 473.80774, + "Y": 58.448307, + "Z": -182.78784 + }, + "TerritoryId": 614, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Yanxia - Namai", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": 435.81787, + "Y": 68.84845, + "Z": -94.02999 + }, + "TerritoryId": 614, + "MaximumDistance": 150 + } + } + }, + "Fly": true + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2738_Kurobana vs the Arrowheads.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2738_Kurobana vs the Arrowheads.json new file mode 100644 index 00000000..7203fa8f --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2738_Kurobana vs the Arrowheads.json @@ -0,0 +1,167 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Theo", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1019312, + "Position": { + "X": 473.80774, + "Y": 58.448307, + "Z": -182.78784 + }, + "TerritoryId": 614, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Yanxia - Namai", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": 472.4036, + "Y": 58.568016, + "Z": -181.87 + }, + "TerritoryId": 614, + "MaximumDistance": 50 + } + } + }, + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1022414, + "Position": { + "X": 605.249, + "Y": 67.79578, + "Z": -137.49908 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_STMBDZ415_02738_Q1_000_000", + "Answer": "TEXT_STMBDZ415_02738_A1_000_001" + } + ], + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2008490, + "Position": { + "X": 627.8019, + "Y": 84.97742, + "Z": -98.49707 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ], + "Fly": true + }, + { + "DataId": 2008491, + "Position": { + "X": 664.8203, + "Y": 92.088135, + "Z": -107.774536 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ], + "Mount": true + }, + { + "DataId": 2008492, + "Position": { + "X": 657.98413, + "Y": 85.22156, + "Z": -150.56079 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ], + "Mount": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1022414, + "Position": { + "X": 605.249, + "Y": 67.79578, + "Z": -137.49908 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1019312, + "Position": { + "X": 473.80774, + "Y": 58.448307, + "Z": -182.78784 + }, + "TerritoryId": 614, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Yanxia - Namai", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": 435.81787, + "Y": 68.84845, + "Z": -94.02999 + }, + "TerritoryId": 614, + "MaximumDistance": 150 + } + } + }, + "Fly": true + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2739_Kurobana Holmes.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2739_Kurobana Holmes.json new file mode 100644 index 00000000..a5211c3d --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2739_Kurobana Holmes.json @@ -0,0 +1,150 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Theo", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1022425, + "Position": { + "X": 473.3806, + "Y": 58.51295, + "Z": -180.95679 + }, + "TerritoryId": 614, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Yanxia - Namai", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": 472.4036, + "Y": 58.568016, + "Z": -181.87 + }, + "TerritoryId": 614, + "MaximumDistance": 50 + } + } + }, + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1022417, + "Position": { + "X": 365.6825, + "Y": 100.83898, + "Z": -93.91931 + }, + "StopDistance": 0.5, + "TerritoryId": 614, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1022416, + "Position": { + "X": 675.92883, + "Y": 98.45921, + "Z": -103.80713 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1022418, + "Position": { + "X": 734.5845, + "Y": 119.698425, + "Z": -35.05005 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "Position": { + "X": 720.75977, + "Y": 116.93192, + "Z": -60.349487 + }, + "TerritoryId": 614, + "InteractionType": "Combat", + "Fly": true, + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 7540 + ] + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1022418, + "Position": { + "X": 734.5845, + "Y": 119.698425, + "Z": -35.05005 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1019312, + "Position": { + "X": 473.80774, + "Y": 58.448307, + "Z": -182.78784 + }, + "TerritoryId": 614, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Yanxia - Namai", + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": 435.81787, + "Y": 68.84845, + "Z": -94.02999 + }, + "TerritoryId": 614, + "MaximumDistance": 150 + } + } + }, + "Fly": true + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2740_Kurobana vs Gyorin.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2740_Kurobana vs Gyorin.json new file mode 100644 index 00000000..f6f3e1fe --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2740_Kurobana vs Gyorin.json @@ -0,0 +1,99 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Theo", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1022399, + "Position": { + "X": 392.69092, + "Y": 80.90235, + "Z": -194.9035 + }, + "TerritoryId": 614, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1023237, + "Position": { + "X": -233.72241, + "Y": 17.628202, + "Z": 485.3131 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1023237, + "Position": { + "X": -233.72241, + "Y": 17.628202, + "Z": 485.3131 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1023463, + "Position": { + "X": 563.8666, + "Y": 68.09528, + "Z": -11.306946 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "AetheryteShortcut": "Yanxia - Namai", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1023465, + "Position": { + "X": 462.76025, + "Y": 68.01855, + "Z": -106.55377 + }, + "TerritoryId": 614, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Yanxia - Namai", + "Fly": true, + "SkipConditions": { + "AetheryteShortcutIf": { + "NearPosition": { + "Position": { + "X": 462.13455, + "Y": 68.01515, + "Z": -104.52245 + }, + "TerritoryId": 622, + "MaximumDistance": 50 + } + } + } + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2747_Amber Alert.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2747_Amber Alert.json new file mode 100644 index 00000000..20d4eb7c --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2747_Amber Alert.json @@ -0,0 +1,92 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Theo", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "Position": { + "X": -297.51367, + "Y": 17.31996, + "Z": 508.2195 + }, + "TerritoryId": 614, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 1019298, + "Position": { + "X": -318.87692, + "Y": 17.974895, + "Z": 508.29004 + }, + "TerritoryId": 614, + "InteractionType": "AcceptQuest", + "StopDistance": 0.1 + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1019261, + "Position": { + "X": 403.00586, + "Y": 76.169815, + "Z": -148.8518 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "Fly": true, + "AetheryteShortcut": "Yanxia - Namai" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": -297.51367, + "Y": 17.31996, + "Z": 508.2195 + }, + "TerritoryId": 614, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 1019298, + "Position": { + "X": -318.87692, + "Y": 17.974895, + "Z": 508.29004 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "StopDistance": 0.1 + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1019261, + "Position": { + "X": 403.00586, + "Y": 76.169815, + "Z": -148.8518 + }, + "TerritoryId": 614, + "InteractionType": "CompleteQuest", + "Fly": true, + "AetheryteShortcut": "Yanxia - Namai" + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2749_No Wealth Like Mineral Wealth.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2749_No Wealth Like Mineral Wealth.json new file mode 100644 index 00000000..b63fe369 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2749_No Wealth Like Mineral Wealth.json @@ -0,0 +1,121 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Theo", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1023237, + "Position": { + "X": -233.72241, + "Y": 17.628202, + "Z": 485.3131 + }, + "TerritoryId": 614, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1023239, + "Position": { + "X": -392.72144, + "Y": 46.670254, + "Z": 452.93335 + }, + "StopDistance": 0.5, + "TerritoryId": 614, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1023240, + "Position": { + "X": -258.6557, + "Y": 38.181896, + "Z": 217.9751 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": -287.37323, + "Y": 39.150906, + "Z": 206.95801 + }, + "TerritoryId": 614, + "InteractionType": "Combat", + "Fly": true, + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 7541 + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1023240, + "Position": { + "X": -258.6557, + "Y": 38.181896, + "Z": 217.9751 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 2008801, + "Position": { + "X": -234.24127, + "Y": 17.593567, + "Z": 486.9917 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1023237, + "Position": { + "X": -233.72241, + "Y": 17.628202, + "Z": 485.3131 + }, + "TerritoryId": 614, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2750_Fresh Flesh.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2750_Fresh Flesh.json new file mode 100644 index 00000000..dd88387b --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2750_Fresh Flesh.json @@ -0,0 +1,106 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Theo", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1023237, + "Position": { + "X": -233.72241, + "Y": 17.628202, + "Z": 485.3131 + }, + "TerritoryId": 614, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 151.29321, + "Y": -0.2997286, + "Z": 229.44983 + }, + "TerritoryId": 614, + "InteractionType": "Combat", + "Fly": true, + "EnemySpawnType": "OverworldEnemies", + "ComplexCombatData": [ + { + "DataId": 6682, + "KillCount": 3 + } + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1023237, + "Position": { + "X": -233.72241, + "Y": 17.628202, + "Z": 485.3131 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2008802, + "Position": { + "X": -235.03479, + "Y": 17.654663, + "Z": 487.32727 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1023243, + "Position": { + "X": -88.85327, + "Y": -0.35101318, + "Z": 654.4442 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1023237, + "Position": { + "X": -233.72241, + "Y": 17.628202, + "Z": 485.3131 + }, + "TerritoryId": 614, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} \ No newline at end of file diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2751_Show Me the New Money.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2751_Show Me the New Money.json new file mode 100644 index 00000000..080d2189 --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2751_Show Me the New Money.json @@ -0,0 +1,120 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "Theo", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1023237, + "Position": { + "X": -233.72241, + "Y": 17.628202, + "Z": 485.3131 + }, + "TerritoryId": 614, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1023244, + "Position": { + "X": -290.15033, + "Y": 17.31996, + "Z": 490.86743 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1023245, + "Position": { + "X": 133.1654, + "Y": 13.172864, + "Z": 483.7871 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1023246, + "Position": { + "X": 401.3275, + "Y": 14.6418705, + "Z": 630.15173 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "Position": { + "X": 447.20697, + "Y": 14.621715, + "Z": 673.4272 + }, + "TerritoryId": 614, + "InteractionType": "Combat", + "Fly": true, + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 7525 + ] + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1023246, + "Position": { + "X": 401.3275, + "Y": 14.6418705, + "Z": 630.15173 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1023244, + "Position": { + "X": -290.15033, + "Y": 17.31996, + "Z": 490.86743 + }, + "TerritoryId": 614, + "InteractionType": "CompleteQuest", + "Fly": true + } + ] + } + ] +} \ No newline at end of file From aa2ba3ca9a706159a453b12997c5233697676561 Mon Sep 17 00:00:00 2001 From: MrGuffels Date: Wed, 8 Jan 2025 17:46:16 -0600 Subject: [PATCH 02/29] Test Commit to Fix Schema actions Test Commit --- .gitignore | 1 + QuestPaths/quest-v1.json | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index f0fb17c2..3855e319 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ bin/ /.idea /.vs *.user +/.vscode diff --git a/QuestPaths/quest-v1.json b/QuestPaths/quest-v1.json index eab9789a..d2e747a7 100644 --- a/QuestPaths/quest-v1.json +++ b/QuestPaths/quest-v1.json @@ -983,7 +983,8 @@ "Souleater", "Fire III", "Adloquium", - "Water Cannon" + "Water Cannon", + "Wasshoi" ] } }, From b2e268700bad2d806762ea0aab635fb7b98b9de0 Mon Sep 17 00:00:00 2001 From: MrGuffels Date: Wed, 8 Jan 2025 17:51:50 -0600 Subject: [PATCH 03/29] Revert "Test Commit to Fix Schema actions" This reverts commit aa2ba3ca9a706159a453b12997c5233697676561. --- .gitignore | 1 - QuestPaths/quest-v1.json | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 3855e319..f0fb17c2 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,3 @@ bin/ /.idea /.vs *.user -/.vscode diff --git a/QuestPaths/quest-v1.json b/QuestPaths/quest-v1.json index d2e747a7..eab9789a 100644 --- a/QuestPaths/quest-v1.json +++ b/QuestPaths/quest-v1.json @@ -983,8 +983,7 @@ "Souleater", "Fire III", "Adloquium", - "Water Cannon", - "Wasshoi" + "Water Cannon" ] } }, From 8b9e7e55572561526e3439033b95f789bdbdc181 Mon Sep 17 00:00:00 2001 From: MrGuffels Date: Thu, 9 Jan 2025 07:56:40 -0600 Subject: [PATCH 04/29] Fixed Stop Distance 0 --- .gitignore | 1 + .../The Azim Steppe/543_Sea of Blades_MIN.json | 13 +++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index f0fb17c2..a6964753 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ bin/ /.idea /.vs +/.vscode *.user diff --git a/GatheringPaths/4.x - Stormblood/The Azim Steppe/543_Sea of Blades_MIN.json b/GatheringPaths/4.x - Stormblood/The Azim Steppe/543_Sea of Blades_MIN.json index f6940546..79154b67 100644 --- a/GatheringPaths/4.x - Stormblood/The Azim Steppe/543_Sea of Blades_MIN.json +++ b/GatheringPaths/4.x - Stormblood/The Azim Steppe/543_Sea of Blades_MIN.json @@ -1,5 +1,5 @@ { - "schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/GatheringPaths/gatheringlocation-v1.json", + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/GatheringPaths/gatheringlocation-v1.json", "Author": "Theo", "Steps": [ { @@ -19,7 +19,8 @@ "Y": -21.51083, "Z": 558.524 }, - "StopDistance": 0 + "MinimumAngle": 90, + "MaximumAngle": 270 } ] } @@ -35,7 +36,9 @@ "X": 609.9794, "Y": -21.53052, "Z": 579.6443 - } + }, + "MinimumAngle": 90, + "MaximumAngle": 135 } ] } @@ -51,7 +54,9 @@ "X": 588.3865, "Y": -20.42655, "Z": 561.5663 - } + }, + "MinimumAngle": 45, + "MaximumAngle": 315 } ] } From a0a719fa1c0a8b2896d40d7d05a2b786f16dbec6 Mon Sep 17 00:00:00 2001 From: MrGuffels Date: Thu, 9 Jan 2025 08:01:54 -0600 Subject: [PATCH 05/29] Update 543_Sea of Blades_MIN.json --- .../The Azim Steppe/543_Sea of Blades_MIN.json | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/GatheringPaths/4.x - Stormblood/The Azim Steppe/543_Sea of Blades_MIN.json b/GatheringPaths/4.x - Stormblood/The Azim Steppe/543_Sea of Blades_MIN.json index 79154b67..2f984b9d 100644 --- a/GatheringPaths/4.x - Stormblood/The Azim Steppe/543_Sea of Blades_MIN.json +++ b/GatheringPaths/4.x - Stormblood/The Azim Steppe/543_Sea of Blades_MIN.json @@ -20,7 +20,8 @@ "Z": 558.524 }, "MinimumAngle": 90, - "MaximumAngle": 270 + "MaximumAngle": 270, + "MaximumDistance": 3 } ] } @@ -38,7 +39,8 @@ "Z": 579.6443 }, "MinimumAngle": 90, - "MaximumAngle": 135 + "MaximumAngle": 135, + "MaximumDistance": 3 } ] } @@ -56,7 +58,8 @@ "Z": 561.5663 }, "MinimumAngle": 45, - "MaximumAngle": 315 + "MaximumAngle": 315, + "MaximumDistance": 3 } ] } From 4b9eae916a295781adea3db2a66c4dca0c6816ae Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sun, 19 Jan 2025 22:58:14 +0100 Subject: [PATCH 06/29] Add logic for using items on the Spotted Mudpuppy in 'Factual Folklore' --- .../927_Factual Folklore.json | 9 ++++++--- QuestPaths/quest-v1.json | 9 ++++++--- .../Converter/CombatItemUseConditionConverter.cs | 1 + Questionable.Model/Questing/ECombatItemUseCondition.cs | 1 + Questionable/Controller/CombatModules/ItemUseModule.cs | 4 ++++ 5 files changed, 18 insertions(+), 6 deletions(-) diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/B9-Coerthas Central Highlands, Whitebrim Front/927_Factual Folklore.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/B9-Coerthas Central Highlands, Whitebrim Front/927_Factual Folklore.json index b9550d58..924c6a9d 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/B9-Coerthas Central Highlands, Whitebrim Front/927_Factual Folklore.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/B9-Coerthas Central Highlands, Whitebrim Front/927_Factual Folklore.json @@ -35,10 +35,13 @@ "Z": 89.58569 }, "TerritoryId": 155, - "InteractionType": "Instruction", - "Comment": "Use Quest item on enemy to weaken it first", - "$": "Status Effects: 22 (HP Penalty) + 62 (Damage Down)", + "InteractionType": "Combat", "EnemySpawnType": "AfterInteraction", + "CombatItemUse": { + "ItemId": 2000961, + "Condition": "MissingStatus", + "Value": 22 + }, "ComplexCombatData": [ { "DataId": 2196 diff --git a/QuestPaths/quest-v1.json b/QuestPaths/quest-v1.json index 99105c93..f0f82637 100644 --- a/QuestPaths/quest-v1.json +++ b/QuestPaths/quest-v1.json @@ -183,7 +183,8 @@ "null" ], "description": "The Item to use", - "exclusiveMinimum": 0 + "exclusiveMinimum": 0, + "maximum": 2010000 }, "SkipConditions": { "type": "object", @@ -648,13 +649,15 @@ "type": "object", "properties": { "ItemId": { - "type": "integer" + "type": "integer", + "maximum": 2010000 }, "Condition": { "type": "string", "enum": [ "Incapacitated", - "Health%" + "Health%", + "MissingStatus" ] }, "Value": { diff --git a/Questionable.Model/Questing/Converter/CombatItemUseConditionConverter.cs b/Questionable.Model/Questing/Converter/CombatItemUseConditionConverter.cs index 1b4086ff..deadc4f6 100644 --- a/Questionable.Model/Questing/Converter/CombatItemUseConditionConverter.cs +++ b/Questionable.Model/Questing/Converter/CombatItemUseConditionConverter.cs @@ -9,5 +9,6 @@ public sealed class CombatItemUseConditionConverter() : EnumConverterUseItem(_combatData.CombatItemUse.ItemId); } _continueAt = DateTime.Now.AddSeconds(2); @@ -147,6 +148,9 @@ internal sealed class ItemUseModule : ICombatModule if (_combatData.CombatItemUse.Condition == ECombatItemUseCondition.HealthPercent) return (100f * battleChara->Health / battleChara->MaxHealth) < _combatData.CombatItemUse.Value; + + if (_combatData.CombatItemUse.Condition == ECombatItemUseCondition.MissingStatus) + return !battleChara->StatusManager.HasStatus((uint)_combatData.CombatItemUse.Value); } return false; From f12b777d12e900caaccc16dfbb69dfc58a44b3a0 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Tue, 21 Jan 2025 19:28:02 +0100 Subject: [PATCH 07/29] Update ARR Mor Dhona quests --- .../1001_Drowning Out the Voices.json | 24 +++++++++++++++++-- .../C6-Mor Dhona/1004_Fool Me Twice.json | 2 +- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/1001_Drowning Out the Voices.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/1001_Drowning Out the Voices.json index d1a4fdbf..1fcf9d81 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/1001_Drowning Out the Voices.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/1001_Drowning Out the Voices.json @@ -19,6 +19,7 @@ }, { "Sequence": 1, + "Comment": "'Invalid target' messages can just be bad positioning?", "Steps": [ { "Position": { @@ -52,7 +53,6 @@ "InteractionType": "Combat", "EnemySpawnType": "AfterItemUse", "ItemId": 2000766, - "GroundTarget": true, "KillEnemyDataIds": [ 46 ], @@ -86,6 +86,27 @@ 64 ] }, + { + "Position": { + "X": -219.34567, + "Y": 4.551038, + "Z": -637.8296 + }, + "TerritoryId": 156, + "InteractionType": "WalkTo", + "SkipConditions": { + "StepIf": { + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 8 + ] + } + } + }, { "DataId": 2002234, "Position": { @@ -161,7 +182,6 @@ "InteractionType": "Combat", "EnemySpawnType": "AfterItemUse", "ItemId": 2000766, - "GroundTarget": true, "KillEnemyDataIds": [ 46 ], diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/1004_Fool Me Twice.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/1004_Fool Me Twice.json index daaad896..0629a682 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/1004_Fool Me Twice.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/1004_Fool Me Twice.json @@ -72,7 +72,7 @@ "Z": -609.4606 }, "TerritoryId": 156, - "InteractionType": "UseItem", + "InteractionType": "SinglePlayerDuty", "ItemId": 2000771 } ] From 3a763d625a31ef1781b914cdd649e41b2c2d629d Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Tue, 21 Jan 2025 19:32:28 +0100 Subject: [PATCH 08/29] New experimental interrupt handler --- .../Controller/GatheringController.cs | 3 +- Questionable/Controller/InterruptHandler.cs | 165 ++++++++++++++++++ Questionable/Controller/MiniTaskController.cs | 22 ++- Questionable/Controller/QuestController.cs | 17 +- Questionable/Controller/Steps/Common/Mount.cs | 4 + .../Controller/Steps/Common/NextQuest.cs | 2 + .../Steps/Common/SendNotification.cs | 2 + .../Steps/Common/WaitConditionTask.cs | 2 + .../Controller/Steps/Gathering/DoGather.cs | 2 + .../Steps/Gathering/DoGatherCollectable.cs | 2 + .../Steps/Gathering/MoveToLandingLocation.cs | 1 + .../Steps/Gathering/TurnInDelivery.cs | 3 + .../Controller/Steps/Interactions/Action.cs | 4 + .../Steps/Interactions/AetherCurrent.cs | 2 + .../Steps/Interactions/AethernetShard.cs | 2 + .../Steps/Interactions/Aetheryte.cs | 2 + .../Controller/Steps/Interactions/Combat.cs | 2 + .../Controller/Steps/Interactions/Dive.cs | 2 + .../Controller/Steps/Interactions/Duty.cs | 6 + .../Controller/Steps/Interactions/Emote.cs | 4 + .../Steps/Interactions/EquipItem.cs | 2 + .../Steps/Interactions/EquipRecommended.cs | 2 + .../Controller/Steps/Interactions/Interact.cs | 2 + .../Controller/Steps/Interactions/Jump.cs | 2 + .../Controller/Steps/Interactions/Say.cs | 2 + .../Steps/Interactions/StatusOff.cs | 2 + .../Controller/Steps/Interactions/UseItem.cs | 2 + .../Controller/Steps/Leves/InitiateLeve.cs | 8 + .../Steps/Shared/AethernetShortcut.cs | 2 + .../Steps/Shared/AetheryteShortcut.cs | 4 + Questionable/Controller/Steps/Shared/Craft.cs | 3 + .../Controller/Steps/Shared/Gather.cs | 7 + .../Controller/Steps/Shared/MoveTo.cs | 8 + .../Steps/Shared/RedeemRewardItems.cs | 2 + .../Controller/Steps/Shared/SkipCondition.cs | 2 + .../Controller/Steps/Shared/StepDisabled.cs | 2 + .../Controller/Steps/Shared/SwitchClassJob.cs | 3 + .../Controller/Steps/Shared/WaitAtEnd.cs | 16 ++ .../Controller/Steps/Shared/WaitAtStart.cs | 3 +- Questionable/Controller/Steps/TaskExecutor.cs | 4 + Questionable/QuestionablePlugin.cs | 1 + 41 files changed, 321 insertions(+), 7 deletions(-) create mode 100644 Questionable/Controller/InterruptHandler.cs diff --git a/Questionable/Controller/GatheringController.cs b/Questionable/Controller/GatheringController.cs index bbe6d2e4..28de31f9 100644 --- a/Questionable/Controller/GatheringController.cs +++ b/Questionable/Controller/GatheringController.cs @@ -49,9 +49,10 @@ internal sealed unsafe class GatheringController : MiniTaskController logger, ICondition condition, IServiceProvider serviceProvider, + InterruptHandler interruptHandler, IDataManager dataManager, IPluginLog pluginLog) - : base(chatGui, condition, serviceProvider, dataManager, logger) + : base(chatGui, condition, serviceProvider, interruptHandler, dataManager, logger) { _movementController = movementController; _gatheringPointRegistry = gatheringPointRegistry; diff --git a/Questionable/Controller/InterruptHandler.cs b/Questionable/Controller/InterruptHandler.cs new file mode 100644 index 00000000..9171432f --- /dev/null +++ b/Questionable/Controller/InterruptHandler.cs @@ -0,0 +1,165 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.InteropServices; +using Dalamud.Game; +using Dalamud.Hooking; +using Dalamud.Plugin.Services; +using FFXIVClientStructs.FFXIV.Client.Game; +using FFXIVClientStructs.FFXIV.Client.Game.Character; +using FFXIVClientStructs.FFXIV.Common.Math; +using JetBrains.Annotations; +using Microsoft.Extensions.Logging; +using Questionable.Data; + +namespace Questionable.Controller; + +internal sealed unsafe class InterruptHandler : IDisposable +{ + private readonly Hook _processActionEffectHook; + private readonly IClientState _clientState; + private readonly TerritoryData _territoryData; + private readonly ILogger _logger; + + private delegate void ProcessActionEffect(uint sourceId, Character* sourceCharacter, Vector3* pos, + EffectHeader* effectHeader, EffectEntry* effectArray, ulong* effectTail); + + public InterruptHandler(IGameInteropProvider gameInteropProvider, IClientState clientState, + TerritoryData territoryData, ILogger logger) + { + _clientState = clientState; + _territoryData = territoryData; + _logger = logger; + _processActionEffectHook = + gameInteropProvider.HookFromSignature(Signatures.ActionEffect, + HandleProcessActionEffect); + _processActionEffectHook.Enable(); + } + + public event EventHandler? Interrupted; + + private void HandleProcessActionEffect(uint sourceId, Character* sourceCharacter, Vector3* pos, + EffectHeader* effectHeader, EffectEntry* effectArray, ulong* effectTail) + { + try + { + if (!_territoryData.IsDutyInstance(_clientState.TerritoryType)) + { + for (int i = 0; i < effectHeader->TargetCount; i++) + { + uint targetId = (uint)(effectTail[i] & uint.MaxValue); + EffectEntry* effect = effectArray + 8 * i; + + if (targetId == _clientState.LocalPlayer?.GameObjectId && + effect->Type is EActionEffectType.Damage or EActionEffectType.BlockedDamage + or EActionEffectType.ParriedDamage) + { + _logger.LogTrace("Damage action effect on self, from {SourceId} ({EffectType})", sourceId, + effect->Type); + Interrupted?.Invoke(this, EventArgs.Empty); + break; + } + } + } + } + catch (Exception e) + { + _logger.LogWarning(e, "Unable to process action effect"); + } + finally + { + _processActionEffectHook.Original(sourceId, sourceCharacter, pos, effectHeader, effectArray, effectTail); + } + } + + public void Dispose() + { + _processActionEffectHook.Disable(); + _processActionEffectHook.Dispose(); + } + + private static class Signatures + { + internal const string ActionEffect = "40 ?? 56 57 41 ?? 41 ?? 41 ?? 48 ?? ?? ?? ?? ?? ?? ?? 48"; + } + + [StructLayout(LayoutKind.Explicit)] + private struct EffectEntry + { + [FieldOffset(0)] public EActionEffectType Type; + [FieldOffset(1)] public byte Param0; + [FieldOffset(2)] public byte Param1; + [FieldOffset(3)] public byte Param2; + [FieldOffset(4)] public byte Mult; + [FieldOffset(5)] public byte Flags; + [FieldOffset(6)] public ushort Value; + + public byte AttackType => (byte)(Param1 & 0xF); + public uint Damage => Mult == 0 ? Value : Value + ((uint)ushort.MaxValue + 1) * Mult; + + public override string ToString() + { + return + $"Type: {Type}, p0: {Param0:D3}, p1: {Param1:D3}, p2: {Param2:D3} 0x{Param2:X2} '{Convert.ToString(Param2, 2).PadLeft(8, '0')}', mult: {Mult:D3}, flags: {Flags:D3} | {Convert.ToString(Flags, 2).PadLeft(8, '0')}, value: {Value:D6} ATTACK TYPE: {AttackType}"; + } + } + + [StructLayout(LayoutKind.Explicit)] + private struct EffectHeader + { + [FieldOffset(0)] public ulong AnimationTargetId; + [FieldOffset(8)] public uint ActionID; + [FieldOffset(12)] public uint GlobalEffectCounter; + [FieldOffset(16)] public float AnimationLockTime; + [FieldOffset(20)] public uint SomeTargetID; + [FieldOffset(24)] public ushort SourceSequence; + [FieldOffset(26)] public ushort Rotation; + [FieldOffset(28)] public ushort AnimationId; + [FieldOffset(30)] public byte Variation; + [FieldOffset(31)] public ActionType ActionType; + [FieldOffset(33)] public byte TargetCount; + } + + [UsedImplicitly(ImplicitUseTargetFlags.Members)] + private enum EActionEffectType : byte + { + None = 0, + Miss = 1, + FullResist = 2, + Damage = 3, + Heal = 4, + BlockedDamage = 5, + ParriedDamage = 6, + Invulnerable = 7, + NoEffectText = 8, + Unknown0 = 9, + MpLoss = 10, + MpGain = 11, + TpLoss = 12, + TpGain = 13, + ApplyStatusEffectTarget = 14, + ApplyStatusEffectSource = 15, + RecoveredFromStatusEffect = 16, + LoseStatusEffectTarget = 17, + LoseStatusEffectSource = 18, + StatusNoEffect = 20, + ThreatPosition = 24, + EnmityAmountUp = 25, + EnmityAmountDown = 26, + StartActionCombo = 27, + ComboSucceed = 28, + Retaliation = 29, + Knockback = 32, + Attract1 = 33, //Here is an issue bout knockback. some is 32 some is 33. + Attract2 = 34, + Mount = 40, + FullResistStatus = 52, + FullResistStatus2 = 55, + VFX = 59, + Gauge = 60, + JobGauge = 61, + SetModelState = 72, + SetHP = 73, + PartialInvulnerable = 74, + Interrupt = 75, + } +} diff --git a/Questionable/Controller/MiniTaskController.cs b/Questionable/Controller/MiniTaskController.cs index 6055a68c..c9aec197 100644 --- a/Questionable/Controller/MiniTaskController.cs +++ b/Questionable/Controller/MiniTaskController.cs @@ -17,26 +17,29 @@ using Mount = Questionable.Controller.Steps.Common.Mount; namespace Questionable.Controller; -internal abstract class MiniTaskController +internal abstract class MiniTaskController : IDisposable { protected readonly TaskQueue _taskQueue = new(); private readonly IChatGui _chatGui; private readonly ICondition _condition; private readonly IServiceProvider _serviceProvider; + private readonly InterruptHandler _interruptHandler; private readonly ILogger _logger; private readonly string _actionCanceledText; protected MiniTaskController(IChatGui chatGui, ICondition condition, IServiceProvider serviceProvider, - IDataManager dataManager, ILogger logger) + InterruptHandler interruptHandler, IDataManager dataManager, ILogger logger) { _chatGui = chatGui; _logger = logger; _serviceProvider = serviceProvider; + _interruptHandler = interruptHandler; _condition = condition; _actionCanceledText = dataManager.GetString(1314, x => x.Text)!; + _interruptHandler.Interrupted += HandleInterruption; } protected virtual void UpdateCurrentTask() @@ -198,8 +201,21 @@ internal abstract class MiniTaskController if (!isHandled) { if (GameFunctions.GameStringEquals(_actionCanceledText, message.TextValue) && - !_condition[ConditionFlag.InFlight]) + !_condition[ConditionFlag.InFlight] && + _taskQueue.CurrentTaskExecutor?.ShouldInterruptOnDamage() == true) InterruptQueueWithCombat(); } } + + protected virtual void HandleInterruption(object? sender, EventArgs e) + { + if (!_condition[ConditionFlag.InFlight] && + _taskQueue.CurrentTaskExecutor?.ShouldInterruptOnDamage() == true) + InterruptQueueWithCombat(); + } + + public virtual void Dispose() + { + _interruptHandler.Interrupted -= HandleInterruption; + } } diff --git a/Questionable/Controller/QuestController.cs b/Questionable/Controller/QuestController.cs index 9d17fed1..d514f267 100644 --- a/Questionable/Controller/QuestController.cs +++ b/Questionable/Controller/QuestController.cs @@ -75,8 +75,9 @@ internal sealed class QuestController : MiniTaskController, IDi YesAlreadyIpc yesAlreadyIpc, TaskCreator taskCreator, IServiceProvider serviceProvider, + InterruptHandler interruptHandler, IDataManager dataManager) - : base(chatGui, condition, serviceProvider, dataManager, logger) + : base(chatGui, condition, serviceProvider, interruptHandler, dataManager, logger) { _clientState = clientState; _gameFunctions = gameFunctions; @@ -801,11 +802,23 @@ internal sealed class QuestController : MiniTaskController, IDi _gatheringController.OnNormalToast(message); } - public void Dispose() + protected override void HandleInterruption(object? sender, EventArgs e) + { + if (!IsRunning) + return; + + if (AutomationType == EAutomationType.Manual) + return; + + base.HandleInterruption(sender, e); + } + + public override void Dispose() { _toastGui.ErrorToast -= OnErrorToast; _toastGui.Toast -= OnNormalToast; _condition.ConditionChange -= OnConditionChange; + base.Dispose(); } public sealed record StepProgress( diff --git a/Questionable/Controller/Steps/Common/Mount.cs b/Questionable/Controller/Steps/Common/Mount.cs index 1e03d8e9..4f35f4d9 100644 --- a/Questionable/Controller/Steps/Common/Mount.cs +++ b/Questionable/Controller/Steps/Common/Mount.cs @@ -110,6 +110,8 @@ internal static class Mount ? ETaskResult.TaskComplete : ETaskResult.StillRunning; } + + public override bool ShouldInterruptOnDamage() => false; } internal enum MountResult @@ -197,6 +199,8 @@ internal static class Mount return false; } + + public override bool ShouldInterruptOnDamage() => false; } public enum EMountIf diff --git a/Questionable/Controller/Steps/Common/NextQuest.cs b/Questionable/Controller/Steps/Common/NextQuest.cs index 7f4b0261..3ac7758d 100644 --- a/Questionable/Controller/Steps/Common/NextQuest.cs +++ b/Questionable/Controller/Steps/Common/NextQuest.cs @@ -61,5 +61,7 @@ internal static class NextQuest } public override ETaskResult Update() => ETaskResult.TaskComplete; + + public override bool ShouldInterruptOnDamage() => false; } } diff --git a/Questionable/Controller/Steps/Common/SendNotification.cs b/Questionable/Controller/Steps/Common/SendNotification.cs index cf116028..6d8bbcec 100644 --- a/Questionable/Controller/Steps/Common/SendNotification.cs +++ b/Questionable/Controller/Steps/Common/SendNotification.cs @@ -104,5 +104,7 @@ internal static class SendNotification } public override ETaskResult Update() => ETaskResult.TaskComplete; + + public override bool ShouldInterruptOnDamage() => false; } } diff --git a/Questionable/Controller/Steps/Common/WaitConditionTask.cs b/Questionable/Controller/Steps/Common/WaitConditionTask.cs index 367fdfec..8203c056 100644 --- a/Questionable/Controller/Steps/Common/WaitConditionTask.cs +++ b/Questionable/Controller/Steps/Common/WaitConditionTask.cs @@ -25,5 +25,7 @@ internal static class WaitCondition return DateTime.Now >= _continueAt ? ETaskResult.TaskComplete : ETaskResult.StillRunning; } + + public override bool ShouldInterruptOnDamage() => false; } } diff --git a/Questionable/Controller/Steps/Gathering/DoGather.cs b/Questionable/Controller/Steps/Gathering/DoGather.cs index 0f4c8c7f..bf4ab4aa 100644 --- a/Questionable/Controller/Steps/Gathering/DoGather.cs +++ b/Questionable/Controller/Steps/Gathering/DoGather.cs @@ -236,6 +236,8 @@ internal static class DoGather EAction action = PickAction(minerAction, botanistAction); return ActionManager.Instance()->GetActionStatus(ActionType.Action, (uint)action) == 0; } + + public override bool ShouldInterruptOnDamage() => false; } [SuppressMessage("ReSharper", "NotAccessedPositionalProperty.Local")] diff --git a/Questionable/Controller/Steps/Gathering/DoGatherCollectable.cs b/Questionable/Controller/Steps/Gathering/DoGatherCollectable.cs index 2b91f353..fcd5efad 100644 --- a/Questionable/Controller/Steps/Gathering/DoGatherCollectable.cs +++ b/Questionable/Controller/Steps/Gathering/DoGatherCollectable.cs @@ -198,6 +198,8 @@ internal static class DoGatherCollectable else return botanistAction; } + + public override bool ShouldInterruptOnDamage() => false; } [SuppressMessage("ReSharper", "NotAccessedPositionalProperty.Local")] diff --git a/Questionable/Controller/Steps/Gathering/MoveToLandingLocation.cs b/Questionable/Controller/Steps/Gathering/MoveToLandingLocation.cs index 38fa30cd..bc183013 100644 --- a/Questionable/Controller/Steps/Gathering/MoveToLandingLocation.cs +++ b/Questionable/Controller/Steps/Gathering/MoveToLandingLocation.cs @@ -59,5 +59,6 @@ internal static class MoveToLandingLocation public override ETaskResult Update() => moveExecutor.Update(); public bool OnErrorToast(SeString message) => moveExecutor.OnErrorToast(message); + public override bool ShouldInterruptOnDamage() => moveExecutor.ShouldInterruptOnDamage(); } } diff --git a/Questionable/Controller/Steps/Gathering/TurnInDelivery.cs b/Questionable/Controller/Steps/Gathering/TurnInDelivery.cs index caf2b0f4..0483605b 100644 --- a/Questionable/Controller/Steps/Gathering/TurnInDelivery.cs +++ b/Questionable/Controller/Steps/Gathering/TurnInDelivery.cs @@ -80,5 +80,8 @@ internal static class TurnInDelivery addon->FireCallback(2, pickGatheringItem); return ETaskResult.StillRunning; } + + // not even sure if any turn-in npcs are NEAR mobs; but we also need to be on a gathering/crafting job + public override bool ShouldInterruptOnDamage() => false; } } diff --git a/Questionable/Controller/Steps/Interactions/Action.cs b/Questionable/Controller/Steps/Interactions/Action.cs index 7255fa0b..f7f97502 100644 --- a/Questionable/Controller/Steps/Interactions/Action.cs +++ b/Questionable/Controller/Steps/Interactions/Action.cs @@ -124,6 +124,8 @@ internal static class Action return ETaskResult.TaskComplete; } + + public override bool ShouldInterruptOnDamage() => false; } internal sealed record UseMudraOnObject(uint DataId, EAction Action) : ITask @@ -187,5 +189,7 @@ internal static class Action logger.LogError("Unable to find relevant combo for {Action}", Task.Action); return ETaskResult.TaskComplete; } + + public override bool ShouldInterruptOnDamage() => false; } } diff --git a/Questionable/Controller/Steps/Interactions/AetherCurrent.cs b/Questionable/Controller/Steps/Interactions/AetherCurrent.cs index b244bbea..7632e574 100644 --- a/Questionable/Controller/Steps/Interactions/AetherCurrent.cs +++ b/Questionable/Controller/Steps/Interactions/AetherCurrent.cs @@ -65,5 +65,7 @@ internal static class AetherCurrent gameFunctions.IsAetherCurrentUnlocked(Task.AetherCurrentId) ? ETaskResult.TaskComplete : ETaskResult.StillRunning; + + public override bool ShouldInterruptOnDamage() => true; } } diff --git a/Questionable/Controller/Steps/Interactions/AethernetShard.cs b/Questionable/Controller/Steps/Interactions/AethernetShard.cs index b1af7fe9..db2c5212 100644 --- a/Questionable/Controller/Steps/Interactions/AethernetShard.cs +++ b/Questionable/Controller/Steps/Interactions/AethernetShard.cs @@ -53,5 +53,7 @@ internal static class AethernetShard aetheryteFunctions.IsAetheryteUnlocked(Task.AetheryteLocation) ? ETaskResult.TaskComplete : ETaskResult.StillRunning; + + public override bool ShouldInterruptOnDamage() => true; } } diff --git a/Questionable/Controller/Steps/Interactions/Aetheryte.cs b/Questionable/Controller/Steps/Interactions/Aetheryte.cs index d9754776..dd40fc69 100644 --- a/Questionable/Controller/Steps/Interactions/Aetheryte.cs +++ b/Questionable/Controller/Steps/Interactions/Aetheryte.cs @@ -52,5 +52,7 @@ internal static class Aetheryte aetheryteFunctions.IsAetheryteUnlocked(Task.AetheryteLocation) ? ETaskResult.TaskComplete : ETaskResult.StillRunning; + + public override bool ShouldInterruptOnDamage() => true; } } diff --git a/Questionable/Controller/Steps/Interactions/Combat.cs b/Questionable/Controller/Steps/Interactions/Combat.cs index 463c32ce..e63058a8 100644 --- a/Questionable/Controller/Steps/Interactions/Combat.cs +++ b/Questionable/Controller/Steps/Interactions/Combat.cs @@ -190,5 +190,7 @@ internal static class Combat return ETaskResult.TaskComplete; } } + + public override bool ShouldInterruptOnDamage() => false; } } diff --git a/Questionable/Controller/Steps/Interactions/Dive.cs b/Questionable/Controller/Steps/Interactions/Dive.cs index b5389774..eea9cd87 100644 --- a/Questionable/Controller/Steps/Interactions/Dive.cs +++ b/Questionable/Controller/Steps/Interactions/Dive.cs @@ -71,6 +71,8 @@ internal static class Dive return base.Update(); } + public override bool ShouldInterruptOnDamage() => false; + protected override ETaskResult UpdateInternal() { if (condition[ConditionFlag.Diving]) diff --git a/Questionable/Controller/Steps/Interactions/Duty.cs b/Questionable/Controller/Steps/Interactions/Duty.cs index 5e20accf..b59f8ce7 100644 --- a/Questionable/Controller/Steps/Interactions/Duty.cs +++ b/Questionable/Controller/Steps/Interactions/Duty.cs @@ -93,6 +93,8 @@ internal static class Duty ? ETaskResult.TaskComplete : ETaskResult.StillRunning; } + + public override bool ShouldInterruptOnDamage() => false; } internal sealed record WaitAutoDutyTask(uint ContentFinderConditionId) : ITask @@ -117,6 +119,8 @@ internal static class Duty ? ETaskResult.TaskComplete : ETaskResult.StillRunning; } + + public override bool ShouldInterruptOnDamage() => false; } internal sealed record OpenDutyFinderTask(uint ContentFinderConditionId) : ITask @@ -138,5 +142,7 @@ internal static class Duty } public override ETaskResult Update() => ETaskResult.TaskComplete; + + public override bool ShouldInterruptOnDamage() => false; } } diff --git a/Questionable/Controller/Steps/Interactions/Emote.cs b/Questionable/Controller/Steps/Interactions/Emote.cs index 085b0356..d6dd7146 100644 --- a/Questionable/Controller/Steps/Interactions/Emote.cs +++ b/Questionable/Controller/Steps/Interactions/Emote.cs @@ -51,6 +51,8 @@ internal static class Emote chatFunctions.UseEmote(Task.DataId, Task.Emote); return true; } + + public override bool ShouldInterruptOnDamage() => true; } internal sealed record UseOnSelf(EEmote Emote) : ITask @@ -65,5 +67,7 @@ internal static class Emote chatFunctions.UseEmote(Task.Emote); return true; } + + public override bool ShouldInterruptOnDamage() => true; } } diff --git a/Questionable/Controller/Steps/Interactions/EquipItem.cs b/Questionable/Controller/Steps/Interactions/EquipItem.cs index f5cd4e11..d761926d 100644 --- a/Questionable/Controller/Steps/Interactions/EquipItem.cs +++ b/Questionable/Controller/Steps/Interactions/EquipItem.cs @@ -183,5 +183,7 @@ internal static class EquipItem return false; } + + public override bool ShouldInterruptOnDamage() => true; } } diff --git a/Questionable/Controller/Steps/Interactions/EquipRecommended.cs b/Questionable/Controller/Steps/Interactions/EquipRecommended.cs index 3b2be0f1..295bb8cc 100644 --- a/Questionable/Controller/Steps/Interactions/EquipRecommended.cs +++ b/Questionable/Controller/Steps/Interactions/EquipRecommended.cs @@ -98,5 +98,7 @@ internal static class EquipRecommended return ETaskResult.TaskComplete; } + + public override bool ShouldInterruptOnDamage() => true; } } diff --git a/Questionable/Controller/Steps/Interactions/Interact.cs b/Questionable/Controller/Steps/Interactions/Interact.cs index 0ca70c11..0073349b 100644 --- a/Questionable/Controller/Steps/Interactions/Interact.cs +++ b/Questionable/Controller/Steps/Interactions/Interact.cs @@ -228,6 +228,8 @@ internal static class Interact } } + public override bool ShouldInterruptOnDamage() => true; + private enum EInteractionState { None, diff --git a/Questionable/Controller/Steps/Interactions/Jump.cs b/Questionable/Controller/Steps/Interactions/Jump.cs index f7b9892d..3238405c 100644 --- a/Questionable/Controller/Steps/Interactions/Jump.cs +++ b/Questionable/Controller/Steps/Interactions/Jump.cs @@ -80,6 +80,8 @@ internal static class Jump return ETaskResult.TaskComplete; } + + public override bool ShouldInterruptOnDamage() => true; } internal sealed class DoSingleJump( diff --git a/Questionable/Controller/Steps/Interactions/Say.cs b/Questionable/Controller/Steps/Interactions/Say.cs index f13ab4ab..ffb56215 100644 --- a/Questionable/Controller/Steps/Interactions/Say.cs +++ b/Questionable/Controller/Steps/Interactions/Say.cs @@ -48,5 +48,7 @@ internal static class Say chatFunctions.ExecuteCommand($"/say {Task.ChatMessage}"); return true; } + + public override bool ShouldInterruptOnDamage() => true; } } diff --git a/Questionable/Controller/Steps/Interactions/StatusOff.cs b/Questionable/Controller/Steps/Interactions/StatusOff.cs index 746f7394..c9b2b4ca 100644 --- a/Questionable/Controller/Steps/Interactions/StatusOff.cs +++ b/Questionable/Controller/Steps/Interactions/StatusOff.cs @@ -43,5 +43,7 @@ internal static class StatusOff { return gameFunctions.HasStatus(Task.Status) ? ETaskResult.StillRunning : ETaskResult.TaskComplete; } + + public override bool ShouldInterruptOnDamage() => false; } } diff --git a/Questionable/Controller/Steps/Interactions/UseItem.cs b/Questionable/Controller/Steps/Interactions/UseItem.cs index bf779a02..abc427ad 100644 --- a/Questionable/Controller/Steps/Interactions/UseItem.cs +++ b/Questionable/Controller/Steps/Interactions/UseItem.cs @@ -205,6 +205,8 @@ internal static class UseItem else return TimeSpan.FromSeconds(5); } + + public override bool ShouldInterruptOnDamage() => true; } internal sealed record UseOnGround( diff --git a/Questionable/Controller/Steps/Leves/InitiateLeve.cs b/Questionable/Controller/Steps/Leves/InitiateLeve.cs index ab584cef..31cf4705 100644 --- a/Questionable/Controller/Steps/Leves/InitiateLeve.cs +++ b/Questionable/Controller/Steps/Leves/InitiateLeve.cs @@ -50,6 +50,8 @@ internal static class InitiateLeve return ETaskResult.TaskComplete; } + + public override bool ShouldInterruptOnDamage() => false; } internal sealed record OpenJournal(ElementId ElementId) : ITask @@ -85,6 +87,8 @@ internal static class InitiateLeve return ETaskResult.StillRunning; } + + public override bool ShouldInterruptOnDamage() => false; } internal sealed record Initiate(ElementId ElementId) : ITask @@ -111,6 +115,8 @@ internal static class InitiateLeve return ETaskResult.StillRunning; } + + public override bool ShouldInterruptOnDamage() => false; } internal sealed class SelectDifficulty : ITask @@ -138,5 +144,7 @@ internal static class InitiateLeve return ETaskResult.StillRunning; } + + public override bool ShouldInterruptOnDamage() => false; } } diff --git a/Questionable/Controller/Steps/Shared/AethernetShortcut.cs b/Questionable/Controller/Steps/Shared/AethernetShortcut.cs index e63b69c0..460aa440 100644 --- a/Questionable/Controller/Steps/Shared/AethernetShortcut.cs +++ b/Questionable/Controller/Steps/Shared/AethernetShortcut.cs @@ -269,5 +269,7 @@ internal static class AethernetShortcut return ETaskResult.TaskComplete; } + + public override bool ShouldInterruptOnDamage() => true; } } diff --git a/Questionable/Controller/Steps/Shared/AetheryteShortcut.cs b/Questionable/Controller/Steps/Shared/AetheryteShortcut.cs index af575333..b2748b18 100644 --- a/Questionable/Controller/Steps/Shared/AetheryteShortcut.cs +++ b/Questionable/Controller/Steps/Shared/AetheryteShortcut.cs @@ -221,6 +221,8 @@ internal static class AetheryteShortcut } public override bool WasInterrupted() => condition[ConditionFlag.InCombat] || base.WasInterrupted(); + + public override bool ShouldInterruptOnDamage() => true; } internal sealed record MoveAwayFromAetheryte(EAetheryteLocation TargetAetheryte) : ITask @@ -264,5 +266,7 @@ internal static class AetheryteShortcut } public override ETaskResult Update() => moveExecutor.Update(); + + public override bool ShouldInterruptOnDamage() => true; } } diff --git a/Questionable/Controller/Steps/Shared/Craft.cs b/Questionable/Controller/Steps/Shared/Craft.cs index 26493ca0..d986368f 100644 --- a/Questionable/Controller/Steps/Shared/Craft.cs +++ b/Questionable/Controller/Steps/Shared/Craft.cs @@ -133,5 +133,8 @@ internal static class Craft return inventoryManager->GetInventoryItemCount(Task.ItemId, isHq: false, checkEquipped: false) + inventoryManager->GetInventoryItemCount(Task.ItemId, isHq: true, checkEquipped: false); } + + // we're on a crafting class, so combat doesn't make much sense (we also can't change classes in combat...) + public override bool ShouldInterruptOnDamage() => false; } } diff --git a/Questionable/Controller/Steps/Shared/Gather.cs b/Questionable/Controller/Steps/Shared/Gather.cs index 73dd8d12..f4aad9c9 100644 --- a/Questionable/Controller/Steps/Shared/Gather.cs +++ b/Questionable/Controller/Steps/Shared/Gather.cs @@ -100,6 +100,8 @@ internal static class Gather minCollectability: (short)itemToGather.Collectability) >= itemToGather.ItemCount; } + + public override bool ShouldInterruptOnDamage() => false; } internal sealed record GatheringTask( @@ -140,6 +142,9 @@ internal static class Gather gatheringController.OnErrorToast(ref message, ref isHandled); return isHandled; } + + // we're on a gathering class, so combat doesn't make much sense (we also can't change classes in combat...) + public override bool ShouldInterruptOnDamage() => false; } /// @@ -154,5 +159,7 @@ internal static class Gather { protected override bool Start() => true; public override ETaskResult Update() => ETaskResult.TaskComplete; + + public override bool ShouldInterruptOnDamage() => false; } } diff --git a/Questionable/Controller/Steps/Shared/MoveTo.cs b/Questionable/Controller/Steps/Shared/MoveTo.cs index 4df2870f..65689108 100644 --- a/Questionable/Controller/Steps/Shared/MoveTo.cs +++ b/Questionable/Controller/Steps/Shared/MoveTo.cs @@ -286,6 +286,8 @@ internal static class MoveTo return base.WasInterrupted(); } + public override bool ShouldInterruptOnDamage() => false; + public bool OnErrorToast(SeString message) { if (GameFunctions.GameStringEquals(_cannotExecuteAtThisTime, message.TextValue)) @@ -302,6 +304,8 @@ internal static class MoveTo protected override bool Start() => true; public override ETaskResult Update() => ETaskResult.TaskComplete; + + public override bool ShouldInterruptOnDamage() => false; } internal sealed record MoveTask( @@ -361,6 +365,8 @@ internal static class MoveTo return ETaskResult.TaskComplete; } + + public override bool ShouldInterruptOnDamage() => false; } internal sealed class LandTask : ITask @@ -421,5 +427,7 @@ internal static class MoveTo return false; } + + public override bool ShouldInterruptOnDamage() => false; } } diff --git a/Questionable/Controller/Steps/Shared/RedeemRewardItems.cs b/Questionable/Controller/Steps/Shared/RedeemRewardItems.cs index 408b92f7..c7abcae7 100644 --- a/Questionable/Controller/Steps/Shared/RedeemRewardItems.cs +++ b/Questionable/Controller/Steps/Shared/RedeemRewardItems.cs @@ -74,5 +74,7 @@ internal static class RedeemRewardItems return DateTime.Now <= _continueAt ? ETaskResult.StillRunning : ETaskResult.TaskComplete; } + + public override bool ShouldInterruptOnDamage() => true; } } diff --git a/Questionable/Controller/Steps/Shared/SkipCondition.cs b/Questionable/Controller/Steps/Shared/SkipCondition.cs index 5abab059..ebf1dc1f 100644 --- a/Questionable/Controller/Steps/Shared/SkipCondition.cs +++ b/Questionable/Controller/Steps/Shared/SkipCondition.cs @@ -315,5 +315,7 @@ internal static class SkipCondition } public override ETaskResult Update() => ETaskResult.SkipRemainingTasksForStep; + + public override bool ShouldInterruptOnDamage() => false; } } diff --git a/Questionable/Controller/Steps/Shared/StepDisabled.cs b/Questionable/Controller/Steps/Shared/StepDisabled.cs index f7065359..de58cac3 100644 --- a/Questionable/Controller/Steps/Shared/StepDisabled.cs +++ b/Questionable/Controller/Steps/Shared/StepDisabled.cs @@ -31,5 +31,7 @@ internal static class StepDisabled logger.LogInformation("Skipping step, as it is disabled"); return ETaskResult.SkipRemainingTasksForStep; } + + public override bool ShouldInterruptOnDamage() => false; } } diff --git a/Questionable/Controller/Steps/Shared/SwitchClassJob.cs b/Questionable/Controller/Steps/Shared/SwitchClassJob.cs index 59477fec..18bfef7e 100644 --- a/Questionable/Controller/Steps/Shared/SwitchClassJob.cs +++ b/Questionable/Controller/Steps/Shared/SwitchClassJob.cs @@ -52,5 +52,8 @@ internal static class SwitchClassJob } protected override ETaskResult UpdateInternal() => ETaskResult.TaskComplete; + + // can we even take damage while switching jobs? we should be out of combat... + public override bool ShouldInterruptOnDamage() => false; } } diff --git a/Questionable/Controller/Steps/Shared/WaitAtEnd.cs b/Questionable/Controller/Steps/Shared/WaitAtEnd.cs index 0b3a02ba..d39c7c2a 100644 --- a/Questionable/Controller/Steps/Shared/WaitAtEnd.cs +++ b/Questionable/Controller/Steps/Shared/WaitAtEnd.cs @@ -157,6 +157,8 @@ internal static class WaitAtEnd Delay = Task.Delay; return true; } + + public override bool ShouldInterruptOnDamage() => false; } internal sealed class WaitNextStepOrSequence : ITask @@ -169,6 +171,8 @@ internal static class WaitAtEnd protected override bool Start() => true; public override ETaskResult Update() => ETaskResult.StillRunning; + + public override bool ShouldInterruptOnDamage() => false; } internal sealed record WaitForCompletionFlags(QuestId Quest, QuestStep Step) : ITask @@ -190,6 +194,8 @@ internal static class WaitAtEnd ? ETaskResult.TaskComplete : ETaskResult.StillRunning; } + + public override bool ShouldInterruptOnDamage() => false; } internal sealed record WaitObjectAtPosition( @@ -209,6 +215,8 @@ internal static class WaitAtEnd gameFunctions.IsObjectAtPosition(Task.DataId, Task.Destination, Task.Distance) ? ETaskResult.TaskComplete : ETaskResult.StillRunning; + + public override bool ShouldInterruptOnDamage() => false; } internal sealed record WaitQuestAccepted(ElementId ElementId) : ITask @@ -226,6 +234,8 @@ internal static class WaitAtEnd ? ETaskResult.TaskComplete : ETaskResult.StillRunning; } + + public override bool ShouldInterruptOnDamage() => false; } internal sealed record WaitQuestCompleted(ElementId ElementId) : ITask @@ -241,6 +251,8 @@ internal static class WaitAtEnd { return questFunctions.IsQuestComplete(Task.ElementId) ? ETaskResult.TaskComplete : ETaskResult.StillRunning; } + + public override bool ShouldInterruptOnDamage() => false; } internal sealed record NextStep(ElementId ElementId, int Sequence) : ILastTask @@ -253,6 +265,8 @@ internal static class WaitAtEnd protected override bool Start() => true; public override ETaskResult Update() => ETaskResult.NextStep; + + public override bool ShouldInterruptOnDamage() => false; } internal sealed class EndAutomation : ILastTask @@ -268,5 +282,7 @@ internal static class WaitAtEnd protected override bool Start() => true; public override ETaskResult Update() => ETaskResult.End; + + public override bool ShouldInterruptOnDamage() => false; } } diff --git a/Questionable/Controller/Steps/Shared/WaitAtStart.cs b/Questionable/Controller/Steps/Shared/WaitAtStart.cs index c2c304b4..8386e636 100644 --- a/Questionable/Controller/Steps/Shared/WaitAtStart.cs +++ b/Questionable/Controller/Steps/Shared/WaitAtStart.cs @@ -31,6 +31,7 @@ internal static class WaitAtStart Delay = Task.Delay; return true; } - } + public override bool ShouldInterruptOnDamage() => false; + } } diff --git a/Questionable/Controller/Steps/TaskExecutor.cs b/Questionable/Controller/Steps/TaskExecutor.cs index d0315dbc..30e10b64 100644 --- a/Questionable/Controller/Steps/TaskExecutor.cs +++ b/Questionable/Controller/Steps/TaskExecutor.cs @@ -13,6 +13,8 @@ internal interface ITaskExecutor bool Start(ITask task); + bool ShouldInterruptOnDamage(); + bool WasInterrupted(); ETaskResult Update(); @@ -56,4 +58,6 @@ internal abstract class TaskExecutor : ITaskExecutor } public abstract ETaskResult Update(); + + public abstract bool ShouldInterruptOnDamage(); } diff --git a/Questionable/QuestionablePlugin.cs b/Questionable/QuestionablePlugin.cs index a4b5bae9..e0794c2d 100644 --- a/Questionable/QuestionablePlugin.cs +++ b/Questionable/QuestionablePlugin.cs @@ -247,6 +247,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); From 325d5368a50b3f8089168232eaccb51b17f051ae Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Tue, 21 Jan 2025 21:44:08 +0100 Subject: [PATCH 09/29] Interrupts: Add a special case for certain movement tasks --- .../Controller/Steps/Shared/MoveTo.cs | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/Questionable/Controller/Steps/Shared/MoveTo.cs b/Questionable/Controller/Steps/Shared/MoveTo.cs index 65689108..60d83aed 100644 --- a/Questionable/Controller/Steps/Shared/MoveTo.cs +++ b/Questionable/Controller/Steps/Shared/MoveTo.cs @@ -228,6 +228,17 @@ internal static class MoveTo } } } + else if (!ShouldResolveCombatBeforeNextInteraction() && + _movementController is { IsPathfinding: false, IsPathRunning: false } && + mountExecutor.EvaluateMountState() == Mount.MountResult.DontMount) + { + // except for e.g. jumping which would maybe break if combat navigates us away, if we don't + // need a mount anymore we can just skip combat and assume that the interruption is handled + // later. + // + // without this, the character would just stand around while getting hit + _nestedExecutor = (new NoOpTaskExecutor(), new NoOpTask(), true); + } } else if (nestedExecutor.Executor.Update() == ETaskResult.TaskComplete) { @@ -286,7 +297,16 @@ internal static class MoveTo return base.WasInterrupted(); } - public override bool ShouldInterruptOnDamage() => false; + public override bool ShouldInterruptOnDamage() + { + // have we stopped moving, and are we + // (a) waiting for a mount to complete, or + // (b) want combat to be done before any other interaction? + return _movementController is { IsPathfinding: false, IsPathRunning: false } && + (_nestedExecutor is { Triggered: false, Executor: Mount.MountExecutor } || ShouldResolveCombatBeforeNextInteraction()); + } + + private bool ShouldResolveCombatBeforeNextInteraction() => Task.InteractionType is EInteractionType.Jump; public bool OnErrorToast(SeString message) { From 3a3196d869fc15d8637d37d910e80cd5c950414c Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Tue, 21 Jan 2025 21:45:01 +0100 Subject: [PATCH 10/29] No longer accept the level 30 job quest if relevant aetherytes aren't unlocked --- Questionable/Controller/QuestRegistry.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Questionable/Controller/QuestRegistry.cs b/Questionable/Controller/QuestRegistry.cs index d6641073..7808b095 100644 --- a/Questionable/Controller/QuestRegistry.cs +++ b/Questionable/Controller/QuestRegistry.cs @@ -234,7 +234,11 @@ internal sealed class QuestRegistry public List GetKnownClassJobQuests(EClassJob classJob) { - return _questData.GetClassJobQuests(classJob) + List allQuests = [.._questData.GetClassJobQuests(classJob)]; + if (classJob.AsJob() != classJob) + allQuests.AddRange(_questData.GetClassJobQuests(classJob.AsJob())); + + return allQuests .Where(x => IsKnownQuest(x.QuestId)) .ToList(); } From b3d9ce382d6b814a5af4ce0b12950b79cb80994f Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Tue, 21 Jan 2025 21:50:05 +0100 Subject: [PATCH 11/29] Version bump --- Directory.Build.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Build.targets b/Directory.Build.targets index c0b49f3b..cfa9441e 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -1,5 +1,5 @@ - 4.14 + 4.15 From 2cf059ec38985bf125e7e009d73a0b39808f1f10 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Wed, 22 Jan 2025 18:37:15 +0100 Subject: [PATCH 12/29] CodeGen update --- .../RoslynElements/CombatItemUseExtensions.cs | 29 +++++++++++++++++++ .../RoslynElements/QuestStepExtensions.cs | 3 ++ QuestPathGenerator/RoslynShortcuts.cs | 1 + 3 files changed, 33 insertions(+) create mode 100644 QuestPathGenerator/RoslynElements/CombatItemUseExtensions.cs diff --git a/QuestPathGenerator/RoslynElements/CombatItemUseExtensions.cs b/QuestPathGenerator/RoslynElements/CombatItemUseExtensions.cs new file mode 100644 index 00000000..93e5d696 --- /dev/null +++ b/QuestPathGenerator/RoslynElements/CombatItemUseExtensions.cs @@ -0,0 +1,29 @@ +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Questionable.Model.Questing; +using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory; +using static Questionable.QuestPathGenerator.RoslynShortcuts; + +namespace Questionable.QuestPathGenerator.RoslynElements; + +internal static class CombatItemUseExtensions +{ + public static ExpressionSyntax ToExpressionSyntax(this CombatItemUse combatItemuse) + { + var emptyItemuse = new CombatItemUse(); + return ObjectCreationExpression( + IdentifierName(nameof(CombatItemUse))) + .WithInitializer( + InitializerExpression( + SyntaxKind.ObjectInitializerExpression, + SeparatedList( + SyntaxNodeList( + Assignment(nameof(CombatItemUse.ItemId), combatItemuse.ItemId, + emptyItemuse.ItemId) + .AsSyntaxNodeOrToken(), + Assignment(nameof(CombatItemUse.Condition), combatItemuse.Condition, emptyItemuse.Condition) + .AsSyntaxNodeOrToken(), + Assignment(nameof(combatItemuse.Value), combatItemuse.Value, emptyItemuse.Value) + .AsSyntaxNodeOrToken())))); + } +} diff --git a/QuestPathGenerator/RoslynElements/QuestStepExtensions.cs b/QuestPathGenerator/RoslynElements/QuestStepExtensions.cs index 6b76bb95..2d3ec803 100644 --- a/QuestPathGenerator/RoslynElements/QuestStepExtensions.cs +++ b/QuestPathGenerator/RoslynElements/QuestStepExtensions.cs @@ -107,6 +107,9 @@ internal static class QuestStepExtensions .AsSyntaxNodeOrToken(), AssignmentList(nameof(QuestStep.ComplexCombatData), step.ComplexCombatData) .AsSyntaxNodeOrToken(), + Assignment(nameof(QuestStep.CombatItemUse), step.CombatItemUse, + emptyStep.CombatItemUse) + .AsSyntaxNodeOrToken(), Assignment(nameof(QuestStep.CombatDelaySecondsAtStart), step.CombatDelaySecondsAtStart, emptyStep.CombatDelaySecondsAtStart) diff --git a/QuestPathGenerator/RoslynShortcuts.cs b/QuestPathGenerator/RoslynShortcuts.cs index c5fb47f5..2c1df09f 100644 --- a/QuestPathGenerator/RoslynShortcuts.cs +++ b/QuestPathGenerator/RoslynShortcuts.cs @@ -71,6 +71,7 @@ public static class RoslynShortcuts GatheringNodeGroup nodeGroup => nodeGroup.ToExpressionSyntax(), GatheringNode nodeLocation => nodeLocation.ToExpressionSyntax(), GatheringLocation location => location.ToExpressionSyntax(), + CombatItemUse combatItemUse => combatItemUse.ToExpressionSyntax(), not null when value.GetType().IsEnum => MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression, IdentifierName(value.GetType().Name), IdentifierName(value.GetType().GetEnumName(value)!)), _ => throw new Exception($"Unsupported data type {value.GetType()} = {value}") From 05d63942649ccd93f86fb66c593868f505a17859 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Wed, 22 Jan 2025 18:38:03 +0100 Subject: [PATCH 13/29] Minor ARR MSQ updates --- .../757_On to Little Ala Mhigo.json | 10 ++++++++++ .../897_The Talk of Coerthas.json | 3 ++- .../924_Ye of Little Faith.json | 3 ++- .../961_Representing the Representative.json | 9 +++++++++ .../962_The Reluctant Researcher.json | 9 +++++++++ 5 files changed, 32 insertions(+), 2 deletions(-) diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/A5-Southern Thanalan, Little Ala Mhigo/757_On to Little Ala Mhigo.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/A5-Southern Thanalan, Little Ala Mhigo/757_On to Little Ala Mhigo.json index 27a25019..19fac78d 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/A5-Southern Thanalan, Little Ala Mhigo/757_On to Little Ala Mhigo.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/A5-Southern Thanalan, Little Ala Mhigo/757_On to Little Ala Mhigo.json @@ -36,6 +36,16 @@ "InteractionType": "WalkTo", "TargetTerritoryId": 146 }, + { + "Position": { + "X": -47.50145, + "Y": 16.362688, + "Z": -439.62503 + }, + "TerritoryId": 146, + "InteractionType": "WalkTo", + "$": "vnav sometimes attempts to walk to the aetheryte using exactly one waypoint between zone boundary and aetheryte, which means walking into walls" + }, { "TerritoryId": 146, "InteractionType": "AttuneAetheryte", diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/B7-Coerthas Central Highlands, Camp Dragonhead/897_The Talk of Coerthas.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/B7-Coerthas Central Highlands, Camp Dragonhead/897_The Talk of Coerthas.json index fc0042f5..b5543417 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/B7-Coerthas Central Highlands, Camp Dragonhead/897_The Talk of Coerthas.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/B7-Coerthas Central Highlands, Camp Dragonhead/897_The Talk of Coerthas.json @@ -103,7 +103,8 @@ }, "TerritoryId": 155, "InteractionType": "WalkTo", - "$": "NW Skyfire Locks door (inside)" + "$": "NW Skyfire Locks door (inside)", + "Mount": true }, { "Position": { diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/B9-Coerthas Central Highlands, Whitebrim Front/924_Ye of Little Faith.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/B9-Coerthas Central Highlands, Whitebrim Front/924_Ye of Little Faith.json index f3401f9b..66891113 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/B9-Coerthas Central Highlands, Whitebrim Front/924_Ye of Little Faith.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/B9-Coerthas Central Highlands, Whitebrim Front/924_Ye of Little Faith.json @@ -49,7 +49,8 @@ }, "TerritoryId": 155, "InteractionType": "WalkTo", - "Comment": "North Whitebrim, Stairs (bottom)" + "Comment": "North Whitebrim, Stairs (bottom)", + "Mount": true }, { "Position": { diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C2-Western La Noscea, Isles of Umbra/961_Representing the Representative.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C2-Western La Noscea, Isles of Umbra/961_Representing the Representative.json index 6d2279b9..f4d1379f 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C2-Western La Noscea, Isles of Umbra/961_Representing the Representative.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C2-Western La Noscea, Isles of Umbra/961_Representing the Representative.json @@ -76,6 +76,15 @@ { "Sequence": 3, "Steps": [ + { + "Position": { + "X": 303.96317, + "Y": -36.40591, + "Z": 316.74185 + }, + "TerritoryId": 138, + "InteractionType": "WalkTo" + }, { "DataId": 1006501, "Position": { diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C2-Western La Noscea, Isles of Umbra/962_The Reluctant Researcher.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C2-Western La Noscea, Isles of Umbra/962_The Reluctant Researcher.json index 8266ce99..23eb5a02 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C2-Western La Noscea, Isles of Umbra/962_The Reluctant Researcher.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C2-Western La Noscea, Isles of Umbra/962_The Reluctant Researcher.json @@ -26,6 +26,15 @@ { "Sequence": 1, "Steps": [ + { + "Position": { + "X": 303.96317, + "Y": -36.40591, + "Z": 316.74185 + }, + "TerritoryId": 138, + "InteractionType": "WalkTo" + }, { "DataId": 1007640, "Position": { From 5e45af38d19b4e1b0d059382bb07a92e91d6c24a Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Wed, 22 Jan 2025 18:38:24 +0100 Subject: [PATCH 14/29] Fix target switching logic in combat --- Questionable/Controller/CombatController.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Questionable/Controller/CombatController.cs b/Questionable/Controller/CombatController.cs index 73fe17df..ea10fa7c 100644 --- a/Questionable/Controller/CombatController.cs +++ b/Questionable/Controller/CombatController.cs @@ -157,7 +157,7 @@ internal sealed class CombatController : IDisposable { int currentTargetPriority = GetKillPriority(target); var nextTarget = FindNextTarget(); - int nextTargetPriority = GetKillPriority(target); + int nextTargetPriority = nextTarget != null ? GetKillPriority(nextTarget) : 0; if (nextTarget != null && nextTarget.Equals(target)) { @@ -176,7 +176,7 @@ internal sealed class CombatController : IDisposable } else if (nextTarget != null) { - if (nextTargetPriority > currentTargetPriority) + if (nextTargetPriority > currentTargetPriority || currentTargetPriority == 0) SetTarget(nextTarget); } else From e0580239e4473ccbc0810443e92529cff8863a47 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Wed, 22 Jan 2025 19:16:56 +0100 Subject: [PATCH 15/29] Enable flight for turning in 'The Wind's Blessing' --- .../Side Quests/Kozama'uka/5083_The Wind's Blessing.json | 1 + 1 file changed, 1 insertion(+) 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 index 903ee73e..c02008d7 100644 --- 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 @@ -96,6 +96,7 @@ }, "TerritoryId": 1188, "InteractionType": "CompleteQuest", + "Fly": true, "NextQuestId": 5084 } ] From 4e427e43099a71dac8858b0d8675087f5f01807f Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Thu, 23 Jan 2025 01:31:17 +0100 Subject: [PATCH 16/29] Minor ARR updates --- .../Class Quests/WAR/1052_Looking the Part.json | 13 +++++++++++-- .../C6-Mor Dhona/1001_Drowning Out the Voices.json | 5 ++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1052_Looking the Part.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1052_Looking the Part.json index a3ae2649..59241a3d 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1052_Looking the Part.json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1052_Looking the Part.json @@ -112,9 +112,18 @@ "SkipConditions": { "AetheryteShortcutIf": { "InSameTerritory": true + }, + "StepIf": { + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] } - }, - "Comment": "TODO Verify enemy id" + } }, { "DataId": 2002309, diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/1001_Drowning Out the Voices.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/1001_Drowning Out the Voices.json index 1fcf9d81..59a79e75 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/1001_Drowning Out the Voices.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/1001_Drowning Out the Voices.json @@ -51,6 +51,7 @@ }, "TerritoryId": 156, "InteractionType": "Combat", + "DelaySecondsAtStart": 2, "EnemySpawnType": "AfterItemUse", "ItemId": 2000766, "KillEnemyDataIds": [ @@ -180,6 +181,7 @@ }, "TerritoryId": 156, "InteractionType": "Combat", + "DelaySecondsAtStart": 2, "EnemySpawnType": "AfterItemUse", "ItemId": 2000766, "KillEnemyDataIds": [ @@ -238,7 +240,8 @@ }, "TerritoryId": 156, "InteractionType": "UseItem", - "ItemId": 2000766 + "ItemId": 2000766, + "DelaySecondsAtStart": 2 } ] }, From 4f61ea45edf3c31d9d3455baf8425b9f73f92899 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Thu, 23 Jan 2025 01:43:09 +0100 Subject: [PATCH 17/29] Update colors for some specific status/error messages --- Questionable/Controller/MiniTaskController.cs | 4 ++-- Questionable/Controller/QuestController.cs | 2 +- Questionable/Controller/Steps/Interactions/AetherCurrent.cs | 3 ++- .../Controller/Steps/Interactions/EquipRecommended.cs | 5 +++-- Questionable/Controller/Steps/Shared/AetheryteShortcut.cs | 4 ++-- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Questionable/Controller/MiniTaskController.cs b/Questionable/Controller/MiniTaskController.cs index c9aec197..949c1915 100644 --- a/Questionable/Controller/MiniTaskController.cs +++ b/Questionable/Controller/MiniTaskController.cs @@ -68,7 +68,7 @@ internal abstract class MiniTaskController : IDisposable { _logger.LogError(e, "Failed to start task {TaskName}", upcomingTask.ToString()); _chatGui.PrintError( - $"[Questionable] Failed to start task '{upcomingTask}', please check /xllog for details."); + $"Failed to start task '{upcomingTask}', please check /xllog for details.", CommandHandler.MessageTag, CommandHandler.TagColor); Stop("Task failed to start"); return; } @@ -93,7 +93,7 @@ internal abstract class MiniTaskController : IDisposable _logger.LogError(e, "Failed to update task {TaskName}", _taskQueue.CurrentTaskExecutor.CurrentTask.ToString()); _chatGui.PrintError( - $"[Questionable] Failed to update task '{_taskQueue.CurrentTaskExecutor.CurrentTask}', please check /xllog for details."); + $"Failed to update task '{_taskQueue.CurrentTaskExecutor.CurrentTask}', please check /xllog for details.", CommandHandler.MessageTag, CommandHandler.TagColor); Stop("Task failed to update"); return; } diff --git a/Questionable/Controller/QuestController.cs b/Questionable/Controller/QuestController.cs index d514f267..2c522556 100644 --- a/Questionable/Controller/QuestController.cs +++ b/Questionable/Controller/QuestController.cs @@ -623,7 +623,7 @@ internal sealed class QuestController : MiniTaskController, IDi catch (Exception e) { _logger.LogError(e, "Failed to create tasks"); - _chatGui.PrintError("[Questionable] Failed to start next task sequence, please check /xllog for details."); + _chatGui.PrintError("Failed to start next task sequence, please check /xllog for details.", CommandHandler.MessageTag, CommandHandler.TagColor); Stop("Tasks failed to create"); } } diff --git a/Questionable/Controller/Steps/Interactions/AetherCurrent.cs b/Questionable/Controller/Steps/Interactions/AetherCurrent.cs index 7632e574..7c1f6338 100644 --- a/Questionable/Controller/Steps/Interactions/AetherCurrent.cs +++ b/Questionable/Controller/Steps/Interactions/AetherCurrent.cs @@ -26,7 +26,8 @@ internal static class AetherCurrent if (!aetherCurrentData.IsValidAetherCurrent(step.TerritoryId, step.AetherCurrentId.Value)) { chatGui.PrintError( - $"[Questionable] Aether current with id {step.AetherCurrentId} is referencing an invalid aether current, will skip attunement"); + $"Aether current with id {step.AetherCurrentId} is referencing an invalid aether current, will skip attunement", + CommandHandler.MessageTag, CommandHandler.TagColor); return null; } diff --git a/Questionable/Controller/Steps/Interactions/EquipRecommended.cs b/Questionable/Controller/Steps/Interactions/EquipRecommended.cs index 295bb8cc..3e008cca 100644 --- a/Questionable/Controller/Steps/Interactions/EquipRecommended.cs +++ b/Questionable/Controller/Steps/Interactions/EquipRecommended.cs @@ -40,7 +40,8 @@ internal static class EquipRecommended public override string ToString() => "EquipRecommended"; } - internal sealed unsafe class DoEquipRecommended(IClientState clientState, IChatGui chatGui, ICondition condition) : TaskExecutor + internal sealed unsafe class DoEquipRecommended(IClientState clientState, IChatGui chatGui, ICondition condition) + : TaskExecutor { private bool _equipped; @@ -88,7 +89,7 @@ internal static class EquipRecommended if (!isAllEquipped) { - chatGui.Print("Equipping recommended gear.", "Questionable"); + chatGui.Print("Equipping recommended gear.", CommandHandler.MessageTag, CommandHandler.TagColor); recommendedEquipModule->EquipRecommendedGear(); } diff --git a/Questionable/Controller/Steps/Shared/AetheryteShortcut.cs b/Questionable/Controller/Steps/Shared/AetheryteShortcut.cs index b2748b18..4a56e929 100644 --- a/Questionable/Controller/Steps/Shared/AetheryteShortcut.cs +++ b/Questionable/Controller/Steps/Shared/AetheryteShortcut.cs @@ -201,7 +201,7 @@ internal static class AetheryteShortcut if (!aetheryteFunctions.IsAetheryteUnlocked(Task.TargetAetheryte)) { - chatGui.PrintError($"[Questionable] Aetheryte {Task.TargetAetheryte} is not unlocked."); + chatGui.PrintError($"Aetheryte {Task.TargetAetheryte} is not unlocked.", CommandHandler.MessageTag, CommandHandler.TagColor); throw new TaskException("Aetheryte is not unlocked"); } @@ -215,7 +215,7 @@ internal static class AetheryteShortcut } else { - chatGui.Print("[Questionable] Unable to teleport to aetheryte."); + chatGui.Print("Unable to teleport to aetheryte.", CommandHandler.MessageTag, CommandHandler.TagColor); throw new TaskException("Unable to teleport to aetheryte"); } } From 7731dd065898e98f06222dab9dfea7033ab5fadd Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 24 Jan 2025 19:40:36 +0100 Subject: [PATCH 18/29] Use Vesper Bay aetheryte tickets for 'Operation Archon' if you left the Waking Sands --- .../4521_Operation Archon.json | 83 ++++++++++++++++++- QuestPaths/quest-v1.json | 1 + .../Converter/SkipConditionConverter.cs | 1 + .../Questing/EExtraSkipCondition.cs | 1 + .../Controller/Steps/Shared/SkipCondition.cs | 1 + 5 files changed, 85 insertions(+), 2 deletions(-) diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/4521_Operation Archon.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/4521_Operation Archon.json index 81c32c86..d470701a 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/4521_Operation Archon.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/4521_Operation Archon.json @@ -5,6 +5,71 @@ { "Sequence": 0, "Steps": [ + { + "TerritoryId": 132, + "InteractionType": "UseItem", + "ItemId": 30362, + "TargetTerritoryId": 140, + "SkipConditions": { + "StepIf": { + "InTerritory": [ + 140, + 212 + ] + } + } + }, + { + "Position": { + "X": -492.96475, + "Y": 20.999884, + "Z": -380.82272 + }, + "TerritoryId": 140, + "InteractionType": "WalkTo", + "$": "Avoid walking around Waking Sands table", + "SkipConditions": { + "StepIf": { + "InTerritory": [ + 212 + ] + } + } + }, + { + "DataId": 2001715, + "Position": { + "X": 23.23944, + "Y": 2.090454, + "Z": -0.015319824 + }, + "TerritoryId": 212, + "InteractionType": "Interact", + "TargetTerritoryId": 212, + "SkipConditions": { + "StepIf": { + "ExtraCondition": "WakingSandsSolar" + } + } + }, + { + "DataId": 2001711, + "Position": { + "X": -480.9181, + "Y": 18.00103, + "Z": -386.862 + }, + "TerritoryId": 140, + "InteractionType": "Interact", + "TargetTerritoryId": 212, + "SkipConditions": { + "StepIf": { + "InTerritory": [ + 212 + ] + } + } + }, { "DataId": 1006690, "Position": { @@ -29,7 +94,14 @@ }, "TerritoryId": 212, "InteractionType": "Interact", - "TargetTerritoryId": 212 + "TargetTerritoryId": 212, + "SkipConditions": { + "StepIf": { + "InTerritory": [ + 140 + ] + } + } }, { "DataId": 2001716, @@ -40,7 +112,14 @@ }, "TerritoryId": 212, "InteractionType": "Interact", - "TargetTerritoryId": 140 + "TargetTerritoryId": 140, + "SkipConditions": { + "StepIf": { + "InTerritory": [ + 140 + ] + } + } }, { "DataId": 1006578, diff --git a/QuestPaths/quest-v1.json b/QuestPaths/quest-v1.json index f0f82637..d1c1b23c 100644 --- a/QuestPaths/quest-v1.json +++ b/QuestPaths/quest-v1.json @@ -292,6 +292,7 @@ "type": "string", "enum": [ "WakingSandsMainArea", + "WakingSandsSolar", "RisingStonesSolar", "RoguesGuild", "DockStorehouse" diff --git a/Questionable.Model/Questing/Converter/SkipConditionConverter.cs b/Questionable.Model/Questing/Converter/SkipConditionConverter.cs index 3de919b9..eb917950 100644 --- a/Questionable.Model/Questing/Converter/SkipConditionConverter.cs +++ b/Questionable.Model/Questing/Converter/SkipConditionConverter.cs @@ -8,6 +8,7 @@ public sealed class SkipConditionConverter() : EnumConverter Values = new() { { EExtraSkipCondition.WakingSandsMainArea, "WakingSandsMainArea" }, + { EExtraSkipCondition.WakingSandsSolar, "WakingSandsSolar" }, { EExtraSkipCondition.RisingStonesSolar, "RisingStonesSolar"}, { EExtraSkipCondition.RoguesGuild, "RoguesGuild"}, { EExtraSkipCondition.DockStorehouse, "DockStorehouse"}, diff --git a/Questionable.Model/Questing/EExtraSkipCondition.cs b/Questionable.Model/Questing/EExtraSkipCondition.cs index d9d7b0be..8ec77d49 100644 --- a/Questionable.Model/Questing/EExtraSkipCondition.cs +++ b/Questionable.Model/Questing/EExtraSkipCondition.cs @@ -8,6 +8,7 @@ public enum EExtraSkipCondition { None, WakingSandsMainArea, + WakingSandsSolar, RisingStonesSolar, /// diff --git a/Questionable/Controller/Steps/Shared/SkipCondition.cs b/Questionable/Controller/Steps/Shared/SkipCondition.cs index ebf1dc1f..bd953539 100644 --- a/Questionable/Controller/Steps/Shared/SkipCondition.cs +++ b/Questionable/Controller/Steps/Shared/SkipCondition.cs @@ -307,6 +307,7 @@ internal static class SkipCondition return condition switch { EExtraSkipCondition.WakingSandsMainArea => territoryType == 212 && position.X < 24, + EExtraSkipCondition.WakingSandsSolar => territoryType == 212 && position.X >= 24, EExtraSkipCondition.RisingStonesSolar => territoryType == 351 && position.Z <= -28, EExtraSkipCondition.RoguesGuild => territoryType == 129 && position.Y <= -115, EExtraSkipCondition.DockStorehouse => territoryType == 137 && position.Y <= -20, From d85b204c791e2e869c9954347f84afbd74be48ad Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 24 Jan 2025 19:53:20 +0100 Subject: [PATCH 19/29] Automatically close job bar tutorials + Lv49 novice guide --- .../Controller/GameUi/HelpUiController.cs | 61 ++++++++++++++++++- Questionable/Controller/MiniTaskController.cs | 17 ++++++ Questionable/Controller/QuestController.cs | 4 ++ 3 files changed, 80 insertions(+), 2 deletions(-) diff --git a/Questionable/Controller/GameUi/HelpUiController.cs b/Questionable/Controller/GameUi/HelpUiController.cs index 0d869add..504f8cd0 100644 --- a/Questionable/Controller/GameUi/HelpUiController.cs +++ b/Questionable/Controller/GameUi/HelpUiController.cs @@ -3,6 +3,7 @@ using Dalamud.Game.Addon.Lifecycle; using Dalamud.Game.Addon.Lifecycle.AddonArgTypes; using Dalamud.Plugin.Services; using FFXIVClientStructs.FFXIV.Component.GUI; +using LLib.GameUI; using Microsoft.Extensions.Logging; namespace Questionable.Controller.GameUi; @@ -11,17 +12,45 @@ internal sealed class HelpUiController : IDisposable { private readonly QuestController _questController; private readonly IAddonLifecycle _addonLifecycle; + private readonly IGameGui _gameGui; private readonly ILogger _logger; - public HelpUiController(QuestController questController, IAddonLifecycle addonLifecycle, ILogger logger) + public HelpUiController( + QuestController questController, + IAddonLifecycle addonLifecycle, + IGameGui gameGui, + ILogger logger) { _questController = questController; _addonLifecycle = addonLifecycle; + _gameGui = gameGui; _logger = logger; + _questController.AutomationTypeChanged += CloseHelpWindowsWhenStartingQuests; + _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "AkatsukiNote", UnendingCodexPostSetup); _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "ContentsTutorial", ContentsTutorialPostSetup); _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "MultipleHelpWindow", MultipleHelpWindowPostSetup); + _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "JobHudNotice", JobHudNoticePostSetup); + _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "Guide", GuidePostSetup); + } + + private unsafe void CloseHelpWindowsWhenStartingQuests(object sender, QuestController.EAutomationType e) + { + if (e is QuestController.EAutomationType.Manual) + return; + + if (_gameGui.TryGetAddonByName("Guide", out AtkUnitBase* addonGuide)) + { + _logger.LogInformation("Guide window is open"); + GuidePostSetup(addonGuide); + } + + if (_gameGui.TryGetAddonByName("JobHudNotice", out AtkUnitBase* addonJobHudNotice)) + { + _logger.LogInformation("JobHudNotice window is open"); + JobHudNoticePostSetup(addonJobHudNotice); + } } private unsafe void UnendingCodexPostSetup(AddonEvent type, AddonArgs args) @@ -36,7 +65,7 @@ internal sealed class HelpUiController : IDisposable private unsafe void ContentsTutorialPostSetup(AddonEvent type, AddonArgs args) { - if (_questController.StartedQuest?.Quest.Id.Value == 245) + if (_questController.StartedQuest?.Quest.Id.Value is 245 or 3872) { _logger.LogInformation("Closing ContentsTutorial"); AtkUnitBase* addon = (AtkUnitBase*)args.Addon; @@ -58,10 +87,38 @@ internal sealed class HelpUiController : IDisposable } } + private unsafe void JobHudNoticePostSetup(AddonEvent type, AddonArgs args) + { + if (_questController.IsRunning || _questController.AutomationType != QuestController.EAutomationType.Manual) + JobHudNoticePostSetup((AtkUnitBase*)args.Addon); + } + + private unsafe void JobHudNoticePostSetup(AtkUnitBase* addon) + { + _logger.LogInformation("Clicking the JobHudNotice window to open the relevant Guide page"); + addon->FireCallbackInt(0); + } + + private unsafe void GuidePostSetup(AddonEvent type, AddonArgs args) + { + if (_questController.IsRunning || _questController.AutomationType != QuestController.EAutomationType.Manual) + GuidePostSetup((AtkUnitBase*)args.Addon); + } + + private unsafe void GuidePostSetup(AtkUnitBase* addon) + { + _logger.LogInformation("Closing Guide window"); + addon->FireCallbackInt(-1); + } + public void Dispose() { + _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "Guide", GuidePostSetup); + _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "JobHudNotice", JobHudNoticePostSetup); _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "MultipleHelpWindow", MultipleHelpWindowPostSetup); _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "ContentsTutorial", ContentsTutorialPostSetup); _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "AkatsukiNote", UnendingCodexPostSetup); + + _questController.AutomationTypeChanged -= CloseHelpWindowsWhenStartingQuests; } } diff --git a/Questionable/Controller/MiniTaskController.cs b/Questionable/Controller/MiniTaskController.cs index 949c1915..4099a17d 100644 --- a/Questionable/Controller/MiniTaskController.cs +++ b/Questionable/Controller/MiniTaskController.cs @@ -28,6 +28,7 @@ internal abstract class MiniTaskController : IDisposable private readonly ILogger _logger; private readonly string _actionCanceledText; + private readonly string _cantExecuteDueToStatusText; protected MiniTaskController(IChatGui chatGui, ICondition condition, IServiceProvider serviceProvider, InterruptHandler interruptHandler, IDataManager dataManager, ILogger logger) @@ -39,6 +40,7 @@ internal abstract class MiniTaskController : IDisposable _condition = condition; _actionCanceledText = dataManager.GetString(1314, x => x.Text)!; + _cantExecuteDueToStatusText = dataManager.GetString(7728, x => x.Text)!; _interruptHandler.Interrupted += HandleInterruption; } @@ -183,6 +185,19 @@ internal abstract class MiniTaskController : IDisposable else _taskQueue.InterruptWith([new WaitAtEnd.WaitDelay()]); + LogTasksAfterInterruption(); + } + + private void InterruptWithoutCombat() + { + _logger.LogWarning("Interrupted, attempting to redo previous tasks (not in combat)"); + _taskQueue.InterruptWith([new WaitAtEnd.WaitDelay()]); + + LogTasksAfterInterruption(); + } + + private void LogTasksAfterInterruption() + { _logger.LogInformation("Remaining tasks after interruption:"); foreach (ITask task in _taskQueue.RemainingTasks) _logger.LogInformation("- {TaskName}", task); @@ -204,6 +219,8 @@ internal abstract class MiniTaskController : IDisposable !_condition[ConditionFlag.InFlight] && _taskQueue.CurrentTaskExecutor?.ShouldInterruptOnDamage() == true) InterruptQueueWithCombat(); + else if (GameFunctions.GameStringEquals(_cantExecuteDueToStatusText, message.TextValue)) + InterruptWithoutCombat(); } } diff --git a/Questionable/Controller/QuestController.cs b/Questionable/Controller/QuestController.cs index 2c522556..954bb5be 100644 --- a/Questionable/Controller/QuestController.cs +++ b/Questionable/Controller/QuestController.cs @@ -111,9 +111,13 @@ internal sealed class QuestController : MiniTaskController, IDi _logger.LogInformation("Setting automation type to {NewAutomationType} (previous: {OldAutomationType})", value, _automationType); _automationType = value; + AutomationTypeChanged?.Invoke(this, value); } } + public delegate void AutomationTypeChangedEventHandler(object sender, EAutomationType e); + public event AutomationTypeChangedEventHandler? AutomationTypeChanged; + public (QuestProgress Progress, ECurrentQuestType Type)? CurrentQuestDetails { get From 2ebc4b5a0d7882559e93dbdece72be700163ec15 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 24 Jan 2025 20:04:32 +0100 Subject: [PATCH 20/29] Fix 'Operation Archon' step order --- .../4521_Operation Archon.json | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/4521_Operation Archon.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/4521_Operation Archon.json index d470701a..2f33376f 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/4521_Operation Archon.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/4521_Operation Archon.json @@ -36,22 +36,6 @@ } } }, - { - "DataId": 2001715, - "Position": { - "X": 23.23944, - "Y": 2.090454, - "Z": -0.015319824 - }, - "TerritoryId": 212, - "InteractionType": "Interact", - "TargetTerritoryId": 212, - "SkipConditions": { - "StepIf": { - "ExtraCondition": "WakingSandsSolar" - } - } - }, { "DataId": 2001711, "Position": { @@ -70,6 +54,22 @@ } } }, + { + "DataId": 2001715, + "Position": { + "X": 23.23944, + "Y": 2.090454, + "Z": -0.015319824 + }, + "TerritoryId": 212, + "InteractionType": "Interact", + "TargetTerritoryId": 212, + "SkipConditions": { + "StepIf": { + "ExtraCondition": "WakingSandsSolar" + } + } + }, { "DataId": 1006690, "Position": { From ffccd347bd9e9affff348bf00597bd06ddef5c3b Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 24 Jan 2025 20:30:58 +0100 Subject: [PATCH 21/29] Add a delay to equipping recommended gear for specific instances where ilvl calculation would otherwise be off --- .../Steps/Interactions/EquipRecommended.cs | 68 +++++++++++-------- 1 file changed, 38 insertions(+), 30 deletions(-) diff --git a/Questionable/Controller/Steps/Interactions/EquipRecommended.cs b/Questionable/Controller/Steps/Interactions/EquipRecommended.cs index 3e008cca..a71cc3b0 100644 --- a/Questionable/Controller/Steps/Interactions/EquipRecommended.cs +++ b/Questionable/Controller/Steps/Interactions/EquipRecommended.cs @@ -43,7 +43,8 @@ internal static class EquipRecommended internal sealed unsafe class DoEquipRecommended(IClientState clientState, IChatGui chatGui, ICondition condition) : TaskExecutor { - private bool _equipped; + private bool _checkedOrTriggeredEquipmentUpdate; + private DateTime _continueAt = DateTime.MinValue; protected override bool Start() { @@ -60,44 +61,51 @@ internal static class EquipRecommended if (recommendedEquipModule->IsUpdating) return ETaskResult.StillRunning; - if (!_equipped) + if (!_checkedOrTriggeredEquipmentUpdate) { - InventoryManager* inventoryManager = InventoryManager.Instance(); - InventoryContainer* equippedItems = - inventoryManager->GetInventoryContainer(InventoryType.EquippedItems); - bool isAllEquipped = true; - foreach (var recommendedItemPtr in recommendedEquipModule->RecommendedItems) - { - var recommendedItem = recommendedItemPtr.Value; - if (recommendedItem == null || recommendedItem->ItemId == 0) - continue; - - bool isEquipped = false; - for (int i = 0; i < equippedItems->Size; ++i) - { - var equippedItem = equippedItems->Items[i]; - if (equippedItem.ItemId != 0 && equippedItem.ItemId == recommendedItem->ItemId) - { - isEquipped = true; - break; - } - } - - if (!isEquipped) - isAllEquipped = false; - } - - if (!isAllEquipped) + if (!IsAllRecommendeGearEquipped()) { chatGui.Print("Equipping recommended gear.", CommandHandler.MessageTag, CommandHandler.TagColor); recommendedEquipModule->EquipRecommendedGear(); + _continueAt = DateTime.Now.AddSeconds(1); } - _equipped = true; + _checkedOrTriggeredEquipmentUpdate = true; return ETaskResult.StillRunning; } - return ETaskResult.TaskComplete; + return DateTime.Now >= _continueAt ? ETaskResult.TaskComplete : ETaskResult.StillRunning; + } + + private bool IsAllRecommendeGearEquipped() + { + var recommendedEquipModule = RecommendEquipModule.Instance(); + InventoryManager* inventoryManager = InventoryManager.Instance(); + InventoryContainer* equippedItems = + inventoryManager->GetInventoryContainer(InventoryType.EquippedItems); + bool isAllEquipped = true; + foreach (var recommendedItemPtr in recommendedEquipModule->RecommendedItems) + { + var recommendedItem = recommendedItemPtr.Value; + if (recommendedItem == null || recommendedItem->ItemId == 0) + continue; + + bool isEquipped = false; + for (int i = 0; i < equippedItems->Size; ++i) + { + var equippedItem = equippedItems->Items[i]; + if (equippedItem.ItemId != 0 && equippedItem.ItemId == recommendedItem->ItemId) + { + isEquipped = true; + break; + } + } + + if (!isEquipped) + isAllEquipped = false; + } + + return isAllEquipped; } public override bool ShouldInterruptOnDamage() => true; From 004d9756d775acc858a2339d85a2c09455e8e397 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 24 Jan 2025 22:26:24 +0100 Subject: [PATCH 22/29] Add an optional teleport before interacting with Raubahn for Castrum Meridianum so lv50 job quests can run before the dungeon; open Lv49 weapon + Lv50 job gear coffer before queueing for Castrum --- .../3873_Rock the Castrum.json | 152 +++++++++++++++++- QuestPaths/quest-v1.json | 8 +- 2 files changed, 156 insertions(+), 4 deletions(-) diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/3873_Rock the Castrum.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/3873_Rock the Castrum.json index 7eec220a..dba66d15 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/3873_Rock the Castrum.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/3873_Rock the Castrum.json @@ -35,13 +35,163 @@ "Z": -225.17743 }, "TerritoryId": 147, - "InteractionType": "Interact" + "InteractionType": "Interact", + "AetheryteShortcut": "Northern Thanalan - Ceruleum Processing Plant", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } } ] }, { "Sequence": 2, + "$": "This doesn't include the DRK/MCH/AST coffers that exist at level 50, but you cannot obtain them until HW", "Steps": [ + { + "TerritoryId": 147, + "InteractionType": "UseItem", + "ItemId": 31337, + "$": "Lv49 Weapon Coffer", + "SkipConditions": { + "StepIf": { + "Item": { + "NotInInventory": true + } + } + } + }, + { + "TerritoryId": 147, + "InteractionType": "UseItem", + "ItemId": 20642, + "$": "Lv50 PLD Coffer", + "SkipConditions": { + "StepIf": { + "Item": { + "NotInInventory": true + } + } + } + }, + { + "TerritoryId": 147, + "InteractionType": "UseItem", + "ItemId": 20643, + "$": "Lv50 MNK Coffer", + "SkipConditions": { + "StepIf": { + "Item": { + "NotInInventory": true + } + } + } + }, + { + "TerritoryId": 147, + "InteractionType": "UseItem", + "ItemId": 20644, + "$": "Lv50 WAR Coffer", + "SkipConditions": { + "StepIf": { + "Item": { + "NotInInventory": true + } + } + } + }, + { + "TerritoryId": 147, + "InteractionType": "UseItem", + "ItemId": 20645, + "$": "Lv50 DRG Coffer", + "SkipConditions": { + "StepIf": { + "Item": { + "NotInInventory": true + } + } + } + }, + { + "TerritoryId": 147, + "InteractionType": "UseItem", + "ItemId": 20646, + "$": "Lv50 BRD Coffer", + "SkipConditions": { + "StepIf": { + "Item": { + "NotInInventory": true + } + } + } + }, + { + "TerritoryId": 147, + "InteractionType": "UseItem", + "ItemId": 20647, + "$": "Lv50 NIN Coffer", + "SkipConditions": { + "StepIf": { + "Item": { + "NotInInventory": true + } + } + } + }, + { + "TerritoryId": 147, + "InteractionType": "UseItem", + "ItemId": 20648, + "$": "Lv50 WHM Coffer", + "SkipConditions": { + "StepIf": { + "Item": { + "NotInInventory": true + } + } + } + }, + { + "TerritoryId": 147, + "InteractionType": "UseItem", + "ItemId": 20649, + "$": "Lv50 BLM Coffer", + "SkipConditions": { + "StepIf": { + "Item": { + "NotInInventory": true + } + } + } + }, + { + "TerritoryId": 147, + "InteractionType": "UseItem", + "ItemId": 20650, + "$": "Lv50 SMN Coffer", + "SkipConditions": { + "StepIf": { + "Item": { + "NotInInventory": true + } + } + } + }, + { + "TerritoryId": 147, + "InteractionType": "UseItem", + "ItemId": 20651, + "$": "Lv50 SCH Coffer", + "SkipConditions": { + "StepIf": { + "Item": { + "NotInInventory": true + } + } + } + }, { "TerritoryId": 147, "InteractionType": "Duty", diff --git a/QuestPaths/quest-v1.json b/QuestPaths/quest-v1.json index d1c1b23c..1902572a 100644 --- a/QuestPaths/quest-v1.json +++ b/QuestPaths/quest-v1.json @@ -47,6 +47,10 @@ }, "Comment": { "type": "string" + }, + "$": { + "type": "string", + "description": "Dev Comment (not visible in-game)" } }, "required": [ @@ -699,9 +703,7 @@ "const": "UseItem" }, "ItemId": { - "not": { - "const": 30362 - } + "minimum": 2000000 } } }, From e305bbfea9ad44c21f13bca33784cc3226ccbd4e Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 24 Jan 2025 22:36:13 +0100 Subject: [PATCH 23/29] Fix Southern Thanalan pathing in 'Legacy of Allag' --- .../Alliance Raid Quests/1709_Legacy of Allag.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/QuestPaths/2.x - A Realm Reborn/Alliance Raid Quests/1709_Legacy of Allag.json b/QuestPaths/2.x - A Realm Reborn/Alliance Raid Quests/1709_Legacy of Allag.json index 1e363fb4..064e9a43 100644 --- a/QuestPaths/2.x - A Realm Reborn/Alliance Raid Quests/1709_Legacy of Allag.json +++ b/QuestPaths/2.x - A Realm Reborn/Alliance Raid Quests/1709_Legacy of Allag.json @@ -329,9 +329,9 @@ }, { "Position": { - "X": -0.75614685, + "X": 3.8795898, "Y": 38.80212, - "Z": -11.007636 + "Z": 0.40251642 }, "TerritoryId": 146, "InteractionType": "WalkTo", @@ -359,7 +359,8 @@ null, 128 ], - "Fly": true + "Fly": true, + "DisableNavmesh": true }, { "DataId": 2000078, From b30c1b29d81b8c8289f10a2417f8c27b599cf70e Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sat, 25 Jan 2025 02:38:35 +0100 Subject: [PATCH 24/29] Remove Haukke Manor & Brayflox's Longstop from automatically supported duties --- .../MSQ-2/A9-Haukke Manor/801_Skeletons in Her Closet.json | 2 +- .../832_The Things We Do for Cheese.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/A9-Haukke Manor/801_Skeletons in Her Closet.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/A9-Haukke Manor/801_Skeletons in Her Closet.json index 9269a84b..a17b715c 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/A9-Haukke Manor/801_Skeletons in Her Closet.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/A9-Haukke Manor/801_Skeletons in Her Closet.json @@ -67,7 +67,7 @@ "TerritoryId": 148, "InteractionType": "Duty", "ContentFinderConditionId": 6, - "AutoDutyEnabled": true + "AutoDutyEnabled": false } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/B2-Eastern La Noscea, Brayflox, Cheese and Wine/832_The Things We Do for Cheese.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/B2-Eastern La Noscea, Brayflox, Cheese and Wine/832_The Things We Do for Cheese.json index 06402bac..960ac4ec 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/B2-Eastern La Noscea, Brayflox, Cheese and Wine/832_The Things We Do for Cheese.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/B2-Eastern La Noscea, Brayflox, Cheese and Wine/832_The Things We Do for Cheese.json @@ -86,7 +86,7 @@ "TerritoryId": 137, "InteractionType": "Duty", "ContentFinderConditionId": 8, - "AutoDutyEnabled": true + "AutoDutyEnabled": false } ] }, From 0a22db23f32c2d311485d87d62f668f29def3a0f Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sat, 25 Jan 2025 17:56:15 +0100 Subject: [PATCH 25/29] Move 'Forging the Spirit' into a separate quest file --- .../272_Life, Materia and Everything.json | 32 ++++++++++++----- .../638_Forging the Spirit.json | 36 +++++++++++++++++++ 2 files changed, 59 insertions(+), 9 deletions(-) create mode 100644 QuestPaths/2.x - A Realm Reborn/Side Quests/Thanalan/Eastern Thanalan/638_Forging the Spirit.json diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/272_Life, Materia and Everything.json b/QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/272_Life, Materia and Everything.json index 6af9e61b..f56212fb 100644 --- a/QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/272_Life, Materia and Everything.json +++ b/QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/272_Life, Materia and Everything.json @@ -21,16 +21,30 @@ "Sequence": 1, "Steps": [ { - "DataId": 1001426, "Position": { - "X": 123.33862, - "Y": 30.999996, - "Z": -384.9394 + "X": 2.7922537, + "Y": 8.206551, + "Z": -274.32318 }, "TerritoryId": 141, - "InteractionType": "Interact", - "Comment": "'Forging the Spirit'", - "AetheryteShortcut": "Central Thanalan - Black Brush Station" + "InteractionType": "WalkTo", + "AetheryteShortcut": "Central Thanalan - Black Brush Station", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + }, + "StepIf": { + "NearPosition": { + "Position": { + "X": 123.33862, + "Y": 30.999996, + "Z": -384.9394 + }, + "TerritoryId": 141, + "MaximumDistance": 30 + } + } + } }, { "DataId": 1001426, @@ -40,8 +54,8 @@ "Z": -384.9394 }, "TerritoryId": 141, - "InteractionType": "Interact", - "Comment": "Quest Turn-In 'Forging the Spirit'" + "InteractionType": "AcceptQuest", + "PickUpQuestId": 638 }, { "DataId": 1001425, diff --git a/QuestPaths/2.x - A Realm Reborn/Side Quests/Thanalan/Eastern Thanalan/638_Forging the Spirit.json b/QuestPaths/2.x - A Realm Reborn/Side Quests/Thanalan/Eastern Thanalan/638_Forging the Spirit.json new file mode 100644 index 00000000..dae2a859 --- /dev/null +++ b/QuestPaths/2.x - A Realm Reborn/Side Quests/Thanalan/Eastern Thanalan/638_Forging the Spirit.json @@ -0,0 +1,36 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1001426, + "Position": { + "X": 123.33862, + "Y": 30.999996, + "Z": -384.9394 + }, + "TerritoryId": 141, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1001426, + "Position": { + "X": 123.33862, + "Y": 30.999996, + "Z": -384.9394 + }, + "TerritoryId": 141, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} From a7706a11e75c0f09cb5252473bc4726b4e81cd6a Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sat, 25 Jan 2025 18:40:47 +0100 Subject: [PATCH 26/29] Add 'Gyorin the Namazu', add some missing NextQuestIds --- .../Yanxia/2734_Perchance to Hanami.json | 5 +- .../2736_Courage the Cowardly Lupin.json | 5 +- .../2737_Kurobana vs the Rice Sacks.json | 5 +- .../2738_Kurobana vs the Arrowheads.json | 5 +- .../Yanxia/2739_Kurobana Holmes.json | 5 +- .../Side Quests/Yanxia/2747_Amber Alert.json | 9 +- .../Yanxia/2748_Gyorin the Namazu.json | 143 ++++++++++++++++++ .../2749_No Wealth Like Mineral Wealth.json | 21 ++- .../Side Quests/Yanxia/2750_Fresh Flesh.json | 5 +- .../Yanxia/2751_Show Me the New Money.json | 5 +- 10 files changed, 188 insertions(+), 20 deletions(-) create mode 100644 QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2748_Gyorin the Namazu.json diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2734_Perchance to Hanami.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2734_Perchance to Hanami.json index 4c41c9a6..35b1eb35 100644 --- a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2734_Perchance to Hanami.json +++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2734_Perchance to Hanami.json @@ -86,9 +86,10 @@ }, "TerritoryId": 614, "InteractionType": "CompleteQuest", - "Fly": true + "Fly": true, + "NextQuestId": 2748 } ] } ] -} \ No newline at end of file +} diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2736_Courage the Cowardly Lupin.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2736_Courage the Cowardly Lupin.json index a319d70c..137f6fc8 100644 --- a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2736_Courage the Cowardly Lupin.json +++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2736_Courage the Cowardly Lupin.json @@ -131,9 +131,10 @@ } } }, - "Fly": true + "Fly": true, + "NextQuestId": 2737 } ] } ] -} \ No newline at end of file +} diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2737_Kurobana vs the Rice Sacks.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2737_Kurobana vs the Rice Sacks.json index 76c060a6..c0640ae1 100644 --- a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2737_Kurobana vs the Rice Sacks.json +++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2737_Kurobana vs the Rice Sacks.json @@ -123,9 +123,10 @@ } } }, - "Fly": true + "Fly": true, + "NextQuestId": 2738 } ] } ] -} \ No newline at end of file +} diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2738_Kurobana vs the Arrowheads.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2738_Kurobana vs the Arrowheads.json index 7203fa8f..44eb2726 100644 --- a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2738_Kurobana vs the Arrowheads.json +++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2738_Kurobana vs the Arrowheads.json @@ -159,9 +159,10 @@ } } }, - "Fly": true + "Fly": true, + "NextQuestId": 2739 } ] } ] -} \ No newline at end of file +} diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2739_Kurobana Holmes.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2739_Kurobana Holmes.json index a5211c3d..f5809f06 100644 --- a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2739_Kurobana Holmes.json +++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2739_Kurobana Holmes.json @@ -142,9 +142,10 @@ } } }, - "Fly": true + "Fly": true, + "NextQuestId": 2740 } ] } ] -} \ No newline at end of file +} diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2747_Amber Alert.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2747_Amber Alert.json index 20d4eb7c..52185f15 100644 --- a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2747_Amber Alert.json +++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2747_Amber Alert.json @@ -24,7 +24,7 @@ }, "TerritoryId": 614, "InteractionType": "AcceptQuest", - "StopDistance": 0.1 + "StopDistance": 0.25 } ] }, @@ -67,7 +67,7 @@ }, "TerritoryId": 614, "InteractionType": "Interact", - "StopDistance": 0.1 + "StopDistance": 0.25 } ] }, @@ -84,9 +84,10 @@ "TerritoryId": 614, "InteractionType": "CompleteQuest", "Fly": true, - "AetheryteShortcut": "Yanxia - Namai" + "AetheryteShortcut": "Yanxia - Namai", + "NextQuestId": 2740 } ] } ] -} \ No newline at end of file +} diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2748_Gyorin the Namazu.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2748_Gyorin the Namazu.json new file mode 100644 index 00000000..910bc8fe --- /dev/null +++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2748_Gyorin the Namazu.json @@ -0,0 +1,143 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1023236, + "Position": { + "X": -300.06866, + "Y": 16.806112, + "Z": 539.45215 + }, + "TerritoryId": 614, + "InteractionType": "AcceptQuest", + "Fly": true + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1023237, + "Position": { + "X": -233.72241, + "Y": 17.628202, + "Z": 485.3131 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": -463.34363, + "Y": 1.3011811, + "Z": 578.3476 + }, + "TerritoryId": 614, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 1023238, + "Position": { + "X": -464.49988, + "Y": 1.3011812, + "Z": 577.32495 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": -487.5986, + "Y": -0.5999999, + "Z": 578.5466 + }, + "TerritoryId": 614, + "InteractionType": "Dive", + "DisableNavmesh": true + }, + { + "DataId": 2008799, + "Position": { + "X": -549.7063, + "Y": -109.51398, + "Z": 569.32935 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "Fly": true, + "Mount": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "Position": { + "X": -487.5986, + "Y": -0.5999999, + "Z": 578.5466 + }, + "TerritoryId": 614, + "InteractionType": "WalkTo", + "DisableNavmesh": true, + "RestartNavigationIfCancelled": false + }, + { + "Position": { + "X": -463.34363, + "Y": 1.3011811, + "Z": 578.3476 + }, + "TerritoryId": 614, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 1023238, + "Position": { + "X": -464.49988, + "Y": 1.3011812, + "Z": 577.32495 + }, + "TerritoryId": 614, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1023237, + "Position": { + "X": -233.72241, + "Y": 17.628202, + "Z": 485.3131 + }, + "TerritoryId": 614, + "InteractionType": "CompleteQuest", + "Fly": true, + "NextQuestId": 2749 + } + ] + } + ] +} diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2749_No Wealth Like Mineral Wealth.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2749_No Wealth Like Mineral Wealth.json index b63fe369..d85ab406 100644 --- a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2749_No Wealth Like Mineral Wealth.json +++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2749_No Wealth Like Mineral Wealth.json @@ -37,6 +37,21 @@ { "Sequence": 2, "Steps": [ + { + "Position": { + "X": -239.56377, + "Y": 49.354053, + "Z": 284.94565 + }, + "TerritoryId": 614, + "InteractionType": "WalkTo", + "Fly": true, + "SkipConditions": { + "StepIf": { + "Flying": "Locked" + } + } + }, { "DataId": 1023240, "Position": { @@ -59,6 +74,7 @@ "Y": 39.150906, "Z": 206.95801 }, + "StopDistance": 0.5, "TerritoryId": 614, "InteractionType": "Combat", "Fly": true, @@ -113,9 +129,10 @@ }, "TerritoryId": 614, "InteractionType": "CompleteQuest", - "Fly": true + "Fly": true, + "NextQuestId": 2750 } ] } ] -} \ No newline at end of file +} diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2750_Fresh Flesh.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2750_Fresh Flesh.json index dd88387b..79b79e9b 100644 --- a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2750_Fresh Flesh.json +++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2750_Fresh Flesh.json @@ -98,9 +98,10 @@ }, "TerritoryId": 614, "InteractionType": "CompleteQuest", - "Fly": true + "Fly": true, + "NextQuestId": 2751 } ] } ] -} \ No newline at end of file +} diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2751_Show Me the New Money.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2751_Show Me the New Money.json index 080d2189..4a9a8aa8 100644 --- a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2751_Show Me the New Money.json +++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2751_Show Me the New Money.json @@ -112,9 +112,10 @@ }, "TerritoryId": 614, "InteractionType": "CompleteQuest", - "Fly": true + "Fly": true, + "NextQuestId": 2747 } ] } ] -} \ No newline at end of file +} From b2c0934f07ac5b09403aa6da4b468a7f78b21c1e Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sat, 25 Jan 2025 18:59:38 +0100 Subject: [PATCH 27/29] GatheringPathRenderer: Adjust dev lookup path --- GatheringPathRenderer/RendererPlugin.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GatheringPathRenderer/RendererPlugin.cs b/GatheringPathRenderer/RendererPlugin.cs index 93c666a8..aa88906c 100644 --- a/GatheringPathRenderer/RendererPlugin.cs +++ b/GatheringPathRenderer/RendererPlugin.cs @@ -82,7 +82,7 @@ public sealed class RendererPlugin : IDalamudPlugin get { #if DEBUG - DirectoryInfo? solutionDirectory = _pluginInterface.AssemblyLocation.Directory?.Parent?.Parent?.Parent; + DirectoryInfo? solutionDirectory = _pluginInterface.AssemblyLocation.Directory?.Parent?.Parent; if (solutionDirectory != null) { DirectoryInfo pathProjectDirectory = @@ -91,7 +91,7 @@ public sealed class RendererPlugin : IDalamudPlugin return pathProjectDirectory; } - throw new Exception("Unable to resolve project path"); + throw new Exception($"Unable to resolve project path ({_pluginInterface.AssemblyLocation.Directory})"); #else var allPluginsDirectory = _pluginInterface.ConfigFile.Directory ?? throw new Exception("Unknown directory for plugin configs"); return allPluginsDirectory From e1b146ee1eb779c9234c74c880d27ba04e5590d7 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sat, 25 Jan 2025 20:00:27 +0100 Subject: [PATCH 28/29] Code cleanup --- Questionable/Controller/InterruptHandler.cs | 1 - Questionable/Controller/QuestController.cs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Questionable/Controller/InterruptHandler.cs b/Questionable/Controller/InterruptHandler.cs index 9171432f..49b24abc 100644 --- a/Questionable/Controller/InterruptHandler.cs +++ b/Questionable/Controller/InterruptHandler.cs @@ -94,7 +94,6 @@ internal sealed unsafe class InterruptHandler : IDisposable [FieldOffset(6)] public ushort Value; public byte AttackType => (byte)(Param1 & 0xF); - public uint Damage => Mult == 0 ? Value : Value + ((uint)ushort.MaxValue + 1) * Mult; public override string ToString() { diff --git a/Questionable/Controller/QuestController.cs b/Questionable/Controller/QuestController.cs index 954bb5be..def1c297 100644 --- a/Questionable/Controller/QuestController.cs +++ b/Questionable/Controller/QuestController.cs @@ -19,7 +19,7 @@ using Quest = Questionable.Model.Quest; namespace Questionable.Controller; -internal sealed class QuestController : MiniTaskController, IDisposable +internal sealed class QuestController : MiniTaskController { private readonly IClientState _clientState; private readonly GameFunctions _gameFunctions; From de90882ecbb609c2f79fecc1ec17b751dc8763f2 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sat, 25 Jan 2025 20:01:13 +0100 Subject: [PATCH 29/29] Add Post-Endwalker role quests --- Directory.Build.targets | 2 +- .../5188_Picking Up the Torch.json | 161 ++++++++++++++++ .../Role Quests/5189_Imposing Views.json | 129 +++++++++++++ .../Role Quests/5190_Enforcing Freedom.json | 175 +++++++++++++++++ .../Role Quests/5191_Bar the Passage.json | 182 ++++++++++++++++++ QuestPaths/quest-v1.json | 4 +- .../Questing/Converter/EmoteConverter.cs | 2 + Questionable.Model/Questing/EEmote.cs | 4 +- Questionable/Data/QuestData.cs | 11 ++ 9 files changed, 667 insertions(+), 3 deletions(-) create mode 100644 QuestPaths/7.x - Dawntrail/Role Quests/5188_Picking Up the Torch.json create mode 100644 QuestPaths/7.x - Dawntrail/Role Quests/5189_Imposing Views.json create mode 100644 QuestPaths/7.x - Dawntrail/Role Quests/5190_Enforcing Freedom.json create mode 100644 QuestPaths/7.x - Dawntrail/Role Quests/5191_Bar the Passage.json diff --git a/Directory.Build.targets b/Directory.Build.targets index cfa9441e..729f81b6 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -1,5 +1,5 @@ - 4.15 + 4.16 diff --git a/QuestPaths/7.x - Dawntrail/Role Quests/5188_Picking Up the Torch.json b/QuestPaths/7.x - Dawntrail/Role Quests/5188_Picking Up the Torch.json new file mode 100644 index 00000000..d8d59f15 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Role Quests/5188_Picking Up the Torch.json @@ -0,0 +1,161 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1050871, + "Position": { + "X": -51.895935, + "Y": -17.97287, + "Z": 182.7268 + }, + "TerritoryId": 1185, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Tuliyollal", + "AethernetShortcut": [ + "[Tuliyollal] Aetheryte Plaza", + "[Tuliyollal] The For'ard Cabins" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1001657, + "Position": { + "X": 94.80432, + "Y": 7.9804688, + "Z": -34.042908 + }, + "TerritoryId": 131, + "InteractionType": "Interact", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Sapphire Avenue Exchange" + ], + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 1006440, + "Position": { + "X": 140.3982, + "Y": 4, + "Z": -54.154297 + }, + "TerritoryId": 131, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 1051655, + "Position": { + "X": 137.74304, + "Y": 4, + "Z": 5.9662476 + }, + "TerritoryId": 131, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": 146.12386, + "Y": 4, + "Z": -23.562449 + }, + "StopDistance": 0.5, + "TerritoryId": 131, + "InteractionType": "Emote", + "Emote": "angry" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1051656, + "Position": { + "X": 56.443115, + "Y": 10, + "Z": 5.935669 + }, + "TerritoryId": 131, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 2012114, + "Position": { + "X": 0, + "Y": 1.15, + "Z": 10.23451 + }, + "TerritoryId": 1255, + "InteractionType": "Interact", + "TargetTerritoryId": 131, + "SkipConditions": { + "StepIf": { + "InTerritory": [ + 131 + ] + } + } + }, + { + "DataId": 1051656, + "Position": { + "X": 56.443115, + "Y": 10, + "Z": 5.935669 + }, + "StopDistance": 7, + "TerritoryId": 131, + "InteractionType": "CompleteQuest", + "NextQuestId": 5189 + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Role Quests/5189_Imposing Views.json b/QuestPaths/7.x - Dawntrail/Role Quests/5189_Imposing Views.json new file mode 100644 index 00000000..17c2bf46 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Role Quests/5189_Imposing Views.json @@ -0,0 +1,129 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1051656, + "Position": { + "X": 56.443115, + "Y": 10, + "Z": 5.935669 + }, + "StopDistance": 7, + "TerritoryId": 131, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2014419, + "Position": { + "X": -158.86176, + "Y": 7.4921875, + "Z": 493.88867 + }, + "TerritoryId": 146, + "InteractionType": "Interact", + "AetheryteShortcut": "Southern Thanalan - Forgotten Springs", + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1051661, + "Position": { + "X": 1.7852783, + "Y": 19.026453, + "Z": 581.62805 + }, + "StopDistance": 5, + "TerritoryId": 146, + "InteractionType": "Interact", + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_KINGBZ002_05189_Q1_000_000", + "Answer": "TEXT_KINGBZ002_05189_A1_000_001" + } + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1051663, + "Position": { + "X": 51.68225, + "Y": 0.7631253, + "Z": 711.57385 + }, + "TerritoryId": 146, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 18178 + ], + "Fly": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1051663, + "Position": { + "X": 51.68225, + "Y": 0.7631253, + "Z": 711.57385 + }, + "TerritoryId": 146, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1051668, + "Position": { + "X": 170.42798, + "Y": 15.943722, + "Z": 897.94763 + }, + "TerritoryId": 146, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1051668, + "Position": { + "X": 170.42798, + "Y": 15.943722, + "Z": 897.94763 + }, + "TerritoryId": 146, + "InteractionType": "CompleteQuest", + "NextQuestId": 5190 + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Role Quests/5190_Enforcing Freedom.json b/QuestPaths/7.x - Dawntrail/Role Quests/5190_Enforcing Freedom.json new file mode 100644 index 00000000..6f05c439 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Role Quests/5190_Enforcing Freedom.json @@ -0,0 +1,175 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1051668, + "Position": { + "X": 170.42798, + "Y": 15.943722, + "Z": 897.94763 + }, + "TerritoryId": 146, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1050871, + "Position": { + "X": -51.895935, + "Y": -17.97287, + "Z": 182.7268 + }, + "TerritoryId": 1185, + "InteractionType": "Interact", + "AetheryteShortcut": "Tuliyollal", + "AethernetShortcut": [ + "[Tuliyollal] Aetheryte Plaza", + "[Tuliyollal] The For'ard Cabins" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1051670, + "Position": { + "X": -15.976257, + "Y": -19.928413, + "Z": 224.90259 + }, + "TerritoryId": 1185, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1051675, + "Position": { + "X": 358.23608, + "Y": 5.957184, + "Z": 428.36658 + }, + "StopDistance": 1, + "TerritoryId": 1190, + "InteractionType": "Interact", + "AetheryteShortcut": "Shaaloani - Hhusatahwi", + "Fly": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "Position": { + "X": 363.81656, + "Y": 5.9295864, + "Z": 435.17932 + }, + "TerritoryId": 1190, + "InteractionType": "WalkTo" + }, + { + "DataId": 1051677, + "Position": { + "X": 371.4198, + "Y": 5.95728, + "Z": 425.4978 + }, + "TerritoryId": 1190, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1051677, + "Position": { + "X": 371.4198, + "Y": 5.95728, + "Z": 425.4978 + }, + "TerritoryId": 1190, + "InteractionType": "Emote", + "Emote": "unbound" + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "DataId": 1051682, + "Position": { + "X": 387.5028, + "Y": -0.60167974, + "Z": 426.99304 + }, + "TerritoryId": 1190, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 7, + "Steps": [ + { + "Position": { + "X": 425.24307, + "Y": 0.7699772, + "Z": 473.79095 + }, + "TerritoryId": 1190, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 1051684, + "Position": { + "X": 426.04712, + "Y": 0.7461932, + "Z": 472.3125 + }, + "TerritoryId": 1190, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1050871, + "Position": { + "X": -51.895935, + "Y": -17.97287, + "Z": 182.7268 + }, + "TerritoryId": 1185, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Tuliyollal", + "AethernetShortcut": [ + "[Tuliyollal] Aetheryte Plaza", + "[Tuliyollal] The For'ard Cabins" + ], + "NextQuestId": 5191 + } + ] + } + ] +} diff --git a/QuestPaths/7.x - Dawntrail/Role Quests/5191_Bar the Passage.json b/QuestPaths/7.x - Dawntrail/Role Quests/5191_Bar the Passage.json new file mode 100644 index 00000000..ac9a8790 --- /dev/null +++ b/QuestPaths/7.x - Dawntrail/Role Quests/5191_Bar the Passage.json @@ -0,0 +1,182 @@ +{ + "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1050871, + "Position": { + "X": -51.895935, + "Y": -17.97287, + "Z": 182.7268 + }, + "TerritoryId": 1185, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1051689, + "Position": { + "X": 273.33484, + "Y": 15.999998, + "Z": 740.6576 + }, + "TerritoryId": 1190, + "InteractionType": "SinglePlayerDuty", + "AethernetShortcut": [ + "[Tuliyollal] The For'ard Cabins", + "[Tuliyollal] Xak Tural Skygate (Shaaloani)" + ] + } + ] + }, + { + "Sequence": 2 + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1051691, + "Position": { + "X": 273.85364, + "Y": 15.999996, + "Z": 738.2771 + }, + "TerritoryId": 1190, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1050871, + "Position": { + "X": -51.895935, + "Y": -17.97287, + "Z": 182.7268 + }, + "TerritoryId": 1185, + "InteractionType": "Interact", + "AetheryteShortcut": "Tuliyollal", + "AethernetShortcut": [ + "[Tuliyollal] Aetheryte Plaza", + "[Tuliyollal] The For'ard Cabins" + ] + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1051672, + "Position": { + "X": -14.816589, + "Y": -19.881973, + "Z": 223.3158 + }, + "TerritoryId": 1185, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "DataId": 1051673, + "Position": { + "X": -15.243774, + "Y": -19.762682, + "Z": 221.72876 + }, + "StopDistance": 5, + "TerritoryId": 1185, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 7, + "Steps": [ + { + "DataId": 1051670, + "Position": { + "X": -15.976257, + "Y": -19.928413, + "Z": 224.90259 + }, + "StopDistance": 5, + "TerritoryId": 1185, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 8, + "Steps": [ + { + "DataId": 1051671, + "Position": { + "X": -17.95996, + "Y": -19.784014, + "Z": 224.17017 + }, + "StopDistance": 5, + "TerritoryId": 1185, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 9, + "Steps": [ + { + "DataId": 1051674, + "Position": { + "X": -16.617126, + "Y": -19.752277, + "Z": 222.64429 + }, + "TerritoryId": 1185, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": -44.643284, + "Y": -17.972864, + "Z": 203.87883 + }, + "TerritoryId": 1185, + "InteractionType": "WalkTo" + }, + { + "DataId": 1046521, + "Position": { + "X": -46.616333, + "Y": -17.97287, + "Z": 180.3158 + }, + "StopDistance": 5, + "TerritoryId": 1185, + "InteractionType": "CompleteQuest", + "DisableNavmesh": true + } + ] + } + ] +} diff --git a/QuestPaths/quest-v1.json b/QuestPaths/quest-v1.json index 1902572a..0ca8c368 100644 --- a/QuestPaths/quest-v1.json +++ b/QuestPaths/quest-v1.json @@ -866,7 +866,9 @@ "mogdance", "salute", "laugh", - "greeting" + "greeting", + "angry", + "unbound" ] } } diff --git a/Questionable.Model/Questing/Converter/EmoteConverter.cs b/Questionable.Model/Questing/Converter/EmoteConverter.cs index bdfe5581..576a77e5 100644 --- a/Questionable.Model/Questing/Converter/EmoteConverter.cs +++ b/Questionable.Model/Questing/Converter/EmoteConverter.cs @@ -7,6 +7,7 @@ public sealed class EmoteConverter() : EnumConverter(Values) { private static readonly Dictionary Values = new() { + { EEmote.Angry, "angry" }, { EEmote.Bow, "bow" }, { EEmote.Cheer, "cheer" }, { EEmote.Clap, "clap" }, @@ -45,5 +46,6 @@ public sealed class EmoteConverter() : EnumConverter(Values) { EEmote.Box, "box" }, { EEmote.Greeting, "greeting" }, { EEmote.Uchiwasshoi, "uchiwasshoi" }, + { EEmote.Unbound, "unbound" }, }; } diff --git a/Questionable.Model/Questing/EEmote.cs b/Questionable.Model/Questing/EEmote.cs index 78e7b650..7855bd15 100644 --- a/Questionable.Model/Questing/EEmote.cs +++ b/Questionable.Model/Questing/EEmote.cs @@ -8,6 +8,7 @@ public enum EEmote { None = 0, + Angry = 2, Bow = 5, Cheer = 6, Clap = 7, @@ -45,6 +46,7 @@ public enum EEmote Respect = 140, Box = 166, Greeting = 172, - Uchiwasshoi = 278 + Uchiwasshoi = 278, + Unbound = 282, } diff --git a/Questionable/Data/QuestData.cs b/Questionable/Data/QuestData.cs index 65225863..f84edb95 100644 --- a/Questionable/Data/QuestData.cs +++ b/Questionable/Data/QuestData.cs @@ -189,6 +189,12 @@ internal sealed class QuestData AddPreviousQuest(new QuestId(3833), new QuestId(spearfishing)); */ + // Shadow Walk with Me + AddPreviousQuest(new QuestId(3629), new QuestId(3248)); + AddPreviousQuest(new QuestId(3629), new QuestId(3272)); + AddPreviousQuest(new QuestId(3629), new QuestId(3278)); + AddPreviousQuest(new QuestId(3629), new QuestId(3628)); + // The Hero's Journey AddPreviousQuest(new QuestId(3986), new QuestId(2115)); AddPreviousQuest(new QuestId(3986), new QuestId(2116)); @@ -197,6 +203,11 @@ internal sealed class QuestData AddPreviousQuest(new QuestId(3986), new QuestId(2395)); AddPreviousQuest(new QuestId(3986), new QuestId(3985)); + // Picking up the Torch has half the quests in the sheets(??) + AddPreviousQuest(new QuestId(5188), new QuestId(4841)); + AddPreviousQuest(new QuestId(5188), new QuestId(4847)); + AddPreviousQuest(new QuestId(5188), new QuestId(4959)); + // initial city quests are side quests // unclear if 470 can be started as the required quest isn't available anymore ushort[] limsaSideQuests =