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 58b792d6..cced8794 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 23abee99..1a5f96dc 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 faaf1166..ea8b8257 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 ab55d722..5ab37fe6 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 c9bcf377..07dd8fbf 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 ae8417c0..50ff25c8 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 2e25eb22..130b69e0 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 cbbb57c3..8c00e6a2 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 eba6e305..d7d54815 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 88320c09..e12a5e43 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 615cf8be..5d4a5b35 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 66e6af53..19cbfbe7 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 2fbe65db..18257f45 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 8e87dd8b..aa5a054f 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 a2b64690..270a798d 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 8169dfbd..06d12fb3 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 48d669d2..8f55a98e 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 18979d0a..cc2dcd85 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 212b5074..83dc2b97 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 be65d1d6..02adab4a 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 86f5071c..4423e4d1 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 d134ace3..abc4342a 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 6e246198..2a3451f3 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 ccf61580..dec630ec 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 33df55b7..c04f2dc7 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 6b6425ea..a26a9fca 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 40af8b55..5542bd4b 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 cbe6d957..0150bd00 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 9b581e94..49373025 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 feff8b34..73a1350d 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 ed65c14d..9fd43410 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 90b8d6de..e51f3ef2 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 d73e1be9..0e23cedd 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 cba86057..599b3b17 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 ab8d951a..960d2233 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 69caf918..668b23af 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 09bfe8e2..9b08c1c9 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 67f58ebb..4691ec7c 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 544b366f..a29c5a66 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 1fe65e91..db15f8e2 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 5a23e6e4..8ee496bf 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 2481e8f5..1e5d51bd 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 0b12bb3f..0ac347a2 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 1d2420cf..1c8a3fa3 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 e346822d..3f48db39 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 88ebc1b3..5c74c00b 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 0f51ce6b..75512481 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 405c8f88..680ef124 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",
+ };
+ }
}