diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/BRD/1086_The Archer's Anthem.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/BRD/1086_The Archer's Anthem.json index 58b792d69..cced87949 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/BRD/1086_The Archer's Anthem.json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/BRD/1086_The Archer's Anthem.json @@ -8,7 +8,14 @@ { "TerritoryId": 153, "InteractionType": "EquipItem", - "ItemId": 4546 + "ItemId": 4546, + "AetheryteShortcut": "South Shroud - Quarrymill", + "Fly": true, + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } }, { "TerritoryId": 153, @@ -22,14 +29,7 @@ "Z": -7.3396606 }, "TerritoryId": 153, - "InteractionType": "AcceptQuest", - "AetheryteShortcut": "South Shroud - Quarrymill", - "Fly": true, - "SkipConditions": { - "AetheryteShortcutIf": { - "InSameTerritory": true - } - } + "InteractionType": "AcceptQuest" } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/BTN/3_Way of the Botanist.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/BTN/3_Way of the Botanist.json index 23abee991..1a5f96dcc 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/BTN/3_Way of the Botanist.json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/BTN/3_Way of the Botanist.json @@ -13,7 +13,20 @@ "Z": -142.93127 }, "TerritoryId": 133, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Gridania", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Botanists' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 133 + ] + } + } } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/MIN/192_So You Want to Be a Miner.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/MIN/192_So You Want to Be a Miner.json index faaf1166b..ea8b8257b 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/MIN/192_So You Want to Be a Miner.json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/MIN/192_So You Want to Be a Miner.json @@ -14,6 +14,19 @@ }, "TerritoryId": 131, "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Miners' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + }, "DialogueChoices": [ { "Type": "YesNo", diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/MIN/597_Way of the Miner.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/MIN/597_Way of the Miner.json index ab55d722f..5ab37fe66 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/MIN/597_Way of the Miner.json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/MIN/597_Way of the Miner.json @@ -13,7 +13,20 @@ "Z": 153.2157 }, "TerritoryId": 131, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Miners' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/MIN/599_My First Pickaxe.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/MIN/599_My First Pickaxe.json index c9bcf3776..07dd8fbf1 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/MIN/599_My First Pickaxe.json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/MIN/599_My First Pickaxe.json @@ -13,7 +13,20 @@ "Z": 157.42725 }, "TerritoryId": 131, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Miners' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/MIN/600_Know Thy Land.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/MIN/600_Know Thy Land.json index ae8417c0c..50ff25c8c 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/MIN/600_Know Thy Land.json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/MIN/600_Know Thy Land.json @@ -13,7 +13,20 @@ "Z": 157.42725 }, "TerritoryId": 131, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Miners' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/MNK/532_Way of the Pugilist.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/MNK/532_Way of the Pugilist.json index 2e25eb221..130b69e0d 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/MNK/532_Way of the Pugilist.json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/MNK/532_Way of the Pugilist.json @@ -13,7 +13,13 @@ "Z": -51.163513 }, "TerritoryId": 130, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/MNK/533_Way of the Pugilist.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/MNK/533_Way of the Pugilist.json index cbbb57c3a..8c00e6a22 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/MNK/533_Way of the Pugilist.json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/MNK/533_Way of the Pugilist.json @@ -14,7 +14,13 @@ "Z": -51.163513 }, "TerritoryId": 130, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } } ] } diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/PLD/1055_Paladin's Pledge.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/PLD/1055_Paladin's Pledge.json index eba6e3051..d7d54815e 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/PLD/1055_Paladin's Pledge.json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/PLD/1055_Paladin's Pledge.json @@ -14,6 +14,7 @@ }, "TerritoryId": 131, "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", "AethernetShortcut": [ "[Ul'dah] Aetheryte Plaza", "[Ul'dah] Gladiators' Guild" diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/PLD/256_Kicking the Hornet's Nest.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/PLD/256_Kicking the Hornet's Nest.json index 88320c09b..e12a5e43e 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/PLD/256_Kicking the Hornet's Nest.json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/PLD/256_Kicking the Hornet's Nest.json @@ -13,7 +13,20 @@ "Z": 39.81079 }, "TerritoryId": 131, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Gladiators' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] + } + } } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1097_Forgotten but Not Gone.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1097_Forgotten but Not Gone.json index 615cf8be3..5d4a5b35c 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1097_Forgotten but Not Gone.json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1097_Forgotten but Not Gone.json @@ -12,7 +12,13 @@ "Z": 4.017052 }, "TerritoryId": 129, - "InteractionType": "WalkTo" + "InteractionType": "WalkTo", + "AetheryteShortcut": "Limsa Lominsa", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } }, { "DataId": 1000895, diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1098_The Last Remnants.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1098_The Last Remnants.json index 66e6af532..19cbfbe7c 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1098_The Last Remnants.json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1098_The Last Remnants.json @@ -8,7 +8,20 @@ { "TerritoryId": 128, "InteractionType": "EquipItem", - "ItemId": 4550 + "ItemId": 4550, + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] Marauders' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 128 + ] + } + } }, { "DataId": 1006757, diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1099_The Consequences of Anger.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1099_The Consequences of Anger.json index 2fbe65db6..18257f459 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1099_The Consequences of Anger.json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1099_The Consequences of Anger.json @@ -13,7 +13,20 @@ "Z": -250.56848 }, "TerritoryId": 128, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] Marauders' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 128 + ] + } + } } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1100_In the Image of the Ancients.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1100_In the Image of the Ancients.json index 8e87dd8b2..aa5a054fb 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1100_In the Image of the Ancients.json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1100_In the Image of the Ancients.json @@ -13,7 +13,20 @@ "Z": -250.56848 }, "TerritoryId": 128, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] Marauders' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 128 + ] + } + } } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1101_For Your Fellow Man.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1101_For Your Fellow Man.json index a2b646903..270a798d3 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1101_For Your Fellow Man.json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1101_For Your Fellow Man.json @@ -13,7 +13,20 @@ "Z": -250.56848 }, "TerritoryId": 128, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] Marauders' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 128 + ] + } + } } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1102_The Beast Within.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1102_The Beast Within.json index 8169dfbd4..06d12fb34 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1102_The Beast Within.json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/SCH/1102_The Beast Within.json @@ -13,7 +13,20 @@ "Z": -250.56848 }, "TerritoryId": 128, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": [ + "[Limsa Lominsa] Aetheryte Plaza", + "[Limsa Lominsa] Marauders' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 128 + ] + } + } } ] }, diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/WHM/1081_O Brother, Where Art Thou.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/WHM/1081_O Brother, Where Art Thou.json index 48d669d23..8f55a98ec 100644 --- a/QuestPaths/2.x - A Realm Reborn/Class Quests/WHM/1081_O Brother, Where Art Thou.json +++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/WHM/1081_O Brother, Where Art Thou.json @@ -35,7 +35,8 @@ "Y": 8.712891, "Z": 281.69678 }, - "MaximumDistance": 3 + "MaximumDistance": 3, + "TerritoryId": 153 } } } @@ -157,7 +158,8 @@ "Y": 8.712891, "Z": 281.69678 }, - "MaximumDistance": 3 + "MaximumDistance": 3, + "TerritoryId": 153 } } } diff --git a/QuestPaths/5.x - Shadowbringers/Class Quests/DNC/3250_Gamboling for Gil.json b/QuestPaths/5.x - Shadowbringers/Class Quests/DNC/3250_Gamboling for Gil.json index 18979d0a8..cc2dcd851 100644 --- a/QuestPaths/5.x - Shadowbringers/Class Quests/DNC/3250_Gamboling for Gil.json +++ b/QuestPaths/5.x - Shadowbringers/Class Quests/DNC/3250_Gamboling for Gil.json @@ -13,7 +13,13 @@ "Z": 195.94104 }, "TerritoryId": 129, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Limsa Lominsa", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } } ] }, diff --git a/QuestPaths/5.x - Shadowbringers/Role Quests/Magical Ranged/3623_Hollow Pursuits.json b/QuestPaths/5.x - Shadowbringers/Role Quests/Magical Ranged/3623_Hollow Pursuits.json index 212b50746..83dc2b977 100644 --- a/QuestPaths/5.x - Shadowbringers/Role Quests/Magical Ranged/3623_Hollow Pursuits.json +++ b/QuestPaths/5.x - Shadowbringers/Role Quests/Magical Ranged/3623_Hollow Pursuits.json @@ -13,7 +13,17 @@ "Z": 201.9226 }, "TerritoryId": 819, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Crystarium", + "AethernetShortcut": [ + "[Crystarium] Aetheryte Plaza", + "[Crystarium] Musica Universalis Markets" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } } ] }, diff --git a/QuestPaths/5.x - Shadowbringers/Role Quests/Tank/3243_The Man with Too Many Scars.json b/QuestPaths/5.x - Shadowbringers/Role Quests/Tank/3243_The Man with Too Many Scars.json index be65d1d64..02adab4a2 100644 --- a/QuestPaths/5.x - Shadowbringers/Role Quests/Tank/3243_The Man with Too Many Scars.json +++ b/QuestPaths/5.x - Shadowbringers/Role Quests/Tank/3243_The Man with Too Many Scars.json @@ -14,7 +14,17 @@ "Z": 251.75854 }, "TerritoryId": 819, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Crystarium", + "AethernetShortcut": [ + "[Crystarium] Aetheryte Plaza", + "[Crystarium] Musica Universalis Markets" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } } ] } diff --git a/QuestPaths/7.x - Dawntrail/Class Quests/PCT/4854_The Joy of Pictomancy.json b/QuestPaths/7.x - Dawntrail/Class Quests/PCT/4854_The Joy of Pictomancy.json index 86f5071ca..4423e4d11 100644 --- a/QuestPaths/7.x - Dawntrail/Class Quests/PCT/4854_The Joy of Pictomancy.json +++ b/QuestPaths/7.x - Dawntrail/Class Quests/PCT/4854_The Joy of Pictomancy.json @@ -20,7 +20,20 @@ "Prompt": "TEXT_KINGBB201_04854_Q1_000_000", "Answer": "TEXT_KINGBB201_04854_A1_000_002" } - ] + ], + "AetheryteShortcut": "Gridania", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Conjurers' Guild" + ], + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 133 + ] + } + } } ] }, diff --git a/QuestPaths/7.x - Dawntrail/Class Quests/PCT/4855_Mind over Manor.json b/QuestPaths/7.x - Dawntrail/Class Quests/PCT/4855_Mind over Manor.json index d134ace35..abc4342ac 100644 --- a/QuestPaths/7.x - Dawntrail/Class Quests/PCT/4855_Mind over Manor.json +++ b/QuestPaths/7.x - Dawntrail/Class Quests/PCT/4855_Mind over Manor.json @@ -14,11 +14,15 @@ "TerritoryId": 132, "InteractionType": "UseItem", "ItemId": 43538, + "AetheryteShortcut": "Gridania", "SkipConditions": { "StepIf": { "Item": { "NotInInventory": true } + }, + "AetheryteShortcutIf": { + "InSameTerritory": true } } }, diff --git a/QuestPaths/7.x - Dawntrail/Class Quests/VPR/4848_Enter the Viper.json b/QuestPaths/7.x - Dawntrail/Class Quests/VPR/4848_Enter the Viper.json index 6e2461987..2a3451f3c 100644 --- a/QuestPaths/7.x - Dawntrail/Class Quests/VPR/4848_Enter the Viper.json +++ b/QuestPaths/7.x - Dawntrail/Class Quests/VPR/4848_Enter the Viper.json @@ -13,7 +13,13 @@ "Z": -99.321045 }, "TerritoryId": 130, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ul'dah", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } } ] }, diff --git a/QuestPaths/7.x - Dawntrail/Class Quests/VPR/4849_Fangs of the Viper.json b/QuestPaths/7.x - Dawntrail/Class Quests/VPR/4849_Fangs of the Viper.json index ccf61580b..dec630ecd 100644 --- a/QuestPaths/7.x - Dawntrail/Class Quests/VPR/4849_Fangs of the Viper.json +++ b/QuestPaths/7.x - Dawntrail/Class Quests/VPR/4849_Fangs of the Viper.json @@ -17,16 +17,27 @@ "TerritoryId": 131, "InteractionType": "UseItem", "ItemId": 43537, + "AetheryteShortcut": "Ul'dah", + "AethernetShortcut": [ + "[Ul'dah] Aetheryte Plaza", + "[Ul'dah] Weavers' Guild" + ], "SkipConditions": { "StepIf": { "Item": { "NotInInventory": true } + }, + "AetheryteShortcutIf": { + "InSameTerritory": true, + "InTerritory": [ + 131 + ] } } }, { - "TerritoryId": 131, + "TerritoryId": 131, "InteractionType": "EquipItem", "ItemId": 41808, "SkipConditions": { diff --git a/QuestPaths/7.x - Dawntrail/Role Quests/Magical Ranged/4842_Power Forgotten.json b/QuestPaths/7.x - Dawntrail/Role Quests/Magical Ranged/4842_Power Forgotten.json index 33df55b70..c04f2dc78 100644 --- a/QuestPaths/7.x - Dawntrail/Role Quests/Magical Ranged/4842_Power Forgotten.json +++ b/QuestPaths/7.x - Dawntrail/Role Quests/Magical Ranged/4842_Power Forgotten.json @@ -13,7 +13,13 @@ "Z": 194.72034 }, "TerritoryId": 1185, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Tuliyollal", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } } ] }, diff --git a/QuestPaths/7.x - Dawntrail/Role Quests/Magical Ranged/4843_A Brand of Justice.json b/QuestPaths/7.x - Dawntrail/Role Quests/Magical Ranged/4843_A Brand of Justice.json index 6b6425ea5..a26a9fca3 100644 --- a/QuestPaths/7.x - Dawntrail/Role Quests/Magical Ranged/4843_A Brand of Justice.json +++ b/QuestPaths/7.x - Dawntrail/Role Quests/Magical Ranged/4843_A Brand of Justice.json @@ -13,7 +13,13 @@ "Z": 628.3817 }, "TerritoryId": 957, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Thavnair - Yedlihmad", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } } ] }, diff --git a/QuestPaths/7.x - Dawntrail/Role Quests/Magical Ranged/4844_The Seeds of Popularity.json b/QuestPaths/7.x - Dawntrail/Role Quests/Magical Ranged/4844_The Seeds of Popularity.json index 40af8b559..5542bd4b2 100644 --- a/QuestPaths/7.x - Dawntrail/Role Quests/Magical Ranged/4844_The Seeds of Popularity.json +++ b/QuestPaths/7.x - Dawntrail/Role Quests/Magical Ranged/4844_The Seeds of Popularity.json @@ -13,7 +13,13 @@ "Z": 628.3817 }, "TerritoryId": 957, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Thavnair - Yedlihmad", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } } ] }, diff --git a/QuestPaths/7.x - Dawntrail/Role Quests/Magical Ranged/4845_Floundering Fame.json b/QuestPaths/7.x - Dawntrail/Role Quests/Magical Ranged/4845_Floundering Fame.json index cbe6d9571..0150bd00f 100644 --- a/QuestPaths/7.x - Dawntrail/Role Quests/Magical Ranged/4845_Floundering Fame.json +++ b/QuestPaths/7.x - Dawntrail/Role Quests/Magical Ranged/4845_Floundering Fame.json @@ -14,6 +14,12 @@ }, "TerritoryId": 957, "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Thavnair - Yedlihmad", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + }, "DialogueChoices": [ { "Type": "List", diff --git a/QuestPaths/7.x - Dawntrail/Role Quests/Magical Ranged/4846_Behind the Helm.json b/QuestPaths/7.x - Dawntrail/Role Quests/Magical Ranged/4846_Behind the Helm.json index 9b581e947..493730251 100644 --- a/QuestPaths/7.x - Dawntrail/Role Quests/Magical Ranged/4846_Behind the Helm.json +++ b/QuestPaths/7.x - Dawntrail/Role Quests/Magical Ranged/4846_Behind the Helm.json @@ -13,7 +13,13 @@ "Z": 628.3817 }, "TerritoryId": 957, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Thavnair - Yedlihmad", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } } ] }, diff --git a/QuestPaths/7.x - Dawntrail/Role Quests/Magical Ranged/4847_Heroes and Pretenders.json b/QuestPaths/7.x - Dawntrail/Role Quests/Magical Ranged/4847_Heroes and Pretenders.json index feff8b349..73a1350de 100644 --- a/QuestPaths/7.x - Dawntrail/Role Quests/Magical Ranged/4847_Heroes and Pretenders.json +++ b/QuestPaths/7.x - Dawntrail/Role Quests/Magical Ranged/4847_Heroes and Pretenders.json @@ -16,7 +16,13 @@ "Z": 628.3817 }, "TerritoryId": 957, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Thavnair - Yedlihmad", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } } ] }, diff --git a/QuestPaths/7.x - Dawntrail/Role Quests/Physical Ranged/4838_Take Me to Your Leader.json b/QuestPaths/7.x - Dawntrail/Role Quests/Physical Ranged/4838_Take Me to Your Leader.json index ed65c14dd..9fd434103 100644 --- a/QuestPaths/7.x - Dawntrail/Role Quests/Physical Ranged/4838_Take Me to Your Leader.json +++ b/QuestPaths/7.x - Dawntrail/Role Quests/Physical Ranged/4838_Take Me to Your Leader.json @@ -13,7 +13,13 @@ "Z": -3.6469727 }, "TerritoryId": 621, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Lochs - Porta Praetoria", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } } ] }, diff --git a/QuestPaths/7.x - Dawntrail/Role Quests/Physical Ranged/4839_The Milk of Mamool Ja Kindness.json b/QuestPaths/7.x - Dawntrail/Role Quests/Physical Ranged/4839_The Milk of Mamool Ja Kindness.json index 90b8d6de8..e51f3ef26 100644 --- a/QuestPaths/7.x - Dawntrail/Role Quests/Physical Ranged/4839_The Milk of Mamool Ja Kindness.json +++ b/QuestPaths/7.x - Dawntrail/Role Quests/Physical Ranged/4839_The Milk of Mamool Ja Kindness.json @@ -13,7 +13,13 @@ "Z": 739.4979 }, "TerritoryId": 620, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Peaks - Ala Ghiri", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } } ] }, diff --git a/QuestPaths/7.x - Dawntrail/Role Quests/Physical Ranged/4840_Ally in the Alley.json b/QuestPaths/7.x - Dawntrail/Role Quests/Physical Ranged/4840_Ally in the Alley.json index d73e1be94..0e23ceddc 100644 --- a/QuestPaths/7.x - Dawntrail/Role Quests/Physical Ranged/4840_Ally in the Alley.json +++ b/QuestPaths/7.x - Dawntrail/Role Quests/Physical Ranged/4840_Ally in the Alley.json @@ -13,7 +13,13 @@ "Z": 739.4979 }, "TerritoryId": 620, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Peaks - Ala Ghiri", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } } ] }, diff --git a/QuestPaths/7.x - Dawntrail/Role Quests/Physical Ranged/4841_The Mightiest Shield.json b/QuestPaths/7.x - Dawntrail/Role Quests/Physical Ranged/4841_The Mightiest Shield.json index cba86057d..599b3b176 100644 --- a/QuestPaths/7.x - Dawntrail/Role Quests/Physical Ranged/4841_The Mightiest Shield.json +++ b/QuestPaths/7.x - Dawntrail/Role Quests/Physical Ranged/4841_The Mightiest Shield.json @@ -16,7 +16,13 @@ "Z": 618.09717 }, "TerritoryId": 621, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Lochs - Ala Mhigan Quarter", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } } ] }, diff --git a/QuestPaths/7.x - Dawntrail/Role Quests/Tank/4818_The Narwhal Beckons.json b/QuestPaths/7.x - Dawntrail/Role Quests/Tank/4818_The Narwhal Beckons.json index ab8d951ab..960d22332 100644 --- a/QuestPaths/7.x - Dawntrail/Role Quests/Tank/4818_The Narwhal Beckons.json +++ b/QuestPaths/7.x - Dawntrail/Role Quests/Tank/4818_The Narwhal Beckons.json @@ -13,7 +13,13 @@ "Z": 203.14331 }, "TerritoryId": 1185, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Tuliyollal", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } } ] }, diff --git a/QuestPaths/7.x - Dawntrail/Role Quests/Tank/4819_Sleepless in Ishgard.json b/QuestPaths/7.x - Dawntrail/Role Quests/Tank/4819_Sleepless in Ishgard.json index 69caf9181..668b23afe 100644 --- a/QuestPaths/7.x - Dawntrail/Role Quests/Tank/4819_Sleepless in Ishgard.json +++ b/QuestPaths/7.x - Dawntrail/Role Quests/Tank/4819_Sleepless in Ishgard.json @@ -13,7 +13,13 @@ "Z": -48.05072 }, "TerritoryId": 418, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ishgard", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } } ] }, diff --git a/QuestPaths/7.x - Dawntrail/Role Quests/Tank/4820_Between Sleep and Death.json b/QuestPaths/7.x - Dawntrail/Role Quests/Tank/4820_Between Sleep and Death.json index 09bfe8e26..9b08c1c96 100644 --- a/QuestPaths/7.x - Dawntrail/Role Quests/Tank/4820_Between Sleep and Death.json +++ b/QuestPaths/7.x - Dawntrail/Role Quests/Tank/4820_Between Sleep and Death.json @@ -14,6 +14,12 @@ }, "TerritoryId": 418, "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ishgard", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + }, "DialogueChoices": [ { "Type": "List", diff --git a/QuestPaths/7.x - Dawntrail/Role Quests/Tank/4821_Beacon in the Darkness.json b/QuestPaths/7.x - Dawntrail/Role Quests/Tank/4821_Beacon in the Darkness.json index 67f58ebbb..4691ec7c2 100644 --- a/QuestPaths/7.x - Dawntrail/Role Quests/Tank/4821_Beacon in the Darkness.json +++ b/QuestPaths/7.x - Dawntrail/Role Quests/Tank/4821_Beacon in the Darkness.json @@ -13,7 +13,13 @@ "Z": -1.7243042 }, "TerritoryId": 418, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ishgard", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } } ] }, diff --git a/QuestPaths/7.x - Dawntrail/Role Quests/Tank/4822_Awakened, not Stirred.json b/QuestPaths/7.x - Dawntrail/Role Quests/Tank/4822_Awakened, not Stirred.json index 544b366f1..a29c5a665 100644 --- a/QuestPaths/7.x - Dawntrail/Role Quests/Tank/4822_Awakened, not Stirred.json +++ b/QuestPaths/7.x - Dawntrail/Role Quests/Tank/4822_Awakened, not Stirred.json @@ -14,7 +14,13 @@ }, "StopDistance": 5, "TerritoryId": 418, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ishgard", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } } ] }, diff --git a/QuestPaths/7.x - Dawntrail/Role Quests/Tank/4823_Dreams of a New Day.json b/QuestPaths/7.x - Dawntrail/Role Quests/Tank/4823_Dreams of a New Day.json index 1fe65e91f..db15f8e23 100644 --- a/QuestPaths/7.x - Dawntrail/Role Quests/Tank/4823_Dreams of a New Day.json +++ b/QuestPaths/7.x - Dawntrail/Role Quests/Tank/4823_Dreams of a New Day.json @@ -16,7 +16,13 @@ "Z": -48.17273 }, "TerritoryId": 418, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Ishgard", + "SkipConditions": { + "AetheryteShortcutIf": { + "InSameTerritory": true + } + } } ] }, diff --git a/Questionable.Model/Questing/QuestStep.cs b/Questionable.Model/Questing/QuestStep.cs index 5a23e6e47..8ee496bfc 100644 --- a/Questionable.Model/Questing/QuestStep.cs +++ b/Questionable.Model/Questing/QuestStep.cs @@ -12,6 +12,7 @@ namespace Questionable.Model.Questing; public sealed class QuestStep { public const float DefaultStopDistance = 3f; + public const int VesperBayAetheryteTicket = 30362; public uint? DataId { get; set; } @@ -110,4 +111,19 @@ public sealed class QuestStep else return StopDistance ?? DefaultStopDistance; } + + /// + /// Only relevant for the step 0 in sequence 0: Whether this step is valid for teleporting to it. + /// + /// + public bool IsTeleportableForPriorityQuests() + { + if (AetheryteShortcut != null) + return true; + + if (InteractionType == EInteractionType.UseItem && ItemId == VesperBayAetheryteTicket) + return true; + + return false; + } } diff --git a/Questionable/Controller/Steps/Interactions/UseItem.cs b/Questionable/Controller/Steps/Interactions/UseItem.cs index 2481e8f5c..1e5d51bd3 100644 --- a/Questionable/Controller/Steps/Interactions/UseItem.cs +++ b/Questionable/Controller/Steps/Interactions/UseItem.cs @@ -23,8 +23,6 @@ namespace Questionable.Controller.Steps.Interactions; internal static class UseItem { - public const int VesperBayAetheryteTicket = 30362; - internal sealed class Factory( Mount.Factory mountFactory, MoveTo.Factory moveFactory, @@ -47,7 +45,7 @@ internal static class UseItem ArgumentNullException.ThrowIfNull(step.ItemId); - if (step.ItemId == VesperBayAetheryteTicket) + if (step.ItemId == QuestStep.VesperBayAetheryteTicket) { unsafe { @@ -196,7 +194,7 @@ internal static class UseItem if (StartingCombat && condition[ConditionFlag.InCombat]) return ETaskResult.TaskComplete; - if (ItemId == VesperBayAetheryteTicket && _usedItem) + if (ItemId == QuestStep.VesperBayAetheryteTicket && _usedItem) { InventoryManager* inventoryManager = InventoryManager.Instance(); if (inventoryManager == null) @@ -228,7 +226,7 @@ internal static class UseItem private TimeSpan GetRetryDelay() { - if (ItemId == VesperBayAetheryteTicket) + if (ItemId == QuestStep.VesperBayAetheryteTicket) return TimeSpan.FromSeconds(11); else return TimeSpan.FromSeconds(5); diff --git a/Questionable/Controller/Steps/Shared/AetheryteShortcut.cs b/Questionable/Controller/Steps/Shared/AetheryteShortcut.cs index 0b12bb3fc..0ac347a24 100644 --- a/Questionable/Controller/Steps/Shared/AetheryteShortcut.cs +++ b/Questionable/Controller/Steps/Shared/AetheryteShortcut.cs @@ -137,7 +137,7 @@ internal static class AetheryteShortcut if (skipConditions.NearPosition is { } nearPosition && - clientState.TerritoryType == step.TerritoryId) + clientState.TerritoryType == nearPosition.TerritoryId) { if (Vector3.Distance(nearPosition.Position, clientState.LocalPlayer!.Position) <= nearPosition.MaximumDistance) diff --git a/Questionable/Controller/Steps/Shared/SkipCondition.cs b/Questionable/Controller/Steps/Shared/SkipCondition.cs index 1d2420cfb..1c8a3fa38 100644 --- a/Questionable/Controller/Steps/Shared/SkipCondition.cs +++ b/Questionable/Controller/Steps/Shared/SkipCondition.cs @@ -204,7 +204,7 @@ internal static class SkipCondition } } - if (skipConditions.NearPosition is { } nearPosition && clientState.TerritoryType == step.TerritoryId) + if (skipConditions.NearPosition is { } nearPosition && clientState.TerritoryType == nearPosition.TerritoryId) { if (Vector3.Distance(nearPosition.Position, clientState.LocalPlayer!.Position) <= nearPosition.MaximumDistance) diff --git a/Questionable/Functions/QuestFunctions.cs b/Questionable/Functions/QuestFunctions.cs index e346822dc..3f48db397 100644 --- a/Questionable/Functions/QuestFunctions.cs +++ b/Questionable/Functions/QuestFunctions.cs @@ -262,14 +262,7 @@ internal sealed unsafe class QuestFunctions if (firstStep == null) return false; - if (firstStep.AetheryteShortcut != null) - return true; - - if (firstStep is - { InteractionType: EInteractionType.UseItem, ItemId: UseItem.VesperBayAetheryteTicket }) - return true; - - return false; + return firstStep.IsTeleportableForPriorityQuests(); }) .FirstOrDefault(x => { diff --git a/Questionable/QuestionablePlugin.cs b/Questionable/QuestionablePlugin.cs index 88ebc1b36..5c74c00bd 100644 --- a/Questionable/QuestionablePlugin.cs +++ b/Questionable/QuestionablePlugin.cs @@ -223,6 +223,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(sp => sp.GetRequiredService()); } diff --git a/Questionable/Validation/EIssueType.cs b/Questionable/Validation/EIssueType.cs index 0f51ce6be..755124814 100644 --- a/Questionable/Validation/EIssueType.cs +++ b/Questionable/Validation/EIssueType.cs @@ -17,4 +17,5 @@ public enum EIssueType UnexpectedCompleteQuestStep, InvalidAethernetShortcut, InvalidExcelRef, + ClassQuestWithoutAetheryteShortcut, } diff --git a/Questionable/Validation/Validators/ClassQuestShouldHaveShortcutValidator.cs b/Questionable/Validation/Validators/ClassQuestShouldHaveShortcutValidator.cs index 405c8f88a..680ef1243 100644 --- a/Questionable/Validation/Validators/ClassQuestShouldHaveShortcutValidator.cs +++ b/Questionable/Validation/Validators/ClassQuestShouldHaveShortcutValidator.cs @@ -1,6 +1,51 @@ -namespace Questionable.Validation.Validators; +using System.Collections.Generic; +using LLib.GameData; +using Questionable.Data; +using Questionable.Model; +using Questionable.Model.Questing; -public class ClassQuestShouldHaveShortcut +namespace Questionable.Validation.Validators; + +internal sealed class ClassQuestShouldHaveShortcutValidator : IQuestValidator { - + private readonly HashSet _classJobQuests = []; + + public ClassQuestShouldHaveShortcutValidator(QuestData questData) + { + foreach (EClassJob classJob in typeof(EClassJob).GetEnumValues()) + { + if (classJob == EClassJob.Adventurer) + continue; + + foreach (var questInfo in questData.GetClassJobQuests(classJob)) + { + // TODO maybe remove the level check + if (questInfo.Level > 1) + _classJobQuests.Add(questInfo.QuestId); + } + } + } + + public IEnumerable Validate(Quest quest) + { + if (!_classJobQuests.Contains(quest.Id)) + yield break; + + var firstStep = quest.FindSequence(0)?.FindStep(0); + if (firstStep == null) + yield break; + + if (firstStep.IsTeleportableForPriorityQuests()) + yield break; + + yield return new ValidationIssue + { + ElementId = quest.Id, + Sequence = 0, + Step = 0, + Type = EIssueType.ClassQuestWithoutAetheryteShortcut, + Severity = EIssueSeverity.Error, + Description = "Class quest should have an aetheryte shortcut to be done automatically", + }; + } }