From ef34c5b4f1493b891aa6353530637392e2e6b1a8 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 12 Jul 2024 10:31:34 +0200 Subject: [PATCH] Limsa navmesh adjustments; add more role quests --- .../4842_Power Forgotten.json | 0 .../4843_A Brand of Justice.json | 0 .../4844_The Seeds of Popularity.json | 0 .../4845_Floundering Fame.json | 0 .../4846_Behind the Helm.json | 0 .../4847_Heroes and Pretenders.json | 0 .../Melee/4830_The Hunter and the Hunted.json | 161 ++++++++++++++++- .../Melee/4831_A Sea of Blood.json | 153 ++++++++++++++++ .../Role Quests/Melee/4832_Who's Who.json | 142 +++++++++++++++ .../Role Quests/Melee/4833_Cornered Prey.json | 104 +++++++++++ .../Melee/4834_Impostor Syndrome.json | 144 +++++++++++++++ .../Role Quests/Melee/4835_A Hunter True.json | 169 ++++++++++++++++++ .../4836_To Steal a Steelhog.json | 0 .../4837_Bandits Abound.json | 0 .../Urqopacha/5030_An Unlikely Inspector.json | 113 ++++++++++++ .../Urqopacha/5031_The Carmine Secret.json | 82 +++++++++ ...4_Something Stray in the Neighborhood.json | 116 ++++++++++++ Questionable/Controller/MovementController.cs | 44 +---- .../NavigationOverrides/BlacklistedArea.cs | 19 ++ .../NavigationOverrides/BlacklistedPoint.cs | 19 ++ .../IBlacklistedLocation.cs | 10 ++ .../MovementOverrideController.cs | 52 ++++++ Questionable/QuestionablePlugin.cs | 2 + 23 files changed, 1293 insertions(+), 37 deletions(-) rename QuestPaths/Dawntrail/Role Quests/{MagicalRanged => Magical Ranged}/4842_Power Forgotten.json (100%) rename QuestPaths/Dawntrail/Role Quests/{MagicalRanged => Magical Ranged}/4843_A Brand of Justice.json (100%) rename QuestPaths/Dawntrail/Role Quests/{MagicalRanged => Magical Ranged}/4844_The Seeds of Popularity.json (100%) rename QuestPaths/Dawntrail/Role Quests/{MagicalRanged => Magical Ranged}/4845_Floundering Fame.json (100%) rename QuestPaths/Dawntrail/Role Quests/{MagicalRanged => Magical Ranged}/4846_Behind the Helm.json (100%) rename QuestPaths/Dawntrail/Role Quests/{MagicalRanged => Magical Ranged}/4847_Heroes and Pretenders.json (100%) create mode 100644 QuestPaths/Dawntrail/Role Quests/Melee/4831_A Sea of Blood.json create mode 100644 QuestPaths/Dawntrail/Role Quests/Melee/4832_Who's Who.json create mode 100644 QuestPaths/Dawntrail/Role Quests/Melee/4833_Cornered Prey.json create mode 100644 QuestPaths/Dawntrail/Role Quests/Melee/4834_Impostor Syndrome.json create mode 100644 QuestPaths/Dawntrail/Role Quests/Melee/4835_A Hunter True.json rename QuestPaths/Dawntrail/Role Quests/{PhysicalRanged => Physical Ranged}/4836_To Steal a Steelhog.json (100%) rename QuestPaths/Dawntrail/Role Quests/{PhysicalRanged => Physical Ranged}/4837_Bandits Abound.json (100%) create mode 100644 QuestPaths/Dawntrail/Side Quests/Urqopacha/5030_An Unlikely Inspector.json create mode 100644 QuestPaths/Dawntrail/Side Quests/Urqopacha/5031_The Carmine Secret.json create mode 100644 QuestPaths/Dawntrail/Unlocks/Dungeons/5014_Something Stray in the Neighborhood.json create mode 100644 Questionable/Controller/NavigationOverrides/BlacklistedArea.cs create mode 100644 Questionable/Controller/NavigationOverrides/BlacklistedPoint.cs create mode 100644 Questionable/Controller/NavigationOverrides/IBlacklistedLocation.cs create mode 100644 Questionable/Controller/NavigationOverrides/MovementOverrideController.cs diff --git a/QuestPaths/Dawntrail/Role Quests/MagicalRanged/4842_Power Forgotten.json b/QuestPaths/Dawntrail/Role Quests/Magical Ranged/4842_Power Forgotten.json similarity index 100% rename from QuestPaths/Dawntrail/Role Quests/MagicalRanged/4842_Power Forgotten.json rename to QuestPaths/Dawntrail/Role Quests/Magical Ranged/4842_Power Forgotten.json diff --git a/QuestPaths/Dawntrail/Role Quests/MagicalRanged/4843_A Brand of Justice.json b/QuestPaths/Dawntrail/Role Quests/Magical Ranged/4843_A Brand of Justice.json similarity index 100% rename from QuestPaths/Dawntrail/Role Quests/MagicalRanged/4843_A Brand of Justice.json rename to QuestPaths/Dawntrail/Role Quests/Magical Ranged/4843_A Brand of Justice.json diff --git a/QuestPaths/Dawntrail/Role Quests/MagicalRanged/4844_The Seeds of Popularity.json b/QuestPaths/Dawntrail/Role Quests/Magical Ranged/4844_The Seeds of Popularity.json similarity index 100% rename from QuestPaths/Dawntrail/Role Quests/MagicalRanged/4844_The Seeds of Popularity.json rename to QuestPaths/Dawntrail/Role Quests/Magical Ranged/4844_The Seeds of Popularity.json diff --git a/QuestPaths/Dawntrail/Role Quests/MagicalRanged/4845_Floundering Fame.json b/QuestPaths/Dawntrail/Role Quests/Magical Ranged/4845_Floundering Fame.json similarity index 100% rename from QuestPaths/Dawntrail/Role Quests/MagicalRanged/4845_Floundering Fame.json rename to QuestPaths/Dawntrail/Role Quests/Magical Ranged/4845_Floundering Fame.json diff --git a/QuestPaths/Dawntrail/Role Quests/MagicalRanged/4846_Behind the Helm.json b/QuestPaths/Dawntrail/Role Quests/Magical Ranged/4846_Behind the Helm.json similarity index 100% rename from QuestPaths/Dawntrail/Role Quests/MagicalRanged/4846_Behind the Helm.json rename to QuestPaths/Dawntrail/Role Quests/Magical Ranged/4846_Behind the Helm.json diff --git a/QuestPaths/Dawntrail/Role Quests/MagicalRanged/4847_Heroes and Pretenders.json b/QuestPaths/Dawntrail/Role Quests/Magical Ranged/4847_Heroes and Pretenders.json similarity index 100% rename from QuestPaths/Dawntrail/Role Quests/MagicalRanged/4847_Heroes and Pretenders.json rename to QuestPaths/Dawntrail/Role Quests/Magical Ranged/4847_Heroes and Pretenders.json diff --git a/QuestPaths/Dawntrail/Role Quests/Melee/4830_The Hunter and the Hunted.json b/QuestPaths/Dawntrail/Role Quests/Melee/4830_The Hunter and the Hunted.json index fc3fa27f..daf1cb47 100644 --- a/QuestPaths/Dawntrail/Role Quests/Melee/4830_The Hunter and the Hunted.json +++ b/QuestPaths/Dawntrail/Role Quests/Melee/4830_The Hunter and the Hunted.json @@ -13,7 +13,166 @@ "Z": 198.68762 }, "TerritoryId": 1185, - "InteractionType": "AcceptQuest" + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Tuliyollal", + "SkipIf": [ + "AetheryteShortcutIfInSameTerritory" + ] + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1019038, + "Position": { + "X": -55.222473, + "Y": -2.9000003, + "Z": -65.65961 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "AetheryteShortcut": "Kugane", + "AethernetShortcut": [ + "[Kugane] Aetheryte Plaza", + "[Kugane] Shiokaze Hostelry" + ], + "SkipIf": [ + "AetheryteShortcutIfInSameTerritory" + ], + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 1019003, + "Position": { + "X": -41.24518, + "Y": -3.0000017, + "Z": -63.09613 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1019069, + "Position": { + "X": -62.119568, + "Y": 8, + "Z": -56.62628 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1051620, + "Position": { + "X": 111.40613, + "Y": 11.997255, + "Z": -52.048523 + }, + "TerritoryId": 628, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1048296, + "Position": { + "X": 111.40613, + "Y": 11.997235, + "Z": -52.018066 + }, + "TerritoryId": 628, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 2013689, + "Position": { + "X": 29.251465, + "Y": 5.935669, + "Z": -129.62543 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Kugane] Sekiseigumi Barracks", + "[Kugane] Rakuza District" + ] + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 2013690, + "Position": { + "X": 14.114502, + "Y": 3.982544, + "Z": 43.411865 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Kugane] Rakuza District", + "[Kugane] Kogane Dori Markets" + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1048296, + "Position": { + "X": 111.40613, + "Y": 11.997235, + "Z": -52.018066 + }, + "TerritoryId": 628, + "InteractionType": "CompleteQuest", + "AethernetShortcut": [ + "[Kugane] Kogane Dori Markets", + "[Kugane] Sekiseigumi Barracks" + ], + "NextQuestId": 4831 } ] } diff --git a/QuestPaths/Dawntrail/Role Quests/Melee/4831_A Sea of Blood.json b/QuestPaths/Dawntrail/Role Quests/Melee/4831_A Sea of Blood.json new file mode 100644 index 00000000..dfc926b6 --- /dev/null +++ b/QuestPaths/Dawntrail/Role Quests/Melee/4831_A Sea of Blood.json @@ -0,0 +1,153 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1048296, + "Position": { + "X": 111.40613, + "Y": 11.997235, + "Z": -52.018066 + }, + "TerritoryId": 628, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Kugane", + "SkipIf": [ + "AetheryteShortcutIfInSameTerritory" + ], + "DialogueChoices": [ + { + "Type": "List", + "Prompt": "TEXT_KINGBA311_04831_Q2_000_000", + "Answer": "TEXT_KINGBA311_04831_A2_000_002" + } + ] + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1019154, + "Position": { + "X": 829.1294, + "Y": 5.9230084, + "Z": 859.739 + }, + "TerritoryId": 613, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Kugane] Sekiseigumi Barracks", + "[Kugane] The Ruby Price" + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1019169, + "Position": { + "X": 476.82898, + "Y": 30.113333, + "Z": 763.546 + }, + "TerritoryId": 613, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1019167, + "Position": { + "X": 447.56226, + "Y": 34.29651, + "Z": 732.66187 + }, + "TerritoryId": 613, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1048299, + "Position": { + "X": 463.46216, + "Y": 29.787891, + "Z": 736.8428 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "Position": { + "X": 426.16245, + "Y": 0.7213422, + "Z": 195.08597 + }, + "TerritoryId": 613, + "InteractionType": "WalkTo", + "Fly": true + }, + { + "DataId": 1048301, + "Position": { + "X": 427.78674, + "Y": 0.5689501, + "Z": 195.39172 + }, + "TerritoryId": 613, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1048296, + "Position": { + "X": 111.40613, + "Y": 11.997235, + "Z": -52.018066 + }, + "TerritoryId": 628, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Kugane", + "AethernetShortcut": [ + "[Kugane] Aetheryte Plaza", + "[Kugane] Sekiseigumi Barracks" + ], + "NextQuestId": 4832 + } + ] + } + ] +} diff --git a/QuestPaths/Dawntrail/Role Quests/Melee/4832_Who's Who.json b/QuestPaths/Dawntrail/Role Quests/Melee/4832_Who's Who.json new file mode 100644 index 00000000..088de249 --- /dev/null +++ b/QuestPaths/Dawntrail/Role Quests/Melee/4832_Who's Who.json @@ -0,0 +1,142 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1048296, + "Position": { + "X": 111.40613, + "Y": 11.997235, + "Z": -52.018066 + }, + "TerritoryId": 628, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Kugane", + "SkipIf": [ + "AetheryteShortcutIfInSameTerritory" + ] + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1019260, + "Position": { + "X": 417.5935, + "Y": 68.02854, + "Z": -110.24652 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "AetheryteShortcut": "Yanxia - Namai", + "SkipIf": [ + "AetheryteShortcutIfInSameTerritory" + ], + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1019257, + "Position": { + "X": 468.55872, + "Y": 68.02771, + "Z": -93.21747 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 1019262, + "Position": { + "X": 445.76172, + "Y": 58.67623, + "Z": -155.62683 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1048302, + "Position": { + "X": 399.95422, + "Y": 76.04927, + "Z": -114.885254 + }, + "StopDistance": 0.5, + "TerritoryId": 614, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1048304, + "Position": { + "X": 421.3473, + "Y": 1.7278045, + "Z": -278.70605 + }, + "TerritoryId": 614, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1048296, + "Position": { + "X": 111.40613, + "Y": 11.997235, + "Z": -52.018066 + }, + "TerritoryId": 628, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Kugane", + "AethernetShortcut": [ + "[Kugane] Aetheryte Plaza", + "[Kugane] Sekiseigumi Barracks" + ], + "NextQuestId": 4833 + } + ] + } + ] +} diff --git a/QuestPaths/Dawntrail/Role Quests/Melee/4833_Cornered Prey.json b/QuestPaths/Dawntrail/Role Quests/Melee/4833_Cornered Prey.json new file mode 100644 index 00000000..aaf2aab8 --- /dev/null +++ b/QuestPaths/Dawntrail/Role Quests/Melee/4833_Cornered Prey.json @@ -0,0 +1,104 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1048297, + "Position": { + "X": 111.40613, + "Y": 11.997235, + "Z": -52.018066 + }, + "TerritoryId": 628, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Kugane", + "SkipIf": [ + "AetheryteShortcutIfInSameTerritory" + ] + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2013691, + "Position": { + "X": 203.8147, + "Y": 12.069824, + "Z": 773.0067 + }, + "TerritoryId": 613, + "InteractionType": "Interact", + "AethernetShortcut": [ + "[Kugane] Sekiseigumi Barracks", + "[Kugane] The Ruby Price" + ], + "Fly": true + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 2013692, + "Position": { + "X": 138.59766, + "Y": 9.292725, + "Z": 676.6002 + }, + "TerritoryId": 613, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 17617, + 17618, + 17619 + ], + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2013693, + "Position": { + "X": 167.89502, + "Y": 2.1209717, + "Z": 561.27246 + }, + "TerritoryId": 613, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1048297, + "Position": { + "X": 111.40613, + "Y": 11.997235, + "Z": -52.018066 + }, + "TerritoryId": 628, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Kugane", + "AethernetShortcut": [ + "[Kugane] Aetheryte Plaza", + "[Kugane] Sekiseigumi Barracks" + ], + "NextQuestId": 4834 + } + ] + } + ] +} diff --git a/QuestPaths/Dawntrail/Role Quests/Melee/4834_Impostor Syndrome.json b/QuestPaths/Dawntrail/Role Quests/Melee/4834_Impostor Syndrome.json new file mode 100644 index 00000000..d8a32a52 --- /dev/null +++ b/QuestPaths/Dawntrail/Role Quests/Melee/4834_Impostor Syndrome.json @@ -0,0 +1,144 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1048297, + "Position": { + "X": 111.40613, + "Y": 11.997235, + "Z": -52.018066 + }, + "TerritoryId": 628, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Kugane", + "SkipIf": [ + "AetheryteShortcutIfInSameTerritory" + ] + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "Position": { + "X": 42.052795, + "Y": 4.000001, + "Z": 71.14965 + }, + "TerritoryId": 628, + "InteractionType": "WalkTo", + "AethernetShortcut": [ + "[Kugane] Sekiseigumi Barracks", + "[Kugane] Kogane Dori Markets" + ] + }, + { + "DataId": 1018984, + "Position": { + "X": 42.34375, + "Y": 4.8365364, + "Z": 73.83838 + }, + "TerritoryId": 628, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1019065, + "Position": { + "X": 80.49133, + "Y": 4, + "Z": 56.443115 + }, + "TerritoryId": 628, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 2013694, + "Position": { + "X": 517.2654, + "Y": 0.99176025, + "Z": -692.10345 + }, + "TerritoryId": 613, + "InteractionType": "UseItem", + "ItemId": 2003492, + "AetheryteShortcut": "Ruby Sea - Onokoro", + "Fly": true + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 2013695, + "Position": { + "X": 519.76794, + "Y": 0.99176025, + "Z": -679.8352 + }, + "TerritoryId": 613, + "InteractionType": "Combat", + "EnemySpawnType": "AfterInteraction", + "KillEnemyDataIds": [ + 17620 + ] + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1019065, + "Position": { + "X": 80.49133, + "Y": 4, + "Z": 56.443115 + }, + "TerritoryId": 628, + "InteractionType": "Interact", + "AetheryteShortcut": "Kugane", + "AethernetShortcut": [ + "[Kugane] Aetheryte Plaza", + "[Kugane] Kogane Dori Markets" + ], + "SkipIf": [ + "AetheryteShortcutIfInSameTerritory" + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1048298, + "Position": { + "X": 111.40613, + "Y": 11.997235, + "Z": -52.018066 + }, + "TerritoryId": 628, + "InteractionType": "CompleteQuest", + "NextQuestId": 4835 + } + ] + } + ] +} diff --git a/QuestPaths/Dawntrail/Role Quests/Melee/4835_A Hunter True.json b/QuestPaths/Dawntrail/Role Quests/Melee/4835_A Hunter True.json new file mode 100644 index 00000000..de3637e6 --- /dev/null +++ b/QuestPaths/Dawntrail/Role Quests/Melee/4835_A Hunter True.json @@ -0,0 +1,169 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1048298, + "Position": { + "X": 111.40613, + "Y": 11.997235, + "Z": -52.018066 + }, + "TerritoryId": 628, + "InteractionType": "AcceptQuest", + "AetheryteShortcut": "Kugane", + "SkipIf": [ + "AetheryteShortcutIfInSameTerritory" + ] + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1019350, + "Position": { + "X": 563.2562, + "Y": -19.505632, + "Z": 319.11182 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "AetheryteShortcut": "Azim Steppe - Reunion", + "SkipIf": [ + "AetheryteShortcutIfInSameTerritory" + ], + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 1019351, + "Position": { + "X": 548.8822, + "Y": -19.505648, + "Z": 295.1858 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 1019353, + "Position": { + "X": 544.0298, + "Y": -19.505642, + "Z": 391.68372 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1048305, + "Position": { + "X": 591.08875, + "Y": -19.505634, + "Z": 296.9253 + }, + "TerritoryId": 622, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "DataId": 1048305, + "Position": { + "X": 591.08875, + "Y": -19.505634, + "Z": 296.9253 + }, + "TerritoryId": 622, + "InteractionType": "SinglePlayerDuty" + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "Position": { + "X": 0, + "Y": 0, + "Z": 0 + }, + "TerritoryId": 1, + "InteractionType": "WalkTo", + "Comment": "Filler" + } + ] + }, + { + "Sequence": 5, + "Steps": [ + { + "DataId": 1048307, + "Position": { + "X": -494.56018, + "Y": 71.630486, + "Z": -518.9441 + }, + "TerritoryId": 622, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1048295, + "Position": { + "X": -74.143616, + "Y": -19.32829, + "Z": 198.68762 + }, + "TerritoryId": 1185, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Tuliyollal", + "AethernetShortcut": [ + "[Tuliyollal] Aetheryte Plaza", + "[Tuliyollal] Bayside Bevy Marketplace" + ] + } + ] + } + ] +} diff --git a/QuestPaths/Dawntrail/Role Quests/PhysicalRanged/4836_To Steal a Steelhog.json b/QuestPaths/Dawntrail/Role Quests/Physical Ranged/4836_To Steal a Steelhog.json similarity index 100% rename from QuestPaths/Dawntrail/Role Quests/PhysicalRanged/4836_To Steal a Steelhog.json rename to QuestPaths/Dawntrail/Role Quests/Physical Ranged/4836_To Steal a Steelhog.json diff --git a/QuestPaths/Dawntrail/Role Quests/PhysicalRanged/4837_Bandits Abound.json b/QuestPaths/Dawntrail/Role Quests/Physical Ranged/4837_Bandits Abound.json similarity index 100% rename from QuestPaths/Dawntrail/Role Quests/PhysicalRanged/4837_Bandits Abound.json rename to QuestPaths/Dawntrail/Role Quests/Physical Ranged/4837_Bandits Abound.json diff --git a/QuestPaths/Dawntrail/Side Quests/Urqopacha/5030_An Unlikely Inspector.json b/QuestPaths/Dawntrail/Side Quests/Urqopacha/5030_An Unlikely Inspector.json new file mode 100644 index 00000000..a83ee8d8 --- /dev/null +++ b/QuestPaths/Dawntrail/Side Quests/Urqopacha/5030_An Unlikely Inspector.json @@ -0,0 +1,113 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1048650, + "Position": { + "X": 367.87964, + "Y": -156.28014, + "Z": -419.11957 + }, + "TerritoryId": 1187, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2014104, + "Position": { + "X": 374.77686, + "Y": -154.07043, + "Z": -373.52563 + }, + "TerritoryId": 1187, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + }, + { + "DataId": 2014106, + "Position": { + "X": 327.90112, + "Y": -152.20874, + "Z": -369.31415 + }, + "TerritoryId": 1187, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 32 + ] + }, + { + "DataId": 2014105, + "Position": { + "X": 330.6172, + "Y": -158.06824, + "Z": -399.8932 + }, + "TerritoryId": 1187, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 2014107, + "Position": { + "X": 275.7152, + "Y": -166.94897, + "Z": -462.7909 + }, + "TerritoryId": 1187, + "InteractionType": "Interact", + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 16 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1048650, + "Position": { + "X": 367.87964, + "Y": -156.28014, + "Z": -419.11957 + }, + "TerritoryId": 1187, + "InteractionType": "CompleteQuest" + } + ] + } + ] +} diff --git a/QuestPaths/Dawntrail/Side Quests/Urqopacha/5031_The Carmine Secret.json b/QuestPaths/Dawntrail/Side Quests/Urqopacha/5031_The Carmine Secret.json new file mode 100644 index 00000000..284e85ac --- /dev/null +++ b/QuestPaths/Dawntrail/Side Quests/Urqopacha/5031_The Carmine Secret.json @@ -0,0 +1,82 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1048649, + "Position": { + "X": 357.86987, + "Y": -155.91757, + "Z": -370.1076 + }, + "TerritoryId": 1187, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 1050671, + "Position": { + "X": 191.97375, + "Y": -87.10133, + "Z": -277.39374 + }, + "TerritoryId": 1187, + "InteractionType": "UseItem", + "ItemId": 2003601, + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 64 + ] + }, + { + "DataId": 1050670, + "Position": { + "X": 132.86023, + "Y": -75.24902, + "Z": -213.2143 + }, + "TerritoryId": 1187, + "InteractionType": "UseItem", + "ItemId": 2003601, + "Fly": true, + "CompletionQuestVariablesFlags": [ + null, + null, + null, + null, + null, + 128 + ] + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1048649, + "Position": { + "X": 357.86987, + "Y": -155.91757, + "Z": -370.1076 + }, + "TerritoryId": 1187, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Urqopacha - Wachunpelo" + } + ] + } + ] +} diff --git a/QuestPaths/Dawntrail/Unlocks/Dungeons/5014_Something Stray in the Neighborhood.json b/QuestPaths/Dawntrail/Unlocks/Dungeons/5014_Something Stray in the Neighborhood.json new file mode 100644 index 00000000..2275fc54 --- /dev/null +++ b/QuestPaths/Dawntrail/Unlocks/Dungeons/5014_Something Stray in the Neighborhood.json @@ -0,0 +1,116 @@ +{ + "$schema": "https://carvel.li/questionable/quest-1.0", + "Author": "liza", + "TerritoryBlacklist": [ + 1204 + ], + "QuestSequence": [ + { + "Sequence": 0, + "Steps": [ + { + "DataId": 1051440, + "Position": { + "X": 305.01257, + "Y": 51.199978, + "Z": 198.07727 + }, + "TerritoryId": 1186, + "InteractionType": "AcceptQuest" + } + ] + }, + { + "Sequence": 1, + "Steps": [ + { + "DataId": 2014334, + "Position": { + "X": -6.9123535, + "Y": 53.177612, + "Z": 761.68445 + }, + "TerritoryId": 1192, + "InteractionType": "Interact" + } + ] + }, + { + "Sequence": 2, + "Steps": [ + { + "DataId": 1048243, + "Position": { + "X": 57.87744, + "Y": 53.200012, + "Z": 772.03015 + }, + "TerritoryId": 1192, + "InteractionType": "Interact", + "TargetTerritoryId": 1192, + "SkipIf": [ + "FlyingUnlocked" + ] + }, + { + "DataId": 1051443, + "Position": { + "X": 614.28235, + "Y": 9.022843, + "Z": 610.13184 + }, + "TerritoryId": 1192, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 3, + "Steps": [ + { + "TerritoryId": 1192, + "InteractionType": "Duty", + "ContentFinderConditionId": 981 + } + ] + }, + { + "Sequence": 4, + "Steps": [ + { + "DataId": 1051442, + "Position": { + "X": 613.76355, + "Y": 9.022844, + "Z": 612.1156 + }, + "StopDistance": 7, + "TerritoryId": 1192, + "InteractionType": "Interact", + "Fly": true + } + ] + }, + { + "Sequence": 255, + "Steps": [ + { + "DataId": 1051440, + "Position": { + "X": 305.01257, + "Y": 51.199978, + "Z": 198.07727 + }, + "TerritoryId": 1186, + "InteractionType": "CompleteQuest", + "AetheryteShortcut": "Solution Nine", + "AethernetShortcut": [ + "[Solution Nine] Aetheryte Plaza", + "[Solution Nine] Neon Stein" + ] + } + ] + } + ] +} diff --git a/Questionable/Controller/MovementController.cs b/Questionable/Controller/MovementController.cs index badf5f0b..c4d22503 100644 --- a/Questionable/Controller/MovementController.cs +++ b/Questionable/Controller/MovementController.cs @@ -14,6 +14,7 @@ using Dalamud.Plugin.Services; using FFXIVClientStructs.FFXIV.Client.Game; using FFXIVClientStructs.FFXIV.Client.Game.Control; using Microsoft.Extensions.Logging; +using Questionable.Controller.NavigationOverrides; using Questionable.External; using Questionable.Model; using Questionable.Model.V1; @@ -23,28 +24,26 @@ namespace Questionable.Controller; internal sealed class MovementController : IDisposable { - private static readonly List BlacklistedAreas = - [ - new(1191, new(-223.0412f, 31.937134f, -584.03906f), 5f, 7.75f), - ]; - private readonly NavmeshIpc _navmeshIpc; private readonly IClientState _clientState; private readonly GameFunctions _gameFunctions; private readonly ChatFunctions _chatFunctions; private readonly ICondition _condition; + private readonly MovementOverrideController _movementOverrideController; private readonly ILogger _logger; private CancellationTokenSource? _cancellationTokenSource; private Task>? _pathfindTask; public MovementController(NavmeshIpc navmeshIpc, IClientState clientState, GameFunctions gameFunctions, - ChatFunctions chatFunctions, ICondition condition, ILogger logger) + ChatFunctions chatFunctions, ICondition condition, MovementOverrideController movementOverrideController, + ILogger logger) { _navmeshIpc = navmeshIpc; _clientState = clientState; _gameFunctions = gameFunctions; _chatFunctions = chatFunctions; _condition = condition; + _movementOverrideController = movementOverrideController; _logger = logger; } @@ -112,29 +111,7 @@ internal sealed class MovementController : IDisposable } if (!Destination.IsFlying) - { - // certain areas shouldn't have navmesh points in them, e.g. the aetheryte in HF Outskirts can't be - // walked on without jumping, but if you teleport to the wrong side you're fucked otherwise. - foreach (var blacklistedArea in BlacklistedAreas) - { - if (_clientState.TerritoryType != blacklistedArea.TerritoryId) - continue; - - for (int i = 0; i < navPoints.Count; ++i) - { - var point = navPoints[i]; - float distance = (point - blacklistedArea.Center).Length(); - if (distance < blacklistedArea.MinDistance || distance > blacklistedArea.MaxDistance) - continue; - - _logger.LogInformation("Fudging navmesh point {Point} in blacklisted area", - point.ToString("G", CultureInfo.InvariantCulture)); - navPoints[i] = blacklistedArea.Center + - Vector3.Normalize(point - blacklistedArea.Center) * - blacklistedArea.MaxDistance; - } - } - } + _movementOverrideController.AdjustPath(navPoints); _navmeshIpc.MoveTo(navPoints, Destination.IsFlying); MovementStartedAt = DateTime.Now; @@ -175,7 +152,8 @@ internal sealed class MovementController : IDisposable { if (Destination.DataId is 2012173 or 2012174 or 2012175 or 2012176 - or 2014133 or 2014134 or 2014135) + or 2014133 or 2014134 or 2014135 + or 2014105) { Stop(); } @@ -336,12 +314,6 @@ internal sealed class MovementController : IDisposable bool CanSprint, bool UseNavmesh); - public sealed record BlacklistedArea( - ushort TerritoryId, - Vector3 Center, - float MinDistance, - float MaxDistance); - public sealed class PathfindingFailedException : Exception { public PathfindingFailedException() diff --git a/Questionable/Controller/NavigationOverrides/BlacklistedArea.cs b/Questionable/Controller/NavigationOverrides/BlacklistedArea.cs new file mode 100644 index 00000000..5e49e874 --- /dev/null +++ b/Questionable/Controller/NavigationOverrides/BlacklistedArea.cs @@ -0,0 +1,19 @@ +using System.Numerics; + +namespace Questionable.Controller.NavigationOverrides; + +internal sealed record BlacklistedArea( + ushort TerritoryId, + Vector3 Center, + float MinDistance, + float MaxDistance) : IBlacklistedLocation +{ + public Vector3? AdjustPoint(Vector3 point) + { + float distance = (point - Center).Length(); + if (distance < MinDistance || distance > MaxDistance) + return null; + + return Center + Vector3.Normalize(point - Center) * MaxDistance; + } +} diff --git a/Questionable/Controller/NavigationOverrides/BlacklistedPoint.cs b/Questionable/Controller/NavigationOverrides/BlacklistedPoint.cs new file mode 100644 index 00000000..2ad12d8e --- /dev/null +++ b/Questionable/Controller/NavigationOverrides/BlacklistedPoint.cs @@ -0,0 +1,19 @@ +using System.Numerics; + +namespace Questionable.Controller.NavigationOverrides; + +public sealed record BlacklistedPoint( + ushort TerritoryId, + Vector3 Original, + Vector3 Replacement, + float CheckDistance = 0.05f) : IBlacklistedLocation +{ + public Vector3? AdjustPoint(Vector3 point) + { + float distance = (point - Original).Length(); + if (distance > CheckDistance) + return null; + + return Replacement; + } +} diff --git a/Questionable/Controller/NavigationOverrides/IBlacklistedLocation.cs b/Questionable/Controller/NavigationOverrides/IBlacklistedLocation.cs new file mode 100644 index 00000000..f8ef2fda --- /dev/null +++ b/Questionable/Controller/NavigationOverrides/IBlacklistedLocation.cs @@ -0,0 +1,10 @@ +using System.Numerics; + +namespace Questionable.Controller.NavigationOverrides; + +internal interface IBlacklistedLocation +{ + ushort TerritoryId { get; } + + Vector3? AdjustPoint(Vector3 point); +} diff --git a/Questionable/Controller/NavigationOverrides/MovementOverrideController.cs b/Questionable/Controller/NavigationOverrides/MovementOverrideController.cs new file mode 100644 index 00000000..2bb5d8a2 --- /dev/null +++ b/Questionable/Controller/NavigationOverrides/MovementOverrideController.cs @@ -0,0 +1,52 @@ +using System.Collections.Generic; +using System.Globalization; +using System.Numerics; +using Dalamud.Plugin.Services; +using Microsoft.Extensions.Logging; + +namespace Questionable.Controller.NavigationOverrides; + +internal sealed class MovementOverrideController +{ + private static readonly List BlacklistedLocations = [ + new BlacklistedArea(1191, new(-223.0412f, 31.937134f, -584.03906f), 5f, 7.75f), + new BlacklistedPoint(128, new Vector3(2f, 40.25f, 36.5f), new Vector3(0.25f, 40.25f, 36.5f)) + ]; + + private readonly IClientState _clientState; + private readonly ILogger _logger; + + public MovementOverrideController(IClientState clientState, ILogger logger) + { + _clientState = clientState; + _logger = logger; + } + + /// + /// Certain areas shouldn't have navmesh points in them, e.g. the aetheryte in HF Outskirts can't be + /// walked on without jumping, but if you teleport to the wrong side you're fucked otherwise. + /// + /// list of points to check + public void AdjustPath(List navPoints) + { + foreach (var blacklistedArea in BlacklistedLocations) + { + if (_clientState.TerritoryType != blacklistedArea.TerritoryId) + continue; + + for (int i = 0; i < navPoints.Count; ++i) + { + Vector3? updatedPoint = blacklistedArea.AdjustPoint(navPoints[i]); + + if (updatedPoint != null) + { + _logger.LogInformation("Fudging navmesh point from {Original} to {Replacement} in blacklisted area", + navPoints[i].ToString("G", CultureInfo.InvariantCulture), + updatedPoint.Value.ToString("G", CultureInfo.InvariantCulture)); + + navPoints[i] = updatedPoint.Value; + } + } + } + } +} diff --git a/Questionable/QuestionablePlugin.cs b/Questionable/QuestionablePlugin.cs index 3b1e59ca..2fe468df 100644 --- a/Questionable/QuestionablePlugin.cs +++ b/Questionable/QuestionablePlugin.cs @@ -9,6 +9,7 @@ using Dalamud.Plugin.Services; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Questionable.Controller; +using Questionable.Controller.NavigationOverrides; using Questionable.Controller.Steps; using Questionable.Controller.Steps.BaseFactory; using Questionable.Controller.Steps.BaseTasks; @@ -114,6 +115,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin serviceCollection.AddTransient(); serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton();