From 5bcaba7eba6a45e910b278c64333606ffd21db5b Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sat, 15 Jun 2024 14:12:32 +0200 Subject: [PATCH] Gridania start, various quest fixes, automatically start GC quest, automatically start chocobo quest --- QuestPathGenerator/QuestSourceGenerator.cs | 3 + .../MSQ-1/Gridania/129_Spirithold Broken.json | 210 ++++++++++ .../MSQ-1/Gridania/161_Leia's Legacy.json | 165 ++++++++ .../Gridania/175_Surveying the Damage.json | 117 ++++++ .../MSQ-1/Gridania/176_On to Bentbranch.json | 48 +++ .../MSQ-1/Gridania/201_Passing Muster.json | 37 ++ .../MSQ-1/Gridania/28_To the Bannock.json | 46 +++ .../Gridania/376_You Shall Not Trespass.json | 87 ++++ .../MSQ-1/Gridania/377_Don't Look Down.json | 197 +++++++++ ...79_In the Grim Darkness of the Forest.json | 66 +++ .../Gridania/380_Threat Level Elevated.json | 66 +++ .../MSQ-1/Gridania/381_Migrant Marauders.json | 55 +++ .../Gridania/384_A Hearer is Often Late.json | 51 +++ .../MSQ-1/Gridania/3854_Eggs over Queasy.json | 55 +++ .../Gridania/3855_A Soldier's Breakfast.json | 79 ++++ .../Gridania/387_Salvaging the Scene.json | 66 +++ .../MSQ-1/Gridania/39_Coming to Gridania.json | 36 ++ .../MSQ-1/Gridania/445_Chasing Shadows.json | 69 ++++ .../Gridania/446_Dread Is in the Air.json | 41 ++ .../Gridania/447_To Guard a Guardian.json | 118 ++++++ .../MSQ-1/Gridania/448_Festive Endeavors.json | 102 +++++ .../Gridania/449_Renewing the Covenant.json | 112 +++++ .../Gridania/507_The Gridanian Envoy.json | 383 ++++++++++++++++++ .../MSQ-1/Gridania/85_LNC_Close to Home.json | 201 +++++++++ .../Shared/245_It's Probably Pirates.json | 1 + .../272_Life, Materia and Everything.json | 3 +- .../509_The Scions of the Seventh Dawn.json | 22 +- .../510_A Wild Rose By Any Other Name.json | 12 + .../Shared/511_A Hero in the Making.json | 2 +- .../MSQ-1/Shared/618_Unsolved Mystery.json | 20 + .../MSQ-1/Shared/660_Into a Copper Hell.json | 1 + .../MSQ-1/Shared/677_Fire in the Gloom.json | 24 +- ...80_The Company You Keep (Twin Adders).json | 105 +++++ .../681_The Company You Keep (Maelstrom).json | 21 +- .../MSQ-1/Shared/683_Wood's Will Be Done.json | 62 +++ .../700_My Little Chocobo (Twin Adder).json | 78 ++++ .../701_My Little Chocobo (Maelstrom).json | 99 +++++ QuestPaths/ARealmReborn/MSQ-2/.gitkeep | 0 .../MSQ-2/A2/3856_We Come in Peace.json | 44 ++ QuestPaths/quest-v1.json | 4 +- .../V1/Converter/SkipConditionConverter.cs | 2 + Questionable.Model/V1/ESkipCondition.cs | 2 + Questionable/Configuration.cs | 2 + Questionable/Controller/GameUiController.cs | 2 - Questionable/Controller/MovementController.cs | 2 +- Questionable/Controller/QuestController.cs | 19 +- .../Steps/BaseFactory/AetheryteShortcut.cs | 12 +- .../Steps/BaseFactory/SkipCondition.cs | 30 +- .../Controller/Steps/BaseFactory/WaitAtEnd.cs | 1 + .../Steps/InteractionFactory/EquipItem.cs | 47 ++- .../Steps/InteractionFactory/UseItem.cs | 46 ++- Questionable/GameFunctions.cs | 89 ++-- Questionable/Questionable.csproj | 2 +- Questionable/Windows/ConfigWindow.cs | 13 +- Questionable/Windows/DebugWindow.cs | 4 + 55 files changed, 3086 insertions(+), 95 deletions(-) create mode 100644 QuestPaths/ARealmReborn/MSQ-1/Gridania/129_Spirithold Broken.json create mode 100644 QuestPaths/ARealmReborn/MSQ-1/Gridania/161_Leia's Legacy.json create mode 100644 QuestPaths/ARealmReborn/MSQ-1/Gridania/175_Surveying the Damage.json create mode 100644 QuestPaths/ARealmReborn/MSQ-1/Gridania/176_On to Bentbranch.json create mode 100644 QuestPaths/ARealmReborn/MSQ-1/Gridania/201_Passing Muster.json create mode 100644 QuestPaths/ARealmReborn/MSQ-1/Gridania/28_To the Bannock.json create mode 100644 QuestPaths/ARealmReborn/MSQ-1/Gridania/376_You Shall Not Trespass.json create mode 100644 QuestPaths/ARealmReborn/MSQ-1/Gridania/377_Don't Look Down.json create mode 100644 QuestPaths/ARealmReborn/MSQ-1/Gridania/379_In the Grim Darkness of the Forest.json create mode 100644 QuestPaths/ARealmReborn/MSQ-1/Gridania/380_Threat Level Elevated.json create mode 100644 QuestPaths/ARealmReborn/MSQ-1/Gridania/381_Migrant Marauders.json create mode 100644 QuestPaths/ARealmReborn/MSQ-1/Gridania/384_A Hearer is Often Late.json create mode 100644 QuestPaths/ARealmReborn/MSQ-1/Gridania/3854_Eggs over Queasy.json create mode 100644 QuestPaths/ARealmReborn/MSQ-1/Gridania/3855_A Soldier's Breakfast.json create mode 100644 QuestPaths/ARealmReborn/MSQ-1/Gridania/387_Salvaging the Scene.json create mode 100644 QuestPaths/ARealmReborn/MSQ-1/Gridania/39_Coming to Gridania.json create mode 100644 QuestPaths/ARealmReborn/MSQ-1/Gridania/445_Chasing Shadows.json create mode 100644 QuestPaths/ARealmReborn/MSQ-1/Gridania/446_Dread Is in the Air.json create mode 100644 QuestPaths/ARealmReborn/MSQ-1/Gridania/447_To Guard a Guardian.json create mode 100644 QuestPaths/ARealmReborn/MSQ-1/Gridania/448_Festive Endeavors.json create mode 100644 QuestPaths/ARealmReborn/MSQ-1/Gridania/449_Renewing the Covenant.json create mode 100644 QuestPaths/ARealmReborn/MSQ-1/Gridania/507_The Gridanian Envoy.json create mode 100644 QuestPaths/ARealmReborn/MSQ-1/Gridania/85_LNC_Close to Home.json create mode 100644 QuestPaths/ARealmReborn/MSQ-1/Shared/680_The Company You Keep (Twin Adders).json create mode 100644 QuestPaths/ARealmReborn/MSQ-1/Shared/683_Wood's Will Be Done.json create mode 100644 QuestPaths/ARealmReborn/MSQ-1/Shared/700_My Little Chocobo (Twin Adder).json create mode 100644 QuestPaths/ARealmReborn/MSQ-1/Shared/701_My Little Chocobo (Maelstrom).json delete mode 100644 QuestPaths/ARealmReborn/MSQ-2/.gitkeep create mode 100644 QuestPaths/ARealmReborn/MSQ-2/A2/3856_We Come in Peace.json diff --git a/QuestPathGenerator/QuestSourceGenerator.cs b/QuestPathGenerator/QuestSourceGenerator.cs index 9bc6cc29..8d2f37ed 100644 --- a/QuestPathGenerator/QuestSourceGenerator.cs +++ b/QuestPathGenerator/QuestSourceGenerator.cs @@ -48,6 +48,9 @@ public class QuestSourceGenerator : ISourceGenerator quests.Add((id, quest)); } + if (quests.Count == 0) + return; + quests = quests.OrderBy(x => x.Item1).ToList(); var code = diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/129_Spirithold Broken.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/129_Spirithold Broken.json new file mode 100644 index 00000000..6f83e493 --- /dev/null +++ b/QuestPaths/ARealmReborn/MSQ-1/Gridania/129_Spirithold Broken.json @@ -0,0 +1,210 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "TerritoryBlacklist": [ + 225 + ], + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1000421, + "Position": { + "X": 98.25281, + "Y": -8, + "Z": -78.446655 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1000465, + "Position": { + "X": 298.63428, + "Y": 9.999997, + "Z": 119.035645 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1000465, + "Position": { + "X": 298.63428, + "Y": 9.999997, + "Z": 119.035645 + }, + "TerritoryId": 148, + "InteractionType": "WaitForManualProgress", + "Comment": "Manual Quest Progress (very combat heavy)", + "$": "TODO Remove later" + }, + { + "DataId": 1000512, + "Position": { + "X": 311.69592, + "Y": 14.8470745, + "Z": 164.47693 + }, + "TerritoryId": 148, + "InteractionType": "Interact", + "Disabled": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1000513, + "Position": { + "X": 303.8833, + "Y": 15.899703, + "Z": 160.87585 + }, + "TerritoryId": 148, + "InteractionType": "Interact", + "Disabled": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 1000514, + "Position": { + "X": 296.1012, + "Y": 15.999987, + "Z": 171.4961 + }, + "TerritoryId": 148, + "InteractionType": "Interact", + "Disabled": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 1000515, + "Position": { + "X": 291.21838, + "Y": 19.86808, + "Z": 175.21924 + }, + "TerritoryId": 148, + "InteractionType": "Interact", + "Disabled": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] + }, + { + "DataId": 1000516, + "Position": { + "X": 284.65698, + "Y": 21.97319, + "Z": 188.18945 + }, + "TerritoryId": 148, + "InteractionType": "Interact", + "Disabled": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 8 + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1000740, + "Position": { + "X": 260.18152, + "Y": 24.000002, + "Z": 192.2179 + }, + "TerritoryId": 148, + "InteractionType": "SinglePlayerDuty" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "Position": { + "X": 319.9492, + "Y": 13.866494, + "Z": 156.2647 + }, + "TerritoryId": 148, + "InteractionType": "WalkTo" + }, + { + "DataId": 1000465, + "Position": { + "X": 298.63428, + "Y": 9.999997, + "Z": 119.035645 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1000100, + "Position": { + "X": 23.819275, + "Y": -8, + "Z": 115.92273 + }, + "TerritoryId": 132, + "InteractionType": "Interact", + "AetheryteShortcut": "Gridania", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Airship Landing" + ] + } + ] + } + ] +} diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/161_Leia's Legacy.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/161_Leia's Legacy.json new file mode 100644 index 00000000..04f87dbe --- /dev/null +++ b/QuestPaths/ARealmReborn/MSQ-1/Gridania/161_Leia's Legacy.json @@ -0,0 +1,165 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1000471, + "Position": { + "X": -60.471558, + "Y": 0.19999865, + "Z": 6.301941 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1000484, + "Position": { + "X": 2.0598755, + "Y": -7.9139543, + "Z": -22.171448 + }, + "TerritoryId": 148, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 1000476, + "Position": { + "X": 27.0542, + "Y": -6.881897, + "Z": 14.145081 + }, + "TerritoryId": 148, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1000483, + "Position": { + "X": 85.496216, + "Y": -6.0870457, + "Z": 67.00232 + }, + "TerritoryId": 148, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1000471, + "Position": { + "X": -60.471558, + "Y": 0.19999865, + "Z": 6.301941 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": 9.630515, + "Y": -22.580793, + "Z": 242.32327 + }, + "TerritoryId": 148, + "InteractionType": "WalkTo" + }, + { + "DataId": 1003002, + "Position": { + "X": -189.13562, + "Y": -26.70127, + "Z": 295.52136 + }, + "TerritoryId": 148, + "InteractionType": "SinglePlayerDuty" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1003002, + "Position": { + "X": -189.13562, + "Y": -26.70127, + "Z": 295.52136 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1000471, + "Position": { + "X": -60.471558, + "Y": 0.19999865, + "Z": 6.301941 + }, + "TerritoryId": 148, + "InteractionType": "Interact", + "AetheryteShortcut": "Central Shroud - Bentbranch Meadows" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1000471, + "Position": { + "X": -60.471558, + "Y": 0.19999865, + "Z": 6.301941 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + } + ] +} diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/175_Surveying the Damage.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/175_Surveying the Damage.json new file mode 100644 index 00000000..9da7388c --- /dev/null +++ b/QuestPaths/ARealmReborn/MSQ-1/Gridania/175_Surveying the Damage.json @@ -0,0 +1,117 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1000449, + "Position": { + "X": 201.83093, + "Y": -5.5419664, + "Z": -107.25574 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 1, + "Comment": "Very likely this needs manual combat and/or manual continues", + "Steps": [ + { + "DataId": 2000141, + "Position": { + "X": 179.4613, + "Y": -10.666138, + "Z": 99.56506 + }, + "TerritoryId": 148, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ], + "$": "QuestVariables if done first: 17 0 16 0 0 128" + }, + { + "DataId": 2000147, + "Position": { + "X": 168.07812, + "Y": -12.008911, + "Z": 120.80554 + }, + "TerritoryId": 148, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ], + "$": "QuestVariables if done first: 17 16 17 0 0 192" + }, + { + "DataId": 2000149, + "Position": { + "X": 154.0398, + "Y": -10.75769, + "Z": 120.3479 + }, + "TerritoryId": 148, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ], + "$": "QuestVariables if done first: 33 17 17 16 0 208" + }, + { + "DataId": 2000148, + "Position": { + "X": 126.14636, + "Y": -12.008911, + "Z": 142.35144 + }, + "TerritoryId": 148, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1000685, + "Position": { + "X": 287.92236, + "Y": -3.297, + "Z": -32.6391 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + } + ] +} diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/176_On to Bentbranch.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/176_On to Bentbranch.json new file mode 100644 index 00000000..db4e89f7 --- /dev/null +++ b/QuestPaths/ARealmReborn/MSQ-1/Gridania/176_On to Bentbranch.json @@ -0,0 +1,48 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1000100, + "Position": { + "X": 23.819275, + "Y": -8, + "Z": 115.92273 + }, + "TerritoryId": 132, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 3, + "Position": { + "X": 13.076904, + "Y": 0.56451416, + "Z": 35.90442 + }, + "StopDistance": 10, + "TerritoryId": 148, + "InteractionType": "AttuneAetheryte", + "AethernetShortcut": ["[Gridania] Aetheryte Plaza", "[Gridania] Blue Badger Gate (Central Shroud)"] + }, + { + "DataId": 1000470, + "Position": { + "X": -59.006653, + "Y": -0.010835781, + "Z": 26.41333 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + } + ] +} diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/201_Passing Muster.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/201_Passing Muster.json new file mode 100644 index 00000000..55d8a1b6 --- /dev/null +++ b/QuestPaths/ARealmReborn/MSQ-1/Gridania/201_Passing Muster.json @@ -0,0 +1,37 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1000421, + "Position": { + "X": 98.25281, + "Y": -8, + "Z": -78.446655 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1000421, + "Position": { + "X": 98.25281, + "Y": -8, + "Z": -78.446655 + }, + "TerritoryId": 148, + "InteractionType": "Interact", + "Comment": "All starting gear (except the hat) is ilvl 5 already" + } + ] + } + ] +} diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/28_To the Bannock.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/28_To the Bannock.json new file mode 100644 index 00000000..e57f0821 --- /dev/null +++ b/QuestPaths/ARealmReborn/MSQ-1/Gridania/28_To the Bannock.json @@ -0,0 +1,46 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1000100, + "Position": { + "X": 23.819275, + "Y": -8, + "Z": 115.92273 + }, + "TerritoryId": 132, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": 158.06026, + "Y": -12.97808, + "Z": 158.08466 + }, + "TerritoryId": 132, + "InteractionType": "WalkTo", + "TargetTerritoryId": 148 + }, + { + "DataId": 1000421, + "Position": { + "X": 98.25281, + "Y": -8, + "Z": -78.446655 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + } + ] +} diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/376_You Shall Not Trespass.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/376_You Shall Not Trespass.json new file mode 100644 index 00000000..504b366f --- /dev/null +++ b/QuestPaths/ARealmReborn/MSQ-1/Gridania/376_You Shall Not Trespass.json @@ -0,0 +1,87 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1000470, + "Position": { + "X": -59.006653, + "Y": -0.010835781, + "Z": 26.41333 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -61.749943, + "Y": 0.9481318, + "Z": -38.52144 + }, + "TerritoryId": 148, + "InteractionType": "Jump", + "JumpDestination": { + "Position": { + "X": -67.083466, + "Y": -4.478065, + "Z": -45.204926 + }, + "StopDistance": 3 + } + }, + { + "DataId": 1000748, + "Position": { + "X": -125.230774, + "Y": 4.1573725, + "Z": -43.595093 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": -171.87439, + "Y": 1.7183347, + "Z": -70.586975 + }, + "TerritoryId": 148, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "KillEnemyDataIds": [ + 771 + ], + "Comment": "Kill Qiqirn manually" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1000748, + "Position": { + "X": -125.230774, + "Y": 4.1573725, + "Z": -43.595093 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + } + ] +} diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/377_Don't Look Down.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/377_Don't Look Down.json new file mode 100644 index 00000000..e662df85 --- /dev/null +++ b/QuestPaths/ARealmReborn/MSQ-1/Gridania/377_Don't Look Down.json @@ -0,0 +1,197 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1000435, + "Position": { + "X": -127.06189, + "Y": 4.1490583, + "Z": -44.296997 + }, + "StopDistance": 5, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2000750, + "Position": { + "X": -151.26276, + "Y": 14.358704, + "Z": -73.014465 + }, + "TerritoryId": 148, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 2000749, + "Position": { + "X": -164.11078, + "Y": 23.025818, + "Z": -86.167725 + }, + "TerritoryId": 148, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "Position": { + "X": -180.18181, + "Y": 31.66525, + "Z": -91.84381 + }, + "TerritoryId": 148, + "InteractionType": "WalkTo", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + -128 + ] + }, + { + "Position": { + "X": -184.41872, + "Y": 29.940958, + "Z": -93.809525 + }, + "TerritoryId": 148, + "InteractionType": "WalkTo", + "DisableNavmesh": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + -128 + ] + }, + { + "DataId": 2000748, + "Position": { + "X": -189.25769, + "Y": 30.44165, + "Z": -98.83276 + }, + "TerritoryId": 148, + "InteractionType": "Interact", + "DisableNavmesh": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "Position": { + "X": -179.84062, + "Y": 31.476957, + "Z": -91.05707 + }, + "TerritoryId": 148, + "InteractionType": "WalkTo", + "DisableNavmesh": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + -16 + ] + }, + { + "Position": { + "X": -171.76294, + "Y": 23.022184, + "Z": -76.32822 + }, + "TerritoryId": 148, + "InteractionType": "WalkTo", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + -16 + ] + }, + { + "DataId": 2000751, + "Position": { + "X": -169.3294, + "Y": 18.600708, + "Z": -72.129456 + }, + "TerritoryId": 148, + "InteractionType": "Interact", + "DisableNavmesh": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": -166.56161, + "Y": 0.63666093, + "Z": -61.089085 + }, + "TerritoryId": 148, + "InteractionType": "WalkTo", + "DisableNavmesh": true, + "Comment": "Jumping back up isn't trivial" + }, + { + "DataId": 1000436, + "Position": { + "X": -193.22504, + "Y": 56.264572, + "Z": -116.47211 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + } + ] +} diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/379_In the Grim Darkness of the Forest.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/379_In the Grim Darkness of the Forest.json new file mode 100644 index 00000000..c9de3ec2 --- /dev/null +++ b/QuestPaths/ARealmReborn/MSQ-1/Gridania/379_In the Grim Darkness of the Forest.json @@ -0,0 +1,66 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1000436, + "Position": { + "X": -193.22504, + "Y": 56.264572, + "Z": -116.47211 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1000748, + "Position": { + "X": -125.230774, + "Y": 4.1573725, + "Z": -43.595093 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2000689, + "Position": { + "X": -95.47571, + "Y": 3.4942627, + "Z": -150.80493 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1000748, + "Position": { + "X": -125.230774, + "Y": 4.1573725, + "Z": -43.595093 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + } + ] +} diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/380_Threat Level Elevated.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/380_Threat Level Elevated.json new file mode 100644 index 00000000..9afa66d2 --- /dev/null +++ b/QuestPaths/ARealmReborn/MSQ-1/Gridania/380_Threat Level Elevated.json @@ -0,0 +1,66 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1000748, + "Position": { + "X": -125.230774, + "Y": 4.1573725, + "Z": -43.595093 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1001280, + "Position": { + "X": 89.28052, + "Y": -6.351089, + "Z": -121.96539 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1000483, + "Position": { + "X": 85.496216, + "Y": -6.0870457, + "Z": 67.00232 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1000741, + "Position": { + "X": -66.7583, + "Y": 0.2, + "Z": 11.36792 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + } + ] +} diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/381_Migrant Marauders.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/381_Migrant Marauders.json new file mode 100644 index 00000000..dde9cfee --- /dev/null +++ b/QuestPaths/ARealmReborn/MSQ-1/Gridania/381_Migrant Marauders.json @@ -0,0 +1,55 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1000741, + "Position": { + "X": -66.7583, + "Y": 0.2, + "Z": 11.36792 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2001006, + "Position": { + "X": 99.65662, + "Y": -15.732117, + "Z": 193.01135 + }, + "TerritoryId": 148, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 12 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1000491, + "Position": { + "X": 47.958984, + "Y": -24, + "Z": 228.5343 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + } + ] +} diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/384_A Hearer is Often Late.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/384_A Hearer is Often Late.json new file mode 100644 index 00000000..0511deb9 --- /dev/null +++ b/QuestPaths/ARealmReborn/MSQ-1/Gridania/384_A Hearer is Often Late.json @@ -0,0 +1,51 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1000491, + "Position": { + "X": 47.958984, + "Y": -24, + "Z": 228.5343 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1002932, + "Position": { + "X": -65.049255, + "Y": -36.79766, + "Z": 477.59204 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1000503, + "Position": { + "X": 178.33215, + "Y": -32.015224, + "Z": 333.30273 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + } + ] +} diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/3854_Eggs over Queasy.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/3854_Eggs over Queasy.json new file mode 100644 index 00000000..ac7ea3c0 --- /dev/null +++ b/QuestPaths/ARealmReborn/MSQ-1/Gridania/3854_Eggs over Queasy.json @@ -0,0 +1,55 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1000421, + "Position": { + "X": 98.25281, + "Y": -8, + "Z": -78.446655 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 194.08282, + "Y": -8.422037, + "Z": -47.295006 + }, + "TerritoryId": 148, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "KillEnemyDataIds": [ + 43 + ], + "Comment": "Kill Chigoes manually" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1000449, + "Position": { + "X": 201.83093, + "Y": -5.5419664, + "Z": -107.25574 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + } + ] +} diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/3855_A Soldier's Breakfast.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/3855_A Soldier's Breakfast.json new file mode 100644 index 00000000..ed45022b --- /dev/null +++ b/QuestPaths/ARealmReborn/MSQ-1/Gridania/3855_A Soldier's Breakfast.json @@ -0,0 +1,79 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1000685, + "Position": { + "X": 287.92236, + "Y": -3.297, + "Z": -32.6391 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 1, + "Comment": "TODO Figure out quest flags if picking up egg first OR doing the combat first", + "Steps": [ + { + "DataId": 2000010, + "Position": { + "X": 480.88794, + "Y": 30.746826, + "Z": -49.729187 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + }, + { + "Position": { + "X": 480.88794, + "Y": 30.746826, + "Z": -49.729187 + }, + "TerritoryId": 148, + "InteractionType": "Combat", + "EnemySpawnType": "OverworldEnemies", + "KillEnemyDataIds": [142], + "Comment": "Depending on how many enemies you fought on the way to the egg, this step could be optional" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1000685, + "Position": { + "X": 287.92236, + "Y": -3.297, + "Z": -32.6391 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1000408, + "Position": { + "X": 106.85889, + "Y": -8, + "Z": -75.669556 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + } + ] +} diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/387_Salvaging the Scene.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/387_Salvaging the Scene.json new file mode 100644 index 00000000..ad355301 --- /dev/null +++ b/QuestPaths/ARealmReborn/MSQ-1/Gridania/387_Salvaging the Scene.json @@ -0,0 +1,66 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1000503, + "Position": { + "X": 178.33215, + "Y": -32.015224, + "Z": 333.30273 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2001018, + "Position": { + "X": 155.47412, + "Y": -23.66681, + "Z": 490.74524 + }, + "TerritoryId": 148, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 26 + ] + }, + { + "DataId": 2001016, + "Position": { + "X": 152.60547, + "Y": -23.758362, + "Z": 494.71265 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1000470, + "Position": { + "X": -59.006653, + "Y": -0.010835781, + "Z": 26.41333 + }, + "TerritoryId": 148, + "InteractionType": "Interact", + "AetheryteShortcut": "Central Shroud - Bentbranch Meadows" + } + ] + } + ] +} diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/39_Coming to Gridania.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/39_Coming to Gridania.json new file mode 100644 index 00000000..ae0d54ab --- /dev/null +++ b/QuestPaths/ARealmReborn/MSQ-1/Gridania/39_Coming to Gridania.json @@ -0,0 +1,36 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1001148, + "Position": { + "X": 117.112915, + "Y": -12.506256, + "Z": 143.63306 + }, + "TerritoryId": 183, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1001140, + "Position": { + "X": 23.788818, + "Y": -8, + "Z": 115.861694 + }, + "TerritoryId": 183, + "InteractionType": "Interact" + } + ] + } + ] +} diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/445_Chasing Shadows.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/445_Chasing Shadows.json new file mode 100644 index 00000000..70c7c525 --- /dev/null +++ b/QuestPaths/ARealmReborn/MSQ-1/Gridania/445_Chasing Shadows.json @@ -0,0 +1,69 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "TerritoryBlacklist": [ + 233 + ], + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1000421, + "Position": { + "X": 98.25281, + "Y": -8, + "Z": -78.446655 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2000953, + "Position": { + "X": 323.5979, + "Y": 0.3508911, + "Z": -309.55975 + }, + "TerritoryId": 148, + "InteractionType": "SinglePlayerDuty" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2001194, + "Position": { + "X": 323.627, + "Y": 0.3168333, + "Z": -309.5412 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1000421, + "Position": { + "X": 98.25281, + "Y": -8, + "Z": -78.446655 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + } + ] +} diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/446_Dread Is in the Air.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/446_Dread Is in the Air.json new file mode 100644 index 00000000..07e7791d --- /dev/null +++ b/QuestPaths/ARealmReborn/MSQ-1/Gridania/446_Dread Is in the Air.json @@ -0,0 +1,41 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1000471, + "Position": { + "X": -60.471558, + "Y": 0.19999865, + "Z": 6.301941 + }, + "TerritoryId": 148, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1000100, + "Position": { + "X": 23.819275, + "Y": -8, + "Z": 115.92273 + }, + "TerritoryId": 132, + "InteractionType": "Interact", + "AetheryteShortcut": "Gridania", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Airship Landing" + ] + } + ] + } + ] +} diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/447_To Guard a Guardian.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/447_To Guard a Guardian.json new file mode 100644 index 00000000..31deec40 --- /dev/null +++ b/QuestPaths/ARealmReborn/MSQ-1/Gridania/447_To Guard a Guardian.json @@ -0,0 +1,118 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1000100, + "Position": { + "X": 23.819275, + "Y": -8, + "Z": 115.92273 + }, + "TerritoryId": 132, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 49.65071, + "Y": -8.046952, + "Z": 102.32186 + }, + "TerritoryId": 132, + "InteractionType": "WalkTo", + "$": "New Gridania Navmesh workaround" + }, + { + "DataId": 1000423, + "Position": { + "X": 232.04382, + "Y": 1.999974, + "Z": 45.578613 + }, + "TerritoryId": 132, + "InteractionType": "Interact", + "AethernetShortcut": ["[Gridania] Aetheryte Plaza", "[Gridania] Archers' Guild"], + "DialogueChoices": [ + { + "Type": "YesNo", + "Prompt": "TEXT_MANFST007_00447_Q1_000_1", + "Yes": true + } + ] + }, + { + "DataId": 1003061, + "Position": { + "X": -0.015319824, + "Y": 0.500025, + "Z": -4.3793945 + }, + "StopDistance": 7, + "TerritoryId": 204, + "InteractionType": "Interact", + "DisableNavmesh": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1000456, + "Position": { + "X": -303.5172, + "Y": 21.902342, + "Z": 127.45862 + }, + "TerritoryId": 148, + "InteractionType": "SinglePlayerDuty", + "AetheryteShortcut": "Central Shroud - Bentbranch Meadows" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1000423, + "Position": { + "X": 232.04382, + "Y": 1.999974, + "Z": 45.578613 + }, + "TerritoryId": 132, + "InteractionType": "Interact", + "AetheryteShortcut": "Gridania", + "AethernetShortcut": ["[Gridania] Aetheryte Plaza", "[Gridania] Archers' Guild"], + "DialogueChoices": [ + { + "Type": "YesNo", + "Prompt": "TEXT_MANFST007_00447_Q1_000_1", + "Yes": true + } + ] + }, + { + "DataId": 1003061, + "Position": { + "X": -0.015319824, + "Y": 0.500025, + "Z": -4.3793945 + }, + "StopDistance": 7, + "TerritoryId": 204, + "InteractionType": "Interact", + "DisableNavmesh": true + } + ] + } + ] +} diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/448_Festive Endeavors.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/448_Festive Endeavors.json new file mode 100644 index 00000000..f2b9a533 --- /dev/null +++ b/QuestPaths/ARealmReborn/MSQ-1/Gridania/448_Festive Endeavors.json @@ -0,0 +1,102 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1003061, + "Position": { + "X": -0.015319824, + "Y": 0.500025, + "Z": -4.3793945 + }, + "StopDistance": 7, + "TerritoryId": 204, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2001215, + "Position": { + "X": 0.002457563, + "Y": 1.052062, + "Z": 9.820032 + }, + "TerritoryId": 204, + "InteractionType": "Interact", + "TargetTerritoryId": 132 + }, + { + "DataId": 1000100, + "Position": { + "X": 23.819275, + "Y": -8, + "Z": 115.92273 + }, + "TerritoryId": 132, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Gridania] Archers' Guild", + "[Gridania] Airship Landing" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": 49.65071, + "Y": -8.046952, + "Z": 102.32186 + }, + "TerritoryId": 132, + "InteractionType": "WalkTo", + "$": "New Gridania Navmesh workaround" + }, + { + "DataId": 1000153, + "Position": { + "X": -44.87683, + "Y": -1.2500024, + "Z": 56.839844 + }, + "TerritoryId": 132, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "Position": { + "X": 49.65071, + "Y": -8.046952, + "Z": 102.32186 + }, + "TerritoryId": 132, + "InteractionType": "WalkTo", + "$": "New Gridania Navmesh workaround" + }, + { + "DataId": 1000100, + "Position": { + "X": 23.819275, + "Y": -8, + "Z": 115.92273 + }, + "TerritoryId": 132, + "InteractionType": "Interact" + } + ] + } + ] +} diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/449_Renewing the Covenant.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/449_Renewing the Covenant.json new file mode 100644 index 00000000..843634c0 --- /dev/null +++ b/QuestPaths/ARealmReborn/MSQ-1/Gridania/449_Renewing the Covenant.json @@ -0,0 +1,112 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1000100, + "Position": { + "X": 23.819275, + "Y": -8, + "Z": 115.92273 + }, + "TerritoryId": 132, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "TerritoryId": 132, + "InteractionType": "EquipItem", + "ItemId": 2651 + }, + { + "Position": { + "X": 49.65071, + "Y": -8.046952, + "Z": 102.32186 + }, + "TerritoryId": 132, + "InteractionType": "WalkTo", + "$": "New Gridania Navmesh workaround" + }, + { + "DataId": 1000286, + "Position": { + "X": -53.574463, + "Y": 7.2025366, + "Z": -118.36426 + }, + "TerritoryId": 133, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Mih Khetto's Amphitheatre" + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 2000087, + "Position": { + "X": 0.015197754, + "Y": 1.449585, + "Z": 7.7057495 + }, + "TerritoryId": 179, + "InteractionType": "Interact", + "TargetTerritoryId": 132 + }, + { + "Position": { + "X": 49.65071, + "Y": -8.046952, + "Z": 102.32186 + }, + "TerritoryId": 132, + "InteractionType": "WalkTo", + "$": "New Gridania Navmesh workaround" + }, + { + "DataId": 1000460, + "Position": { + "X": -159.41101, + "Y": 4.054107, + "Z": -4.1047363 + }, + "TerritoryId": 133, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Conjurers' Guild" + ], + "DialogueChoices": [ + { + "Type": "YesNo", + "Prompt": "TEXT_MANFST009_00449_Q2_000_1", + "Yes": true + } + ] + }, + { + "DataId": 1003027, + "Position": { + "X": 4.8981323, + "Y": -1.92944, + "Z": -0.19836426 + }, + "TerritoryId": 205, + "InteractionType": "Interact" + } + ] + } + ] +} diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/507_The Gridanian Envoy.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/507_The Gridanian Envoy.json new file mode 100644 index 00000000..ad1d1103 --- /dev/null +++ b/QuestPaths/ARealmReborn/MSQ-1/Gridania/507_The Gridanian Envoy.json @@ -0,0 +1,383 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1003027, + "Position": { + "X": 4.8981323, + "Y": -1.92944, + "Z": -0.19836426 + }, + "TerritoryId": 205, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2001216, + "Position": { + "X": 45.87172, + "Y": 7.763558, + "Z": 47.41661 + }, + "TerritoryId": 205, + "InteractionType": "Interact", + "TargetTerritoryId": 133 + }, + { + "DataId": 1000100, + "Position": { + "X": 23.819275, + "Y": -8, + "Z": 115.92273 + }, + "TerritoryId": 132, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Gridania] Conjurers' Guild", + "[Gridania] Airship Landing" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1000106, + "Position": { + "X": 29.007324, + "Y": -19.000002, + "Z": 105.485596 + }, + "TerritoryId": 132, + "InteractionType": "Interact", + "DialogueChoices": [ + { + "Type": "YesNo", + "Prompt": "TEXT_MANFST200_00507_Q1_000_1", + "Yes": true + } + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2001666, + "Position": { + "X": 7.179191, + "Y": -21.93796, + "Z": 124.1005 + }, + "TerritoryId": 132, + "InteractionType": "Interact", + "DialogueChoices": [ + { + "Type": "YesNo", + "Prompt": "TEXT_MANFST200_00507_Q2_000_1", + "Yes": true + } + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1002703, + "Position": { + "X": -12.375122, + "Y": 91.499985, + "Z": -0.5340576 + }, + "TerritoryId": 128, + "InteractionType": "Interact", + "DialogueChoices": [ + { + "Type": "YesNo", + "Prompt": "TEXT_MANFST200_00507_Q5_000_1", + "Yes": true + } + ], + "Comment": "Limsa Arrivals Attendant" + }, + { + "DataId": 1002693, + "Position": { + "X": -6.515625, + "Y": 91.49996, + "Z": -13.656921 + }, + "TerritoryId": 128, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1003583, + "Position": { + "X": -7.248047, + "Y": 91.49999, + "Z": -16.128845 + }, + "TerritoryId": 128, + "InteractionType": "Interact", + "TargetTerritoryId": 129, + "DialogueChoices": [ + { + "Type": "List", + "ExcelSheet": "Warp", + "Prompt": null, + "Answer": 131094 + } + ] + }, + { + "DataId": 1001029, + "Position": { + "X": 9.170593, + "Y": 20.999403, + "Z": -15.213318 + }, + "TerritoryId": 129, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "DataId": 8, + "Position": { + "X": -84.00108, + "Y": 20.77683, + "Z": 0.03414845 + }, + "StopDistance": 10, + "TerritoryId": 129, + "InteractionType": "AttuneAetheryte" + }, + { + "DataId": 49, + "Position": { + "X": -213.61108, + "Y": 16.739136, + "Z": 51.80432 + }, + "TerritoryId": 129, + "InteractionType": "AttuneAethernetShard", + "Comment": "Hawkers' Alley" + }, + { + "DataId": 43, + "Position": { + "X": -335.1645, + "Y": 12.619202, + "Z": 56.381958 + }, + "TerritoryId": 129, + "InteractionType": "AttuneAethernetShard", + "Comment": "Arcanists' Guild" + }, + { + "DataId": 44, + "Position": { + "X": -179.40033, + "Y": 4.8065186, + "Z": 182.97095 + }, + "TerritoryId": 129, + "InteractionType": "AttuneAethernetShard", + "Comment": "Fishermens' Guild", + "AethernetShortcut": [ + "[Limsa Lominsa] Arcanists' Guild", + "[Limsa Lominsa] Hawkers' Alley" + ] + }, + { + "Position": { + "X": -83.8817, + "Y": 18.475962, + "Z": -29.903847 + }, + "TerritoryId": 129, + "InteractionType": "WalkTo", + "TargetTerritoryId": 128, + "Comment": "Walk to Culinarians' Guild", + "AethernetShortcut": [ + "[Limsa Lominsa] Fishermens' Guild", + "[Limsa Lominsa] Aetheryte Plaza" + ] + }, + { + "DataId": 42, + "Position": { + "X": -56.50421, + "Y": 44.47998, + "Z": -131.45648 + }, + "TerritoryId": 128, + "InteractionType": "AttuneAethernetShard", + "Comment": "Culinarians' Guild" + }, + { + "DataId": 48, + "Position": { + "X": -5.1728516, + "Y": 44.63257, + "Z": -218.06671 + }, + "TerritoryId": 128, + "InteractionType": "AttuneAethernetShard", + "Comment": "Marauders' Guild" + }, + { + "DataId": 41, + "Position": { + "X": 16.067688, + "Y": 40.787354, + "Z": 68.80286 + }, + "TerritoryId": 128, + "InteractionType": "AttuneAethernetShard", + "Comment": "Aftcastle" + }, + { + "DataId": 1002695, + "Position": { + "X": -25.92511, + "Y": 91.999954, + "Z": -3.6774292 + }, + "TerritoryId": 128, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Limsa Lominsa] The Aftcastle", + "[Limsa Lominsa] Airship Landing" + ], + "DialogueChoices": [ + { + "Type": "YesNo", + "Prompt": "TEXT_MANFST200_00507_Q6_000_1", + "Yes": true + } + ] + } + ] + }, + { + "Sequence": 7, + "Steps": [ + { + "DataId": 2001669, + "Position": { + "X": -11.12384, + "Y": 92.0271, + "Z": 17.166382 + }, + "TerritoryId": 128, + "InteractionType": "Interact", + "DialogueChoices": [ + { + "Type": "YesNo", + "Prompt": "TEXT_MANFST200_00507_Q4_000_1", + "Yes": true + } + ] + } + ] + }, + { + "Sequence": 8, + "Steps": [ + { + "DataId": 1004434, + "Position": { + "X": -27.17633, + "Y": 83.19998, + "Z": 2.304016 + }, + "TerritoryId": 130, + "InteractionType": "Interact", + "DialogueChoices": [ + { + "Type": "YesNo", + "Prompt": "TEXT_MANFST200_00507_Q7_000_1", + "Yes": true + } + ], + "Comment": "Ul'dah Arrivals Attendant" + }, + { + "DataId": 1004336, + "Position": { + "X": -12.619263, + "Y": 82.99987, + "Z": 4.562378 + }, + "TerritoryId": 130, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1004339, + "Position": { + "X": -25.986206, + "Y": 81.799995, + "Z": -31.99823 + }, + "TerritoryId": 130, + "InteractionType": "Interact", + "TargetTerritoryId": 131, + "DialogueChoices": [ + { + "Type": "List", + "ExcelSheet": "Warp", + "Prompt": null, + "Answer": 131096 + } + ] + }, + { + "DataId": 51, + "Position": { + "X": 6.6376343, + "Y": 30.655273, + "Z": -24.826477 + }, + "TerritoryId": 131, + "InteractionType": "AttuneAethernetShard" + }, + { + "DataId": 1001821, + "Position": { + "X": -24.124573, + "Y": 38.000004, + "Z": 85.31323 + }, + "TerritoryId": 131, + "InteractionType": "Interact" + } + ] + } + ] +} diff --git a/QuestPaths/ARealmReborn/MSQ-1/Gridania/85_LNC_Close to Home.json b/QuestPaths/ARealmReborn/MSQ-1/Gridania/85_LNC_Close to Home.json new file mode 100644 index 00000000..13ab3a06 --- /dev/null +++ b/QuestPaths/ARealmReborn/MSQ-1/Gridania/85_LNC_Close to Home.json @@ -0,0 +1,201 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1001140, + "Position": { + "X": 23.788818, + "Y": -8, + "Z": 115.861694 + }, + "TerritoryId": 183, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 49.65071, + "Y": -8.046952, + "Z": 102.32186 + }, + "TerritoryId": 132, + "InteractionType": "WalkTo", + "$": "New Gridania Navmesh workaround" + }, + { + "DataId": 2, + "Position": { + "X": 32.913696, + "Y": 2.670288, + "Z": 30.014404 + }, + "StopDistance": 10, + "TerritoryId": 132, + "InteractionType": "AttuneAetheryte", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 25, + "Position": { + "X": 166.58276, + "Y": -1.7243042, + "Z": 86.13721 + }, + "TerritoryId": 132, + "InteractionType": "AttuneAethernetShard", + "Comment": "Archers' Guild" + }, + { + "Position": { + "X": 102.810745, + "Y": 5.4071116, + "Z": 12.54738 + }, + "TerritoryId": 132, + "InteractionType": "WalkTo", + "TargetTerritoryId": 133 + }, + { + "DataId": 1000768, + "Position": { + "X": 172.35059, + "Y": 15.5, + "Z": -89.951965 + }, + "TerritoryId": 133, + "InteractionType": "Interact", + "Comment": "TODO Questflags", + "$": "If done after aetheryte: 33 1 0 0 0 128" + }, + { + "DataId": 26, + "Position": { + "X": 101.27405, + "Y": 9.018005, + "Z": -111.31464 + }, + "TerritoryId": 133, + "InteractionType": "AttuneAethernetShard", + "Comment": "Leatherworkers' Guild" + }, + { + "DataId": 27, + "Position": { + "X": 121.23291, + "Y": 12.649658, + "Z": -229.63306 + }, + "TerritoryId": 133, + "InteractionType": "AttuneAethernetShard", + "Comment": "Lancers' Guild" + }, + { + "DataId": 1000251, + "Position": { + "X": 147.08167, + "Y": 15.5, + "Z": -267.99426 + }, + "TerritoryId": 133, + "InteractionType": "Interact", + "Comment": "Lancer Receptionist" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1000251, + "Position": { + "X": 147.08167, + "Y": 15.5, + "Z": -267.99426 + }, + "TerritoryId": 133, + "InteractionType": "Interact", + "Comment": "Pick up Class Quest" + }, + { + "DataId": 30, + "Position": { + "X": -73.92999, + "Y": 7.9804688, + "Z": -140.15417 + }, + "TerritoryId": 133, + "InteractionType": "AttuneAethernetShard", + "AethernetShortcut": [ + "[Gridania] Lancers' Guild", + "[Gridania] Leatherworkers' Guild & Shaded Bower" + ], + "Comment": "Mih Khetto's Amphitheatre" + }, + { + "Position": { + "X": -174.09056, + "Y": 10.91981, + "Z": -162.12527 + }, + "TerritoryId": 133, + "InteractionType": "WalkTo" + }, + { + "DataId": 29, + "Position": { + "X": -311.0857, + "Y": 7.94989, + "Z": -177.05048 + }, + "TerritoryId": 133, + "InteractionType": "AttuneAethernetShard", + "Comment": "Botanists' Guild" + }, + { + "DataId": 28, + "Position": { + "X": -145.15906, + "Y": 4.9591064, + "Z": -11.7647705 + }, + "TerritoryId": 133, + "InteractionType": "AttuneAethernetShard", + "AethernetShortcut": [ + "[Gridania] Botanists' Guild", + "[Gridania] Mih Khetto's Amphitheatre" + ], + "Comment": "Conjurers' Guild" + }, + { + "DataId": 1000100, + "Position": { + "X": 23.819275, + "Y": -8, + "Z": 115.92273 + }, + "TerritoryId": 132, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Gridania] Conjurers' Guild", + "[Gridania] Airship Landing" + ] + } + ] + } + ] +} diff --git a/QuestPaths/ARealmReborn/MSQ-1/Shared/245_It's Probably Pirates.json b/QuestPaths/ARealmReborn/MSQ-1/Shared/245_It's Probably Pirates.json index 369a9edc..6985404e 100644 --- a/QuestPaths/ARealmReborn/MSQ-1/Shared/245_It's Probably Pirates.json +++ b/QuestPaths/ARealmReborn/MSQ-1/Shared/245_It's Probably Pirates.json @@ -82,6 +82,7 @@ "Y": 0.9999907, "Z": 211.68835 }, + "StopDistance": 7, "TerritoryId": 129, "InteractionType": "Interact", "TargetTerritoryId": 138, diff --git a/QuestPaths/ARealmReborn/MSQ-1/Shared/272_Life, Materia and Everything.json b/QuestPaths/ARealmReborn/MSQ-1/Shared/272_Life, Materia and Everything.json index 63542a69..ac2d5284 100644 --- a/QuestPaths/ARealmReborn/MSQ-1/Shared/272_Life, Materia and Everything.json +++ b/QuestPaths/ARealmReborn/MSQ-1/Shared/272_Life, Materia and Everything.json @@ -29,7 +29,8 @@ }, "TerritoryId": 141, "InteractionType": "Interact", - "Comment": "'Forging the Spirit'" + "Comment": "'Forging the Spirit'", + "AetheryteShortcut": "Central Thanalan - Black Brush Station" }, { "DataId": 1001426, diff --git a/QuestPaths/ARealmReborn/MSQ-1/Shared/509_The Scions of the Seventh Dawn.json b/QuestPaths/ARealmReborn/MSQ-1/Shared/509_The Scions of the Seventh Dawn.json index 94290f68..2f3dd463 100644 --- a/QuestPaths/ARealmReborn/MSQ-1/Shared/509_The Scions of the Seventh Dawn.json +++ b/QuestPaths/ARealmReborn/MSQ-1/Shared/509_The Scions of the Seventh Dawn.json @@ -20,6 +20,16 @@ { "Sequence": 1, "Steps": [ + { + "Position": { + "X": -316.29608, + "Y": 23.44405, + "Z": -345.24487 + }, + "TerritoryId": 140, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Western Thanalan - Horizon" + }, { "DataId": 1004603, "Position": { @@ -28,14 +38,22 @@ "Z": -381.97913 }, "TerritoryId": 140, - "InteractionType": "Interact", - "AetheryteShortcut": "Western Thanalan - Horizon" + "InteractionType": "Interact" } ] }, { "Sequence": 255, "Steps": [ + { + "Position": { + "X": -493.3852, + "Y": 21, + "Z": -382.50455 + }, + "TerritoryId": 140, + "InteractionType": "WalkTo" + }, { "DataId": 2001711, "Position": { diff --git a/QuestPaths/ARealmReborn/MSQ-1/Shared/510_A Wild Rose By Any Other Name.json b/QuestPaths/ARealmReborn/MSQ-1/Shared/510_A Wild Rose By Any Other Name.json index 818d8a47..794aa215 100644 --- a/QuestPaths/ARealmReborn/MSQ-1/Shared/510_A Wild Rose By Any Other Name.json +++ b/QuestPaths/ARealmReborn/MSQ-1/Shared/510_A Wild Rose By Any Other Name.json @@ -50,6 +50,7 @@ "Y": 0.32037354, "Z": -166.58276 }, + "StopDistance": 10, "TerritoryId": 141, "InteractionType": "AttuneAetheryte", "AetheryteShortcut": "Ul'dah", @@ -68,6 +69,16 @@ "InteractionType": "WalkTo", "TargetTerritoryId": 145 }, + { + "Position": { + "X": -423.0189, + "Y": -37.96352, + "Z": 176.73677 + }, + "TerritoryId": 145, + "InteractionType": "WalkTo", + "$": "Camp Drybone Lantern" + }, { "DataId": 18, "Position": { @@ -75,6 +86,7 @@ "Y": -57.1756, "Z": 142.59558 }, + "StopDistance": 10, "TerritoryId": 145, "InteractionType": "AttuneAetheryte" }, diff --git a/QuestPaths/ARealmReborn/MSQ-1/Shared/511_A Hero in the Making.json b/QuestPaths/ARealmReborn/MSQ-1/Shared/511_A Hero in the Making.json index 59c28f16..576fc56a 100644 --- a/QuestPaths/ARealmReborn/MSQ-1/Shared/511_A Hero in the Making.json +++ b/QuestPaths/ARealmReborn/MSQ-1/Shared/511_A Hero in the Making.json @@ -137,7 +137,7 @@ "Sequence": 255, "Steps": [ { - "TerritoryId": 145, + "TerritoryId": 133, "InteractionType": "UseItem", "ItemId": 30362, "TargetTerritoryId": 140 diff --git a/QuestPaths/ARealmReborn/MSQ-1/Shared/618_Unsolved Mystery.json b/QuestPaths/ARealmReborn/MSQ-1/Shared/618_Unsolved Mystery.json index 6684049e..7a932363 100644 --- a/QuestPaths/ARealmReborn/MSQ-1/Shared/618_Unsolved Mystery.json +++ b/QuestPaths/ARealmReborn/MSQ-1/Shared/618_Unsolved Mystery.json @@ -95,6 +95,26 @@ { "Sequence": 255, "Steps": [ + { + "Position": { + "X": -378.46735, + "Y": -38.009487, + "Z": 159.38092 + }, + "TerritoryId": 145, + "InteractionType": "WalkTo", + "$": "Camp Drybone cliff jump" + }, + { + "Position": { + "X": -379.3895, + "Y": -59.000004, + "Z": 147.99257 + }, + "TerritoryId": 145, + "InteractionType": "WalkTo", + "DisableNavmesh": true + }, { "DataId": 1003929, "Position": { diff --git a/QuestPaths/ARealmReborn/MSQ-1/Shared/660_Into a Copper Hell.json b/QuestPaths/ARealmReborn/MSQ-1/Shared/660_Into a Copper Hell.json index 8c9213ee..4d35fbf0 100644 --- a/QuestPaths/ARealmReborn/MSQ-1/Shared/660_Into a Copper Hell.json +++ b/QuestPaths/ARealmReborn/MSQ-1/Shared/660_Into a Copper Hell.json @@ -46,6 +46,7 @@ "Y": 48.203125, "Z": -227.039 }, + "StopDistance": 10, "TerritoryId": 140, "InteractionType": "AttuneAetheryte", "AethernetShortcut": [ diff --git a/QuestPaths/ARealmReborn/MSQ-1/Shared/677_Fire in the Gloom.json b/QuestPaths/ARealmReborn/MSQ-1/Shared/677_Fire in the Gloom.json index 88ee8a14..1ae9d994 100644 --- a/QuestPaths/ARealmReborn/MSQ-1/Shared/677_Fire in the Gloom.json +++ b/QuestPaths/ARealmReborn/MSQ-1/Shared/677_Fire in the Gloom.json @@ -23,6 +23,16 @@ { "Sequence": 1, "Steps": [ + { + "Position": { + "X": 49.65071, + "Y": -8.046952, + "Z": 102.32186 + }, + "TerritoryId": 132, + "InteractionType": "WalkTo", + "$": "New Gridania Navmesh workaround" + }, { "DataId": 3, "Position": { @@ -63,6 +73,17 @@ { "Sequence": 255, "Steps": [ + { + "Position": { + "X": 49.65071, + "Y": -8.046952, + "Z": 102.32186 + }, + "TerritoryId": 132, + "InteractionType": "WalkTo", + "$": "New Gridania Navmesh workaround", + "AetheryteShortcut": "Gridania" + }, { "DataId": 1000100, "Position": { @@ -71,8 +92,7 @@ "Z": 115.92273 }, "TerritoryId": 132, - "InteractionType": "Interact", - "AetheryteShortcut": "Gridania" + "InteractionType": "Interact" } ] } diff --git a/QuestPaths/ARealmReborn/MSQ-1/Shared/680_The Company You Keep (Twin Adders).json b/QuestPaths/ARealmReborn/MSQ-1/Shared/680_The Company You Keep (Twin Adders).json new file mode 100644 index 00000000..6e716e30 --- /dev/null +++ b/QuestPaths/ARealmReborn/MSQ-1/Shared/680_The Company You Keep (Twin Adders).json @@ -0,0 +1,105 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1004884, + "Position": { + "X": 38.895264, + "Y": 1.2000012, + "Z": 3.463745 + }, + "TerritoryId": 212, + "InteractionType": "Interact", + "DialogueChoices": [ + { + "Type": "YesNo", + "Prompt": "TEXT_MANFST302_00680_Q1_000_1", + "Yes": true + } + ] + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1002394, + "Position": { + "X": -69.5354, + "Y": -0.50095016, + "Z": -9.99469 + }, + "TerritoryId": 132, + "InteractionType": "Interact", + "AetheryteShortcut": "Gridania", + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_MANFST302_00680_Q2_000_1", + "Answer": "TEXT_MANFST302_00680_A2_000_2" + } + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1001263, + "Position": { + "X": 181.41443, + "Y": -2.3519497, + "Z": -240.40594 + }, + "TerritoryId": 133, + "InteractionType": "Interact", + "TargetTerritoryId": 152, + "AethernetShortcut": [ + "[Gridania] Aetheryte Plaza", + "[Gridania] Lancers' Guild" + ], + "DialogueChoices": [ + { + "Type": "List", + "ExcelSheet": "Warp", + "Prompt": null, + "Answer": 131077 + } + ] + }, + { + "DataId": 1004886, + "Position": { + "X": 30.319702, + "Y": 8.422709, + "Z": 475.30322 + }, + "TerritoryId": 152, + "InteractionType": "SinglePlayerDuty" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1002394, + "Position": { + "X": -69.5354, + "Y": -0.50095016, + "Z": -9.99469 + }, + "TerritoryId": 132, + "InteractionType": "Interact", + "AetheryteShortcut": "Gridania" + } + ] + } + ] +} diff --git a/QuestPaths/ARealmReborn/MSQ-1/Shared/681_The Company You Keep (Maelstrom).json b/QuestPaths/ARealmReborn/MSQ-1/Shared/681_The Company You Keep (Maelstrom).json index 09c9602f..a469fae8 100644 --- a/QuestPaths/ARealmReborn/MSQ-1/Shared/681_The Company You Keep (Maelstrom).json +++ b/QuestPaths/ARealmReborn/MSQ-1/Shared/681_The Company You Keep (Maelstrom).json @@ -4,8 +4,25 @@ "QuestSequence": [ { "Sequence": 0, - "Steps": [], - "Comment": "Quest start is intentionally empty, so you pick a Grand Company" + "Steps": [ + { + "DataId": 1004885, + "Position": { + "X": 36.453735, + "Y": 1.2000011, + "Z": 4.6845093 + }, + "TerritoryId": 212, + "InteractionType": "Interact", + "DialogueChoices": [ + { + "Type": "YesNo", + "Prompt": "TEXT_MANSEA302_00681_Q1_000_1", + "Yes": true + } + ] + } + ] }, { "Sequence": 1, diff --git a/QuestPaths/ARealmReborn/MSQ-1/Shared/683_Wood's Will Be Done.json b/QuestPaths/ARealmReborn/MSQ-1/Shared/683_Wood's Will Be Done.json new file mode 100644 index 00000000..a1ad6984 --- /dev/null +++ b/QuestPaths/ARealmReborn/MSQ-1/Shared/683_Wood's Will Be Done.json @@ -0,0 +1,62 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1002394, + "Position": { + "X": -69.5354, + "Y": -0.50095016, + "Z": -9.99469 + }, + "TerritoryId": 132, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "TerritoryId": 132, + "InteractionType": "UseItem", + "ItemId": 30362, + "TargetTerritoryId": 140 + }, + { + "Position": { + "X": -492.96475, + "Y": 20.999884, + "Z": -380.82272 + }, + "TerritoryId": 140, + "InteractionType": "WalkTo" + }, + { + "DataId": 2001711, + "Position": { + "X": -480.9181, + "Y": 18.00103, + "Z": -386.862 + }, + "TerritoryId": 140, + "InteractionType": "Interact", + "TargetTerritoryId": 212 + }, + { + "DataId": 1005012, + "Position": { + "X": 22.507019, + "Y": 0.9999986, + "Z": -2.02948 + }, + "TerritoryId": 212, + "InteractionType": "Interact" + } + ] + } + ] +} diff --git a/QuestPaths/ARealmReborn/MSQ-1/Shared/700_My Little Chocobo (Twin Adder).json b/QuestPaths/ARealmReborn/MSQ-1/Shared/700_My Little Chocobo (Twin Adder).json new file mode 100644 index 00000000..5dd6d397 --- /dev/null +++ b/QuestPaths/ARealmReborn/MSQ-1/Shared/700_My Little Chocobo (Twin Adder).json @@ -0,0 +1,78 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1000168, + "Position": { + "X": -75.48645, + "Y": -0.5013741, + "Z": -5.081299 + }, + "TerritoryId": 132, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1002394, + "Position": { + "X": -69.5354, + "Y": -0.50095016, + "Z": -9.99469 + }, + "TerritoryId": 132, + "InteractionType": "Instruction", + "Comment": "Buy Serpent Chocobo Issuance" + }, + { + "DataId": 1000136, + "Position": { + "X": 32.303345, + "Y": -0.050583772, + "Z": 70.29822 + }, + "TerritoryId": 132, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1006001, + "Position": { + "X": 35.38562, + "Y": -0.89902794, + "Z": 67.551636 + }, + "StopDistance": 7, + "TerritoryId": 132, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1000136, + "Position": { + "X": 32.303345, + "Y": -0.050583772, + "Z": 70.29822 + }, + "TerritoryId": 132, + "InteractionType": "Interact" + } + ] + } + ] +} diff --git a/QuestPaths/ARealmReborn/MSQ-1/Shared/701_My Little Chocobo (Maelstrom).json b/QuestPaths/ARealmReborn/MSQ-1/Shared/701_My Little Chocobo (Maelstrom).json new file mode 100644 index 00000000..8bf69cc4 --- /dev/null +++ b/QuestPaths/ARealmReborn/MSQ-1/Shared/701_My Little Chocobo (Maelstrom).json @@ -0,0 +1,99 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1003281, + "Position": { + "X": 97.520386, + "Y": 40.248554, + "Z": 81.1322 + }, + "TerritoryId": 128, + "InteractionType": "Interact", + "AetheryteShortcut": "Limsa Lominsa", + "AethernetShortcut": ["[Limsa Lominsa] Aetheryte Plaza", "[Limsa Lominsa] The Aftcastle"] + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1002387, + "Position": { + "X": 95.750244, + "Y": 40.250286, + "Z": 76.67651 + }, + "TerritoryId": 128, + "InteractionType": "Instruction", + "Comment": "Buy Storm Chocobo Issuance" + }, + { + "DataId": 1003597, + "Position": { + "X": 8.194031, + "Y": 39.999973, + "Z": 17.746216 + }, + "TerritoryId": 128, + "InteractionType": "Interact", + "TargetTerritoryId": 129, + "DialogueChoices": [ + { + "Type": "List", + "ExcelSheet": "Warp", + "Prompt": null, + "Answer": 131094 + } + ] + }, + { + "DataId": 1001027, + "Position": { + "X": 45.792236, + "Y": 20, + "Z": -8.1026 + }, + "TerritoryId": 129, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1006002, + "Position": { + "X": 49.576538, + "Y": 20, + "Z": -5.722229 + }, + "StopDistance": 7, + "TerritoryId": 129, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1001027, + "Position": { + "X": 45.792236, + "Y": 20, + "Z": -8.1026 + }, + "TerritoryId": 129, + "InteractionType": "Interact" + } + ] + } + ] +} diff --git a/QuestPaths/ARealmReborn/MSQ-2/.gitkeep b/QuestPaths/ARealmReborn/MSQ-2/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/QuestPaths/ARealmReborn/MSQ-2/A2/3856_We Come in Peace.json b/QuestPaths/ARealmReborn/MSQ-2/A2/3856_We Come in Peace.json new file mode 100644 index 00000000..c8fc28a6 --- /dev/null +++ b/QuestPaths/ARealmReborn/MSQ-2/A2/3856_We Come in Peace.json @@ -0,0 +1,44 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1000168, + "Position": { + "X": -75.48645, + "Y": -0.5013741, + "Z": -5.081299 + }, + "TerritoryId": 132, + "InteractionType": "Interact", + "AetheryteShortcut": "Gridania", + "SkipIf": [ + "AetheryteShortcutIfInSameTerritory" + ] + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": -75.48645, + "Y": -0.5013741, + "Z": -5.081299 + }, + "TerritoryId": 132, + "InteractionType": "UseItem", + "ItemId": 6001, + "SkipIf": [ + "ChocoboUnlocked" + ], + "Comment": "Use Chocobo whistle (if not yet unlocked)" + } + ] + } + ] +} diff --git a/QuestPaths/quest-v1.json b/QuestPaths/quest-v1.json index 0cf0ac3f..9ad2c19b 100644 --- a/QuestPaths/quest-v1.json +++ b/QuestPaths/quest-v1.json @@ -350,7 +350,9 @@ "Never", "FlyingLocked", "FlyingUnlocked", - "DifferentTerritory" + "DifferentTerritory", + "ChocoboUnlocked", + "AetheryteShortcutIfInSameTerritory" ] } }, diff --git a/Questionable.Model/V1/Converter/SkipConditionConverter.cs b/Questionable.Model/V1/Converter/SkipConditionConverter.cs index dd38ac4f..3ae25769 100644 --- a/Questionable.Model/V1/Converter/SkipConditionConverter.cs +++ b/Questionable.Model/V1/Converter/SkipConditionConverter.cs @@ -9,5 +9,7 @@ public sealed class SkipConditionConverter() : EnumConverter(Val { ESkipCondition.Never, "Never" }, { ESkipCondition.FlyingLocked, "FlyingLocked" }, { ESkipCondition.FlyingUnlocked, "FlyingUnlocked" }, + { ESkipCondition.ChocoboUnlocked, "ChocoboUnlocked" }, + { ESkipCondition.AetheryteShortcutIfInSameTerritory, "AetheryteShortcutIfInSameTerritory" }, }; } diff --git a/Questionable.Model/V1/ESkipCondition.cs b/Questionable.Model/V1/ESkipCondition.cs index 4f2639d4..fd8ee6a3 100644 --- a/Questionable.Model/V1/ESkipCondition.cs +++ b/Questionable.Model/V1/ESkipCondition.cs @@ -10,4 +10,6 @@ public enum ESkipCondition Never, FlyingLocked, FlyingUnlocked, + ChocoboUnlocked, + AetheryteShortcutIfInSameTerritory, } diff --git a/Questionable/Configuration.cs b/Questionable/Configuration.cs index d77af785..7dc415b9 100644 --- a/Questionable/Configuration.cs +++ b/Questionable/Configuration.cs @@ -1,4 +1,5 @@ using Dalamud.Configuration; +using FFXIVClientStructs.FFXIV.Client.UI.Agent; using LLib.ImGui; namespace Questionable; @@ -15,6 +16,7 @@ internal sealed class Configuration : IPluginConfiguration { public bool AutoAcceptNextQuest { get; set; } public uint MountId { get; set; } = 71; + public GrandCompany GrandCompany { get; set; } = GrandCompany.None; } internal sealed class AdvancedConfiguration diff --git a/Questionable/Controller/GameUiController.cs b/Questionable/Controller/GameUiController.cs index 116af081..5830eced 100644 --- a/Questionable/Controller/GameUiController.cs +++ b/Questionable/Controller/GameUiController.cs @@ -386,10 +386,8 @@ internal sealed class GameUiController : IDisposable { if (_questController.CurrentQuest?.Quest.QuestId == 245) { - // TODO Test this _logger.LogInformation("Closing ContentsTutorial"); AtkUnitBase* addon = (AtkUnitBase*)args.Addon; - //addon->FireCallbackInt(-2); addon->FireCallbackInt(13); } } diff --git a/Questionable/Controller/MovementController.cs b/Questionable/Controller/MovementController.cs index 7f01ee3a..cc732962 100644 --- a/Questionable/Controller/MovementController.cs +++ b/Questionable/Controller/MovementController.cs @@ -44,7 +44,7 @@ internal sealed class MovementController : IDisposable public bool IsNavmeshReady => _navmeshIpc.IsReady; public bool IsPathRunning => _navmeshIpc.IsPathRunning; public bool IsPathfinding => _pathfindTask is { IsCompleted: false }; - public DestinationData? Destination { get; private set; } + public DestinationData? Destination { get; set; } public DateTime MovementStartedAt { get; private set; } = DateTime.MaxValue; public void Update() diff --git a/Questionable/Controller/QuestController.cs b/Questionable/Controller/QuestController.cs index 494a181e..7cd71c4d 100644 --- a/Questionable/Controller/QuestController.cs +++ b/Questionable/Controller/QuestController.cs @@ -1,23 +1,12 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Numerics; -using System.Threading; -using System.Threading.Tasks; -using Dalamud.Game.ClientState.Conditions; using Dalamud.Game.ClientState.Keys; -using Dalamud.Game.ClientState.Objects.Types; using Dalamud.Plugin.Services; -using FFXIVClientStructs.FFXIV.Application.Network.WorkDefinitions; -using FFXIVClientStructs.FFXIV.Client.Game; -using FFXIVClientStructs.FFXIV.Client.Game.UI; using Microsoft.Extensions.Logging; using Questionable.Controller.Steps; -using Questionable.Data; -using Questionable.External; using Questionable.Model; using Questionable.Model.V1; -using Questionable.Model.V1.Converter; namespace Questionable.Controller; @@ -464,11 +453,6 @@ internal sealed class QuestController } } - // TODO is this still required? - public sealed record StepProgress( - DateTime StartedAt, - int DialogueChoicesSelected = 0); - public void Skip(ushort questQuestId, byte currentQuestSequence) { lock (_lock) @@ -498,4 +482,7 @@ internal sealed class QuestController } } } + + public sealed record StepProgress( + DateTime StartedAt); } diff --git a/Questionable/Controller/Steps/BaseFactory/AetheryteShortcut.cs b/Questionable/Controller/Steps/BaseFactory/AetheryteShortcut.cs index 5a3f76c6..5a9b3b86 100644 --- a/Questionable/Controller/Steps/BaseFactory/AetheryteShortcut.cs +++ b/Questionable/Controller/Steps/BaseFactory/AetheryteShortcut.cs @@ -25,7 +25,11 @@ internal static class AetheryteShortcut var task = serviceProvider.GetRequiredService() .With(step, step.AetheryteShortcut.Value, aetheryteData.TerritoryIds[step.AetheryteShortcut.Value]); - return [new WaitConditionTask(gameFunctions.CanTeleport, "CanTeleport"), task]; + return + [ + new WaitConditionTask(() => gameFunctions.CanTeleport(step.AetheryteShortcut.Value), "CanTeleport"), + task + ]; } public ITask CreateTask(Quest quest, QuestSequence sequence, QuestStep step) @@ -64,6 +68,12 @@ internal static class AetheryteShortcut ushort territoryType = clientState.TerritoryType; if (ExpectedTerritoryId == territoryType) { + if (Step.SkipIf.Contains(ESkipCondition.AetheryteShortcutIfInSameTerritory)) + { + logger.LogInformation("Skipping aetheryte teleport due to SkipIf"); + return false; + } + Vector3 pos = clientState.LocalPlayer!.Position; if (aetheryteData.CalculateDistance(pos, territoryType, TargetAetheryte) < 11 || (Step.AethernetShortcut != null && diff --git a/Questionable/Controller/Steps/BaseFactory/SkipCondition.cs b/Questionable/Controller/Steps/BaseFactory/SkipCondition.cs index b7fa8e40..6757aa20 100644 --- a/Questionable/Controller/Steps/BaseFactory/SkipCondition.cs +++ b/Questionable/Controller/Steps/BaseFactory/SkipCondition.cs @@ -1,5 +1,8 @@ using System; +using System.Collections.Generic; +using System.Linq; using FFXIVClientStructs.FFXIV.Application.Network.WorkDefinitions; +using FFXIVClientStructs.FFXIV.Client.Game.UI; using FFXIVClientStructs.FFXIV.Client.System.Framework; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -17,11 +20,13 @@ internal static class SkipCondition if (step.SkipIf.Contains(ESkipCondition.Never)) return null; - if (step.SkipIf.Count == 0 && step.CompletionQuestVariablesFlags.Count == 0) + var relevantConditions = + step.SkipIf.Where(x => x != ESkipCondition.AetheryteShortcutIfInSameTerritory).ToList(); + if (relevantConditions.Count == 0 && step.CompletionQuestVariablesFlags.Count == 0) return null; return serviceProvider.GetRequiredService() - .With(step, quest.QuestId); + .With(step, relevantConditions, quest.QuestId); } } @@ -30,33 +35,42 @@ internal static class SkipCondition GameFunctions gameFunctions) : ITask { public QuestStep Step { get; set; } = null!; + public List SkipConditions { get; set; } = null!; public ushort QuestId { get; set; } - public ITask With(QuestStep step, ushort questId) + public ITask With(QuestStep step, List skipConditions, ushort questId) { Step = step; + SkipConditions = skipConditions; QuestId = questId; return this; } - public bool Start() + public unsafe bool Start() { - logger.LogInformation("Checking skip conditions; {ConfiguredConditions}", string.Join(",", Step.SkipIf)); + logger.LogInformation("Checking skip conditions; {ConfiguredConditions}", string.Join(",", SkipConditions)); - if (Step.SkipIf.Contains(ESkipCondition.FlyingUnlocked) && + if (SkipConditions.Contains(ESkipCondition.FlyingUnlocked) && gameFunctions.IsFlyingUnlocked(Step.TerritoryId)) { logger.LogInformation("Skipping step, as flying is unlocked"); return true; } - if (Step.SkipIf.Contains(ESkipCondition.FlyingLocked) && + if (SkipConditions.Contains(ESkipCondition.FlyingLocked) && !gameFunctions.IsFlyingUnlocked(Step.TerritoryId)) { logger.LogInformation("Skipping step, as flying is locked"); return true; } + if (SkipConditions.Contains(ESkipCondition.ChocoboUnlocked) && + PlayerState.Instance()->IsMountUnlocked(1)) + { + logger.LogInformation("Skipping step, as chocobo is unlocked"); + return true; + } + if (Step is { DataId: not null, @@ -87,6 +101,6 @@ internal static class SkipCondition public ETaskResult Update() => ETaskResult.SkipRemainingTasksForStep; - public override string ToString() => $"CheckSkip({string.Join(", ", Step.SkipIf)})"; + public override string ToString() => $"CheckSkip({string.Join(", ", SkipConditions)})"; } } diff --git a/Questionable/Controller/Steps/BaseFactory/WaitAtEnd.cs b/Questionable/Controller/Steps/BaseFactory/WaitAtEnd.cs index 59f2c0ec..8c9ed5e9 100644 --- a/Questionable/Controller/Steps/BaseFactory/WaitAtEnd.cs +++ b/Questionable/Controller/Steps/BaseFactory/WaitAtEnd.cs @@ -35,6 +35,7 @@ internal static class WaitAtEnd return [ serviceProvider.GetRequiredService(), notInCombat, + serviceProvider.GetRequiredService(), Next(quest, sequence, step) ]; diff --git a/Questionable/Controller/Steps/InteractionFactory/EquipItem.cs b/Questionable/Controller/Steps/InteractionFactory/EquipItem.cs index 802bec61..865c171f 100644 --- a/Questionable/Controller/Steps/InteractionFactory/EquipItem.cs +++ b/Questionable/Controller/Steps/InteractionFactory/EquipItem.cs @@ -27,8 +27,7 @@ internal static class EquipItem } } - internal sealed class DoEquip(IDataManager dataManager, ILogger logger) - : AbstractDelayedTask(TimeSpan.FromSeconds(1)) + internal sealed class DoEquip(IDataManager dataManager, ILogger logger) : ITask { private static readonly IReadOnlyList SourceInventoryTypes = [ @@ -55,6 +54,8 @@ internal static class EquipItem private Item _item = null!; private List _targetSlots = []; + private DateTime _continueAt = DateTime.MaxValue; + public ITask With(uint itemId) { _itemId = itemId; @@ -64,7 +65,32 @@ internal static class EquipItem return this; } - protected override unsafe bool StartInternal() + public bool Start() + { + Equip(); + _continueAt = DateTime.Now.AddSeconds(1); + return true; + } + + public unsafe ETaskResult Update() + { + if (DateTime.Now < _continueAt) + return ETaskResult.StillRunning; + + InventoryManager* inventoryManager = InventoryManager.Instance(); + if (inventoryManager == null) + return ETaskResult.StillRunning; + + if (_targetSlots.Any(x => + inventoryManager->GetInventorySlot(InventoryType.EquippedItems, x)->ItemID == _itemId)) + return ETaskResult.TaskComplete; + + Equip(); + _continueAt = DateTime.Now.AddSeconds(1); + return ETaskResult.StillRunning; + } + + private unsafe bool Equip() { var inventoryManager = InventoryManager.Instance(); if (inventoryManager == null) @@ -108,26 +134,13 @@ internal static class EquipItem int result = inventoryManager->MoveItemSlot(sourceInventoryType, sourceSlot, InventoryType.EquippedItems, targetSlot, 1); logger.LogInformation("MoveItemSlot result: {Result}", result); - return true; + return result == 0; } } return false; } - protected override unsafe ETaskResult UpdateInternal() - { - InventoryManager* inventoryManager = InventoryManager.Instance(); - if (inventoryManager == null) - return ETaskResult.StillRunning; - - if (_targetSlots.Any(x => - inventoryManager->GetInventorySlot(InventoryType.EquippedItems, x)->ItemID == _itemId)) - return ETaskResult.TaskComplete; - - return ETaskResult.StillRunning; - } - private static List? GetEquipSlot(Item item) { return item.EquipSlotCategory.Row switch diff --git a/Questionable/Controller/Steps/InteractionFactory/UseItem.cs b/Questionable/Controller/Steps/InteractionFactory/UseItem.cs index 7b6d043d..323d4a79 100644 --- a/Questionable/Controller/Steps/InteractionFactory/UseItem.cs +++ b/Questionable/Controller/Steps/InteractionFactory/UseItem.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; +using FFXIVClientStructs.FFXIV.Client.Game; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; using Questionable.Controller.Steps.BaseTasks; using Questionable.Model; using Questionable.Model.V1; @@ -9,6 +11,8 @@ namespace Questionable.Controller.Steps.InteractionFactory; internal static class UseItem { + public const int VesperBayAetheryteTicket = 30362; + internal sealed class Factory(IServiceProvider serviceProvider) : ITaskFactory { public IEnumerable CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step) @@ -45,30 +49,58 @@ internal static class UseItem => throw new InvalidOperationException(); } - internal abstract class UseItemBase : ITask + internal abstract class UseItemBase(ILogger logger) : ITask { private bool _usedItem; private DateTime _continueAt; + private int _itemCount; public uint ItemId { get; set; } protected abstract bool UseItem(); - public bool Start() + public unsafe bool Start() { + InventoryManager* inventoryManager = InventoryManager.Instance(); + if (inventoryManager == null) + throw new TaskException("No InventoryManager"); + + _itemCount = inventoryManager->GetInventoryItemCount(ItemId); + if (_itemCount == 0) + throw new TaskException($"Don't have any {ItemId} in inventory (NQ only)"); + _usedItem = UseItem(); - if (ItemId == 30362) // vesper bay aether ticket + if (ItemId == VesperBayAetheryteTicket) _continueAt = DateTime.Now.AddSeconds(11); else _continueAt = DateTime.Now.AddSeconds(2); return true; } - public ETaskResult Update() + public unsafe ETaskResult Update() { if (DateTime.Now <= _continueAt) return ETaskResult.StillRunning; + if (ItemId == VesperBayAetheryteTicket) + { + InventoryManager* inventoryManager = InventoryManager.Instance(); + if (inventoryManager == null) + { + logger.LogWarning("InventoryManager is not available"); + return ETaskResult.StillRunning; + } + + int itemCount = inventoryManager->GetInventoryItemCount(ItemId); + if (itemCount == _itemCount) + { + // TODO Better handling for game-provided errors, i.e. reacting to the 'Could not use' messages. UseItem() is successful in this case (and returns 0) + logger.LogInformation("Attempted to use vesper bay aetheryte ticket, but it didn't consume an item - reattempting next frame"); + _usedItem = false; + return ETaskResult.StillRunning; + } + } + if (!_usedItem) { _usedItem = UseItem(); @@ -81,7 +113,7 @@ internal static class UseItem } - internal sealed class UseOnGround(GameFunctions gameFunctions) : UseItemBase + internal sealed class UseOnGround(GameFunctions gameFunctions, ILogger logger) : UseItemBase(logger) { public uint DataId { get; set; } @@ -97,7 +129,7 @@ internal static class UseItem public override string ToString() => $"UseItem({ItemId} on ground at {DataId})"; } - internal sealed class UseOnObject(GameFunctions gameFunctions) : UseItemBase + internal sealed class UseOnObject(GameFunctions gameFunctions, ILogger logger) : UseItemBase(logger) { public uint DataId { get; set; } @@ -113,7 +145,7 @@ internal static class UseItem public override string ToString() => $"UseItem({ItemId} on {DataId})"; } - internal sealed class Use(GameFunctions gameFunctions) : UseItemBase + internal sealed class Use(GameFunctions gameFunctions, ILogger logger) : UseItemBase(logger) { public ITask With(uint itemId) { diff --git a/Questionable/GameFunctions.cs b/Questionable/GameFunctions.cs index 3c3da805..96ed837a 100644 --- a/Questionable/GameFunctions.cs +++ b/Questionable/GameFunctions.cs @@ -32,6 +32,7 @@ using ContentFinderCondition = Lumina.Excel.GeneratedSheets.ContentFinderConditi using ContentTalk = Lumina.Excel.GeneratedSheets.ContentTalk; using Emote = Lumina.Excel.GeneratedSheets.Emote; using GameObject = Dalamud.Game.ClientState.Objects.Types.GameObject; +using GrandCompany = FFXIVClientStructs.FFXIV.Client.UI.Agent.GrandCompany; using Quest = Questionable.Model.Quest; using TerritoryType = Lumina.Excel.GeneratedSheets.TerritoryType; @@ -102,6 +103,50 @@ internal sealed unsafe class GameFunctions public DateTime ReturnRequestedAt { get; set; } = DateTime.MinValue; public (ushort CurrentQuest, byte Sequence) GetCurrentQuest() + { + var (currentQuest, sequence) = GetCurrentQuestInternal(); + QuestManager* questManager = QuestManager.Instance(); + PlayerState* playerState = PlayerState.Instance(); + + if (currentQuest == 0) + { + if (_clientState.TerritoryType == 181) // Starting in Limsa + return (107, 0); + if (_clientState.TerritoryType == 183) // Starting in Gridania + return (39, 0); + return default; + } + else if (currentQuest == 681) + { + // if we have already picked up the GC quest, just return the progress for it + if (questManager->IsQuestAccepted(currentQuest) || QuestManager.IsQuestComplete(currentQuest)) + return (currentQuest, sequence); + + // The company you keep... + return _configuration.General.GrandCompany switch + { + GrandCompany.TwinAdder => (680, 0), + GrandCompany.Maelstrom => (681, 0), + _ => default + }; + } + else if (currentQuest == 3856 && !playerState->IsMountUnlocked(1)) // we come in peace + { + ushort chocoboQuest = (GrandCompany)playerState->GrandCompany switch + { + GrandCompany.TwinAdder => 700, + GrandCompany.Maelstrom => 701, + _ => 0 + }; + + if (chocoboQuest != 0 && !QuestManager.IsQuestComplete(chocoboQuest)) + return (chocoboQuest, QuestManager.GetQuestSequence(chocoboQuest)); + } + + return (currentQuest, sequence); + } + + public (ushort CurrentQuest, byte Sequence) GetCurrentQuestInternal() { ushort currentQuest; @@ -135,12 +180,7 @@ internal sealed unsafe class GameFunctions currentQuest = scenarioTree->Data->CurrentScenarioQuest; if (currentQuest == 0) - { - if (_clientState.TerritoryType == 181) // Starting Limsa - return (107, 0); - return default; - } return (currentQuest, QuestManager.GetQuestSequence(currentQuest)); } @@ -157,39 +197,23 @@ internal sealed unsafe class GameFunctions var uiState = UIState.Instance(); return uiState != null && uiState->IsAetheryteUnlocked(aetheryteId); - /* - var telepo = Telepo.Instance(); - if (telepo == null || telepo->UpdateAetheryteList() == null) - { - subIndex = 0; - return false; - } - - for (ulong i = 0; i < telepo->TeleportList.Size(); ++i) - { - var data = telepo->TeleportList.Get(i); - if (data.AetheryteId == aetheryteId) - { - subIndex = data.SubIndex; - return true; - } - } - - subIndex = 0; - return false; - */ } public bool IsAetheryteUnlocked(EAetheryteLocation aetheryteLocation) => IsAetheryteUnlocked((uint)aetheryteLocation, out _); - public bool CanTeleport() => ActionManager.Instance()->GetActionStatus(ActionType.Action, 5) == 0; + public bool CanTeleport(EAetheryteLocation aetheryteLocation) + { + if ((ushort)aetheryteLocation == PlayerState.Instance()->HomeAetheryteId && + ActionManager.Instance()->GetActionStatus(ActionType.GeneralAction, 8) == 0) + return true; + + return ActionManager.Instance()->GetActionStatus(ActionType.Action, 5) == 0; + } public bool TeleportAetheryte(uint aetheryteId) { - var status = ActionManager.Instance()->GetActionStatus(ActionType.Action, 5); - if (status != 0) - return false; + if (IsAetheryteUnlocked(aetheryteId, out var subIndex)) { @@ -201,8 +225,9 @@ internal sealed unsafe class GameFunctions return true; } - // fallback if return isn't available or (more likely) on a different aetheryte - return Telepo.Instance()->Teleport(aetheryteId, subIndex); + if (ActionManager.Instance()->GetActionStatus(ActionType.Action, 5) == 0) + // fallback if return isn't available or (more likely) on a different aetheryte + return Telepo.Instance()->Teleport(aetheryteId, subIndex); } return false; diff --git a/Questionable/Questionable.csproj b/Questionable/Questionable.csproj index 64a7caf1..da28f5fe 100644 --- a/Questionable/Questionable.csproj +++ b/Questionable/Questionable.csproj @@ -1,7 +1,7 @@  net8.0-windows - 0.14 + 0.15 12 enable true diff --git a/Questionable/Windows/ConfigWindow.cs b/Questionable/Windows/ConfigWindow.cs index ebfe6059..3a3ce083 100644 --- a/Questionable/Windows/ConfigWindow.cs +++ b/Questionable/Windows/ConfigWindow.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; using Dalamud.Interface.Colors; @@ -8,6 +7,7 @@ using Dalamud.Plugin.Services; using ImGuiNET; using LLib.ImGui; using Lumina.Excel.GeneratedSheets; +using GrandCompany = FFXIVClientStructs.FFXIV.Client.UI.Agent.GrandCompany; namespace Questionable.Windows; @@ -19,6 +19,9 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig private readonly uint[] _mountIds; private readonly string[] _mountNames; + private readonly string[] _grandCompanyNames = + ["None (manually pick quest)", "Maelstrom", "Twin Adder"/*, "Immortal Flames"*/]; + [SuppressMessage("Performance", "CA1861", Justification = "One time initialization")] public ConfigWindow(DalamudPluginInterface pluginInterface, Configuration configuration, IDataManager dataManager) : base("Config - Questionable###QuestionableConfig", ImGuiWindowFlags.AlwaysAutoResize) @@ -58,6 +61,14 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig Save(); } + int grandCompany = (int)_configuration.General.GrandCompany; + if (ImGui.Combo("Preferred Grand Company", ref grandCompany, _grandCompanyNames, + _grandCompanyNames.Length)) + { + _configuration.General.GrandCompany = (GrandCompany)grandCompany; + Save(); + } + ImGui.EndTabItem(); } diff --git a/Questionable/Windows/DebugWindow.cs b/Questionable/Windows/DebugWindow.cs index 468a455f..380e7819 100644 --- a/Questionable/Windows/DebugWindow.cs +++ b/Questionable/Windows/DebugWindow.cs @@ -310,8 +310,12 @@ internal sealed class DebugWindow : LWindow, IPersistableWindowConfig map->FlagMapMarker.TerritoryId != _clientState.TerritoryType || !_navmeshIpc.IsReady); if (ImGui.Button("Move to Flag")) + { + _movementController.Destination = null; _gameFunctions.ExecuteCommand( $"/vnav {(_gameFunctions.IsFlyingUnlockedInCurrentZone() ? "flyflag" : "moveflag")}"); + } + ImGui.EndDisabled(); ImGui.SameLine();