From 74859235063c748883665d7b0762124593a56f7b Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Tue, 9 Jul 2024 16:58:26 +0200 Subject: [PATCH] Support PointMenu' (e.g. the stone tablet interaction near DT's beginning) + Update DT paths till mid-Yak T'el --- QuestPathGenerator/QuestSourceGenerator.cs | 2 + .../5039_Traveler to the Rescue.json | 1 + .../4860_A New World to Explore.json | 15 ++ .../4863_A Saga in Stone.json | 13 +- .../4865_To Kozama'uka.json | 15 ++ .../4868_A Well-mannered Shipwright.json | 13 +- .../4869_The Lifting of Wings.json | 11 ++ .../4873_The Feat of Gold.json | 6 +- .../4878_The Success of Others.json | 29 +++- .../4879_For All Turali.json | 15 ++ .../4880_A Leaking Workpot.json | 49 ++++-- .../4881_Lending a Helphand.json | 1 + .../4882_The Feat of Pots.json | 2 + .../4884_The Shape of Peace.json | 15 ++ .../4885_Lost Promise.json | 2 +- .../4886_A Brother's Duty.json | 13 +- .../4889_History's Keepers.json | 3 +- .../4890_The Feat of Proof.json | 15 +- .../4892_An Echo of Madness.json | 3 + .../4893_Pointing the Way.json | 1 + .../C-Yak T'el/4897_The Leap to Yak T'el.json | 15 ++ .../4899_A History of Violence.json | 3 +- .../C-Yak T'el/4900_The Feat of Repast.json | 1 + .../4912_The Long Road to Xak Tural.json | 15 ++ .../4923_In Yyasulani's Shadow.json | 15 ++ .../4926_All Aboard.json | 15 ++ .../4933_Solution Nine.json | 15 ++ .../4945_The Resilient Son.json | 30 ++++ .../4948_Through the Gate of Gold.json | 30 ++++ .../MSQ/F-Living Memory/4959_Dawntrail.json | 15 ++ .../Healer/4824_In the Sting of Things.json | 2 +- .../MagicalRanged/4842_Power Forgotten.json | 62 +++++++ .../4843_A Brand of Justice.json | 141 +++++++++++++++ .../4844_The Seeds of Popularity.json | 163 ++++++++++++++++++ .../Melee/4830_The Hunter and the Hunted.json | 2 +- .../4836_To Steal a Steelhog.json | 2 +- .../Tank/4823_Dreams of a New Day.json | 15 ++ QuestPaths/quest-v1.json | 7 + Questionable.Model/V1/QuestStep.cs | 1 + Questionable/Controller/GameUiController.cs | 63 +++++++ Questionable/Controller/QuestController.cs | 6 +- Questionable/Controller/QuestRegistry.cs | 7 + .../Controller/Steps/BaseFactory/Move.cs | 6 +- .../Controller/Steps/BaseFactory/WaitAtEnd.cs | 6 +- Questionable/Data/TerritoryData.cs | 11 ++ Questionable/Windows/QuestWindow.cs | 14 +- 46 files changed, 837 insertions(+), 49 deletions(-) create mode 100644 QuestPaths/Dawntrail/RoleQuests/MagicalRanged/4843_A Brand of Justice.json create mode 100644 QuestPaths/Dawntrail/RoleQuests/MagicalRanged/4844_The Seeds of Popularity.json diff --git a/QuestPathGenerator/QuestSourceGenerator.cs b/QuestPathGenerator/QuestSourceGenerator.cs index c136d2e46..060d62540 100644 --- a/QuestPathGenerator/QuestSourceGenerator.cs +++ b/QuestPathGenerator/QuestSourceGenerator.cs @@ -350,6 +350,8 @@ public class QuestSourceGenerator : ISourceGenerator .AsSyntaxNodeOrToken(), AssignmentList(nameof(QuestStep.DialogueChoices), step.DialogueChoices) .AsSyntaxNodeOrToken(), + AssignmentList(nameof(QuestStep.PointMenuChoices), step.PointMenuChoices) + .AsSyntaxNodeOrToken(), Assignment(nameof(QuestStep.QuestId), step.QuestId, emptyStep.QuestId) .AsSyntaxNodeOrToken()))))), Token(SyntaxKind.CommaToken), diff --git a/QuestPaths/Dawntrail/AetherCurrents/Urqopacha/5039_Traveler to the Rescue.json b/QuestPaths/Dawntrail/AetherCurrents/Urqopacha/5039_Traveler to the Rescue.json index a370f3f16..c9da7b591 100644 --- a/QuestPaths/Dawntrail/AetherCurrents/Urqopacha/5039_Traveler to the Rescue.json +++ b/QuestPaths/Dawntrail/AetherCurrents/Urqopacha/5039_Traveler to the Rescue.json @@ -26,6 +26,7 @@ "Y": -129.27074, "Z": -351.33496 }, + "StopDistance": 0.25, "TerritoryId": 1187, "InteractionType": "Combat", "EnemySpawnType": "AutoOnEnterArea", diff --git a/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4860_A New World to Explore.json b/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4860_A New World to Explore.json index 6d600acd2..9164879e2 100644 --- a/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4860_A New World to Explore.json +++ b/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4860_A New World to Explore.json @@ -59,6 +59,21 @@ } ] }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "TerritoryId": 1, + "InteractionType": "WalkTo", + "Comment": "Filler" + } + ] + }, { "Sequence": 4, "Steps": [ diff --git a/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4863_A Saga in Stone.json b/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4863_A Saga in Stone.json index 3b5ec9750..ba5c7a98c 100644 --- a/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4863_A Saga in Stone.json +++ b/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4863_A Saga in Stone.json @@ -29,8 +29,7 @@ "Z": 129.80847 }, "TerritoryId": 1185, - "InteractionType": "WaitForManualProgress", - "Comment": "Click all tablets (PointMenu)", + "InteractionType": "Interact", "DialogueChoices": [ { "Type": "YesNo", @@ -47,6 +46,16 @@ "Prompt": "TEXT_KINGMA104_04863_Q2_000_000", "Answer": "TEXT_KINGMA104_04863_A2_000_001" } + ], + "PointMenuChoices": [ + 0, + 1, + 2, + 3, + 0, + 1, + 2, + 3 ] } ] diff --git a/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4865_To Kozama'uka.json b/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4865_To Kozama'uka.json index 75add291d..e1f33ee5d 100644 --- a/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4865_To Kozama'uka.json +++ b/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4865_To Kozama'uka.json @@ -33,6 +33,21 @@ } ] }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "TerritoryId": 1, + "InteractionType": "WalkTo", + "Comment": "Filler" + } + ] + }, { "Sequence": 3, "Steps": [ diff --git a/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4868_A Well-mannered Shipwright.json b/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4868_A Well-mannered Shipwright.json index 5623afb05..002a3643c 100644 --- a/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4868_A Well-mannered Shipwright.json +++ b/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4868_A Well-mannered Shipwright.json @@ -85,7 +85,8 @@ "Z": -388.50995 }, "TerritoryId": 1188, - "InteractionType": "Interact" + "InteractionType": "Interact", + "AetheryteShortcut": "Kozama'uka - Ok'hanu" } ] }, @@ -148,6 +149,16 @@ { "Sequence": 8, "Steps": [ + { + "Position": { + "X": -510.96463, + "Y": -0.47684515, + "Z": -305.96155 + }, + "TerritoryId": 1188, + "InteractionType": "WalkTo", + "Comment": "Waypoint after swimming through the river" + }, { "DataId": 2013936, "Position": { diff --git a/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4869_The Lifting of Wings.json b/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4869_The Lifting of Wings.json index d721f5069..61b6a3165 100644 --- a/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4869_The Lifting of Wings.json +++ b/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4869_The Lifting of Wings.json @@ -73,6 +73,17 @@ { "Sequence": 4, "Steps": [ + { + "Position": { + "X": 303.21774, + "Y": 7.475274, + "Z": -215.19496 + }, + "TerritoryId": 1188, + "InteractionType": "WalkTo", + "DisableNavmesh": true, + "Mount": true + }, { "DataId": 2013632, "Position": { diff --git a/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4873_The Feat of Gold.json b/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4873_The Feat of Gold.json index 93ab2e85d..ef9e4e1aa 100644 --- a/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4873_The Feat of Gold.json +++ b/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4873_The Feat of Gold.json @@ -84,14 +84,16 @@ "Z": -171.58777 }, "TerritoryId": 1187, - "InteractionType": "WaitForManualProgress", - "Comment": "Pick Disconcerted Hoobigo", + "InteractionType": "Interact", "DialogueChoices": [ { "Type": "List", "Prompt": "TEXT_KINGMA114_04873_Q1_000_000", "Answer": "TEXT_KINGMA114_04873_A1_000_001" } + ], + "PointMenuChoices": [ + 3 ] } ] diff --git a/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4878_The Success of Others.json b/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4878_The Success of Others.json index 491fe1b8c..9a8138f25 100644 --- a/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4878_The Success of Others.json +++ b/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4878_The Success of Others.json @@ -61,6 +61,29 @@ "InteractionType": "AttuneAethernetShard", "Comment": "Wachumeqimeqi" }, + { + "Position": { + "X": -130.34163, + "Y": -14.999287, + "Z": 198.40685 + }, + "TerritoryId": 1185, + "InteractionType": "WalkTo", + "AethernetShortcut": [ + "[Tuliyollal] Wachumeqimeqi", + "[Tuliyollal] The For'ard Cabins" + ] + }, + { + "Position": { + "X": -122.40268, + "Y": -19.754322, + "Z": 202.20439 + }, + "TerritoryId": 1185, + "InteractionType": "WalkTo", + "DisableNavmesh": true + }, { "DataId": 1046763, "Position": { @@ -69,11 +92,7 @@ "Z": 201.12915 }, "TerritoryId": 1185, - "InteractionType": "Interact", - "AethernetShortcut": [ - "[Tuliyollal] Wachumeqimeqi", - "[Tuliyollal] The For'ard Cabins" - ] + "InteractionType": "Interact" } ] }, diff --git a/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4879_For All Turali.json b/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4879_For All Turali.json index c3912a958..029cab886 100644 --- a/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4879_For All Turali.json +++ b/QuestPaths/Dawntrail/MSQ/A-Kozama'uka1-Urqopacha1/4879_For All Turali.json @@ -64,6 +64,21 @@ } ] }, + { + "Sequence": 4, + "Steps": [ + { + "Position": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "TerritoryId": 1, + "InteractionType": "WalkTo", + "Comment": "Filler" + } + ] + }, { "Sequence": 5, "Steps": [ diff --git a/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4880_A Leaking Workpot.json b/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4880_A Leaking Workpot.json index 0f5663c5a..20faf30d8 100644 --- a/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4880_A Leaking Workpot.json +++ b/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4880_A Leaking Workpot.json @@ -21,17 +21,6 @@ { "Sequence": 1, "Steps": [ - { - "DataId": 2013943, - "Position": { - "X": 485.89294, - "Y": 121.3855, - "Z": 831.29626 - }, - "TerritoryId": 1188, - "InteractionType": "AttuneAetherCurrent", - "AetherCurrentId": 2818428 - }, { "DataId": 203, "Position": { @@ -43,6 +32,41 @@ "TerritoryId": 1188, "InteractionType": "AttuneAetheryte" }, + { + "Position": { + "X": 533.37555, + "Y": 122.98077, + "Z": 790.01416 + }, + "TerritoryId": 1188, + "InteractionType": "WalkTo", + "AetheryteShortcut": "Tuliyollal", + "AethernetShortcut": [ + "[Tuliyollal] Aetheryte Plaza", + "[Tuliyollal] Ihuykatumu (Kozama'uka)" + ] + }, + { + "Position": { + "X": 522.3003, + "Y": 120.81023, + "Z": 803.62744 + }, + "TerritoryId": 1188, + "InteractionType": "WalkTo", + "DisableNavmesh": true + }, + { + "DataId": 2013943, + "Position": { + "X": 485.89294, + "Y": 121.3855, + "Z": 831.29626 + }, + "TerritoryId": 1188, + "InteractionType": "AttuneAetherCurrent", + "AetherCurrentId": 2818428 + }, { "DataId": 1046603, "Position": { @@ -51,7 +75,8 @@ "Z": 259.66272 }, "TerritoryId": 1188, - "InteractionType": "Interact" + "InteractionType": "Interact", + "AetheryteShortcut": "Kozama'uka - Many Fires" } ] }, diff --git a/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4881_Lending a Helphand.json b/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4881_Lending a Helphand.json index 10934a893..dcd11e605 100644 --- a/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4881_Lending a Helphand.json +++ b/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4881_Lending a Helphand.json @@ -115,6 +115,7 @@ "Y": 122.89019, "Z": 348.47034 }, + "StopDistance": 5, "TerritoryId": 1188, "InteractionType": "CompleteQuest" } diff --git a/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4882_The Feat of Pots.json b/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4882_The Feat of Pots.json index 54e043143..d42df4293 100644 --- a/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4882_The Feat of Pots.json +++ b/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4882_The Feat of Pots.json @@ -12,6 +12,7 @@ "Y": 122.950645, "Z": 345.6626 }, + "StopDistance": 5, "TerritoryId": 1188, "InteractionType": "AcceptQuest" } @@ -42,6 +43,7 @@ "Y": -17.964504, "Z": 166.55212 }, + "StopDistance": 5, "TerritoryId": 1185, "InteractionType": "Interact" } diff --git a/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4884_The Shape of Peace.json b/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4884_The Shape of Peace.json index 4c71bd865..185ff46b2 100644 --- a/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4884_The Shape of Peace.json +++ b/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4884_The Shape of Peace.json @@ -45,6 +45,21 @@ } ] }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "TerritoryId": 1, + "InteractionType": "WalkTo", + "Comment": "Filler" + } + ] + }, { "Sequence": 3, "Steps": [ diff --git a/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4885_Lost Promise.json b/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4885_Lost Promise.json index 7a3023c74..b89555e73 100644 --- a/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4885_Lost Promise.json +++ b/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4885_Lost Promise.json @@ -188,7 +188,7 @@ }, "TerritoryId": 1188, "InteractionType": "WaitForNpcAtPosition", - "NpcWaitDistance": 1 + "NpcWaitDistance": 3 }, { "DataId": 1046648, diff --git a/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4886_A Brother's Duty.json b/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4886_A Brother's Duty.json index 6e2f83184..cca2883ee 100644 --- a/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4886_A Brother's Duty.json +++ b/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4886_A Brother's Duty.json @@ -21,6 +21,15 @@ { "Sequence": 1, "Steps": [ + { + "Position": { + "X": 531.60944, + "Y": 116.17938, + "Z": 166.65599 + }, + "TerritoryId": 1188, + "InteractionType": "WalkTo" + }, { "DataId": 2013610, "Position": { @@ -42,6 +51,7 @@ "Y": 110.795235, "Z": 256.5983 }, + "StopDistance": 0.25, "TerritoryId": 1188, "InteractionType": "Combat", "EnemySpawnType": "AutoOnEnterArea", @@ -79,8 +89,7 @@ "Z": 229.96863 }, "TerritoryId": 1188, - "InteractionType": "Interact", - "Comment": "TODO Verify this is the correct sequence" + "InteractionType": "Interact" } ] }, diff --git a/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4889_History's Keepers.json b/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4889_History's Keepers.json index 892432e66..5fb8769c1 100644 --- a/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4889_History's Keepers.json +++ b/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4889_History's Keepers.json @@ -28,7 +28,8 @@ "Z": 465.87305 }, "TerritoryId": 1188, - "InteractionType": "Interact" + "InteractionType": "Interact", + "AetheryteShortcut": "Kozama'uka - Earthenshire" } ] }, diff --git a/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4890_The Feat of Proof.json b/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4890_The Feat of Proof.json index 209821cf4..b538942cf 100644 --- a/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4890_The Feat of Proof.json +++ b/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4890_The Feat of Proof.json @@ -166,9 +166,18 @@ }, { "Position": { - "X": 282.9373, - "Y": 47.77521, - "Z": 140.4986 + "X": 341.56342, + "Y": 57.53834, + "Z": 10.309054 + }, + "TerritoryId": 1187, + "InteractionType": "WalkTo" + }, + { + "Position": { + "X": 308.72827, + "Y": 60.2934, + "Z": 111.43004 }, "TerritoryId": 1187, "InteractionType": "WalkTo" diff --git a/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4892_An Echo of Madness.json b/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4892_An Echo of Madness.json index d0d19f5cc..6492474c4 100644 --- a/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4892_An Echo of Madness.json +++ b/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4892_An Echo of Madness.json @@ -27,6 +27,7 @@ "Y": 129.04724, "Z": 652.12476 }, + "StopDistance": 5, "TerritoryId": 1187, "InteractionType": "Interact", "CompletionQuestVariablesFlags": [ @@ -62,6 +63,7 @@ "Y": 111.135, "Z": 557.7324 }, + "StopDistance": 5, "TerritoryId": 1187, "InteractionType": "Interact", "CompletionQuestVariablesFlags": [ @@ -80,6 +82,7 @@ "Y": 111.135, "Z": 697.4745 }, + "StopDistance": 5, "TerritoryId": 1187, "InteractionType": "Interact", "CompletionQuestVariablesFlags": [ diff --git a/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4893_Pointing the Way.json b/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4893_Pointing the Way.json index a3d3b5d3f..c1e0da4c2 100644 --- a/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4893_Pointing the Way.json +++ b/QuestPaths/Dawntrail/MSQ/B-Kozama'uka2-Urqopacha2/4893_Pointing the Way.json @@ -157,6 +157,7 @@ "Y": 109.359344, "Z": 395.2364 }, + "StopDistance": 0.25, "TerritoryId": 1187, "InteractionType": "Combat", "EnemySpawnType": "AutoOnEnterArea", diff --git a/QuestPaths/Dawntrail/MSQ/C-Yak T'el/4897_The Leap to Yak T'el.json b/QuestPaths/Dawntrail/MSQ/C-Yak T'el/4897_The Leap to Yak T'el.json index df60f84e5..3df2c76be 100644 --- a/QuestPaths/Dawntrail/MSQ/C-Yak T'el/4897_The Leap to Yak T'el.json +++ b/QuestPaths/Dawntrail/MSQ/C-Yak T'el/4897_The Leap to Yak T'el.json @@ -45,6 +45,21 @@ } ] }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "TerritoryId": 1, + "InteractionType": "WalkTo", + "Comment": "Filler" + } + ] + }, { "Sequence": 3, "Steps": [ diff --git a/QuestPaths/Dawntrail/MSQ/C-Yak T'el/4899_A History of Violence.json b/QuestPaths/Dawntrail/MSQ/C-Yak T'el/4899_A History of Violence.json index 1e40bf466..b67d760e3 100644 --- a/QuestPaths/Dawntrail/MSQ/C-Yak T'el/4899_A History of Violence.json +++ b/QuestPaths/Dawntrail/MSQ/C-Yak T'el/4899_A History of Violence.json @@ -43,8 +43,7 @@ "Z": -403.21973 }, "TerritoryId": 1189, - "InteractionType": "Interact", - "Comment": "TODO Verify this shouldn't have a teleport (was removed due to AC moving)" + "InteractionType": "Interact" } ] }, diff --git a/QuestPaths/Dawntrail/MSQ/C-Yak T'el/4900_The Feat of Repast.json b/QuestPaths/Dawntrail/MSQ/C-Yak T'el/4900_The Feat of Repast.json index 2b135bfd6..273ebbdcd 100644 --- a/QuestPaths/Dawntrail/MSQ/C-Yak T'el/4900_The Feat of Repast.json +++ b/QuestPaths/Dawntrail/MSQ/C-Yak T'el/4900_The Feat of Repast.json @@ -12,6 +12,7 @@ "Y": 19.501463, "Z": -358.05298 }, + "StopDistance": 5, "TerritoryId": 1189, "InteractionType": "AcceptQuest" } diff --git a/QuestPaths/Dawntrail/MSQ/D-Shaaloani-HeritageFound1/4912_The Long Road to Xak Tural.json b/QuestPaths/Dawntrail/MSQ/D-Shaaloani-HeritageFound1/4912_The Long Road to Xak Tural.json index 72e612c1d..dcdc22ec6 100644 --- a/QuestPaths/Dawntrail/MSQ/D-Shaaloani-HeritageFound1/4912_The Long Road to Xak Tural.json +++ b/QuestPaths/Dawntrail/MSQ/D-Shaaloani-HeritageFound1/4912_The Long Road to Xak Tural.json @@ -32,6 +32,21 @@ } ] }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "TerritoryId": 1, + "InteractionType": "WalkTo", + "Comment": "Filler" + } + ] + }, { "Sequence": 3, "Steps": [ diff --git a/QuestPaths/Dawntrail/MSQ/D-Shaaloani-HeritageFound1/4923_In Yyasulani's Shadow.json b/QuestPaths/Dawntrail/MSQ/D-Shaaloani-HeritageFound1/4923_In Yyasulani's Shadow.json index 442c2d8f5..8d9fd18b6 100644 --- a/QuestPaths/Dawntrail/MSQ/D-Shaaloani-HeritageFound1/4923_In Yyasulani's Shadow.json +++ b/QuestPaths/Dawntrail/MSQ/D-Shaaloani-HeritageFound1/4923_In Yyasulani's Shadow.json @@ -37,6 +37,21 @@ } ] }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "TerritoryId": 1, + "InteractionType": "WalkTo", + "Comment": "Filler" + } + ] + }, { "Sequence": 3, "Steps": [ diff --git a/QuestPaths/Dawntrail/MSQ/D-Shaaloani-HeritageFound1/4926_All Aboard.json b/QuestPaths/Dawntrail/MSQ/D-Shaaloani-HeritageFound1/4926_All Aboard.json index 65234f207..a37257edf 100644 --- a/QuestPaths/Dawntrail/MSQ/D-Shaaloani-HeritageFound1/4926_All Aboard.json +++ b/QuestPaths/Dawntrail/MSQ/D-Shaaloani-HeritageFound1/4926_All Aboard.json @@ -42,6 +42,21 @@ } ] }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "TerritoryId": 1, + "InteractionType": "WalkTo", + "Comment": "Filler" + } + ] + }, { "Sequence": 3, "Steps": [ diff --git a/QuestPaths/Dawntrail/MSQ/E-SolutionNine-HeritageFound2/4933_Solution Nine.json b/QuestPaths/Dawntrail/MSQ/E-SolutionNine-HeritageFound2/4933_Solution Nine.json index 9e43bc412..7d3d23e75 100644 --- a/QuestPaths/Dawntrail/MSQ/E-SolutionNine-HeritageFound2/4933_Solution Nine.json +++ b/QuestPaths/Dawntrail/MSQ/E-SolutionNine-HeritageFound2/4933_Solution Nine.json @@ -34,6 +34,21 @@ } ] }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "TerritoryId": 1, + "InteractionType": "WalkTo", + "Comment": "Filler" + } + ] + }, { "Sequence": 3, "Steps": [ diff --git a/QuestPaths/Dawntrail/MSQ/E-SolutionNine-HeritageFound2/4945_The Resilient Son.json b/QuestPaths/Dawntrail/MSQ/E-SolutionNine-HeritageFound2/4945_The Resilient Son.json index ba6befc72..8abe5c211 100644 --- a/QuestPaths/Dawntrail/MSQ/E-SolutionNine-HeritageFound2/4945_The Resilient Son.json +++ b/QuestPaths/Dawntrail/MSQ/E-SolutionNine-HeritageFound2/4945_The Resilient Son.json @@ -46,6 +46,21 @@ } ] }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "TerritoryId": 1, + "InteractionType": "WalkTo", + "Comment": "Filler" + } + ] + }, { "Sequence": 4, "Steps": [ @@ -56,6 +71,21 @@ } ] }, + { + "Sequence": 5, + "Steps": [ + { + "Position": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "TerritoryId": 1, + "InteractionType": "WalkTo", + "Comment": "Filler" + } + ] + }, { "Sequence": 6, "Steps": [ diff --git a/QuestPaths/Dawntrail/MSQ/F-Living Memory/4948_Through the Gate of Gold.json b/QuestPaths/Dawntrail/MSQ/F-Living Memory/4948_Through the Gate of Gold.json index 78a70188c..1b76a7176 100644 --- a/QuestPaths/Dawntrail/MSQ/F-Living Memory/4948_Through the Gate of Gold.json +++ b/QuestPaths/Dawntrail/MSQ/F-Living Memory/4948_Through the Gate of Gold.json @@ -56,6 +56,21 @@ } ] }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "TerritoryId": 1, + "InteractionType": "WalkTo", + "Comment": "Filler" + } + ] + }, { "Sequence": 3, "Steps": [ @@ -71,6 +86,21 @@ } ] }, + { + "Sequence": 4, + "Steps": [ + { + "Position": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "TerritoryId": 1, + "InteractionType": "WalkTo", + "Comment": "Filler" + } + ] + }, { "Sequence": 5, "Steps": [ diff --git a/QuestPaths/Dawntrail/MSQ/F-Living Memory/4959_Dawntrail.json b/QuestPaths/Dawntrail/MSQ/F-Living Memory/4959_Dawntrail.json index 2f768149b..4d320523e 100644 --- a/QuestPaths/Dawntrail/MSQ/F-Living Memory/4959_Dawntrail.json +++ b/QuestPaths/Dawntrail/MSQ/F-Living Memory/4959_Dawntrail.json @@ -48,6 +48,21 @@ } ] }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "TerritoryId": 1, + "InteractionType": "WalkTo", + "Comment": "Filler" + } + ] + }, { "Sequence": 4, "Steps": [ diff --git a/QuestPaths/Dawntrail/RoleQuests/Healer/4824_In the Sting of Things.json b/QuestPaths/Dawntrail/RoleQuests/Healer/4824_In the Sting of Things.json index 8cdb0369c..777a0ba07 100644 --- a/QuestPaths/Dawntrail/RoleQuests/Healer/4824_In the Sting of Things.json +++ b/QuestPaths/Dawntrail/RoleQuests/Healer/4824_In the Sting of Things.json @@ -13,7 +13,7 @@ "Z": 201.28174 }, "TerritoryId": 1185, - "InteractionType": "Interact" + "InteractionType": "AcceptQuest" } ] } diff --git a/QuestPaths/Dawntrail/RoleQuests/MagicalRanged/4842_Power Forgotten.json b/QuestPaths/Dawntrail/RoleQuests/MagicalRanged/4842_Power Forgotten.json index 7bf7c7e50..2cb7c7f4e 100644 --- a/QuestPaths/Dawntrail/RoleQuests/MagicalRanged/4842_Power Forgotten.json +++ b/QuestPaths/Dawntrail/RoleQuests/MagicalRanged/4842_Power Forgotten.json @@ -13,9 +13,71 @@ "Z": 194.72034 }, "TerritoryId": 1185, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1048335, + "Position": { + "X": -16.739136, + "Y": 0.5999997, + "Z": -55.10034 + }, + "TerritoryId": 963, + "InteractionType": "Interact", + "AetheryteShortcut": "Radz-at-Han" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1048337, + "Position": { + "X": 155.87085, + "Y": 5.297462, + "Z": 618.2803 + }, + "TerritoryId": 957, "InteractionType": "Interact" } ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2013708, + "Position": { + "X": 48.90515, + "Y": 90.22656, + "Z": -83.024414 + }, + "StopDistance": 0.5, + "TerritoryId": 957, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1048331, + "Position": { + "X": 214.03821, + "Y": 5.2600574, + "Z": 628.3817 + }, + "TerritoryId": 957, + "InteractionType": "CompleteQuest" + } + ] } ] } diff --git a/QuestPaths/Dawntrail/RoleQuests/MagicalRanged/4843_A Brand of Justice.json b/QuestPaths/Dawntrail/RoleQuests/MagicalRanged/4843_A Brand of Justice.json new file mode 100644 index 000000000..6ca942002 --- /dev/null +++ b/QuestPaths/Dawntrail/RoleQuests/MagicalRanged/4843_A Brand of Justice.json @@ -0,0 +1,141 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1048331, + "Position": { + "X": 214.03821, + "Y": 5.2600574, + "Z": 628.3817 + }, + "TerritoryId": 957, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1048332, + "Position": { + "X": 52.506226, + "Y": -5.20688E-07, + "Z": -54.154297 + }, + "TerritoryId": 963, + "InteractionType": "Interact", + "AetheryteShortcut": "Radz-at-Han" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1048340, + "Position": { + "X": -186.69415, + "Y": 4.0499983, + "Z": -108.11017 + }, + "TerritoryId": 963, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Radz-at-Han] Aetheryte Plaza", + "[Radz-at-Han] Hall of the Radiant Host" + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1048332, + "Position": { + "X": 52.506226, + "Y": -5.20688E-07, + "Z": -54.154297 + }, + "TerritoryId": 963, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Radz-at-Han] Hall of the Radiant Host", + "[Radz-at-Han] Aetheryte Plaza" + ] + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1048343, + "Position": { + "X": -336.53772, + "Y": 52.243706, + "Z": -165.05688 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "AetheryteShortcut": "Thavnair - Great Work" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "Position": { + "X": -427.5108, + "Y": -0.015813708, + "Z": -710.37146 + }, + "StopDistance": 0.25, + "TerritoryId": 957, + "InteractionType": "Combat", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 17625 + ] + } + ] + }, + { + "Sequence": 6, + "Steps": [ + { + "DataId": 1048344, + "Position": { + "X": -419.028, + "Y": 0.06509568, + "Z": -710.9331 + }, + "StopDistance": 7, + "TerritoryId": 957, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1048331, + "Position": { + "X": 214.03821, + "Y": 5.2600574, + "Z": 628.3817 + }, + "TerritoryId": 957, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/Dawntrail/RoleQuests/MagicalRanged/4844_The Seeds of Popularity.json b/QuestPaths/Dawntrail/RoleQuests/MagicalRanged/4844_The Seeds of Popularity.json new file mode 100644 index 000000000..4ca3c1bc2 --- /dev/null +++ b/QuestPaths/Dawntrail/RoleQuests/MagicalRanged/4844_The Seeds of Popularity.json @@ -0,0 +1,163 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1048331, + "Position": { + "X": 214.03821, + "Y": 5.2600574, + "Z": 628.3817 + }, + "TerritoryId": 957, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1048348, + "Position": { + "X": -118.76105, + "Y": 88.94139, + "Z": -556.90857 + }, + "TerritoryId": 957, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "Position": { + "X": 77.94611, + "Y": 82.44486, + "Z": -548.9286 + }, + "StopDistance": 10, + "TerritoryId": 957, + "InteractionType": "Instruction", + "EnemySpawnType": "AutoOnEnterArea", + "KillEnemyDataIds": [ + 17626 + ], + "ItemId": 2003495, + "Comment": "TODO Needs item use?" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1048348, + "Position": { + "X": -118.76105, + "Y": 88.94139, + "Z": -556.90857 + }, + "TerritoryId": 957, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1048350, + "Position": { + "X": -508.53745, + "Y": 12.375278, + "Z": 97.3678 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "AetheryteShortcut": "Thavnair - Great Work" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1048354, + "Position": { + "X": 154.28394, + "Y": 5.2641535, + "Z": 618.40234 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "AetheryteShortcut": "Thavnair - Yedlihmad", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 1048355, + "Position": { + "X": 227.98499, + "Y": 10.19656, + "Z": 563.31726 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 1048352, + "Position": { + "X": 195.5138, + "Y": 15.136732, + "Z": 529.015 + }, + "TerritoryId": 957, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1048331, + "Position": { + "X": 214.03821, + "Y": 5.2600574, + "Z": 628.3817 + }, + "TerritoryId": 957, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/Dawntrail/RoleQuests/Melee/4830_The Hunter and the Hunted.json b/QuestPaths/Dawntrail/RoleQuests/Melee/4830_The Hunter and the Hunted.json index db58cf2ec..fc3fa27f4 100644 --- a/QuestPaths/Dawntrail/RoleQuests/Melee/4830_The Hunter and the Hunted.json +++ b/QuestPaths/Dawntrail/RoleQuests/Melee/4830_The Hunter and the Hunted.json @@ -13,7 +13,7 @@ "Z": 198.68762 }, "TerritoryId": 1185, - "InteractionType": "Interact" + "InteractionType": "AcceptQuest" } ] } diff --git a/QuestPaths/Dawntrail/RoleQuests/PhysicalRanged/4836_To Steal a Steelhog.json b/QuestPaths/Dawntrail/RoleQuests/PhysicalRanged/4836_To Steal a Steelhog.json index 579bc1bea..ecb16d8c1 100644 --- a/QuestPaths/Dawntrail/RoleQuests/PhysicalRanged/4836_To Steal a Steelhog.json +++ b/QuestPaths/Dawntrail/RoleQuests/PhysicalRanged/4836_To Steal a Steelhog.json @@ -13,7 +13,7 @@ "Z": 203.38745 }, "TerritoryId": 1185, - "InteractionType": "Interact" + "InteractionType": "AcceptQuest" } ] } diff --git a/QuestPaths/Dawntrail/RoleQuests/Tank/4823_Dreams of a New Day.json b/QuestPaths/Dawntrail/RoleQuests/Tank/4823_Dreams of a New Day.json index 1582ab92d..5d9224829 100644 --- a/QuestPaths/Dawntrail/RoleQuests/Tank/4823_Dreams of a New Day.json +++ b/QuestPaths/Dawntrail/RoleQuests/Tank/4823_Dreams of a New Day.json @@ -53,6 +53,21 @@ } ] }, + { + "Sequence": 3, + "Steps": [ + { + "Position": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "TerritoryId": 1, + "InteractionType": "WalkTo", + "Comment": "Filler" + } + ] + }, { "Sequence": 4, "Steps": [ diff --git a/QuestPaths/quest-v1.json b/QuestPaths/quest-v1.json index 95a7cbb4e..0ebe0e633 100644 --- a/QuestPaths/quest-v1.json +++ b/QuestPaths/quest-v1.json @@ -866,6 +866,13 @@ } ] } + }, + "PointMenuChoices": { + "type": "array", + "items": { + "type": "integer", + "minimum": 0 + } } } } diff --git a/Questionable.Model/V1/QuestStep.cs b/Questionable.Model/V1/QuestStep.cs index 9d3262e6b..a23c20ca5 100644 --- a/Questionable.Model/V1/QuestStep.cs +++ b/Questionable.Model/V1/QuestStep.cs @@ -49,6 +49,7 @@ public sealed class QuestStep public IList SkipIf { get; set; } = new List(); public IList CompletionQuestVariablesFlags { get; set; } = new List(); public IList DialogueChoices { get; set; } = new List(); + public IList PointMenuChoices { get; set; } = new List(); public ushort? QuestId { get; set; } [JsonConstructor] diff --git a/Questionable/Controller/GameUiController.cs b/Questionable/Controller/GameUiController.cs index ec82f6a9f..0784cca45 100644 --- a/Questionable/Controller/GameUiController.cs +++ b/Questionable/Controller/GameUiController.cs @@ -48,6 +48,7 @@ internal sealed class GameUiController : IDisposable _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "CutSceneSelectString", CutsceneSelectStringPostSetup); _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "SelectIconString", SelectIconStringPostSetup); _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "SelectYesno", SelectYesnoPostSetup); + _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "PointMenu", PointMenuPostSetup); _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "Credit", CreditPostSetup); _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "AkatsukiNote", UnendingCodexPostSetup); _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "ContentsTutorial", ContentsTutorialPostSetup); @@ -80,6 +81,12 @@ internal sealed class GameUiController : IDisposable _logger.LogInformation("SelectYesno window is open"); SelectYesnoPostSetup(addonSelectYesno, true); } + + if (_gameGui.TryGetAddonByName("PointMenu", out AtkUnitBase* addonPointMenu)) + { + _logger.LogInformation("PointMenu is open"); + PointMenuPostSetup(addonPointMenu); + } } private unsafe void SelectStringPostSetup(AddonEvent type, AddonArgs args) @@ -380,6 +387,61 @@ internal sealed class GameUiController : IDisposable } } + private unsafe void PointMenuPostSetup(AddonEvent type, AddonArgs args) + { + AtkUnitBase* addonPointMenu = (AtkUnitBase*)args.Addon; + PointMenuPostSetup(addonPointMenu); + } + + private unsafe void PointMenuPostSetup(AtkUnitBase* addonPointMenu) + { + var currentQuest = _questController.CurrentQuest; + if (currentQuest == null) + { + _logger.LogInformation("Ignoring point menu, no active quest"); + return; + } + + var sequence = currentQuest.Quest.FindSequence(currentQuest.Sequence); + if (sequence == null) + return; + + QuestStep? step = sequence.FindStep(currentQuest.Step); + if (step == null) + return; + + if (step.PointMenuChoices.Count == 0) + { + _logger.LogWarning("No point menu choices"); + return; + } + + int counter = currentQuest.StepProgress.PointMenuCounter; + if (counter >= step.PointMenuChoices.Count) + { + _logger.LogWarning("No remaining point menu choices"); + return; + } + + uint choice = step.PointMenuChoices[counter]; + + _logger.LogInformation("Handling point menu, picking choice {Choice} (index = {Index})", choice, counter); + var selectChoice = stackalloc AtkValue[] + { + new() { Type = ValueType.Int, Int = 13 }, + new() { Type = ValueType.UInt, UInt = choice } + }; + addonPointMenu->FireCallback(2, selectChoice); + + _questController.CurrentQuest = currentQuest with + { + StepProgress = currentQuest.StepProgress with + { + PointMenuCounter = counter + 1, + } + }; + } + private unsafe void CreditPostSetup(AddonEvent type, AddonArgs args) { _logger.LogInformation("Closing Credits sequence"); @@ -451,6 +513,7 @@ internal sealed class GameUiController : IDisposable _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "ContentsTutorial", ContentsTutorialPostSetup); _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "AkatsukiNote", UnendingCodexPostSetup); _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "Credit", CreditPostSetup); + _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "PointMenu", PointMenuPostSetup); _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "SelectYesno", SelectYesnoPostSetup); _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "SelectIconString", SelectIconStringPostSetup); _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "CutSceneSelectString", CutsceneSelectStringPostSetup); diff --git a/Questionable/Controller/QuestController.cs b/Questionable/Controller/QuestController.cs index 4ed4f59b1..4dfa0085f 100644 --- a/Questionable/Controller/QuestController.cs +++ b/Questionable/Controller/QuestController.cs @@ -399,7 +399,8 @@ internal sealed class QuestController (QuestSequence? seq, QuestStep? step) = GetNextStep(); if (CurrentQuest == null || seq == null || step == null) { - _logger.LogWarning("Could not retrieve next quest step, not doing anything"); + _logger.LogWarning("Could not retrieve next quest step, not doing anything [{QuestId}, {Sequence}, {Step}]", + CurrentQuest?.Quest.QuestId, CurrentQuest?.Sequence, CurrentQuest?.Step); return; } @@ -492,5 +493,6 @@ internal sealed class QuestController } public sealed record StepProgress( - DateTime StartedAt); + DateTime StartedAt, + int PointMenuCounter = 0); } diff --git a/Questionable/Controller/QuestRegistry.cs b/Questionable/Controller/QuestRegistry.cs index 3d0f638c1..cfb610975 100644 --- a/Questionable/Controller/QuestRegistry.cs +++ b/Questionable/Controller/QuestRegistry.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Globalization; +using System.Linq; using System.IO; using System.Text.Json; using Dalamud.Plugin; @@ -72,6 +73,12 @@ internal sealed class QuestRegistry quest.Name = questData.Name.ToString(); quest.Level = questData.ClassJobLevel0; + +#if !RELEASE + int missingSteps = quest.Data.QuestSequence.Where(x => x.Sequence < 255).Max(x => x.Sequence) - quest.Data.QuestSequence.Count(x => x.Sequence < 255) + 1; + if (missingSteps != 0) + _logger.LogWarning("Quest has missing steps: {QuestId} / {QuestName} → {Count}", quest.QuestId, quest.Name, missingSteps); +#endif } _logger.LogInformation("Loaded {Count} quests", _quests.Count); diff --git a/Questionable/Controller/Steps/BaseFactory/Move.cs b/Questionable/Controller/Steps/BaseFactory/Move.cs index 8388df8f8..32ee4c616 100644 --- a/Questionable/Controller/Steps/BaseFactory/Move.cs +++ b/Questionable/Controller/Steps/BaseFactory/Move.cs @@ -7,6 +7,7 @@ using Dalamud.Plugin.Services; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Questionable.Controller.Steps.BaseTasks; +using Questionable.Data; using Questionable.Model; using Questionable.Model.V1; @@ -45,7 +46,8 @@ internal static class Move ILogger logger, GameFunctions gameFunctions, IClientState clientState, - MovementController movementController) + MovementController movementController, + TerritoryData territoryData) { public QuestStep Step { get; set; } = null!; public Vector3 Destination { get; set; } @@ -61,7 +63,7 @@ internal static class Move } yield return new WaitConditionTask(() => clientState.TerritoryType == Step.TerritoryId, - $"Wait(territory: {Step.TerritoryId})"); + $"Wait(territory: {territoryData.GetNameAndId(Step.TerritoryId)})"); if (!Step.DisableNavmesh) yield return new WaitConditionTask(() => movementController.IsNavmeshReady, diff --git a/Questionable/Controller/Steps/BaseFactory/WaitAtEnd.cs b/Questionable/Controller/Steps/BaseFactory/WaitAtEnd.cs index a9affc048..4af6d5889 100644 --- a/Questionable/Controller/Steps/BaseFactory/WaitAtEnd.cs +++ b/Questionable/Controller/Steps/BaseFactory/WaitAtEnd.cs @@ -9,6 +9,7 @@ using FFXIVClientStructs.FFXIV.Application.Network.WorkDefinitions; using FFXIVClientStructs.FFXIV.Client.Game; using Microsoft.Extensions.DependencyInjection; using Questionable.Controller.Steps.BaseTasks; +using Questionable.Data; using Questionable.Model; using Questionable.Model.V1; @@ -16,7 +17,8 @@ namespace Questionable.Controller.Steps.BaseFactory; internal static class WaitAtEnd { - internal sealed class Factory(IServiceProvider serviceProvider, IClientState clientState, ICondition condition) + internal sealed class Factory(IServiceProvider serviceProvider, IClientState clientState, ICondition condition, + TerritoryData territoryData) : ITaskFactory { public IEnumerable CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step) @@ -76,7 +78,7 @@ internal static class WaitAtEnd // interaction moves to a different territory waitInteraction = new WaitConditionTask( () => clientState.TerritoryType == step.TargetTerritoryId, - $"Wait(tp to territory: {step.TargetTerritoryId})"); + $"Wait(tp to territory: {territoryData.GetNameAndId(step.TargetTerritoryId.Value)})"); } else { diff --git a/Questionable/Data/TerritoryData.cs b/Questionable/Data/TerritoryData.cs index 99e8c85ab..7d3fc59e8 100644 --- a/Questionable/Data/TerritoryData.cs +++ b/Questionable/Data/TerritoryData.cs @@ -1,6 +1,8 @@ using System.Collections.Immutable; +using System.Globalization; using System.Linq; using Dalamud.Plugin.Services; +using FFXIVClientStructs.FFXIV.Client.Game.Character; using Lumina.Excel.GeneratedSheets; namespace Questionable.Data; @@ -31,5 +33,14 @@ internal sealed class TerritoryData public string? GetName(ushort territoryId) => _territoryNames.GetValueOrDefault(territoryId); + public string GetNameAndId(ushort territoryId) + { + string? territoryName = GetName(territoryId); + if (territoryName != null) + return string.Create(CultureInfo.InvariantCulture, $"{territoryName} ({territoryId})"); + else + return territoryId.ToString(CultureInfo.InvariantCulture); + } + public bool CanUseMount(ushort territoryId) => _territoriesWithMount.Contains(territoryId); } diff --git a/Questionable/Windows/QuestWindow.cs b/Questionable/Windows/QuestWindow.cs index c97481e84..e7871118c 100644 --- a/Questionable/Windows/QuestWindow.cs +++ b/Questionable/Windows/QuestWindow.cs @@ -211,13 +211,9 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig { Debug.Assert(_clientState.LocalPlayer != null, "_clientState.LocalPlayer != null"); - string? territoryName = _territoryData.GetName(_clientState.TerritoryType); - if (territoryName != null) - territoryName += string.Create(CultureInfo.InvariantCulture, $" ({_clientState.TerritoryType})"); - else - territoryName = _clientState.TerritoryType.ToString(CultureInfo.InvariantCulture); - + string territoryName = _territoryData.GetNameAndId(_clientState.TerritoryType); ImGui.Text(territoryName); + if (_gameFunctions.IsFlyingUnlockedInCurrentZone()) { ImGui.SameLine(); @@ -294,9 +290,9 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig { string interactionType = gameObject->NamePlateIconId switch { - 71201 or 71211 or 71221 or 71231 or 71341 => "AcceptQuest", - 71202 or 71212 or 71222 or 71232 or 71342 => "AcceptQuest", // repeatable - 71205 or 71215 or 71225 or 71235 or 71345 => "CompleteQuest", + 71201 or 71211 or 71221 or 71231 or 71341 or 71351 => "AcceptQuest", + 71202 or 71212 or 71222 or 71232 or 71342 or 71352 => "AcceptQuest", // repeatable + 71205 or 71215 or 71225 or 71235 or 71345 or 71355 => "CompleteQuest", _ => "Interact", }; ImGui.SetClipboardText($$"""