From 51e5faae69ee7de8548f005c62cb989f910a0a59 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Mon, 3 Jun 2024 14:20:02 +0200 Subject: [PATCH] Fix mount selection, make chat-messages multilingual, various path updates --- QuestPaths/AssemblyQuestLoader.cs | 4 +- .../4507_Touring Anagnorisis Part 1.json | 24 ++++ .../Elpis/4511_An Expected Guest.json | 9 ++ .../4241_Carrots Its Whats for Dinner.json | 12 +- .../4358_Old Sharlayan New to You.json | 3 +- .../4359_Hitting the Books.json | 3 +- .../4367_Estate Visitor.json | 3 +- .../4368_For Thavnair Bound.json | 3 +- .../4370_A Fishermans Friend.json | 9 -- .../4376_The Satrap of Radz at Han.json | 3 +- .../MSQ/B-Garlemald/4381_A Capital Idea.json | 3 +- .../C-MareLamentorum/4408_Returning Home.json | 3 +- .../MSQ/D-Thavnair2/4409_Skies Aflame.json | 8 +- .../4425_Their Greatest Contribution.json | 8 +- .../4438_Thou Must Live Die and Know.json | 3 +- .../MSQ/F-Labyrinthos2/4440_Outside Help.json | 6 +- .../MSQ/H-6.1/4526_Newfound Adventure.json | 6 +- .../MSQ/H-6.1/4531_Sharing the Wealth.json | 10 +- .../MSQ/H-6.1/4533_Restricted Reading.json | 10 +- .../MSQ/I-6.2/4593_Shadowed Remnants.json | 37 +++++- .../I-6.2/4594_Where Everything Begins.json | 2 +- .../MSQ/I-6.2/4595_Groping in the Dark.json | 24 ++++ .../4599_A World with Light and Life.json | 1 + .../MSQ/J-6.3/4672_Kindled Spirit.json | 35 +++++- .../MSQ/J-6.3/4675_A Dragons Resolve.json | 2 + .../MSQ/J-6.3/4676_Paths Barred.json | 13 +- .../MSQ/J-6.3/4677_Desires Untold.json | 12 +- .../J-6.3/4678_Gods Revel Lands Tremble.json | 2 + .../MSQ/K-6.4/4735_Currying Flavor.json | 4 +- .../Endwalker/MSQ/K-6.4/4736_Going Haam.json | 26 +++- .../MSQ/K-6.4/4737_Like Fear to Flame.json | 62 ++++++++-- .../MSQ/K-6.4/4738_The Fallen Empire.json | 52 ++++++-- .../MSQ/K-6.4/4739_Bonds of Trust.json | 7 +- .../MSQ/K-6.4/4740_Lunar Rendezvous.json | 90 +++++++++++--- .../K-6.4/4741_The Red Side of the Moon.json | 56 +++++++-- .../MSQ/K-6.4/4742_Abyssal Dark.json | 1 + .../MSQ/K-6.4/4743_The Dark Throne.json | 17 ++- .../MSQ/L-6.5/4744_Seeking the Light.json | 2 + .../MSQ/L-6.5/4745_Appealing the Masses.json | 29 ++++- .../MSQ/L-6.5/4746_In Defiance of Fate.json | 10 +- .../MSQ/L-6.5/4747_Back to Action.json | 19 +-- .../MSQ/L-6.5/4748_Down in the Dark.json | 1 + .../MSQ/M-6.55/4753_The Coming Dawn.json | 3 +- QuestPaths/QuestPaths.csproj | 6 +- .../MSQ/F-Tempest/3654_Shadowbringers.json | 3 +- .../MSQ/G-5.1/3673_Shaken Resolve.json | 6 +- ...3682_Vows of Virtue, Deeds of Cruelty.json | 3 +- .../MSQ/I-5.3/3773_Fraying Threads.json | 3 +- .../MSQ/I-5.3/3774_Food for the Soul.json | 3 +- .../MSQ/J-5.4/4009_Reviving the Legacy.json | 3 +- .../MSQ/J-5.4/4016_Futures Rewritten.json | 3 +- .../MSQ/K-5.5/4063_When the Dust Settles.json | 3 +- QuestPaths/quest-v1.json | 21 +++- Questionable/Controller/MovementController.cs | 4 + Questionable/Controller/QuestController.cs | 116 ++++++++++-------- Questionable/GameFunctions.cs | 70 ++++++++++- Questionable/Model/V1/ChatMessage.cs | 7 ++ .../V1/Converter/SkipConditionConverter.cs | 1 + Questionable/Model/V1/DialogueChoice.cs | 2 +- Questionable/Model/V1/ESkipCondition.cs | 1 + Questionable/Model/V1/QuestStep.cs | 2 +- Questionable/Questionable.csproj | 2 +- 62 files changed, 720 insertions(+), 176 deletions(-) create mode 100644 Questionable/Model/V1/ChatMessage.cs diff --git a/QuestPaths/AssemblyQuestLoader.cs b/QuestPaths/AssemblyQuestLoader.cs index 14264cf8..460e1971 100644 --- a/QuestPaths/AssemblyQuestLoader.cs +++ b/QuestPaths/AssemblyQuestLoader.cs @@ -1,4 +1,5 @@ -using System; +#if RELEASE +using System; using System.IO; using System.IO.Compression; @@ -23,3 +24,4 @@ public static class AssemblyQuestLoader } } } +#endif diff --git a/QuestPaths/Endwalker/AetherCurrents/Elpis/4507_Touring Anagnorisis Part 1.json b/QuestPaths/Endwalker/AetherCurrents/Elpis/4507_Touring Anagnorisis Part 1.json index 63573553..96ea596d 100644 --- a/QuestPaths/Endwalker/AetherCurrents/Elpis/4507_Touring Anagnorisis Part 1.json +++ b/QuestPaths/Endwalker/AetherCurrents/Elpis/4507_Touring Anagnorisis Part 1.json @@ -59,6 +59,14 @@ }, "TerritoryId": 961, "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ], "$.0": "[1]", "$.1": "QuestVariables if done first: 17 0 0 0 0 64" }, @@ -71,6 +79,14 @@ }, "TerritoryId": 961, "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ], "$.0": "[2]", "$.2": "QuestVariables if done after [1]: 33 16 0 0 0 96", "$.3": "QuestVariables if done after [3]: 32 17 0 0 0 160" @@ -84,6 +100,14 @@ }, "TerritoryId": 961, "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ], "$.0": 3, "$.1": "QuestVariables if done first: 16 1 0 0 0 128" } diff --git a/QuestPaths/Endwalker/AetherCurrents/Elpis/4511_An Expected Guest.json b/QuestPaths/Endwalker/AetherCurrents/Elpis/4511_An Expected Guest.json index 6713a6f2..aed15bc8 100644 --- a/QuestPaths/Endwalker/AetherCurrents/Elpis/4511_An Expected Guest.json +++ b/QuestPaths/Endwalker/AetherCurrents/Elpis/4511_An Expected Guest.json @@ -20,6 +20,15 @@ { "Sequence": 1, "Steps": [ + { + "Position": { + "X": -588.7367, + "Y": 158.76302, + "Z": -195.30913 + }, + "TerritoryId": 961, + "InteractionType": "WalkTo" + }, { "Position": { "X": -318.20203, diff --git a/QuestPaths/Endwalker/AetherCurrents/Mare Lamentorum/4241_Carrots Its Whats for Dinner.json b/QuestPaths/Endwalker/AetherCurrents/Mare Lamentorum/4241_Carrots Its Whats for Dinner.json index cb226cfe..a5096100 100644 --- a/QuestPaths/Endwalker/AetherCurrents/Mare Lamentorum/4241_Carrots Its Whats for Dinner.json +++ b/QuestPaths/Endwalker/AetherCurrents/Mare Lamentorum/4241_Carrots Its Whats for Dinner.json @@ -35,7 +35,9 @@ "StopDistance": 3, "TerritoryId": 959, "InteractionType": "Say", - "ChatMessage": "carrot of happiness" + "ChatMessage": { + "Key": "TEXT_AKTKZE002_04241_SYSTEM_000_010" + } }, { "DataId": 1041790, @@ -47,7 +49,9 @@ "StopDistance": 3, "TerritoryId": 959, "InteractionType": "Say", - "ChatMessage": "carrot of happiness", + "ChatMessage": { + "Key": "TEXT_AKTKZE002_04241_SYSTEM_000_010" + }, "$.1": "QuestVariables if done after [1]: 2 0 0 0 0 192" }, { @@ -65,7 +69,9 @@ "StopDistance": 3, "TerritoryId": 959, "InteractionType": "Say", - "ChatMessage": "carrot of happiness" + "ChatMessage": { + "Key": "TEXT_AKTKZE002_04241_SYSTEM_000_010" + } } ] }, diff --git a/QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4358_Old Sharlayan New to You.json b/QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4358_Old Sharlayan New to You.json index 41b4c872..fa29ba68 100644 --- a/QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4358_Old Sharlayan New to You.json +++ b/QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4358_Old Sharlayan New to You.json @@ -236,7 +236,8 @@ "Z": 4.5318604 }, "TerritoryId": 962, - "InteractionType": "Interact" + "InteractionType": "Interact", + "TargetTerritoryId": 987 }, { "DataId": 1038586, diff --git a/QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4359_Hitting the Books.json b/QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4359_Hitting the Books.json index e634e7db..641b2ced 100644 --- a/QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4359_Hitting the Books.json +++ b/QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4359_Hitting the Books.json @@ -28,7 +28,8 @@ "Z": 14.81335 }, "TerritoryId": 987, - "InteractionType": "Interact" + "InteractionType": "Interact", + "TargetTerritoryId": 962 }, { "DataId": 185, diff --git a/QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4367_Estate Visitor.json b/QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4367_Estate Visitor.json index 8718794b..58fd3a90 100644 --- a/QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4367_Estate Visitor.json +++ b/QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4367_Estate Visitor.json @@ -99,7 +99,8 @@ "AethernetShortcut": [ "[Old Sharlayan] The Leveilleur Estate", "[Old Sharlayan] The Baldesion Annex" - ] + ], + "TargetTerritoryId": 987 }, { "DataId": 1040291, diff --git a/QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4368_For Thavnair Bound.json b/QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4368_For Thavnair Bound.json index 43983bf3..190c4e3f 100644 --- a/QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4368_For Thavnair Bound.json +++ b/QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4368_For Thavnair Bound.json @@ -28,7 +28,8 @@ "Z": 14.785889 }, "TerritoryId": 987, - "InteractionType": "Interact" + "InteractionType": "Interact", + "TargetTerritoryId": 962 }, { "DataId": 1038592, diff --git a/QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4370_A Fishermans Friend.json b/QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4370_A Fishermans Friend.json index b8c61111..357f41b7 100644 --- a/QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4370_A Fishermans Friend.json +++ b/QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4370_A Fishermans Friend.json @@ -46,15 +46,12 @@ "InteractionType": "CutsceneSelectString", "DialogueChoices": [ { - "ExcelSheet": "quest/043/AktKma114_04370", "Answer": "TEXT_AKTKMA114_04370_A2_000_088" }, { - "ExcelSheet": "quest/043/AktKma114_04370", "Answer": "TEXT_AKTKMA114_04370_A3_000_098" }, { - "ExcelSheet": "quest/043/AktKma114_04370", "Answer": "TEXT_AKTKMA114_04370_A5_000_107" } ] @@ -75,15 +72,12 @@ "InteractionType": "CutsceneSelectString", "DialogueChoices": [ { - "ExcelSheet": "quest/043/AktKma114_04370", "Answer": "TEXT_AKTKMA114_04370_A6_000_149" }, { - "ExcelSheet": "quest/043/AktKma114_04370", "Answer": "TEXT_AKTKMA114_04370_A7_000_158" }, { - "ExcelSheet": "quest/043/AktKma114_04370", "Answer": "TEXT_AKTKMA114_04370_A8_000_164" } ] @@ -104,15 +98,12 @@ "InteractionType": "CutsceneSelectString", "DialogueChoices": [ { - "ExcelSheet": "quest/043/AktKma114_04370", "Answer": "TEXT_AKTKMA114_04370_A9_000_200" }, { - "ExcelSheet": "quest/043/AktKma114_04370", "Answer": "TEXT_AKTKMA114_04370_A10_000_209" }, { - "ExcelSheet": "quest/043/AktKma114_04370", "Answer": "TEXT_AKTKMA114_04370_A11_000_218" } ] diff --git a/QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4376_The Satrap of Radz at Han.json b/QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4376_The Satrap of Radz at Han.json index e928ce09..460f35a7 100644 --- a/QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4376_The Satrap of Radz at Han.json +++ b/QuestPaths/Endwalker/MSQ/A-Thavnair1-Labyrinthos1/4376_The Satrap of Radz at Han.json @@ -103,7 +103,8 @@ "AethernetShortcut": [ "[Old Sharlayan] Aetheryte Plaza", "[Old Sharlayan] The Baldesion Annex" - ] + ], + "TargetTerritoryId": 987 }, { "DataId": 1038589, diff --git a/QuestPaths/Endwalker/MSQ/B-Garlemald/4381_A Capital Idea.json b/QuestPaths/Endwalker/MSQ/B-Garlemald/4381_A Capital Idea.json index a889d075..fa6d6a21 100644 --- a/QuestPaths/Endwalker/MSQ/B-Garlemald/4381_A Capital Idea.json +++ b/QuestPaths/Endwalker/MSQ/B-Garlemald/4381_A Capital Idea.json @@ -32,7 +32,8 @@ "AethernetShortcut": [ "[Old Sharlayan] The Studium", "[Old Sharlayan] The Baldesion Annex" - ] + ], + "TargetTerritoryId": 987 }, { "DataId": 1038784, diff --git a/QuestPaths/Endwalker/MSQ/C-MareLamentorum/4408_Returning Home.json b/QuestPaths/Endwalker/MSQ/C-MareLamentorum/4408_Returning Home.json index 52a8df53..b0e712a6 100644 --- a/QuestPaths/Endwalker/MSQ/C-MareLamentorum/4408_Returning Home.json +++ b/QuestPaths/Endwalker/MSQ/C-MareLamentorum/4408_Returning Home.json @@ -100,7 +100,8 @@ "Z": 4.5318604 }, "TerritoryId": 962, - "InteractionType": "Interact" + "InteractionType": "Interact", + "TargetTerritoryId": 987 }, { "DataId": 2012188, diff --git a/QuestPaths/Endwalker/MSQ/D-Thavnair2/4409_Skies Aflame.json b/QuestPaths/Endwalker/MSQ/D-Thavnair2/4409_Skies Aflame.json index dcc7ef9c..069e95df 100644 --- a/QuestPaths/Endwalker/MSQ/D-Thavnair2/4409_Skies Aflame.json +++ b/QuestPaths/Endwalker/MSQ/D-Thavnair2/4409_Skies Aflame.json @@ -29,7 +29,8 @@ "Z": 4.55803 }, "TerritoryId": 962, - "InteractionType": "Interact" + "InteractionType": "Interact", + "TargetTerritoryId": 987 } ] }, @@ -37,6 +38,11 @@ "Sequence": 2, "Steps": [ { + "Position": { + "X": 0, + "Y": 0, + "Z": 0 + }, "TerritoryId": 957, "AetheryteShortcut": "Thavnair - Yedlihmad", "InteractionType": "WalkTo", diff --git a/QuestPaths/Endwalker/MSQ/E-Elpis/4425_Their Greatest Contribution.json b/QuestPaths/Endwalker/MSQ/E-Elpis/4425_Their Greatest Contribution.json index 125576d4..39be27cd 100644 --- a/QuestPaths/Endwalker/MSQ/E-Elpis/4425_Their Greatest Contribution.json +++ b/QuestPaths/Endwalker/MSQ/E-Elpis/4425_Their Greatest Contribution.json @@ -126,7 +126,9 @@ }, "TerritoryId": 961, "InteractionType": "Say", - "ChatMessage": "I have a favor to ask" + "ChatMessage": { + "Key": "TEXT_AKTKME107_04425_SAYTODO_000_190" + } } ] }, @@ -142,7 +144,9 @@ }, "TerritoryId": 961, "InteractionType": "Say", - "ChatMessage": "Please, Emet-Selch" + "ChatMessage": { + "Key": "TEXT_AKTKME107_04425_SAYTODO_000_210" + } } ] }, diff --git a/QuestPaths/Endwalker/MSQ/E-Elpis/4438_Thou Must Live Die and Know.json b/QuestPaths/Endwalker/MSQ/E-Elpis/4438_Thou Must Live Die and Know.json index d6764c77..d21a65b0 100644 --- a/QuestPaths/Endwalker/MSQ/E-Elpis/4438_Thou Must Live Die and Know.json +++ b/QuestPaths/Endwalker/MSQ/E-Elpis/4438_Thou Must Live Die and Know.json @@ -65,7 +65,8 @@ "AethernetShortcut": [ "[Old Sharlayan] Aetheryte Plaza", "[Old Sharlayan] The Baldesion Annex" - ] + ], + "TargetTerritoryId": 987 }, { "DataId": 1040161, diff --git a/QuestPaths/Endwalker/MSQ/F-Labyrinthos2/4440_Outside Help.json b/QuestPaths/Endwalker/MSQ/F-Labyrinthos2/4440_Outside Help.json index b42a5831..7e488b39 100644 --- a/QuestPaths/Endwalker/MSQ/F-Labyrinthos2/4440_Outside Help.json +++ b/QuestPaths/Endwalker/MSQ/F-Labyrinthos2/4440_Outside Help.json @@ -49,7 +49,8 @@ "AethernetShortcut": [ "[Old Sharlayan] Aetheryte Plaza", "[Old Sharlayan] The Baldesion Annex" - ] + ], + "TargetTerritoryId": 987 } ] }, @@ -64,7 +65,8 @@ "Z": 14.785889 }, "TerritoryId": 987, - "InteractionType": "Interact" + "InteractionType": "Interact", + "TargetTerritoryId": 962 }, { "DataId": 1039683, diff --git a/QuestPaths/Endwalker/MSQ/H-6.1/4526_Newfound Adventure.json b/QuestPaths/Endwalker/MSQ/H-6.1/4526_Newfound Adventure.json index 80a609d4..9a499661 100644 --- a/QuestPaths/Endwalker/MSQ/H-6.1/4526_Newfound Adventure.json +++ b/QuestPaths/Endwalker/MSQ/H-6.1/4526_Newfound Adventure.json @@ -14,7 +14,8 @@ }, "TerritoryId": 156, "InteractionType": "Interact", - "DisableNavmesh": true + "DisableNavmesh": true, + "TargetTerritoryId": 351 }, { "DataId": 1041232, @@ -39,7 +40,8 @@ "Z": 27.5 }, "TerritoryId": 351, - "InteractionType": "Interact" + "InteractionType": "Interact", + "TargetTerritoryId": 156 }, { "DataId": 1039570, diff --git a/QuestPaths/Endwalker/MSQ/H-6.1/4531_Sharing the Wealth.json b/QuestPaths/Endwalker/MSQ/H-6.1/4531_Sharing the Wealth.json index d6156e09..e7efd53a 100644 --- a/QuestPaths/Endwalker/MSQ/H-6.1/4531_Sharing the Wealth.json +++ b/QuestPaths/Endwalker/MSQ/H-6.1/4531_Sharing the Wealth.json @@ -66,7 +66,15 @@ }, "StopDistance": 5, "TerritoryId": 957, - "InteractionType": "Interact" + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] }, { "DataId": 1039606, diff --git a/QuestPaths/Endwalker/MSQ/H-6.1/4533_Restricted Reading.json b/QuestPaths/Endwalker/MSQ/H-6.1/4533_Restricted Reading.json index bf47298a..da7d334f 100644 --- a/QuestPaths/Endwalker/MSQ/H-6.1/4533_Restricted Reading.json +++ b/QuestPaths/Endwalker/MSQ/H-6.1/4533_Restricted Reading.json @@ -107,10 +107,15 @@ "Y": 1.2090492, "Z": 118.133255 }, + "StopDistance": 4, "TerritoryId": 957, "InteractionType": "WalkTo", "AetheryteShortcut": "Thavnair - Palaka's Stand", - "Fly": true + "Fly": true, + "SkipIf": [ + "FlyingLocked" + ], + "Comment": "TODO Verify; there's some weird shenanigans happening with navmesh not moving to coords 'below' it" }, { "DataId": 2012847, @@ -120,7 +125,8 @@ "Z": 119.43237 }, "TerritoryId": 957, - "InteractionType": "Interact" + "InteractionType": "Interact", + "Mount": false } ] }, diff --git a/QuestPaths/Endwalker/MSQ/I-6.2/4593_Shadowed Remnants.json b/QuestPaths/Endwalker/MSQ/I-6.2/4593_Shadowed Remnants.json index 276af52c..80552cbd 100644 --- a/QuestPaths/Endwalker/MSQ/I-6.2/4593_Shadowed Remnants.json +++ b/QuestPaths/Endwalker/MSQ/I-6.2/4593_Shadowed Remnants.json @@ -30,6 +30,14 @@ }, "TerritoryId": 1089, "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ], "$.0": "[1]", "$.1": "QuestVariables if done first: 1 0 0 0 0 128" }, @@ -42,6 +50,14 @@ }, "TerritoryId": 1089, "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ], "$.0": "[2]", "$.1": "QuestVariables if done after [1]: 2 0 0 0 0 192" }, @@ -54,6 +70,14 @@ }, "TerritoryId": 1089, "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ], "$.0": "[3]", "$.1": "QuestVariables if done after [1, 2]: 3 0 0 0 0 224" }, @@ -65,7 +89,15 @@ "Z": -49.45453 }, "TerritoryId": 1089, - "InteractionType": "Interact" + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] } ] }, @@ -114,7 +146,7 @@ "Z": 206.78001 }, "TerritoryId": 1089, - "InteractionType": "Interact" + "InteractionType": "WalkTo" } ] }, @@ -128,6 +160,7 @@ "Y": -718.4441, "Z": 206.77502 }, + "StopDistance": 5, "TerritoryId": 1089, "InteractionType": "Interact" } diff --git a/QuestPaths/Endwalker/MSQ/I-6.2/4594_Where Everything Begins.json b/QuestPaths/Endwalker/MSQ/I-6.2/4594_Where Everything Begins.json index ffcd8b48..fd2435b9 100644 --- a/QuestPaths/Endwalker/MSQ/I-6.2/4594_Where Everything Begins.json +++ b/QuestPaths/Endwalker/MSQ/I-6.2/4594_Where Everything Begins.json @@ -12,7 +12,7 @@ "Y": -718.33905, "Z": 207.87354 }, - "StopDistance": 5, + "StopDistance": 7, "TerritoryId": 1089, "InteractionType": "Interact" } diff --git a/QuestPaths/Endwalker/MSQ/I-6.2/4595_Groping in the Dark.json b/QuestPaths/Endwalker/MSQ/I-6.2/4595_Groping in the Dark.json index f4c4b44a..f60e2a87 100644 --- a/QuestPaths/Endwalker/MSQ/I-6.2/4595_Groping in the Dark.json +++ b/QuestPaths/Endwalker/MSQ/I-6.2/4595_Groping in the Dark.json @@ -40,6 +40,14 @@ }, "TerritoryId": 1089, "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ], "$.0": "[1]", "$.1": "QuestVariables if done first: 1 0 0 0 0 32" }, @@ -52,6 +60,14 @@ }, "TerritoryId": 1089, "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ], "$.0": "[2]", "$.1": "QuestVariables if done after [1]: 2 0 0 0 0 96" }, @@ -64,6 +80,14 @@ }, "TerritoryId": 1089, "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ], "$.0": "[3]" } ] diff --git a/QuestPaths/Endwalker/MSQ/I-6.2/4599_A World with Light and Life.json b/QuestPaths/Endwalker/MSQ/I-6.2/4599_A World with Light and Life.json index d43ea26d..68e8801b 100644 --- a/QuestPaths/Endwalker/MSQ/I-6.2/4599_A World with Light and Life.json +++ b/QuestPaths/Endwalker/MSQ/I-6.2/4599_A World with Light and Life.json @@ -39,6 +39,7 @@ "Y": 1.7999947, "Z": -180.07172 }, + "StopDistance": 5, "TerritoryId": 963, "InteractionType": "Interact", "AethernetShortcut": [ diff --git a/QuestPaths/Endwalker/MSQ/J-6.3/4672_Kindled Spirit.json b/QuestPaths/Endwalker/MSQ/J-6.3/4672_Kindled Spirit.json index 56c68240..aa7203ab 100644 --- a/QuestPaths/Endwalker/MSQ/J-6.3/4672_Kindled Spirit.json +++ b/QuestPaths/Endwalker/MSQ/J-6.3/4672_Kindled Spirit.json @@ -50,6 +50,14 @@ 16028, 16029 ], + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ], "$.0": "[1]", "$.1": "QuestVariables if done first: 16 5(enemy kill count) 0 0 0 64" }, @@ -62,6 +70,14 @@ }, "TerritoryId": 958, "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ], "$.0": "[2]", "$.1": "QuestVariables if done after [1]: 33 5 0 0 0 96" }, @@ -74,6 +90,14 @@ }, "TerritoryId": 958, "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ], "$.0": "[3]", "$.1": "QuestVariables if done after [1, 2]: 49 21 0 0 0 112" }, @@ -89,7 +113,16 @@ "EnemySpawnType": "AfterInteraction", "KillEnemyDataIds": [ 16030 - ] + ], + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ], + "$.2": "QuestVariables if done first: 16 0 16 0 0 128" } ] }, diff --git a/QuestPaths/Endwalker/MSQ/J-6.3/4675_A Dragons Resolve.json b/QuestPaths/Endwalker/MSQ/J-6.3/4675_A Dragons Resolve.json index dba2d1f3..97ce3779 100644 --- a/QuestPaths/Endwalker/MSQ/J-6.3/4675_A Dragons Resolve.json +++ b/QuestPaths/Endwalker/MSQ/J-6.3/4675_A Dragons Resolve.json @@ -12,6 +12,7 @@ "Y": -173, "Z": 126.35986 }, + "StopDistance": 7, "TerritoryId": 1119, "InteractionType": "Interact" } @@ -122,6 +123,7 @@ "Y": -17.202883, "Z": 705.0431 }, + "StopDistance": 5, "TerritoryId": 958, "InteractionType": "Interact" } diff --git a/QuestPaths/Endwalker/MSQ/J-6.3/4676_Paths Barred.json b/QuestPaths/Endwalker/MSQ/J-6.3/4676_Paths Barred.json index 4fbfeeea..a730dfa4 100644 --- a/QuestPaths/Endwalker/MSQ/J-6.3/4676_Paths Barred.json +++ b/QuestPaths/Endwalker/MSQ/J-6.3/4676_Paths Barred.json @@ -12,6 +12,7 @@ "Y": -17.44166, "Z": 707.3014 }, + "StopDistance": 5, "TerritoryId": 958, "InteractionType": "Interact" } @@ -29,6 +30,7 @@ }, "TerritoryId": 963, "InteractionType": "Interact", + "AetheryteShortcut": "Radz-at-Han", "AethernetShortcut": [ "[Radz-at-Han] Aetheryte Plaza", "[Radz-at-Han] Meghaduta" @@ -62,7 +64,16 @@ "Z": -585.1987 }, "TerritoryId": 957, - "InteractionType": "Interact" + "InteractionType": "Interact", + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] }, { "DataId": 1037647, diff --git a/QuestPaths/Endwalker/MSQ/J-6.3/4677_Desires Untold.json b/QuestPaths/Endwalker/MSQ/J-6.3/4677_Desires Untold.json index c86a52a2..4d7218e3 100644 --- a/QuestPaths/Endwalker/MSQ/J-6.3/4677_Desires Untold.json +++ b/QuestPaths/Endwalker/MSQ/J-6.3/4677_Desires Untold.json @@ -28,7 +28,8 @@ "Z": -616.14404 }, "TerritoryId": 957, - "InteractionType": "Interact" + "InteractionType": "Interact", + "Fly": true } ] }, @@ -43,12 +44,13 @@ "Z": -715.44977 }, "TerritoryId": 957, - "InteractionType": "Interact" + "InteractionType": "Interact", + "Fly": true } ] }, { - "Sequence": 3, + "Sequence": 4, "Steps": [ { "TerritoryId": 1125, @@ -67,9 +69,9 @@ "Y": 89.42017, "Z": -636.86584 }, + "StopDistance": 5, "TerritoryId": 957, - "InteractionType": "Interact", - "Comment": "Unsure if this is the right data id" + "InteractionType": "Interact" } ] } diff --git a/QuestPaths/Endwalker/MSQ/J-6.3/4678_Gods Revel Lands Tremble.json b/QuestPaths/Endwalker/MSQ/J-6.3/4678_Gods Revel Lands Tremble.json index f28d03f5..2af3b071 100644 --- a/QuestPaths/Endwalker/MSQ/J-6.3/4678_Gods Revel Lands Tremble.json +++ b/QuestPaths/Endwalker/MSQ/J-6.3/4678_Gods Revel Lands Tremble.json @@ -12,6 +12,7 @@ "Y": 89.42017, "Z": -636.86584 }, + "StopDistance": 5, "TerritoryId": 957, "InteractionType": "Interact" } @@ -29,6 +30,7 @@ }, "TerritoryId": 963, "InteractionType": "Interact", + "AetheryteShortcut": "Radz-at-Han", "AethernetShortcut": [ "[Radz-at-Han] Aetheryte Plaza", "[Radz-at-Han] Meghaduta" diff --git a/QuestPaths/Endwalker/MSQ/K-6.4/4735_Currying Flavor.json b/QuestPaths/Endwalker/MSQ/K-6.4/4735_Currying Flavor.json index 43c8e26e..2c9dc168 100644 --- a/QuestPaths/Endwalker/MSQ/K-6.4/4735_Currying Flavor.json +++ b/QuestPaths/Endwalker/MSQ/K-6.4/4735_Currying Flavor.json @@ -46,6 +46,7 @@ "Y": 0.59503174, "Z": -141.71057 }, + "StopDistance": 5, "TerritoryId": 963, "InteractionType": "Interact" } @@ -61,7 +62,8 @@ "Z": -140.01839 }, "TerritoryId": 963, - "InteractionType": "UseItem" + "InteractionType": "UseItem", + "ItemId": 2003461 } ] }, diff --git a/QuestPaths/Endwalker/MSQ/K-6.4/4736_Going Haam.json b/QuestPaths/Endwalker/MSQ/K-6.4/4736_Going Haam.json index 0d12835a..a4a44a7e 100644 --- a/QuestPaths/Endwalker/MSQ/K-6.4/4736_Going Haam.json +++ b/QuestPaths/Endwalker/MSQ/K-6.4/4736_Going Haam.json @@ -30,8 +30,10 @@ "Y": 1.2359009, "Z": 5.9662476 }, + "StopDistance": 4, "TerritoryId": 1161, - "InteractionType": "Interact" + "InteractionType": "Interact", + "TargetTerritoryId": 963 }, { "DataId": 1039602, @@ -78,6 +80,7 @@ "Y": 4.357494, "Z": 0.7476196 }, + "StopDistance": 5, "TerritoryId": 962, "InteractionType": "Interact" } @@ -86,6 +89,19 @@ { "Sequence": 4, "Steps": [ + { + "Position": { + "X": 6.0711417, + "Y": -28.723347, + "Z": -43.467506 + }, + "TerritoryId": 956, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Labyrinthos - Sharlayan Hamlet", + "SkipIf": [ + "FlyingUnlocked" + ] + }, { "DataId": 1045407, "Position": { @@ -94,7 +110,8 @@ "Z": -125.96332 }, "TerritoryId": 956, - "InteractionType": "Interact" + "InteractionType": "Interact", + "Fly": true } ] }, @@ -109,7 +126,8 @@ "Z": 54.276245 }, "TerritoryId": 956, - "InteractionType": "Interact" + "InteractionType": "Interact", + "Fly": true } ] }, @@ -123,6 +141,7 @@ "Y": -16.146997, "Z": 236.22485 }, + "StopDistance": 5, "TerritoryId": 962, "InteractionType": "Interact" } @@ -148,6 +167,7 @@ "Y": -16.147, "Z": 235.70605 }, + "StopDistance": 7, "TerritoryId": 962, "InteractionType": "Interact" } diff --git a/QuestPaths/Endwalker/MSQ/K-6.4/4737_Like Fear to Flame.json b/QuestPaths/Endwalker/MSQ/K-6.4/4737_Like Fear to Flame.json index 5969b787..0360fbc7 100644 --- a/QuestPaths/Endwalker/MSQ/K-6.4/4737_Like Fear to Flame.json +++ b/QuestPaths/Endwalker/MSQ/K-6.4/4737_Like Fear to Flame.json @@ -12,6 +12,7 @@ "Y": -16.147, "Z": 235.70605 }, + "StopDistance": 7, "TerritoryId": 962, "InteractionType": "Interact" } @@ -27,8 +28,10 @@ "Y": 23.803606, "Z": 404.9286 }, + "StopDistance": 7, "TerritoryId": 958, - "InteractionType": "Interact" + "InteractionType": "Interact", + "AetheryteShortcut": "Garlemald - Camp Broken Glass" } ] }, @@ -43,7 +46,8 @@ "Z": -191.48547 }, "TerritoryId": 958, - "InteractionType": "Interact" + "InteractionType": "Interact", + "AetheryteShortcut": "Garlemald - Tertium" } ] }, @@ -58,7 +62,15 @@ "Z": -156.02356 }, "TerritoryId": 958, - "InteractionType": "Interact" + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] }, { "DataId": 1045491, @@ -68,7 +80,15 @@ "Z": -178.27118 }, "TerritoryId": 958, - "InteractionType": "Interact" + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] }, { "DataId": 1037774, @@ -78,7 +98,15 @@ "Z": -212.14618 }, "TerritoryId": 958, - "InteractionType": "Interact" + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] }, { "DataId": 1045489, @@ -88,7 +116,15 @@ "Z": -213.18384 }, "TerritoryId": 958, - "InteractionType": "Interact" + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] }, { "DataId": 1037766, @@ -98,7 +134,16 @@ "Z": -265.00348 }, "TerritoryId": 958, - "InteractionType": "Interact" + "InteractionType": "Interact", + "Comment": "TODO Check flags", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 8 + ] } ] }, @@ -113,7 +158,8 @@ "Z": -637.56775 }, "TerritoryId": 958, - "InteractionType": "Interact" + "InteractionType": "Interact", + "Fly": true } ] } diff --git a/QuestPaths/Endwalker/MSQ/K-6.4/4738_The Fallen Empire.json b/QuestPaths/Endwalker/MSQ/K-6.4/4738_The Fallen Empire.json index be4e80c0..81e38a8a 100644 --- a/QuestPaths/Endwalker/MSQ/K-6.4/4738_The Fallen Empire.json +++ b/QuestPaths/Endwalker/MSQ/K-6.4/4738_The Fallen Empire.json @@ -12,6 +12,7 @@ "Y": 15.5581665, "Z": -638.3002 }, + "StopDistance": 5, "TerritoryId": 958, "InteractionType": "Interact" } @@ -28,7 +29,8 @@ "Z": -620.08093 }, "TerritoryId": 958, - "InteractionType": "Interact" + "InteractionType": "Interact", + "Fly": true } ] }, @@ -58,7 +60,16 @@ "Z": 67.063354 }, "TerritoryId": 1160, - "InteractionType": "Interact" + "InteractionType": "Interact", + "Comment": "TODO Check Flags", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] }, { "DataId": 1045493, @@ -68,7 +79,15 @@ "Z": 42.435303 }, "TerritoryId": 1160, - "InteractionType": "Interact" + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] }, { "DataId": 2013350, @@ -78,7 +97,15 @@ "Z": 26.382812 }, "TerritoryId": 1160, - "InteractionType": "Interact" + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] }, { "DataId": 1045492, @@ -88,7 +115,15 @@ "Z": -9.353821 }, "TerritoryId": 1160, - "InteractionType": "Interact" + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] } ] }, @@ -117,8 +152,10 @@ "Y": 23.803606, "Z": 406.05774 }, + "StopDistance": 7, "TerritoryId": 958, - "InteractionType": "Interact" + "InteractionType": "Interact", + "AetheryteShortcut": "Garlemald - Camp Broken Glass" } ] }, @@ -133,7 +170,8 @@ "Z": -202.99078 }, "TerritoryId": 958, - "InteractionType": "Interact" + "InteractionType": "Interact", + "AetheryteShortcut": "Garlemald - Tertium" } ] } diff --git a/QuestPaths/Endwalker/MSQ/K-6.4/4739_Bonds of Trust.json b/QuestPaths/Endwalker/MSQ/K-6.4/4739_Bonds of Trust.json index 38097802..bb8fb52f 100644 --- a/QuestPaths/Endwalker/MSQ/K-6.4/4739_Bonds of Trust.json +++ b/QuestPaths/Endwalker/MSQ/K-6.4/4739_Bonds of Trust.json @@ -12,6 +12,7 @@ "Y": -36.65, "Z": -206.74457 }, + "StopDistance": 7, "TerritoryId": 958, "InteractionType": "Interact" } @@ -26,11 +27,14 @@ "Y": 10.8, "Z": -663.8825 }, + "StopDistance": 1, "TerritoryId": 958, "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", "KillEnemyDataIds": [ 16332 - ] + ], + "Fly": true } ] }, @@ -44,6 +48,7 @@ "Y": 10.8, "Z": -659.75433 }, + "StopDistance": 7, "TerritoryId": 958, "InteractionType": "Interact" } diff --git a/QuestPaths/Endwalker/MSQ/K-6.4/4740_Lunar Rendezvous.json b/QuestPaths/Endwalker/MSQ/K-6.4/4740_Lunar Rendezvous.json index d11cf33b..35d89bc3 100644 --- a/QuestPaths/Endwalker/MSQ/K-6.4/4740_Lunar Rendezvous.json +++ b/QuestPaths/Endwalker/MSQ/K-6.4/4740_Lunar Rendezvous.json @@ -12,6 +12,7 @@ "Y": -36.65, "Z": -204.97449 }, + "StopDistance": 5, "TerritoryId": 958, "InteractionType": "Interact" } @@ -28,7 +29,9 @@ "Z": 585.1072 }, "TerritoryId": 959, - "InteractionType": "Interact" + "InteractionType": "Interact", + "AetheryteShortcut": "Mare Lamentorum - Sinus Lacrimarum", + "Fly": true } ] }, @@ -43,13 +46,27 @@ "Z": 407.27856 }, "TerritoryId": 959, - "InteractionType": "Interact" + "InteractionType": "Interact", + "Fly": true } ] }, { "Sequence": 3, "Steps": [ + { + "DataId": 2012664, + "Position": { + "X": -26.901672, + "Y": -130.47992, + "Z": -580.4685 + }, + "TerritoryId": 959, + "InteractionType": "Interact", + "AetheryteShortcut": "Mare Lamentorum - Bestways Burrow", + "SkipIf": ["FlyingUnlocked"], + "Comment": "Check if the flying unlocked check is good enough" + }, { "DataId": 1039686, "Position": { @@ -58,7 +75,8 @@ "Z": -494.31604 }, "TerritoryId": 959, - "InteractionType": "Interact" + "InteractionType": "Interact", + "Fly": true } ] }, @@ -87,9 +105,18 @@ "Y": -49.589592, "Z": -626.42865 }, + "StopDistance": 6, "TerritoryId": 959, "InteractionType": "Emote", - "Emote": "rally" + "Emote": "rally", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] }, { "DataId": 1045470, @@ -98,20 +125,18 @@ "Y": -49.589596, "Z": -622.3087 }, + "StopDistance": 6, "TerritoryId": 959, "InteractionType": "Emote", - "Emote": "rally" - }, - { - "DataId": 1045473, - "Position": { - "X": 152.42236, - "Y": -49.589592, - "Z": -614.8623 - }, - "TerritoryId": 959, - "InteractionType": "Emote", - "Emote": "rally" + "Emote": "rally", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] }, { "DataId": 1045472, @@ -120,9 +145,39 @@ "Y": -49.589596, "Z": -621.48474 }, + "StopDistance": 6, "TerritoryId": 959, "InteractionType": "Emote", - "Emote": "rally" + "Emote": "rally", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ], + "Comment": "TODO Check Flags" + }, + { + "DataId": 1045473, + "Position": { + "X": 152.42236, + "Y": -49.589592, + "Z": -614.8623 + }, + "StopDistance": 6, + "TerritoryId": 959, + "InteractionType": "Emote", + "Emote": "rally", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] } ] }, @@ -136,6 +191,7 @@ "Y": -49.589592, "Z": -619.9894 }, + "StopDistance": 6, "TerritoryId": 959, "InteractionType": "Interact" } diff --git a/QuestPaths/Endwalker/MSQ/K-6.4/4741_The Red Side of the Moon.json b/QuestPaths/Endwalker/MSQ/K-6.4/4741_The Red Side of the Moon.json index 0c009695..f9feb9c3 100644 --- a/QuestPaths/Endwalker/MSQ/K-6.4/4741_The Red Side of the Moon.json +++ b/QuestPaths/Endwalker/MSQ/K-6.4/4741_The Red Side of the Moon.json @@ -4,15 +4,18 @@ "QuestSequence": [ { "Sequence": 0, - "DataId": 1045611, - "Position": { - "X": 160.87585, - "Y": -49.589592, - "Z": -618.46344 - }, - "TerritoryId": 959, - "InteractionType": "Interact", - "Comment": "Unsure if correct id" + "Steps": [ + { + "DataId": 1045611, + "Position": { + "X": 160.87585, + "Y": -49.589592, + "Z": -618.46344 + }, + "TerritoryId": 959, + "InteractionType": "Interact" + } + ] }, { "Sequence": 1, @@ -25,7 +28,9 @@ "Z": 418.69226 }, "TerritoryId": 959, - "InteractionType": "Interact" + "InteractionType": "Interact", + "AetheryteShortcut": "Mare Lamentorum - Sinus Lacrimarum", + "Fly": true } ] }, @@ -40,7 +45,16 @@ "Z": 638.0254 }, "TerritoryId": 1162, - "InteractionType": "Interact" + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ], + "Comment": "TODO Check Flags" }, { "DataId": 2013355, @@ -50,7 +64,15 @@ "Z": 547.6615 }, "TerritoryId": 1162, - "InteractionType": "Interact" + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] }, { "DataId": 2013356, @@ -60,7 +82,15 @@ "Z": 472.19043 }, "TerritoryId": 1162, - "InteractionType": "Interact" + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] } ] }, diff --git a/QuestPaths/Endwalker/MSQ/K-6.4/4742_Abyssal Dark.json b/QuestPaths/Endwalker/MSQ/K-6.4/4742_Abyssal Dark.json index b43e4031..524a09c2 100644 --- a/QuestPaths/Endwalker/MSQ/K-6.4/4742_Abyssal Dark.json +++ b/QuestPaths/Endwalker/MSQ/K-6.4/4742_Abyssal Dark.json @@ -12,6 +12,7 @@ "Y": 56.573345, "Z": 436.0265 }, + "StopDistance": 5, "TerritoryId": 1162, "InteractionType": "Interact" } diff --git a/QuestPaths/Endwalker/MSQ/K-6.4/4743_The Dark Throne.json b/QuestPaths/Endwalker/MSQ/K-6.4/4743_The Dark Throne.json index c07ccc87..4817a889 100644 --- a/QuestPaths/Endwalker/MSQ/K-6.4/4743_The Dark Throne.json +++ b/QuestPaths/Endwalker/MSQ/K-6.4/4743_The Dark Throne.json @@ -12,6 +12,7 @@ "Y": 54.977272, "Z": 432.02856 }, + "StopDistance": 7, "TerritoryId": 959, "InteractionType": "Interact" } @@ -20,6 +21,18 @@ { "Sequence": 1, "Steps": [ + { + "DataId": 2012664, + "Position": { + "X": -26.901672, + "Y": -130.47992, + "Z": -580.4685 + }, + "TerritoryId": 959, + "InteractionType": "Interact", + "AetheryteShortcut": "Mare Lamentorum - Bestways Burrow", + "SkipIf": ["FlyingUnlocked"] + }, { "DataId": 1045466, "Position": { @@ -28,7 +41,8 @@ "Z": -491.99664 }, "TerritoryId": 959, - "InteractionType": "Interact" + "InteractionType": "Interact", + "Fly": true } ] }, @@ -44,6 +58,7 @@ }, "TerritoryId": 963, "InteractionType": "Interact", + "AetheryteShortcut": "Radz-at-Han", "AethernetShortcut": [ "[Radz-at-Han] Aetheryte Plaza", "[Radz-at-Han] Meghaduta" diff --git a/QuestPaths/Endwalker/MSQ/L-6.5/4744_Seeking the Light.json b/QuestPaths/Endwalker/MSQ/L-6.5/4744_Seeking the Light.json index 1a6c04a2..87f9eda5 100644 --- a/QuestPaths/Endwalker/MSQ/L-6.5/4744_Seeking the Light.json +++ b/QuestPaths/Endwalker/MSQ/L-6.5/4744_Seeking the Light.json @@ -27,6 +27,7 @@ "Y": 55, "Z": -68.61987 }, + "StopDistance": 5, "TerritoryId": 963, "InteractionType": "Interact" } @@ -44,6 +45,7 @@ }, "TerritoryId": 819, "InteractionType": "Interact", + "AetheryteShortcut": "Crystarium", "AethernetShortcut": [ "[Crystarium] Aetheryte Plaza", "[Crystarium] The Cabinet of Curiosity" diff --git a/QuestPaths/Endwalker/MSQ/L-6.5/4745_Appealing the Masses.json b/QuestPaths/Endwalker/MSQ/L-6.5/4745_Appealing the Masses.json index a307df34..d45f6f2f 100644 --- a/QuestPaths/Endwalker/MSQ/L-6.5/4745_Appealing the Masses.json +++ b/QuestPaths/Endwalker/MSQ/L-6.5/4745_Appealing the Masses.json @@ -28,7 +28,8 @@ "Z": -8.255188 }, "TerritoryId": 820, - "InteractionType": "Interact" + "InteractionType": "Interact", + "AetheryteShortcut": "Eulmore" } ] }, @@ -58,7 +59,15 @@ "Z": -61.387024 }, "TerritoryId": 820, - "InteractionType": "Interact" + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] }, { "DataId": 1045633, @@ -72,6 +81,14 @@ "AethernetShortcut": [ "[Eulmore] Aetheryte Plaza", "[Eulmore] The Mainstay" + ], + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 ] }, { @@ -86,6 +103,14 @@ "AethernetShortcut": [ "[Eulmore] The Mainstay", "[Eulmore] Nightsoil Pots" + ], + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 ] } ] diff --git a/QuestPaths/Endwalker/MSQ/L-6.5/4746_In Defiance of Fate.json b/QuestPaths/Endwalker/MSQ/L-6.5/4746_In Defiance of Fate.json index 88414169..2d0f4d99 100644 --- a/QuestPaths/Endwalker/MSQ/L-6.5/4746_In Defiance of Fate.json +++ b/QuestPaths/Endwalker/MSQ/L-6.5/4746_In Defiance of Fate.json @@ -28,7 +28,8 @@ "Z": 298.20703 }, "TerritoryId": 817, - "InteractionType": "Interact" + "InteractionType": "Interact", + "AetheryteShortcut": "Rak'tika - Slitherbough" } ] }, @@ -44,7 +45,9 @@ }, "TerritoryId": 817, "InteractionType": "Say", - "ChatMessage": "allin tuta" + "ChatMessage": { + "Key": "TEXT_AKTKML103_04746_SAYTODO_000_140" + } } ] }, @@ -89,7 +92,8 @@ "Z": -224.5976 }, "TerritoryId": 815, - "InteractionType": "Interact" + "InteractionType": "Interact", + "AetheryteShortcut": "Amh Araeng - Twine" } ] }, diff --git a/QuestPaths/Endwalker/MSQ/L-6.5/4747_Back to Action.json b/QuestPaths/Endwalker/MSQ/L-6.5/4747_Back to Action.json index 720f488c..39df81da 100644 --- a/QuestPaths/Endwalker/MSQ/L-6.5/4747_Back to Action.json +++ b/QuestPaths/Endwalker/MSQ/L-6.5/4747_Back to Action.json @@ -33,12 +33,7 @@ "[Crystarium] Aetheryte Plaza", "[Crystarium] The Dossal Gate" ] - } - ] - }, - { - "Sequence": 2, - "Steps": [ + }, { "DataId": 1033888, "Position": { @@ -48,7 +43,12 @@ }, "TerritoryId": 844, "InteractionType": "Interact" - }, + } + ] + }, + { + "Sequence": 2, + "Steps": [ { "DataId": 1039645, "Position": { @@ -58,6 +58,7 @@ }, "TerritoryId": 963, "InteractionType": "Interact", + "AetheryteShortcut": "Radz-at-Han", "AethernetShortcut": [ "[Radz-at-Han] Aetheryte Plaza", "[Radz-at-Han] Meghaduta" @@ -76,7 +77,9 @@ "Z": 401.26636 }, "TerritoryId": 959, - "InteractionType": "Interact" + "InteractionType": "Interact", + "AetheryteShortcut": "Mare Lamentorum - Sinus Lacrimarum", + "Fly": true } ] }, diff --git a/QuestPaths/Endwalker/MSQ/L-6.5/4748_Down in the Dark.json b/QuestPaths/Endwalker/MSQ/L-6.5/4748_Down in the Dark.json index 6fd4500a..206d1297 100644 --- a/QuestPaths/Endwalker/MSQ/L-6.5/4748_Down in the Dark.json +++ b/QuestPaths/Endwalker/MSQ/L-6.5/4748_Down in the Dark.json @@ -12,6 +12,7 @@ "Y": 56.682667, "Z": 468.162 }, + "StopDistance": 6, "TerritoryId": 1162, "InteractionType": "Interact" } diff --git a/QuestPaths/Endwalker/MSQ/M-6.55/4753_The Coming Dawn.json b/QuestPaths/Endwalker/MSQ/M-6.55/4753_The Coming Dawn.json index 9c8d733c..3747b3b3 100644 --- a/QuestPaths/Endwalker/MSQ/M-6.55/4753_The Coming Dawn.json +++ b/QuestPaths/Endwalker/MSQ/M-6.55/4753_The Coming Dawn.json @@ -126,7 +126,8 @@ "Z": 4.55803 }, "TerritoryId": 962, - "InteractionType": "Interact" + "InteractionType": "Interact", + "TargetTerritoryId": 987 }, { "DataId": 2013420, diff --git a/QuestPaths/QuestPaths.csproj b/QuestPaths/QuestPaths.csproj index 0520512d..631070ba 100644 --- a/QuestPaths/QuestPaths.csproj +++ b/QuestPaths/QuestPaths.csproj @@ -10,19 +10,19 @@ $(SolutionDir)=X:\ - + - + - + diff --git a/QuestPaths/Shadowbringers/MSQ/F-Tempest/3654_Shadowbringers.json b/QuestPaths/Shadowbringers/MSQ/F-Tempest/3654_Shadowbringers.json index 9deff6a9..23b3f745 100644 --- a/QuestPaths/Shadowbringers/MSQ/F-Tempest/3654_Shadowbringers.json +++ b/QuestPaths/Shadowbringers/MSQ/F-Tempest/3654_Shadowbringers.json @@ -50,7 +50,8 @@ }, "TerritoryId": 156, "InteractionType": "Interact", - "AetheryteShortcut": "Mor Dhona" + "AetheryteShortcut": "Mor Dhona", + "TargetTerritoryId": 351 }, { "DataId": 1031257, diff --git a/QuestPaths/Shadowbringers/MSQ/G-5.1/3673_Shaken Resolve.json b/QuestPaths/Shadowbringers/MSQ/G-5.1/3673_Shaken Resolve.json index 3181b209..de3cd854 100644 --- a/QuestPaths/Shadowbringers/MSQ/G-5.1/3673_Shaken Resolve.json +++ b/QuestPaths/Shadowbringers/MSQ/G-5.1/3673_Shaken Resolve.json @@ -28,7 +28,8 @@ "Z": 27.5 }, "TerritoryId": 351, - "InteractionType": "Interact" + "InteractionType": "Interact", + "TargetTerritoryId": 156 }, { "Position": { @@ -73,7 +74,8 @@ "Z": -631.281 }, "TerritoryId": 156, - "InteractionType": "Interact" + "InteractionType": "Interact", + "TargetTerritoryId": 351 }, { "DataId": 1032081, diff --git a/QuestPaths/Shadowbringers/MSQ/G-5.1/3682_Vows of Virtue, Deeds of Cruelty.json b/QuestPaths/Shadowbringers/MSQ/G-5.1/3682_Vows of Virtue, Deeds of Cruelty.json index a04c528b..d2c46e22 100644 --- a/QuestPaths/Shadowbringers/MSQ/G-5.1/3682_Vows of Virtue, Deeds of Cruelty.json +++ b/QuestPaths/Shadowbringers/MSQ/G-5.1/3682_Vows of Virtue, Deeds of Cruelty.json @@ -59,7 +59,8 @@ }, "TerritoryId": 156, "InteractionType": "Interact", - "AetheryteShortcut": "Mor Dhona" + "AetheryteShortcut": "Mor Dhona", + "TargetTerritoryId": 351 }, { "DataId": 1032081, diff --git a/QuestPaths/Shadowbringers/MSQ/I-5.3/3773_Fraying Threads.json b/QuestPaths/Shadowbringers/MSQ/I-5.3/3773_Fraying Threads.json index 0551275f..5f437641 100644 --- a/QuestPaths/Shadowbringers/MSQ/I-5.3/3773_Fraying Threads.json +++ b/QuestPaths/Shadowbringers/MSQ/I-5.3/3773_Fraying Threads.json @@ -45,7 +45,8 @@ }, "TerritoryId": 156, "InteractionType": "Interact", - "AetheryteShortcut": "Mor Dhona" + "AetheryteShortcut": "Mor Dhona", + "TargetTerritoryId": 351 }, { "DataId": 1032081, diff --git a/QuestPaths/Shadowbringers/MSQ/I-5.3/3774_Food for the Soul.json b/QuestPaths/Shadowbringers/MSQ/I-5.3/3774_Food for the Soul.json index be1bcded..17d48f9c 100644 --- a/QuestPaths/Shadowbringers/MSQ/I-5.3/3774_Food for the Soul.json +++ b/QuestPaths/Shadowbringers/MSQ/I-5.3/3774_Food for the Soul.json @@ -28,7 +28,8 @@ "Z": 27.5 }, "TerritoryId": 351, - "InteractionType": "Interact" + "InteractionType": "Interact", + "TargetTerritoryId": 156 }, { "Position": { diff --git a/QuestPaths/Shadowbringers/MSQ/J-5.4/4009_Reviving the Legacy.json b/QuestPaths/Shadowbringers/MSQ/J-5.4/4009_Reviving the Legacy.json index d8a1ea8b..c4448357 100644 --- a/QuestPaths/Shadowbringers/MSQ/J-5.4/4009_Reviving the Legacy.json +++ b/QuestPaths/Shadowbringers/MSQ/J-5.4/4009_Reviving the Legacy.json @@ -29,7 +29,8 @@ }, "TerritoryId": 156, "InteractionType": "Interact", - "AetheryteShortcut": "Mor Dhona" + "AetheryteShortcut": "Mor Dhona", + "TargetTerritoryId": 351 }, { "DataId": 1035355, diff --git a/QuestPaths/Shadowbringers/MSQ/J-5.4/4016_Futures Rewritten.json b/QuestPaths/Shadowbringers/MSQ/J-5.4/4016_Futures Rewritten.json index 570bf1a4..bfd69d99 100644 --- a/QuestPaths/Shadowbringers/MSQ/J-5.4/4016_Futures Rewritten.json +++ b/QuestPaths/Shadowbringers/MSQ/J-5.4/4016_Futures Rewritten.json @@ -62,7 +62,8 @@ }, "TerritoryId": 156, "InteractionType": "Interact", - "AetheryteShortcut": "Mor Dhona" + "AetheryteShortcut": "Mor Dhona", + "TargetTerritoryId": 351 }, { "DataId": 1032694, diff --git a/QuestPaths/Shadowbringers/MSQ/K-5.5/4063_When the Dust Settles.json b/QuestPaths/Shadowbringers/MSQ/K-5.5/4063_When the Dust Settles.json index 43ac6e17..c2b02fcb 100644 --- a/QuestPaths/Shadowbringers/MSQ/K-5.5/4063_When the Dust Settles.json +++ b/QuestPaths/Shadowbringers/MSQ/K-5.5/4063_When the Dust Settles.json @@ -79,7 +79,8 @@ }, "TerritoryId": 156, "InteractionType": "Interact", - "AetheryteShortcut": "Mor Dhona" + "AetheryteShortcut": "Mor Dhona", + "TargetTerritoryId": 351 } ] }, diff --git a/QuestPaths/quest-v1.json b/QuestPaths/quest-v1.json index 4af20ea0..6162ef64 100644 --- a/QuestPaths/quest-v1.json +++ b/QuestPaths/quest-v1.json @@ -348,7 +348,9 @@ "type": "string", "enum": [ "Never", - "FlyingUnlocked" + "FlyingLocked", + "FlyingUnlocked", + "DifferentTerritory" ] } }, @@ -563,12 +565,22 @@ "then": { "properties": { "ChatMessage": { - "type": "string", - "description": "The text to use with /say" + "type": "object", + "description": "The text to use with /say", + "properties": { + "ExcelSheet": { + "type": "string" + }, + "Key": { + "type": "string" + } + }, + "required": [ + "Key" + ] } }, "required": [ - "Position", "ChatMessage" ] } @@ -655,7 +667,6 @@ } }, "required": [ - "ExcelSheet", "Answer" ] } diff --git a/Questionable/Controller/MovementController.cs b/Questionable/Controller/MovementController.cs index f4fa2e04..7b7bbee9 100644 --- a/Questionable/Controller/MovementController.cs +++ b/Questionable/Controller/MovementController.cs @@ -167,6 +167,8 @@ internal sealed class MovementController : IDisposable public void NavigateTo(EMovementType type, uint? dataId, Vector3 to, bool fly, bool sprint, float? stopDistance = null) { PrepareNavigation(type, dataId, to, fly, sprint, stopDistance); + _pluginLog.Information($"Pathfinding to {Destination}"); + _cancellationTokenSource = new(); _cancellationTokenSource.CancelAfter(TimeSpan.FromSeconds(10)); _pathfindTask = @@ -176,6 +178,8 @@ internal sealed class MovementController : IDisposable public void NavigateTo(EMovementType type, uint? dataId, List to, bool fly, bool sprint, float? stopDistance) { PrepareNavigation(type, dataId, to.Last(), fly, sprint, stopDistance); + + _pluginLog.Information($"Moving to {Destination}"); _navmeshIpc.MoveTo(to); } diff --git a/Questionable/Controller/QuestController.cs b/Questionable/Controller/QuestController.cs index 54572dff..ad9d91ec 100644 --- a/Questionable/Controller/QuestController.cs +++ b/Questionable/Controller/QuestController.cs @@ -1,9 +1,7 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.Globalization; using System.IO; -using System.Linq; using System.Numerics; using System.Text.Json; using Dalamud.Game.ClientState.Conditions; @@ -14,7 +12,6 @@ using FFXIVClientStructs.FFXIV.Application.Network.WorkDefinitions; using FFXIVClientStructs.FFXIV.Client.Game; using FFXIVClientStructs.FFXIV.Client.UI; using LLib.GameUI; -using Lumina.Excel.CustomSheets; using Questionable.Data; using Questionable.External; using Questionable.Model; @@ -251,10 +248,12 @@ internal sealed class QuestController public void IncreaseStepCount() { (QuestSequence? seq, QuestStep? step) = GetNextStep(); - if (seq == null || step == null) + if (CurrentQuest == null || seq == null || step == null) + { + _pluginLog.Warning("Unable to retrieve next quest step, not increasing step count"); return; + } - Debug.Assert(CurrentQuest != null, nameof(CurrentQuest) + " != null"); if (CurrentQuest.Step + 1 < seq.Steps.Count) { CurrentQuest = CurrentQuest with @@ -276,10 +275,12 @@ internal sealed class QuestController public unsafe void ExecuteNextStep() { (QuestSequence? seq, QuestStep? step) = GetNextStep(); - if (seq == null || step == null) + if (CurrentQuest == null || seq == null || step == null) + { + _pluginLog.Warning("Could not retrieve next quest step, not doing anything"); return; + } - Debug.Assert(CurrentQuest != null, nameof(CurrentQuest) + " != null"); if (step.Disabled) { _pluginLog.Information("Skipping step, as it is disabled"); @@ -299,12 +300,14 @@ internal sealed class QuestController (_aetheryteData.CalculateDistance(pos, territoryType, step.AethernetShortcut.From) < 20 || _aetheryteData.CalculateDistance(pos, territoryType, step.AethernetShortcut.To) < 20))) { + _pluginLog.Information("Skipping aetheryte teleport"); skipTeleport = true; } } if (skipTeleport) { + _pluginLog.Information("Marking aetheryte shortcut as used"); CurrentQuest = CurrentQuest with { StepProgress = CurrentQuest.StepProgress with { AetheryteShortcutUsed = true } @@ -312,20 +315,24 @@ internal sealed class QuestController } else { - if (step.AetheryteShortcut != null) + if (!_gameFunctions.IsAetheryteUnlocked(step.AetheryteShortcut.Value)) { - if (!_gameFunctions.IsAetheryteUnlocked(step.AetheryteShortcut.Value)) - _chatGui.Print($"[Questionable] Aetheryte {step.AetheryteShortcut.Value} is not unlocked."); - else if (_gameFunctions.TeleportAetheryte(step.AetheryteShortcut.Value)) - CurrentQuest = CurrentQuest with - { - StepProgress = CurrentQuest.StepProgress with { AetheryteShortcutUsed = true } - }; - else - _chatGui.Print("[Questionable] Unable to teleport to aetheryte."); + _pluginLog.Error($"Aetheryte {step.AetheryteShortcut.Value} is not unlocked."); + _chatGui.Print($"[Questionable] Aetheryte {step.AetheryteShortcut.Value} is not unlocked."); + } + else if (_gameFunctions.TeleportAetheryte(step.AetheryteShortcut.Value)) + { + _pluginLog.Information("Travelling via aetheryte..."); + CurrentQuest = CurrentQuest with + { + StepProgress = CurrentQuest.StepProgress with { AetheryteShortcutUsed = true } + }; } else - _chatGui.Print("[Questionable] No aetheryte for teleport set."); + { + _pluginLog.Warning("Unable to teleport to aetheryte"); + _chatGui.Print("[Questionable] Unable to teleport to aetheryte."); + } return; } @@ -343,6 +350,14 @@ internal sealed class QuestController return; } + if (step.SkipIf.Contains(ESkipCondition.FlyingLocked) && + !_gameFunctions.IsFlyingUnlocked(step.TerritoryId)) + { + _pluginLog.Information("Skipping step, as flying is locked"); + IncreaseStepCount(); + return; + } + if (step is { DataId: not null, @@ -372,10 +387,9 @@ internal sealed class QuestController } } - if (!CurrentQuest.StepProgress.AethernetShortcutUsed) + if (!CurrentQuest.StepProgress.AethernetShortcutUsed && step.AethernetShortcut != null) { - if (step.AethernetShortcut != null && - _gameFunctions.IsAetheryteUnlocked(step.AethernetShortcut.From) && + if (_gameFunctions.IsAetheryteUnlocked(step.AethernetShortcut.From) && _gameFunctions.IsAetheryteUnlocked(step.AethernetShortcut.To)) { EAetheryteLocation from = step.AethernetShortcut.From; @@ -389,6 +403,7 @@ internal sealed class QuestController { if (_aetheryteData.CalculateDistance(playerPosition, territoryType, from) < 11) { + _pluginLog.Information($"Using lifestream to teleport to {to}"); _lifestreamIpc.Teleport(to); CurrentQuest = CurrentQuest with { @@ -396,22 +411,31 @@ internal sealed class QuestController }; } else + { + _pluginLog.Information("Moving to aethernet shortcut"); _movementController.NavigateTo(EMovementType.Quest, (uint)from, _aetheryteData.Locations[from], false, true, AetheryteConverter.IsLargeAetheryte(from) ? 10.9f : 6.9f); + } return; } } + else + _pluginLog.Warning($"Aethernet shortcut not unlocked (from: {step.AethernetShortcut.From}, to: {step.AethernetShortcut.To}), walking manually"); } - if (step.TargetTerritoryId == _clientState.TerritoryType) + if (step.TargetTerritoryId == _clientState.TerritoryType && !step.SkipIf.Contains(ESkipCondition.Never)) { - _pluginLog.Information("Zone transition, skipping movement"); + // we assume whatever e.g. interaction, walkto etc. we have will trigger the zone transition + _pluginLog.Information("Zone transition, skipping rest of step"); + IncreaseStepCount(); + return; } - else if (step.InteractionType == EInteractionType.Jump && step.JumpDestination != null && - (_clientState.LocalPlayer!.Position - step.JumpDestination.Position).Length() <= - (step.JumpDestination.StopDistance ?? 1f)) + + if (step.InteractionType == EInteractionType.Jump && step.JumpDestination != null && + (_clientState.LocalPlayer!.Position - step.JumpDestination.Position).Length() <= + (step.JumpDestination.StopDistance ?? 1f)) { _pluginLog.Information("We're at the jump destination, skipping movement"); } @@ -433,16 +457,17 @@ internal sealed class QuestController if (step.Mount == true && !_gameFunctions.HasStatusPreventingSprintOrMount()) { + _pluginLog.Information("Step explicitly wants a mount, trying to mount..."); if (!_condition[ConditionFlag.Mounted] && !_condition[ConditionFlag.InCombat] && _territoryData.CanUseMount(_clientState.TerritoryType)) { - if (ActionManager.Instance()->GetActionStatus(ActionType.Mount, 71) == 0) - ActionManager.Instance()->UseAction(ActionType.Mount, 71); + _gameFunctions.Mount(); return; } } else if (step.Mount == false) { + _pluginLog.Information("Step explicitly wants no mount, trying to unmount..."); if (_condition[ConditionFlag.Mounted]) { _gameFunctions.Unmount(); @@ -456,9 +481,7 @@ internal sealed class QuestController !_condition[ConditionFlag.InCombat] && _territoryData.CanUseMount(_clientState.TerritoryType) && !_gameFunctions.HasStatusPreventingSprintOrMount()) { - if (ActionManager.Instance()->GetActionStatus(ActionType.Mount, 71) == 0) - ActionManager.Instance()->UseAction(ActionType.Mount, 71); - + _gameFunctions.Mount(); return; } @@ -495,10 +518,12 @@ internal sealed class QuestController if (gameObject == null || (gameObject.Position - _clientState.LocalPlayer!.Position).Length() > step.StopDistance) { + _pluginLog.Warning("Object not found or too far away, no position so we can't move"); return; } } + _pluginLog.Information($"Running logic for {step.InteractionType}"); switch (step.InteractionType) { case EInteractionType.Interact: @@ -506,7 +531,10 @@ internal sealed class QuestController { GameObject? gameObject = _gameFunctions.FindObjectByDataId(step.DataId.Value); if (gameObject == null) + { + _pluginLog.Warning($"No game object with dataId {step.DataId}"); return; + } if (!gameObject.IsTargetable && _condition[ConditionFlag.Mounted]) { @@ -623,9 +651,14 @@ internal sealed class QuestController return; } - if (!string.IsNullOrEmpty(step.ChatMessage)) + if (step.ChatMessage != null) { - _gameFunctions.ExecuteCommand($"/say {step.ChatMessage}"); + string? excelString = _gameFunctions.GetExcelString(CurrentQuest.Quest, step.ChatMessage.ExcelSheet, + step.ChatMessage.Key); + if (excelString == null) + return; + + _gameFunctions.ExecuteCommand($"/say {excelString}"); IncreaseStepCount(); } @@ -686,23 +719,10 @@ internal sealed class QuestController { foreach (DialogueChoice dialogueChoice in step.DialogueChoices) { - var excelSheet = _dataManager.Excel.GetSheet(dialogueChoice.ExcelSheet); - if (excelSheet == null) - { - _pluginLog.Error($"Unknown excel sheet '{dialogueChoice.ExcelSheet}'"); - continue; - } - - string? excelString = excelSheet - .FirstOrDefault(x => x.Key == dialogueChoice.Answer) - ?.Value - ?.ToString(); + string? excelString = _gameFunctions.GetExcelString(CurrentQuest.Quest, + dialogueChoice.ExcelSheet, dialogueChoice.Answer); if (excelString == null) - { - _pluginLog.Error( - $"Could not extract '{dialogueChoice.Answer}' from sheet '{dialogueChoice.ExcelSheet}'"); return; - } _pluginLog.Verbose($"Looking for option '{excelString}'"); for (int i = 5; i < addon->AtkUnitBase.AtkValuesCount; ++i) diff --git a/Questionable/GameFunctions.cs b/Questionable/GameFunctions.cs index c6c540eb..79d728cd 100644 --- a/Questionable/GameFunctions.cs +++ b/Questionable/GameFunctions.cs @@ -9,7 +9,6 @@ using System.Text; using Dalamud.Game; using Dalamud.Game.ClientState.Conditions; using Dalamud.Game.ClientState.Objects; -using Dalamud.Game.ClientState.Objects.Types; using Dalamud.Plugin.Services; using FFXIVClientStructs.FFXIV.Application.Network.WorkDefinitions; using FFXIVClientStructs.FFXIV.Client.Game; @@ -20,11 +19,13 @@ using FFXIVClientStructs.FFXIV.Client.System.Framework; using FFXIVClientStructs.FFXIV.Client.System.Memory; using FFXIVClientStructs.FFXIV.Client.System.String; using FFXIVClientStructs.FFXIV.Client.UI.Agent; +using Lumina.Excel.CustomSheets; using Lumina.Excel.GeneratedSheets; using Questionable.Controller; using Questionable.Model.V1; using BattleChara = FFXIVClientStructs.FFXIV.Client.Game.Character.BattleChara; using GameObject = Dalamud.Game.ClientState.Objects.Types.GameObject; +using Quest = Questionable.Model.Quest; namespace Questionable; @@ -44,6 +45,7 @@ internal sealed unsafe class GameFunctions private readonly ReadOnlyDictionary _emoteCommands; private readonly ReadOnlyDictionary _contentFinderConditionToContentId; + private readonly IDataManager _dataManager; private readonly IObjectTable _objectTable; private readonly ITargetManager _targetManager; private readonly ICondition _condition; @@ -53,6 +55,7 @@ internal sealed unsafe class GameFunctions public GameFunctions(IDataManager dataManager, IObjectTable objectTable, ISigScanner sigScanner, ITargetManager targetManager, ICondition condition, IClientState clientState, IPluginLog pluginLog) { + _dataManager = dataManager; _objectTable = objectTable; _targetManager = targetManager; _condition = condition; @@ -399,6 +402,11 @@ internal sealed unsafe class GameFunctions if (_condition[ConditionFlag.Swimming] && !IsFlyingUnlocked(_clientState.TerritoryType)) return true; + // company chocobo is locked + var playerState = PlayerState.Instance(); + if (playerState != null && !playerState->IsMountUnlocked(1)) + return true; + var gameObject = GameObjectManager.GetGameObjectByIndex(0); if (gameObject != null && gameObject->ObjectKind == 1) { @@ -410,12 +418,41 @@ internal sealed unsafe class GameFunctions return false; } + public void Mount() + { + if (!_condition[ConditionFlag.Mounted]) + { + var playerState = PlayerState.Instance(); + if (playerState != null && playerState->IsMountUnlocked(71)) + { + if (ActionManager.Instance()->GetActionStatus(ActionType.Mount, 71) == 0) + { + _pluginLog.Information("Using SDS Fenrir as mount"); + ActionManager.Instance()->UseAction(ActionType.Mount, 71); + } + } + else + { + if (ActionManager.Instance()->GetActionStatus(ActionType.GeneralAction, 9) == 0) + { + _pluginLog.Information("Using mount roulette"); + ActionManager.Instance()->UseAction(ActionType.GeneralAction, 9); + } + } + } + } + public bool Unmount() { if (_condition[ConditionFlag.Mounted]) { if (ActionManager.Instance()->GetActionStatus(ActionType.GeneralAction, 23) == 0) + { + _pluginLog.Information("Unmounting..."); ActionManager.Instance()->UseAction(ActionType.GeneralAction, 23); + } + else + _pluginLog.Warning("Can't unmount right now?"); return true; } @@ -430,9 +467,38 @@ internal sealed unsafe class GameFunctions if (UIState.IsInstanceContentUnlocked(contentId)) AgentContentsFinder.Instance()->OpenRegularDuty(contentFinderConditionId); else - _pluginLog.Error($"Trying to access a locked duty (cf: {contentFinderConditionId}, content: {contentId})"); + _pluginLog.Error( + $"Trying to access a locked duty (cf: {contentFinderConditionId}, content: {contentId})"); } else _pluginLog.Error($"Could not find content for content finder condition (cf: {contentFinderConditionId})"); } + + public string? GetExcelString(Quest currentQuestQuest, string? excelSheetName, string key) + { + if (excelSheetName == null) + { + string questPrefix = $"quest/{(currentQuestQuest.QuestId / 100):000}/"; + string questSuffix = $"_{currentQuestQuest.QuestId:00000}"; + excelSheetName = _dataManager.Excel + .GetSheetNames() + .SingleOrDefault(x => + x.StartsWith(questPrefix, StringComparison.Ordinal) && + x.EndsWith(questSuffix, StringComparison.Ordinal)); + if (excelSheetName == null) + { + _pluginLog.Error($"Could not find sheet matching '{questPrefix}*{questSuffix}"); + return null; + } + } + + var excelSheet = _dataManager.Excel.GetSheet(excelSheetName); + if (excelSheet == null) + { + _pluginLog.Error($"Unknown excel sheet '{excelSheetName}'"); + return null; + } + + return excelSheet.FirstOrDefault(x => x.Key == key)?.Value?.ToString(); + } } diff --git a/Questionable/Model/V1/ChatMessage.cs b/Questionable/Model/V1/ChatMessage.cs new file mode 100644 index 00000000..71721380 --- /dev/null +++ b/Questionable/Model/V1/ChatMessage.cs @@ -0,0 +1,7 @@ +namespace Questionable.Model.V1; + +public sealed class ChatMessage +{ + public string? ExcelSheet { get; set; } + public string Key { get; set; } = null!; +} diff --git a/Questionable/Model/V1/Converter/SkipConditionConverter.cs b/Questionable/Model/V1/Converter/SkipConditionConverter.cs index 644e0dea..dd38ac4f 100644 --- a/Questionable/Model/V1/Converter/SkipConditionConverter.cs +++ b/Questionable/Model/V1/Converter/SkipConditionConverter.cs @@ -7,6 +7,7 @@ public sealed class SkipConditionConverter() : EnumConverter(Val private static readonly Dictionary Values = new() { { ESkipCondition.Never, "Never" }, + { ESkipCondition.FlyingLocked, "FlyingLocked" }, { ESkipCondition.FlyingUnlocked, "FlyingUnlocked" }, }; } diff --git a/Questionable/Model/V1/DialogueChoice.cs b/Questionable/Model/V1/DialogueChoice.cs index 1c32f218..d4c607e7 100644 --- a/Questionable/Model/V1/DialogueChoice.cs +++ b/Questionable/Model/V1/DialogueChoice.cs @@ -2,6 +2,6 @@ public sealed class DialogueChoice { - public string ExcelSheet { get; set; } = null!; + public string? ExcelSheet { get; set; } public string Answer { get; set; } = null!; } diff --git a/Questionable/Model/V1/ESkipCondition.cs b/Questionable/Model/V1/ESkipCondition.cs index bced035a..4f2639d4 100644 --- a/Questionable/Model/V1/ESkipCondition.cs +++ b/Questionable/Model/V1/ESkipCondition.cs @@ -8,5 +8,6 @@ public enum ESkipCondition { None, Never, + FlyingLocked, FlyingUnlocked, } diff --git a/Questionable/Model/V1/QuestStep.cs b/Questionable/Model/V1/QuestStep.cs index 6462f0ef..d16cccd5 100644 --- a/Questionable/Model/V1/QuestStep.cs +++ b/Questionable/Model/V1/QuestStep.cs @@ -35,7 +35,7 @@ public class QuestStep public bool? GroundTarget { get; set; } public EEmote? Emote { get; set; } - public string? ChatMessage { get; set; } + public ChatMessage? ChatMessage { get; set; } public EEnemySpawnType? EnemySpawnType { get; set; } diff --git a/Questionable/Questionable.csproj b/Questionable/Questionable.csproj index 47bc84b0..ac0f229b 100644 --- a/Questionable/Questionable.csproj +++ b/Questionable/Questionable.csproj @@ -1,7 +1,7 @@  net8.0-windows - 0.1 + 0.2 12 enable true