diff --git a/.gitignore b/.gitignore
index f0fb17c2..a6964753 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,4 +2,5 @@
bin/
/.idea
/.vs
+/.vscode
*.user
diff --git a/Directory.Build.targets b/Directory.Build.targets
index c0b49f3b..729f81b6 100644
--- a/Directory.Build.targets
+++ b/Directory.Build.targets
@@ -1,5 +1,5 @@
- 4.14
+ 4.16
diff --git a/GatheringPathRenderer/RendererPlugin.cs b/GatheringPathRenderer/RendererPlugin.cs
index 93c666a8..aa88906c 100644
--- a/GatheringPathRenderer/RendererPlugin.cs
+++ b/GatheringPathRenderer/RendererPlugin.cs
@@ -82,7 +82,7 @@ public sealed class RendererPlugin : IDalamudPlugin
get
{
#if DEBUG
- DirectoryInfo? solutionDirectory = _pluginInterface.AssemblyLocation.Directory?.Parent?.Parent?.Parent;
+ DirectoryInfo? solutionDirectory = _pluginInterface.AssemblyLocation.Directory?.Parent?.Parent;
if (solutionDirectory != null)
{
DirectoryInfo pathProjectDirectory =
@@ -91,7 +91,7 @@ public sealed class RendererPlugin : IDalamudPlugin
return pathProjectDirectory;
}
- throw new Exception("Unable to resolve project path");
+ throw new Exception($"Unable to resolve project path ({_pluginInterface.AssemblyLocation.Directory})");
#else
var allPluginsDirectory = _pluginInterface.ConfigFile.Directory ?? throw new Exception("Unknown directory for plugin configs");
return allPluginsDirectory
diff --git a/GatheringPaths/4.x - Stormblood/The Azim Steppe/543_Sea of Blades_MIN.json b/GatheringPaths/4.x - Stormblood/The Azim Steppe/543_Sea of Blades_MIN.json
new file mode 100644
index 00000000..2f984b9d
--- /dev/null
+++ b/GatheringPaths/4.x - Stormblood/The Azim Steppe/543_Sea of Blades_MIN.json
@@ -0,0 +1,69 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/GatheringPaths/gatheringlocation-v1.json",
+ "Author": "Theo",
+ "Steps": [
+ {
+ "TerritoryId": 622,
+ "InteractionType": "None"
+ }
+ ],
+ "Groups": [
+ {
+ "Nodes": [
+ {
+ "DataId": 32320,
+ "Locations": [
+ {
+ "Position": {
+ "X": 609.3118,
+ "Y": -21.51083,
+ "Z": 558.524
+ },
+ "MinimumAngle": 90,
+ "MaximumAngle": 270,
+ "MaximumDistance": 3
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "Nodes": [
+ {
+ "DataId": 32321,
+ "Locations": [
+ {
+ "Position": {
+ "X": 609.9794,
+ "Y": -21.53052,
+ "Z": 579.6443
+ },
+ "MinimumAngle": 90,
+ "MaximumAngle": 135,
+ "MaximumDistance": 3
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "Nodes": [
+ {
+ "DataId": 32322,
+ "Locations": [
+ {
+ "Position": {
+ "X": 588.3865,
+ "Y": -20.42655,
+ "Z": 561.5663
+ },
+ "MinimumAngle": 45,
+ "MaximumAngle": 315,
+ "MaximumDistance": 3
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/GatheringPaths/4.x - Stormblood/The Azim Steppe/545_Onsal Hakair_BTN.json b/GatheringPaths/4.x - Stormblood/The Azim Steppe/545_Onsal Hakair_BTN.json
new file mode 100644
index 00000000..cccc0b2e
--- /dev/null
+++ b/GatheringPaths/4.x - Stormblood/The Azim Steppe/545_Onsal Hakair_BTN.json
@@ -0,0 +1,60 @@
+{
+ "schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/GatheringPaths/gatheringlocation-v1.json",
+ "Author": "Theo",
+ "Steps": [
+ {
+ "TerritoryId": 622,
+ "InteractionType": "None"
+ }
+ ],
+ "Groups": [
+ {
+ "Nodes": [
+ {
+ "DataId": 32326,
+ "Locations": [
+ {
+ "Position": {
+ "X": -515.5125,
+ "Y": 65.79073,
+ "Z": -386.0356
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "Nodes": [
+ {
+ "DataId": 32327,
+ "Locations": [
+ {
+ "Position": {
+ "X": -527.5466,
+ "Y": 64.7018,
+ "Z": -379.2951
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "Nodes": [
+ {
+ "DataId": 32328,
+ "Locations": [
+ {
+ "Position": {
+ "X": -505.5859,
+ "Y": 64.95732,
+ "Z": -367.5692
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/GatheringPaths/4.x - Stormblood/The Azim Steppe/547_Sea of Blades_BTN.json b/GatheringPaths/4.x - Stormblood/The Azim Steppe/547_Sea of Blades_BTN.json
new file mode 100644
index 00000000..6bf13b75
--- /dev/null
+++ b/GatheringPaths/4.x - Stormblood/The Azim Steppe/547_Sea of Blades_BTN.json
@@ -0,0 +1,60 @@
+{
+ "schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/GatheringPaths/gatheringlocation-v1.json",
+ "Author": "Theo",
+ "Steps": [
+ {
+ "TerritoryId": 622,
+ "InteractionType": "None"
+ }
+ ],
+ "Groups": [
+ {
+ "Nodes": [
+ {
+ "DataId": 32332,
+ "Locations": [
+ {
+ "Position": {
+ "X": 573.6873,
+ "Y": -20.41718,
+ "Z": 582.5559
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "Nodes": [
+ {
+ "DataId": 32333,
+ "Locations": [
+ {
+ "Position": {
+ "X": 579.1252,
+ "Y": -20.40873,
+ "Z": 565.84
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "Nodes": [
+ {
+ "DataId": 32334,
+ "Locations": [
+ {
+ "Position": {
+ "X": 608.5944,
+ "Y": -21.23272,
+ "Z": 571.2001
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/GatheringPaths/4.x - Stormblood/The Azim Steppe/549_Onsal Hakair_MIN.json b/GatheringPaths/4.x - Stormblood/The Azim Steppe/549_Onsal Hakair_MIN.json
new file mode 100644
index 00000000..9ba93d28
--- /dev/null
+++ b/GatheringPaths/4.x - Stormblood/The Azim Steppe/549_Onsal Hakair_MIN.json
@@ -0,0 +1,60 @@
+{
+ "schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/GatheringPaths/gatheringlocation-v1.json",
+ "Author": "Theo",
+ "Steps": [
+ {
+ "TerritoryId": 622,
+ "InteractionType": "None"
+ }
+ ],
+ "Groups": [
+ {
+ "Nodes": [
+ {
+ "DataId": 32338,
+ "Locations": [
+ {
+ "Position": {
+ "X": 727.463,
+ "Y": 14.92286,
+ "Z": -477.1528
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "Nodes": [
+ {
+ "DataId": 32339,
+ "Locations": [
+ {
+ "Position": {
+ "X": 721.5626,
+ "Y": 24.81664,
+ "Z": -499.1444
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "Nodes": [
+ {
+ "DataId": 32340,
+ "Locations": [
+ {
+ "Position": {
+ "X": 702.1278,
+ "Y": 27.92893,
+ "Z": -505.186
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/GatheringPaths/4.x - Stormblood/The Azim Steppe/550_Onsal Hakair_BTN.json b/GatheringPaths/4.x - Stormblood/The Azim Steppe/550_Onsal Hakair_BTN.json
new file mode 100644
index 00000000..c7928395
--- /dev/null
+++ b/GatheringPaths/4.x - Stormblood/The Azim Steppe/550_Onsal Hakair_BTN.json
@@ -0,0 +1,60 @@
+{
+ "schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/GatheringPaths/gatheringlocation-v1.json",
+ "Author": "Theo",
+ "Steps": [
+ {
+ "TerritoryId": 622,
+ "InteractionType": "None"
+ }
+ ],
+ "Groups": [
+ {
+ "Nodes": [
+ {
+ "DataId": 32341,
+ "Locations": [
+ {
+ "Position": {
+ "X": 615.4055,
+ "Y": 31.42307,
+ "Z": -475.3718
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "Nodes": [
+ {
+ "DataId": 32342,
+ "Locations": [
+ {
+ "Position": {
+ "X": 612.0082,
+ "Y": 25.45944,
+ "Z": -442.0886
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "Nodes": [
+ {
+ "DataId": 32343,
+ "Locations": [
+ {
+ "Position": {
+ "X": 634.1258,
+ "Y": 21.76424,
+ "Z": -436.3917
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/QuestPathGenerator/RoslynElements/CombatItemUseExtensions.cs b/QuestPathGenerator/RoslynElements/CombatItemUseExtensions.cs
new file mode 100644
index 00000000..93e5d696
--- /dev/null
+++ b/QuestPathGenerator/RoslynElements/CombatItemUseExtensions.cs
@@ -0,0 +1,29 @@
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+using Questionable.Model.Questing;
+using static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;
+using static Questionable.QuestPathGenerator.RoslynShortcuts;
+
+namespace Questionable.QuestPathGenerator.RoslynElements;
+
+internal static class CombatItemUseExtensions
+{
+ public static ExpressionSyntax ToExpressionSyntax(this CombatItemUse combatItemuse)
+ {
+ var emptyItemuse = new CombatItemUse();
+ return ObjectCreationExpression(
+ IdentifierName(nameof(CombatItemUse)))
+ .WithInitializer(
+ InitializerExpression(
+ SyntaxKind.ObjectInitializerExpression,
+ SeparatedList(
+ SyntaxNodeList(
+ Assignment(nameof(CombatItemUse.ItemId), combatItemuse.ItemId,
+ emptyItemuse.ItemId)
+ .AsSyntaxNodeOrToken(),
+ Assignment(nameof(CombatItemUse.Condition), combatItemuse.Condition, emptyItemuse.Condition)
+ .AsSyntaxNodeOrToken(),
+ Assignment(nameof(combatItemuse.Value), combatItemuse.Value, emptyItemuse.Value)
+ .AsSyntaxNodeOrToken()))));
+ }
+}
diff --git a/QuestPathGenerator/RoslynElements/QuestStepExtensions.cs b/QuestPathGenerator/RoslynElements/QuestStepExtensions.cs
index 6b76bb95..2d3ec803 100644
--- a/QuestPathGenerator/RoslynElements/QuestStepExtensions.cs
+++ b/QuestPathGenerator/RoslynElements/QuestStepExtensions.cs
@@ -107,6 +107,9 @@ internal static class QuestStepExtensions
.AsSyntaxNodeOrToken(),
AssignmentList(nameof(QuestStep.ComplexCombatData), step.ComplexCombatData)
.AsSyntaxNodeOrToken(),
+ Assignment(nameof(QuestStep.CombatItemUse), step.CombatItemUse,
+ emptyStep.CombatItemUse)
+ .AsSyntaxNodeOrToken(),
Assignment(nameof(QuestStep.CombatDelaySecondsAtStart),
step.CombatDelaySecondsAtStart,
emptyStep.CombatDelaySecondsAtStart)
diff --git a/QuestPathGenerator/RoslynShortcuts.cs b/QuestPathGenerator/RoslynShortcuts.cs
index c5fb47f5..2c1df09f 100644
--- a/QuestPathGenerator/RoslynShortcuts.cs
+++ b/QuestPathGenerator/RoslynShortcuts.cs
@@ -71,6 +71,7 @@ public static class RoslynShortcuts
GatheringNodeGroup nodeGroup => nodeGroup.ToExpressionSyntax(),
GatheringNode nodeLocation => nodeLocation.ToExpressionSyntax(),
GatheringLocation location => location.ToExpressionSyntax(),
+ CombatItemUse combatItemUse => combatItemUse.ToExpressionSyntax(),
not null when value.GetType().IsEnum => MemberAccessExpression(SyntaxKind.SimpleMemberAccessExpression,
IdentifierName(value.GetType().Name), IdentifierName(value.GetType().GetEnumName(value)!)),
_ => throw new Exception($"Unsupported data type {value.GetType()} = {value}")
diff --git a/QuestPaths/2.x - A Realm Reborn/Alliance Raid Quests/1709_Legacy of Allag.json b/QuestPaths/2.x - A Realm Reborn/Alliance Raid Quests/1709_Legacy of Allag.json
index 1e363fb4..064e9a43 100644
--- a/QuestPaths/2.x - A Realm Reborn/Alliance Raid Quests/1709_Legacy of Allag.json
+++ b/QuestPaths/2.x - A Realm Reborn/Alliance Raid Quests/1709_Legacy of Allag.json
@@ -329,9 +329,9 @@
},
{
"Position": {
- "X": -0.75614685,
+ "X": 3.8795898,
"Y": 38.80212,
- "Z": -11.007636
+ "Z": 0.40251642
},
"TerritoryId": 146,
"InteractionType": "WalkTo",
@@ -359,7 +359,8 @@
null,
128
],
- "Fly": true
+ "Fly": true,
+ "DisableNavmesh": true
},
{
"DataId": 2000078,
diff --git a/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1052_Looking the Part.json b/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1052_Looking the Part.json
index a3ae2649..59241a3d 100644
--- a/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1052_Looking the Part.json
+++ b/QuestPaths/2.x - A Realm Reborn/Class Quests/WAR/1052_Looking the Part.json
@@ -112,9 +112,18 @@
"SkipConditions": {
"AetheryteShortcutIf": {
"InSameTerritory": true
+ },
+ "StepIf": {
+ "CompletionQuestVariablesFlags": [
+ null,
+ null,
+ null,
+ null,
+ null,
+ 64
+ ]
}
- },
- "Comment": "TODO Verify enemy id"
+ }
},
{
"DataId": 2002309,
diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/272_Life, Materia and Everything.json b/QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/272_Life, Materia and Everything.json
index 6af9e61b..f56212fb 100644
--- a/QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/272_Life, Materia and Everything.json
+++ b/QuestPaths/2.x - A Realm Reborn/MSQ-1/Shared/272_Life, Materia and Everything.json
@@ -21,16 +21,30 @@
"Sequence": 1,
"Steps": [
{
- "DataId": 1001426,
"Position": {
- "X": 123.33862,
- "Y": 30.999996,
- "Z": -384.9394
+ "X": 2.7922537,
+ "Y": 8.206551,
+ "Z": -274.32318
},
"TerritoryId": 141,
- "InteractionType": "Interact",
- "Comment": "'Forging the Spirit'",
- "AetheryteShortcut": "Central Thanalan - Black Brush Station"
+ "InteractionType": "WalkTo",
+ "AetheryteShortcut": "Central Thanalan - Black Brush Station",
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "InSameTerritory": true
+ },
+ "StepIf": {
+ "NearPosition": {
+ "Position": {
+ "X": 123.33862,
+ "Y": 30.999996,
+ "Z": -384.9394
+ },
+ "TerritoryId": 141,
+ "MaximumDistance": 30
+ }
+ }
+ }
},
{
"DataId": 1001426,
@@ -40,8 +54,8 @@
"Z": -384.9394
},
"TerritoryId": 141,
- "InteractionType": "Interact",
- "Comment": "Quest Turn-In 'Forging the Spirit'"
+ "InteractionType": "AcceptQuest",
+ "PickUpQuestId": 638
},
{
"DataId": 1001425,
diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/A5-Southern Thanalan, Little Ala Mhigo/757_On to Little Ala Mhigo.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/A5-Southern Thanalan, Little Ala Mhigo/757_On to Little Ala Mhigo.json
index 27a25019..19fac78d 100644
--- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/A5-Southern Thanalan, Little Ala Mhigo/757_On to Little Ala Mhigo.json
+++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/A5-Southern Thanalan, Little Ala Mhigo/757_On to Little Ala Mhigo.json
@@ -36,6 +36,16 @@
"InteractionType": "WalkTo",
"TargetTerritoryId": 146
},
+ {
+ "Position": {
+ "X": -47.50145,
+ "Y": 16.362688,
+ "Z": -439.62503
+ },
+ "TerritoryId": 146,
+ "InteractionType": "WalkTo",
+ "$": "vnav sometimes attempts to walk to the aetheryte using exactly one waypoint between zone boundary and aetheryte, which means walking into walls"
+ },
{
"TerritoryId": 146,
"InteractionType": "AttuneAetheryte",
diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/A9-Haukke Manor/801_Skeletons in Her Closet.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/A9-Haukke Manor/801_Skeletons in Her Closet.json
index 9269a84b..a17b715c 100644
--- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/A9-Haukke Manor/801_Skeletons in Her Closet.json
+++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/A9-Haukke Manor/801_Skeletons in Her Closet.json
@@ -67,7 +67,7 @@
"TerritoryId": 148,
"InteractionType": "Duty",
"ContentFinderConditionId": 6,
- "AutoDutyEnabled": true
+ "AutoDutyEnabled": false
}
]
},
diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/B2-Eastern La Noscea, Brayflox, Cheese and Wine/832_The Things We Do for Cheese.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/B2-Eastern La Noscea, Brayflox, Cheese and Wine/832_The Things We Do for Cheese.json
index 06402bac..960ac4ec 100644
--- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/B2-Eastern La Noscea, Brayflox, Cheese and Wine/832_The Things We Do for Cheese.json
+++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/B2-Eastern La Noscea, Brayflox, Cheese and Wine/832_The Things We Do for Cheese.json
@@ -86,7 +86,7 @@
"TerritoryId": 137,
"InteractionType": "Duty",
"ContentFinderConditionId": 8,
- "AutoDutyEnabled": true
+ "AutoDutyEnabled": false
}
]
},
diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/B7-Coerthas Central Highlands, Camp Dragonhead/897_The Talk of Coerthas.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/B7-Coerthas Central Highlands, Camp Dragonhead/897_The Talk of Coerthas.json
index fc0042f5..b5543417 100644
--- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/B7-Coerthas Central Highlands, Camp Dragonhead/897_The Talk of Coerthas.json
+++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/B7-Coerthas Central Highlands, Camp Dragonhead/897_The Talk of Coerthas.json
@@ -103,7 +103,8 @@
},
"TerritoryId": 155,
"InteractionType": "WalkTo",
- "$": "NW Skyfire Locks door (inside)"
+ "$": "NW Skyfire Locks door (inside)",
+ "Mount": true
},
{
"Position": {
diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/B9-Coerthas Central Highlands, Whitebrim Front/924_Ye of Little Faith.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/B9-Coerthas Central Highlands, Whitebrim Front/924_Ye of Little Faith.json
index f3401f9b..66891113 100644
--- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/B9-Coerthas Central Highlands, Whitebrim Front/924_Ye of Little Faith.json
+++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/B9-Coerthas Central Highlands, Whitebrim Front/924_Ye of Little Faith.json
@@ -49,7 +49,8 @@
},
"TerritoryId": 155,
"InteractionType": "WalkTo",
- "Comment": "North Whitebrim, Stairs (bottom)"
+ "Comment": "North Whitebrim, Stairs (bottom)",
+ "Mount": true
},
{
"Position": {
diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/B9-Coerthas Central Highlands, Whitebrim Front/927_Factual Folklore.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/B9-Coerthas Central Highlands, Whitebrim Front/927_Factual Folklore.json
index b9550d58..924c6a9d 100644
--- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/B9-Coerthas Central Highlands, Whitebrim Front/927_Factual Folklore.json
+++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/B9-Coerthas Central Highlands, Whitebrim Front/927_Factual Folklore.json
@@ -35,10 +35,13 @@
"Z": 89.58569
},
"TerritoryId": 155,
- "InteractionType": "Instruction",
- "Comment": "Use Quest item on enemy to weaken it first",
- "$": "Status Effects: 22 (HP Penalty) + 62 (Damage Down)",
+ "InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
+ "CombatItemUse": {
+ "ItemId": 2000961,
+ "Condition": "MissingStatus",
+ "Value": 22
+ },
"ComplexCombatData": [
{
"DataId": 2196
diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C2-Western La Noscea, Isles of Umbra/961_Representing the Representative.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C2-Western La Noscea, Isles of Umbra/961_Representing the Representative.json
index 6d2279b9..f4d1379f 100644
--- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C2-Western La Noscea, Isles of Umbra/961_Representing the Representative.json
+++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C2-Western La Noscea, Isles of Umbra/961_Representing the Representative.json
@@ -76,6 +76,15 @@
{
"Sequence": 3,
"Steps": [
+ {
+ "Position": {
+ "X": 303.96317,
+ "Y": -36.40591,
+ "Z": 316.74185
+ },
+ "TerritoryId": 138,
+ "InteractionType": "WalkTo"
+ },
{
"DataId": 1006501,
"Position": {
diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C2-Western La Noscea, Isles of Umbra/962_The Reluctant Researcher.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C2-Western La Noscea, Isles of Umbra/962_The Reluctant Researcher.json
index 8266ce99..23eb5a02 100644
--- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C2-Western La Noscea, Isles of Umbra/962_The Reluctant Researcher.json
+++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C2-Western La Noscea, Isles of Umbra/962_The Reluctant Researcher.json
@@ -26,6 +26,15 @@
{
"Sequence": 1,
"Steps": [
+ {
+ "Position": {
+ "X": 303.96317,
+ "Y": -36.40591,
+ "Z": 316.74185
+ },
+ "TerritoryId": 138,
+ "InteractionType": "WalkTo"
+ },
{
"DataId": 1007640,
"Position": {
diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/1001_Drowning Out the Voices.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/1001_Drowning Out the Voices.json
index d1a4fdbf..59a79e75 100644
--- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/1001_Drowning Out the Voices.json
+++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/1001_Drowning Out the Voices.json
@@ -19,6 +19,7 @@
},
{
"Sequence": 1,
+ "Comment": "'Invalid target' messages can just be bad positioning?",
"Steps": [
{
"Position": {
@@ -50,9 +51,9 @@
},
"TerritoryId": 156,
"InteractionType": "Combat",
+ "DelaySecondsAtStart": 2,
"EnemySpawnType": "AfterItemUse",
"ItemId": 2000766,
- "GroundTarget": true,
"KillEnemyDataIds": [
46
],
@@ -86,6 +87,27 @@
64
]
},
+ {
+ "Position": {
+ "X": -219.34567,
+ "Y": 4.551038,
+ "Z": -637.8296
+ },
+ "TerritoryId": 156,
+ "InteractionType": "WalkTo",
+ "SkipConditions": {
+ "StepIf": {
+ "CompletionQuestVariablesFlags": [
+ null,
+ null,
+ null,
+ null,
+ null,
+ 8
+ ]
+ }
+ }
+ },
{
"DataId": 2002234,
"Position": {
@@ -159,9 +181,9 @@
},
"TerritoryId": 156,
"InteractionType": "Combat",
+ "DelaySecondsAtStart": 2,
"EnemySpawnType": "AfterItemUse",
"ItemId": 2000766,
- "GroundTarget": true,
"KillEnemyDataIds": [
46
],
@@ -218,7 +240,8 @@
},
"TerritoryId": 156,
"InteractionType": "UseItem",
- "ItemId": 2000766
+ "ItemId": 2000766,
+ "DelaySecondsAtStart": 2
}
]
},
diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/1004_Fool Me Twice.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/1004_Fool Me Twice.json
index daaad896..0629a682 100644
--- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/1004_Fool Me Twice.json
+++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C6-Mor Dhona/1004_Fool Me Twice.json
@@ -72,7 +72,7 @@
"Z": -609.4606
},
"TerritoryId": 156,
- "InteractionType": "UseItem",
+ "InteractionType": "SinglePlayerDuty",
"ItemId": 2000771
}
]
diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/3873_Rock the Castrum.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/3873_Rock the Castrum.json
index 7eec220a..dba66d15 100644
--- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/3873_Rock the Castrum.json
+++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/3873_Rock the Castrum.json
@@ -35,13 +35,163 @@
"Z": -225.17743
},
"TerritoryId": 147,
- "InteractionType": "Interact"
+ "InteractionType": "Interact",
+ "AetheryteShortcut": "Northern Thanalan - Ceruleum Processing Plant",
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "InSameTerritory": true
+ }
+ }
}
]
},
{
"Sequence": 2,
+ "$": "This doesn't include the DRK/MCH/AST coffers that exist at level 50, but you cannot obtain them until HW",
"Steps": [
+ {
+ "TerritoryId": 147,
+ "InteractionType": "UseItem",
+ "ItemId": 31337,
+ "$": "Lv49 Weapon Coffer",
+ "SkipConditions": {
+ "StepIf": {
+ "Item": {
+ "NotInInventory": true
+ }
+ }
+ }
+ },
+ {
+ "TerritoryId": 147,
+ "InteractionType": "UseItem",
+ "ItemId": 20642,
+ "$": "Lv50 PLD Coffer",
+ "SkipConditions": {
+ "StepIf": {
+ "Item": {
+ "NotInInventory": true
+ }
+ }
+ }
+ },
+ {
+ "TerritoryId": 147,
+ "InteractionType": "UseItem",
+ "ItemId": 20643,
+ "$": "Lv50 MNK Coffer",
+ "SkipConditions": {
+ "StepIf": {
+ "Item": {
+ "NotInInventory": true
+ }
+ }
+ }
+ },
+ {
+ "TerritoryId": 147,
+ "InteractionType": "UseItem",
+ "ItemId": 20644,
+ "$": "Lv50 WAR Coffer",
+ "SkipConditions": {
+ "StepIf": {
+ "Item": {
+ "NotInInventory": true
+ }
+ }
+ }
+ },
+ {
+ "TerritoryId": 147,
+ "InteractionType": "UseItem",
+ "ItemId": 20645,
+ "$": "Lv50 DRG Coffer",
+ "SkipConditions": {
+ "StepIf": {
+ "Item": {
+ "NotInInventory": true
+ }
+ }
+ }
+ },
+ {
+ "TerritoryId": 147,
+ "InteractionType": "UseItem",
+ "ItemId": 20646,
+ "$": "Lv50 BRD Coffer",
+ "SkipConditions": {
+ "StepIf": {
+ "Item": {
+ "NotInInventory": true
+ }
+ }
+ }
+ },
+ {
+ "TerritoryId": 147,
+ "InteractionType": "UseItem",
+ "ItemId": 20647,
+ "$": "Lv50 NIN Coffer",
+ "SkipConditions": {
+ "StepIf": {
+ "Item": {
+ "NotInInventory": true
+ }
+ }
+ }
+ },
+ {
+ "TerritoryId": 147,
+ "InteractionType": "UseItem",
+ "ItemId": 20648,
+ "$": "Lv50 WHM Coffer",
+ "SkipConditions": {
+ "StepIf": {
+ "Item": {
+ "NotInInventory": true
+ }
+ }
+ }
+ },
+ {
+ "TerritoryId": 147,
+ "InteractionType": "UseItem",
+ "ItemId": 20649,
+ "$": "Lv50 BLM Coffer",
+ "SkipConditions": {
+ "StepIf": {
+ "Item": {
+ "NotInInventory": true
+ }
+ }
+ }
+ },
+ {
+ "TerritoryId": 147,
+ "InteractionType": "UseItem",
+ "ItemId": 20650,
+ "$": "Lv50 SMN Coffer",
+ "SkipConditions": {
+ "StepIf": {
+ "Item": {
+ "NotInInventory": true
+ }
+ }
+ }
+ },
+ {
+ "TerritoryId": 147,
+ "InteractionType": "UseItem",
+ "ItemId": 20651,
+ "$": "Lv50 SCH Coffer",
+ "SkipConditions": {
+ "StepIf": {
+ "Item": {
+ "NotInInventory": true
+ }
+ }
+ }
+ },
{
"TerritoryId": 147,
"InteractionType": "Duty",
diff --git a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/4521_Operation Archon.json b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/4521_Operation Archon.json
index 81c32c86..2f33376f 100644
--- a/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/4521_Operation Archon.json
+++ b/QuestPaths/2.x - A Realm Reborn/MSQ-2/C9-Ultimate Weapon/4521_Operation Archon.json
@@ -5,6 +5,71 @@
{
"Sequence": 0,
"Steps": [
+ {
+ "TerritoryId": 132,
+ "InteractionType": "UseItem",
+ "ItemId": 30362,
+ "TargetTerritoryId": 140,
+ "SkipConditions": {
+ "StepIf": {
+ "InTerritory": [
+ 140,
+ 212
+ ]
+ }
+ }
+ },
+ {
+ "Position": {
+ "X": -492.96475,
+ "Y": 20.999884,
+ "Z": -380.82272
+ },
+ "TerritoryId": 140,
+ "InteractionType": "WalkTo",
+ "$": "Avoid walking around Waking Sands table",
+ "SkipConditions": {
+ "StepIf": {
+ "InTerritory": [
+ 212
+ ]
+ }
+ }
+ },
+ {
+ "DataId": 2001711,
+ "Position": {
+ "X": -480.9181,
+ "Y": 18.00103,
+ "Z": -386.862
+ },
+ "TerritoryId": 140,
+ "InteractionType": "Interact",
+ "TargetTerritoryId": 212,
+ "SkipConditions": {
+ "StepIf": {
+ "InTerritory": [
+ 212
+ ]
+ }
+ }
+ },
+ {
+ "DataId": 2001715,
+ "Position": {
+ "X": 23.23944,
+ "Y": 2.090454,
+ "Z": -0.015319824
+ },
+ "TerritoryId": 212,
+ "InteractionType": "Interact",
+ "TargetTerritoryId": 212,
+ "SkipConditions": {
+ "StepIf": {
+ "ExtraCondition": "WakingSandsSolar"
+ }
+ }
+ },
{
"DataId": 1006690,
"Position": {
@@ -29,7 +94,14 @@
},
"TerritoryId": 212,
"InteractionType": "Interact",
- "TargetTerritoryId": 212
+ "TargetTerritoryId": 212,
+ "SkipConditions": {
+ "StepIf": {
+ "InTerritory": [
+ 140
+ ]
+ }
+ }
},
{
"DataId": 2001716,
@@ -40,7 +112,14 @@
},
"TerritoryId": 212,
"InteractionType": "Interact",
- "TargetTerritoryId": 140
+ "TargetTerritoryId": 140,
+ "SkipConditions": {
+ "StepIf": {
+ "InTerritory": [
+ 140
+ ]
+ }
+ }
},
{
"DataId": 1006578,
diff --git a/QuestPaths/2.x - A Realm Reborn/Side Quests/Thanalan/Eastern Thanalan/638_Forging the Spirit.json b/QuestPaths/2.x - A Realm Reborn/Side Quests/Thanalan/Eastern Thanalan/638_Forging the Spirit.json
new file mode 100644
index 00000000..dae2a859
--- /dev/null
+++ b/QuestPaths/2.x - A Realm Reborn/Side Quests/Thanalan/Eastern Thanalan/638_Forging the Spirit.json
@@ -0,0 +1,36 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "liza",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "DataId": 1001426,
+ "Position": {
+ "X": 123.33862,
+ "Y": 30.999996,
+ "Z": -384.9394
+ },
+ "TerritoryId": 141,
+ "InteractionType": "AcceptQuest"
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1001426,
+ "Position": {
+ "X": 123.33862,
+ "Y": 30.999996,
+ "Z": -384.9394
+ },
+ "TerritoryId": 141,
+ "InteractionType": "CompleteQuest"
+ }
+ ]
+ }
+ ]
+}
diff --git a/QuestPaths/4.x - Stormblood/Aether Currents/The Azim Steppe/2782_Forty Years and Counting.json b/QuestPaths/4.x - Stormblood/Aether Currents/The Azim Steppe/2782_Forty Years and Counting.json
index 98a16015..94328f5c 100644
--- a/QuestPaths/4.x - Stormblood/Aether Currents/The Azim Steppe/2782_Forty Years and Counting.json
+++ b/QuestPaths/4.x - Stormblood/Aether Currents/The Azim Steppe/2782_Forty Years and Counting.json
@@ -17,7 +17,15 @@
"AetheryteShortcut": "Azim Steppe - Dawn Throne",
"SkipConditions": {
"AetheryteShortcutIf": {
- "InSameTerritory": true
+ "NearPosition": {
+ "Position": {
+ "X": 79.24011,
+ "Y": 114.90497,
+ "Z": 95.994385
+ },
+ "TerritoryId": 622,
+ "MaximumDistance": 50
+ }
}
}
}
diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3103_The Importance of Being Yes, Yes.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3103_The Importance of Being Yes, Yes.json
new file mode 100644
index 00000000..20da7a54
--- /dev/null
+++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3103_The Importance of Being Yes, Yes.json
@@ -0,0 +1,141 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "Theo",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "WalkTo"
+ },
+ {
+ "DataId": 1025602,
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "AcceptQuest"
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 1025769,
+ "Position": {
+ "X": 511.43652,
+ "Y": 29.907833,
+ "Z": -404.9287
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "StopDistance": 5,
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "DataId": 1025770,
+ "Position": {
+ "X": 511.65015,
+ "Y": 30.105957,
+ "Z": -407.24805
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "RequiredQuestAcceptedJob": [
+ "DoH"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Craft",
+ "ItemId": 22725,
+ "ItemCount": 2,
+ "RequiredQuestAcceptedJob": [
+ "DoH"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Gather",
+ "ItemsToGather": [
+ {
+ "ItemId": 22621,
+ "ItemCount": 3
+ }
+ ],
+ "RequiredQuestAcceptedJob": [
+ "Miner"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Gather",
+ "ItemsToGather": [
+ {
+ "ItemId": 22647,
+ "ItemCount": 3
+ }
+ ],
+ "RequiredQuestAcceptedJob": [
+ "Botanist"
+ ]
+ },
+ {
+ "DataId": 1025769,
+ "Position": {
+ "X": 511.43652,
+ "Y": 29.907833,
+ "Z": -404.9287
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1025602,
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "CompleteQuest",
+ "Mount": true,
+ "AetheryteShortcut": "Azim Steppe - Dhoro Iloh",
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "NearPosition": {
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "MaximumDistance": 50
+ }
+ }
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3104_Pilgrim's Regress.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3104_Pilgrim's Regress.json
new file mode 100644
index 00000000..08fbd6a5
--- /dev/null
+++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3104_Pilgrim's Regress.json
@@ -0,0 +1,109 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "Theo",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "WalkTo"
+ },
+ {
+ "DataId": 1025602,
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "AcceptQuest"
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 2009491,
+ "Position": {
+ "X": -70.81714,
+ "Y": 66.9718,
+ "Z": -421.89673
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Say",
+ "Fly": true,
+ "ChatMessage": {
+ "Key": "TEXT_BANNAM302_03104_SAYTODO_000_050"
+ },
+ "CompletionQuestVariablesFlags": [
+ null,
+ null,
+ null,
+ null,
+ null,
+ 128
+ ]
+ },
+ {
+ "DataId": 2009492,
+ "Position": {
+ "X": 725.307,
+ "Y": -1.5717163,
+ "Z": -423.81934
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Say",
+ "Fly": true,
+ "ChatMessage": {
+ "Key": "TEXT_BANNAM302_03104_SAYTODO_000_050"
+ },
+ "CompletionQuestVariablesFlags": [
+ null,
+ null,
+ null,
+ null,
+ null,
+ 64
+ ]
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1025602,
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "CompleteQuest",
+ "Mount": true,
+ "AetheryteShortcut": "Azim Steppe - Dhoro Iloh",
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "NearPosition": {
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "MaximumDistance": 50
+ }
+ }
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3105_Unidentified Festive Objects.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3105_Unidentified Festive Objects.json
new file mode 100644
index 00000000..a0945b92
--- /dev/null
+++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3105_Unidentified Festive Objects.json
@@ -0,0 +1,99 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "Theo",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "WalkTo"
+ },
+ {
+ "DataId": 1025602,
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "AcceptQuest"
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 1025641,
+ "Position": {
+ "X": -54.398438,
+ "Y": 76.83682,
+ "Z": -560.8148
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "StopDistance": 5,
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1025642,
+ "Position": {
+ "X": -50.370117,
+ "Y": 76.798584,
+ "Z": -558.77014
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "RequiredQuestAcceptedJob": [
+ "DoH"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Craft",
+ "ItemId": 22726,
+ "ItemCount": 1,
+ "RequiredQuestAcceptedJob": [
+ "DoH"
+ ]
+ },
+ {
+ "DataId": 1025602,
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "CompleteQuest",
+ "Mount": true,
+ "AetheryteShortcut": "Azim Steppe - Dhoro Iloh",
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "NearPosition": {
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "MaximumDistance": 50
+ }
+ }
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3106_Carry That Crate.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3106_Carry That Crate.json
new file mode 100644
index 00000000..06571a60
--- /dev/null
+++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3106_Carry That Crate.json
@@ -0,0 +1,99 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "Theo",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "WalkTo"
+ },
+ {
+ "DataId": 1025602,
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "AcceptQuest"
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 1025773,
+ "Position": {
+ "X": -311.29932,
+ "Y": 50.549908,
+ "Z": -225.8183
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "StopDistance": 5,
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1025774,
+ "Position": {
+ "X": -308.73578,
+ "Y": 50.247925,
+ "Z": -226.09296
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "RequiredQuestAcceptedJob": [
+ "DoH"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Craft",
+ "ItemId": 22727,
+ "ItemCount": 2,
+ "RequiredQuestAcceptedJob": [
+ "DoH"
+ ]
+ },
+ {
+ "DataId": 1025602,
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "CompleteQuest",
+ "Mount": true,
+ "AetheryteShortcut": "Azim Steppe - Dhoro Iloh",
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "NearPosition": {
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "MaximumDistance": 50
+ }
+ }
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3107_Free for Most.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3107_Free for Most.json
new file mode 100644
index 00000000..f88df652
--- /dev/null
+++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3107_Free for Most.json
@@ -0,0 +1,129 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "Theo",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "WalkTo"
+ },
+ {
+ "DataId": 1025602,
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "AcceptQuest"
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 1025775,
+ "Position": {
+ "X": -145.4032,
+ "Y": 27.922167,
+ "Z": -36.05713
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "StopDistance": 5,
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 2,
+ "Steps": []
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1025776,
+ "Position": {
+ "X": -143.45007,
+ "Y": 27.66455,
+ "Z": -39.139465
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "RequiredQuestAcceptedJob": [
+ "DoH"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Craft",
+ "ItemId": 22728,
+ "ItemCount": 3,
+ "RequiredQuestAcceptedJob": [
+ "DoH"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Gather",
+ "ItemsToGather": [
+ {
+ "ItemId": 22624,
+ "ItemCount": 3
+ }
+ ],
+ "RequiredQuestAcceptedJob": [
+ "Miner"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Gather",
+ "ItemsToGather": [
+ {
+ "ItemId": 22650,
+ "ItemCount": 3
+ }
+ ],
+ "RequiredQuestAcceptedJob": [
+ "Botanist"
+ ]
+ },
+ {
+ "DataId": 1025602,
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "CompleteQuest",
+ "Mount": true,
+ "AetheryteShortcut": "Azim Steppe - Dhoro Iloh",
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "NearPosition": {
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "MaximumDistance": 50
+ }
+ }
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3108_Simpler Gifts.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3108_Simpler Gifts.json
new file mode 100644
index 00000000..65bf1b0c
--- /dev/null
+++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3108_Simpler Gifts.json
@@ -0,0 +1,168 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "Theo",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "WalkTo"
+ },
+ {
+ "DataId": 1025602,
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "AcceptQuest"
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 1025777,
+ "Position": {
+ "X": -596.9177,
+ "Y": 64.000984,
+ "Z": -285.0843
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "StopDistance": 5,
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "DataId": 1025778,
+ "Position": {
+ "X": -597.0398,
+ "Y": 63.82837,
+ "Z": -288.65497
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "RequiredQuestAcceptedJob": [
+ "DoH"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Craft",
+ "ItemId": 22729,
+ "ItemCount": 1,
+ "RequiredQuestAcceptedJob": [
+ "DoH"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Gather",
+ "ItemsToGather": [
+ {
+ "ItemId": 22625,
+ "ItemCount": 3
+ }
+ ],
+ "RequiredQuestAcceptedJob": [
+ "Miner"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Gather",
+ "ItemsToGather": [
+ {
+ "ItemId": 22651,
+ "ItemCount": 3
+ }
+ ],
+ "RequiredQuestAcceptedJob": [
+ "Botanist"
+ ]
+ },
+ {
+ "DataId": 1025777,
+ "Position": {
+ "X": -596.9177,
+ "Y": 64.000984,
+ "Z": -285.0843
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 3,
+ "Steps": [
+ {
+ "Position": {
+ "X": -642.094,
+ "Y": 18.562637,
+ "Z": 399.83704
+ },
+ "TerritoryId": 622,
+ "InteractionType": "WalkTo",
+ "Fly": true
+ },
+ {
+ "DataId": 1019330,
+ "Position": {
+ "X": -746.7918,
+ "Y": 7.8459983,
+ "Z": 398.27563
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "StopDistance": 5,
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1025602,
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "CompleteQuest",
+ "Mount": true,
+ "AetheryteShortcut": "Azim Steppe - Dhoro Iloh",
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "NearPosition": {
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "MaximumDistance": 50
+ }
+ }
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3109_Catching Catfish.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3109_Catching Catfish.json
new file mode 100644
index 00000000..db11cf31
--- /dev/null
+++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3109_Catching Catfish.json
@@ -0,0 +1,142 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "Theo",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "WalkTo"
+ },
+ {
+ "DataId": 1025602,
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "AcceptQuest"
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 1025779,
+ "Position": {
+ "X": 194.04845,
+ "Y": 13.27476,
+ "Z": 121.84426
+ },
+ "StopDistance": 0.5,
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "AetheryteShortcut": "Azim Steppe - Dawn Throne",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "DataId": 1025780,
+ "Position": {
+ "X": 192.30945,
+ "Y": 13.260071,
+ "Z": 122.545166
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "RequiredQuestAcceptedJob": [
+ "DoH"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Craft",
+ "ItemId": 22730,
+ "ItemCount": 2,
+ "RequiredQuestAcceptedJob": [
+ "DoH"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Gather",
+ "ItemsToGather": [
+ {
+ "ItemId": 22626,
+ "ItemCount": 3
+ }
+ ],
+ "RequiredQuestAcceptedJob": [
+ "Miner"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Gather",
+ "ItemsToGather": [
+ {
+ "ItemId": 22652,
+ "ItemCount": 3
+ }
+ ],
+ "RequiredQuestAcceptedJob": [
+ "Botanist"
+ ]
+ },
+ {
+ "DataId": 1025779,
+ "Position": {
+ "X": 193.04187,
+ "Y": 13.040566,
+ "Z": 120.19531
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1025602,
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "CompleteQuest",
+ "Mount": true,
+ "AetheryteShortcut": "Azim Steppe - Dhoro Iloh",
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "NearPosition": {
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "MaximumDistance": 50
+ }
+ }
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3110_Wood You Believe It.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3110_Wood You Believe It.json
new file mode 100644
index 00000000..2c09321f
--- /dev/null
+++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3110_Wood You Believe It.json
@@ -0,0 +1,160 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "Theo",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "DataId": 1025602,
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "AcceptQuest",
+ "AetheryteShortcut": "Azim Steppe - Dhoro Iloh",
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "NearPosition": {
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "MaximumDistance": 50
+ }
+ }
+ }
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 1025781,
+ "Position": {
+ "X": 573.96814,
+ "Y": -19.505817,
+ "Z": 427.66455
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "AetheryteShortcut": "Azim Steppe - Reunion"
+ }
+ ]
+ },
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "DataId": 1025782,
+ "Position": {
+ "X": 573.7544,
+ "Y": -19.516357,
+ "Z": 430.10596
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "RequiredQuestAcceptedJob": [
+ "DoH"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Craft",
+ "ItemId": 22731,
+ "ItemCount": 1,
+ "RequiredQuestAcceptedJob": [
+ "DoH"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Gather",
+ "ItemsToGather": [
+ {
+ "ItemId": 22627,
+ "ItemCount": 3
+ }
+ ],
+ "RequiredQuestAcceptedJob": [
+ "Miner"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Gather",
+ "ItemsToGather": [
+ {
+ "ItemId": 22653,
+ "ItemCount": 3
+ }
+ ],
+ "RequiredQuestAcceptedJob": [
+ "Botanist"
+ ]
+ },
+ {
+ "DataId": 1025781,
+ "Position": {
+ "X": 573.96814,
+ "Y": -19.505817,
+ "Z": 427.66455
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 3,
+ "Steps": [
+ {
+ "DataId": 2009494,
+ "Position": {
+ "X": 575.09717,
+ "Y": -19.272217,
+ "Z": 424.97888
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact"
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1025602,
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "CompleteQuest",
+ "Mount": true,
+ "AetheryteShortcut": "Azim Steppe - Dhoro Iloh",
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "NearPosition": {
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "MaximumDistance": 50
+ }
+ }
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3111_Ghosts of Honor.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3111_Ghosts of Honor.json
new file mode 100644
index 00000000..4bfa2050
--- /dev/null
+++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3111_Ghosts of Honor.json
@@ -0,0 +1,143 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "Theo",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "DataId": 1025602,
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "AcceptQuest",
+ "AetheryteShortcut": "Azim Steppe - Dhoro Iloh",
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "NearPosition": {
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "MaximumDistance": 50
+ }
+ }
+ }
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 1025783,
+ "Position": {
+ "X": 122.6062,
+ "Y": 39.55857,
+ "Z": -336.5683
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "Fly": true,
+ "AetheryteShortcut": "Azim Steppe - Dawn Throne",
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "NearPosition": {
+ "Position": {
+ "X": 122.6062,
+ "Y": 39.55857,
+ "Z": -336.5683
+ },
+ "TerritoryId": 622,
+ "MaximumDistance": 50
+ }
+ }
+ }
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1025784,
+ "Position": {
+ "X": 125.68848,
+ "Y": 39.96338,
+ "Z": -335.8969
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "RequiredQuestAcceptedJob": [
+ "DoH"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Craft",
+ "ItemId": 22732,
+ "ItemCount": 2,
+ "RequiredQuestAcceptedJob": [
+ "DoH"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Gather",
+ "ItemsToGather": [
+ {
+ "ItemId": 22628,
+ "ItemCount": 3
+ }
+ ],
+ "RequiredQuestAcceptedJob": [
+ "Miner"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Gather",
+ "ItemsToGather": [
+ {
+ "ItemId": 22654,
+ "ItemCount": 3
+ }
+ ],
+ "RequiredQuestAcceptedJob": [
+ "Botanist"
+ ]
+ },
+ {
+ "DataId": 1025602,
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "CompleteQuest",
+ "Mount": true,
+ "AetheryteShortcut": "Azim Steppe - Dhoro Iloh",
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "NearPosition": {
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "MaximumDistance": 50
+ }
+ }
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3113_Great Buuz Up.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3113_Great Buuz Up.json
new file mode 100644
index 00000000..ab2f39f2
--- /dev/null
+++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3113_Great Buuz Up.json
@@ -0,0 +1,141 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "Theo",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "WalkTo"
+ },
+ {
+ "DataId": 1025602,
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "AcceptQuest"
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 1025787,
+ "Position": {
+ "X": 389.70007,
+ "Y": -8.514979,
+ "Z": 487.93762
+ },
+ "AetheryteShortcut": "Azim Steppe - Reunion",
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "DataId": 1025788,
+ "Position": {
+ "X": 391.9889,
+ "Y": -8.529846,
+ "Z": 489.55518
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "RequiredQuestAcceptedJob": [
+ "DoH"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Craft",
+ "ItemId": 22734,
+ "ItemCount": 2,
+ "RequiredQuestAcceptedJob": [
+ "DoH"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Gather",
+ "ItemsToGather": [
+ {
+ "ItemId": 22630,
+ "ItemCount": 3
+ }
+ ],
+ "RequiredQuestAcceptedJob": [
+ "Miner"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Gather",
+ "ItemsToGather": [
+ {
+ "ItemId": 22656,
+ "ItemCount": 3
+ }
+ ],
+ "RequiredQuestAcceptedJob": [
+ "Botanist"
+ ]
+ },
+ {
+ "DataId": 1025787,
+ "Position": {
+ "X": 389.70007,
+ "Y": -8.514979,
+ "Z": 487.93762
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1025602,
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "CompleteQuest",
+ "Mount": true,
+ "AetheryteShortcut": "Azim Steppe - Dhoro Iloh",
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "NearPosition": {
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "MaximumDistance": 50
+ }
+ }
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3114_Local Special Tea.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3114_Local Special Tea.json
new file mode 100644
index 00000000..081a6f87
--- /dev/null
+++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3114_Local Special Tea.json
@@ -0,0 +1,141 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "Theo",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "WalkTo"
+ },
+ {
+ "DataId": 1025602,
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "AcceptQuest"
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 1025789,
+ "Position": {
+ "X": 594.93384,
+ "Y": 23.164816,
+ "Z": -421.80518
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "AetheryteShortcut": "Azim Steppe - Dawn Throne",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "DataId": 1025790,
+ "Position": {
+ "X": 594.41516,
+ "Y": 23.208984,
+ "Z": -423.81934
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "RequiredQuestAcceptedJob": [
+ "DoH"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Craft",
+ "ItemId": 22735,
+ "ItemCount": 3,
+ "RequiredQuestAcceptedJob": [
+ "DoH"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Gather",
+ "ItemsToGather": [
+ {
+ "ItemId": 22631,
+ "ItemCount": 3
+ }
+ ],
+ "RequiredQuestAcceptedJob": [
+ "Miner"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Gather",
+ "ItemsToGather": [
+ {
+ "ItemId": 22657,
+ "ItemCount": 3
+ }
+ ],
+ "RequiredQuestAcceptedJob": [
+ "Botanist"
+ ]
+ },
+ {
+ "DataId": 1025789,
+ "Position": {
+ "X": 594.93384,
+ "Y": 23.164816,
+ "Z": -421.80518
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1025602,
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "CompleteQuest",
+ "Mount": true,
+ "AetheryteShortcut": "Azim Steppe - Dhoro Iloh",
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "NearPosition": {
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "MaximumDistance": 50
+ }
+ }
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3120_Surprise Offerings.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3120_Surprise Offerings.json
new file mode 100644
index 00000000..c3055787
--- /dev/null
+++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Dailies/3120_Surprise Offerings.json
@@ -0,0 +1,125 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "Theo",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "WalkTo"
+ },
+ {
+ "DataId": 1025602,
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "AcceptQuest"
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 1025805,
+ "Position": {
+ "X": 733.6079,
+ "Y": 0.64432836,
+ "Z": -164.78223
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "AetheryteShortcut": "Azim Steppe - Dawn Throne",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1025806,
+ "Position": {
+ "X": 733.15015,
+ "Y": 0.5340576,
+ "Z": -162.21869
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "RequiredQuestAcceptedJob": [
+ "DoH"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Craft",
+ "ItemId": 22739,
+ "ItemCount": 1,
+ "RequiredQuestAcceptedJob": [
+ "DoH"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Gather",
+ "ItemsToGather": [
+ {
+ "ItemId": 22635,
+ "ItemCount": 3
+ }
+ ],
+ "RequiredQuestAcceptedJob": [
+ "Miner"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Gather",
+ "ItemsToGather": [
+ {
+ "ItemId": 22661,
+ "ItemCount": 3
+ }
+ ],
+ "RequiredQuestAcceptedJob": [
+ "Botanist"
+ ]
+ },
+ {
+ "DataId": 1025602,
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "InteractionType": "CompleteQuest",
+ "Mount": true,
+ "AetheryteShortcut": "Azim Steppe - Dhoro Iloh",
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "NearPosition": {
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "MaximumDistance": 50
+ }
+ }
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Story/3098_Big, Big Fish.json b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Story/3098_Big, Big Fish.json
new file mode 100644
index 00000000..f8d13ce8
--- /dev/null
+++ b/QuestPaths/4.x - Stormblood/Allied Societies/Namazu/Story/3098_Big, Big Fish.json
@@ -0,0 +1,225 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "Theo",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "DataId": 1025605,
+ "Position": {
+ "X": -766.7506,
+ "Y": 127.43907,
+ "Z": 91.11157
+ },
+ "TerritoryId": 622,
+ "InteractionType": "WalkTo",
+ "Fly": true,
+ "AetheryteShortcut": "Azim Steppe - Dhoro Iloh",
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "NearPosition": {
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "MaximumDistance": 50
+ }
+ }
+ }
+ },
+ {
+ "DataId": 1025601,
+ "Position": {
+ "X": -766.7506,
+ "Y": 127.43907,
+ "Z": 91.11157
+ },
+ "TerritoryId": 622,
+ "InteractionType": "AcceptQuest"
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "Position": {
+ "X": -283.0104,
+ "Y": 17.31996,
+ "Z": 508.54376
+ },
+ "TerritoryId": 614,
+ "InteractionType": "WalkTo",
+ "AetheryteShortcut": "Yanxia - Namai",
+ "Fly": true
+ },
+ {
+ "DataId": 1025702,
+ "Position": {
+ "X": -279.25543,
+ "Y": 17.31996,
+ "Z": 489.2804
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "CompletionQuestVariablesFlags": [
+ null,
+ null,
+ null,
+ null,
+ null,
+ 32
+ ]
+ },
+ {
+ "DataId": 1025768,
+ "Position": {
+ "X": -292.2561,
+ "Y": 17.31996,
+ "Z": 489.76868
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "CompletionQuestVariablesFlags": [
+ null,
+ null,
+ null,
+ null,
+ null,
+ 128
+ ]
+ },
+ {
+ "DataId": 1025701,
+ "Position": {
+ "X": -280.81183,
+ "Y": 17.31996,
+ "Z": 524.52893
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "CompletionQuestVariablesFlags": [
+ null,
+ null,
+ null,
+ null,
+ null,
+ 64
+ ]
+ }
+ ]
+ },
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "DataId": 1025605,
+ "Position": {
+ "X": -766.7506,
+ "Y": 127.43907,
+ "Z": 91.11157
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "AetheryteShortcut": "Azim Steppe - Dhoro Iloh"
+ }
+ ]
+ },
+ {
+ "Sequence": 3,
+ "Steps": [
+ {
+ "DataId": 1025703,
+ "Position": {
+ "X": -734.0658,
+ "Y": 127.41788,
+ "Z": 100.8468
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact"
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1025609,
+ "Position": {
+ "X": -770.4738,
+ "Y": 127.42798,
+ "Z": 85.28259
+ },
+ "TerritoryId": 622,
+ "InteractionType": "Interact",
+ "RequiredQuestAcceptedJob": [
+ "DoH"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Craft",
+ "ItemId": 22721,
+ "ItemCount": 2,
+ "RequiredQuestAcceptedJob": [
+ "DoH"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Gather",
+ "ItemsToGather": [
+ {
+ "ItemId": 22617,
+ "ItemCount": 3
+ }
+ ],
+ "RequiredQuestAcceptedJob": [
+ "Miner"
+ ]
+ },
+ {
+ "TerritoryId": 622,
+ "InteractionType": "Gather",
+ "ItemsToGather": [
+ {
+ "ItemId": 22643,
+ "ItemCount": 3
+ }
+ ],
+ "RequiredQuestAcceptedJob": [
+ "Botanist"
+ ]
+ },
+ {
+ "DataId": 1025704,
+ "Position": {
+ "X": -734.8898,
+ "Y": 127.42169,
+ "Z": 99.99231
+ },
+ "TerritoryId": 622,
+ "InteractionType": "CompleteQuest",
+ "Mount": true,
+ "AetheryteShortcut": "Azim Steppe - Dhoro Iloh",
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "NearPosition": {
+ "Position": {
+ "X": -780.148,
+ "Y": 128.25195,
+ "Z": 97.154175
+ },
+ "TerritoryId": 622,
+ "MaximumDistance": 50
+ }
+ }
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2734_Perchance to Hanami.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2734_Perchance to Hanami.json
new file mode 100644
index 00000000..35b1eb35
--- /dev/null
+++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2734_Perchance to Hanami.json
@@ -0,0 +1,95 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "Theo",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "DataId": 1019262,
+ "Position": {
+ "X": 445.76172,
+ "Y": 58.67623,
+ "Z": -155.62683
+ },
+ "TerritoryId": 614,
+ "InteractionType": "AcceptQuest",
+ "AetheryteShortcut": "Yanxia - Namai",
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "NearPosition": {
+ "Position": {
+ "X": 445.76172,
+ "Y": 58.67623,
+ "Z": -155.62683
+ },
+ "TerritoryId": 614,
+ "MaximumDistance": 50
+ }
+ }
+ },
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 2008520,
+ "Position": {
+ "X": 476.85962,
+ "Y": 58.304688,
+ "Z": -178.08807
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "Mount": true,
+ "CompletionQuestVariablesFlags": [
+ null,
+ null,
+ null,
+ null,
+ null,
+ 128
+ ]
+ },
+ {
+ "DataId": 2008521,
+ "Position": {
+ "X": 477.8667,
+ "Y": 59.098145,
+ "Z": -177.66083
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "CompletionQuestVariablesFlags": [
+ null,
+ null,
+ null,
+ null,
+ null,
+ 64
+ ]
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1019302,
+ "Position": {
+ "X": -279.347,
+ "Y": 17.31996,
+ "Z": 498.49683
+ },
+ "TerritoryId": 614,
+ "InteractionType": "CompleteQuest",
+ "Fly": true,
+ "NextQuestId": 2748
+ }
+ ]
+ }
+ ]
+}
diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2736_Courage the Cowardly Lupin.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2736_Courage the Cowardly Lupin.json
new file mode 100644
index 00000000..137f6fc8
--- /dev/null
+++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2736_Courage the Cowardly Lupin.json
@@ -0,0 +1,140 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "Theo",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "DataId": 1019312,
+ "Position": {
+ "X": 473.80774,
+ "Y": 58.448307,
+ "Z": -182.78784
+ },
+ "TerritoryId": 614,
+ "InteractionType": "AcceptQuest",
+ "AetheryteShortcut": "Yanxia - Namai",
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "NearPosition": {
+ "Position": {
+ "X": 472.4036,
+ "Y": 58.568016,
+ "Z": -181.87
+ },
+ "TerritoryId": 614,
+ "MaximumDistance": 50
+ }
+ }
+ },
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 2008459,
+ "Position": {
+ "X": 394.5525,
+ "Y": 80.88806,
+ "Z": -194.17108
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "DataId": 1022399,
+ "Position": {
+ "X": 392.69092,
+ "Y": 80.90235,
+ "Z": -194.9035
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Emote",
+ "Emote": "rally"
+ }
+ ]
+ },
+ {
+ "Sequence": 3,
+ "Steps": [
+ {
+ "Position": {
+ "X": 497.38757,
+ "Y": 55.17306,
+ "Z": 191.36812
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Combat",
+ "Fly": true,
+ "EnemySpawnType": "AutoOnEnterArea",
+ "KillEnemyDataIds": [
+ 7539
+ ]
+ }
+ ]
+ },
+ {
+ "Sequence": 4,
+ "Steps": [
+ {
+ "DataId": 1022400,
+ "Position": {
+ "X": 499.9618,
+ "Y": 55.28981,
+ "Z": 191.18018
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact"
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1019312,
+ "Position": {
+ "X": 473.80774,
+ "Y": 58.448307,
+ "Z": -182.78784
+ },
+ "TerritoryId": 614,
+ "InteractionType": "CompleteQuest",
+ "DialogueChoices": [
+ {
+ "Type": "List",
+ "Prompt": "TEXT_STMBDZ413_02736_Q1_000_000",
+ "Answer": "TEXT_STMBDZ413_02736_A1_000_002"
+ }
+ ],
+ "AetheryteShortcut": "Yanxia - Namai",
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "NearPosition": {
+ "Position": {
+ "X": 435.81787,
+ "Y": 68.84845,
+ "Z": -94.02999
+ },
+ "TerritoryId": 614,
+ "MaximumDistance": 150
+ }
+ }
+ },
+ "Fly": true,
+ "NextQuestId": 2737
+ }
+ ]
+ }
+ ]
+}
diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2737_Kurobana vs the Rice Sacks.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2737_Kurobana vs the Rice Sacks.json
new file mode 100644
index 00000000..c0640ae1
--- /dev/null
+++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2737_Kurobana vs the Rice Sacks.json
@@ -0,0 +1,132 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "Theo",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "DataId": 1019312,
+ "Position": {
+ "X": 473.80774,
+ "Y": 58.448307,
+ "Z": -182.78784
+ },
+ "TerritoryId": 614,
+ "InteractionType": "AcceptQuest",
+ "AetheryteShortcut": "Yanxia - Namai",
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "NearPosition": {
+ "Position": {
+ "X": 472.4036,
+ "Y": 58.568016,
+ "Z": -181.87
+ },
+ "TerritoryId": 614,
+ "MaximumDistance": 50
+ }
+ }
+ },
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 1022399,
+ "Position": {
+ "X": 392.69092,
+ "Y": 80.90235,
+ "Z": -194.9035
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "DataId": 1022421,
+ "Position": {
+ "X": 634.5464,
+ "Y": 86.07644,
+ "Z": -146.74603
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 3,
+ "Steps": [
+ {
+ "DataId": 1022423,
+ "Position": {
+ "X": 499.71765,
+ "Y": 66.36111,
+ "Z": -16.586609
+ },
+ "TerritoryId": 614,
+ "Fly": true,
+ "InteractionType": "Emote",
+ "Emote": "psych"
+ }
+ ]
+ },
+ {
+ "Sequence": 4,
+ "Steps": [
+ {
+ "DataId": 1022424,
+ "Position": {
+ "X": 475.51685,
+ "Y": 68.02852,
+ "Z": -106.30963
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1019312,
+ "Position": {
+ "X": 473.80774,
+ "Y": 58.448307,
+ "Z": -182.78784
+ },
+ "TerritoryId": 614,
+ "InteractionType": "CompleteQuest",
+ "AetheryteShortcut": "Yanxia - Namai",
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "NearPosition": {
+ "Position": {
+ "X": 435.81787,
+ "Y": 68.84845,
+ "Z": -94.02999
+ },
+ "TerritoryId": 614,
+ "MaximumDistance": 150
+ }
+ }
+ },
+ "Fly": true,
+ "NextQuestId": 2738
+ }
+ ]
+ }
+ ]
+}
diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2738_Kurobana vs the Arrowheads.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2738_Kurobana vs the Arrowheads.json
new file mode 100644
index 00000000..44eb2726
--- /dev/null
+++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2738_Kurobana vs the Arrowheads.json
@@ -0,0 +1,168 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "Theo",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "DataId": 1019312,
+ "Position": {
+ "X": 473.80774,
+ "Y": 58.448307,
+ "Z": -182.78784
+ },
+ "TerritoryId": 614,
+ "InteractionType": "AcceptQuest",
+ "AetheryteShortcut": "Yanxia - Namai",
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "NearPosition": {
+ "Position": {
+ "X": 472.4036,
+ "Y": 58.568016,
+ "Z": -181.87
+ },
+ "TerritoryId": 614,
+ "MaximumDistance": 50
+ }
+ }
+ },
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 1022414,
+ "Position": {
+ "X": 605.249,
+ "Y": 67.79578,
+ "Z": -137.49908
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "DialogueChoices": [
+ {
+ "Type": "List",
+ "Prompt": "TEXT_STMBDZ415_02738_Q1_000_000",
+ "Answer": "TEXT_STMBDZ415_02738_A1_000_001"
+ }
+ ],
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "DataId": 2008490,
+ "Position": {
+ "X": 627.8019,
+ "Y": 84.97742,
+ "Z": -98.49707
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "CompletionQuestVariablesFlags": [
+ null,
+ null,
+ null,
+ null,
+ null,
+ 128
+ ],
+ "Fly": true
+ },
+ {
+ "DataId": 2008491,
+ "Position": {
+ "X": 664.8203,
+ "Y": 92.088135,
+ "Z": -107.774536
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "CompletionQuestVariablesFlags": [
+ null,
+ null,
+ null,
+ null,
+ null,
+ 64
+ ],
+ "Mount": true
+ },
+ {
+ "DataId": 2008492,
+ "Position": {
+ "X": 657.98413,
+ "Y": 85.22156,
+ "Z": -150.56079
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "CompletionQuestVariablesFlags": [
+ null,
+ null,
+ null,
+ null,
+ null,
+ 32
+ ],
+ "Mount": true
+ }
+ ]
+ },
+ {
+ "Sequence": 3,
+ "Steps": [
+ {
+ "DataId": 1022414,
+ "Position": {
+ "X": 605.249,
+ "Y": 67.79578,
+ "Z": -137.49908
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1019312,
+ "Position": {
+ "X": 473.80774,
+ "Y": 58.448307,
+ "Z": -182.78784
+ },
+ "TerritoryId": 614,
+ "InteractionType": "CompleteQuest",
+ "AetheryteShortcut": "Yanxia - Namai",
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "NearPosition": {
+ "Position": {
+ "X": 435.81787,
+ "Y": 68.84845,
+ "Z": -94.02999
+ },
+ "TerritoryId": 614,
+ "MaximumDistance": 150
+ }
+ }
+ },
+ "Fly": true,
+ "NextQuestId": 2739
+ }
+ ]
+ }
+ ]
+}
diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2739_Kurobana Holmes.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2739_Kurobana Holmes.json
new file mode 100644
index 00000000..f5809f06
--- /dev/null
+++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2739_Kurobana Holmes.json
@@ -0,0 +1,151 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "Theo",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "DataId": 1022425,
+ "Position": {
+ "X": 473.3806,
+ "Y": 58.51295,
+ "Z": -180.95679
+ },
+ "TerritoryId": 614,
+ "InteractionType": "AcceptQuest",
+ "AetheryteShortcut": "Yanxia - Namai",
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "NearPosition": {
+ "Position": {
+ "X": 472.4036,
+ "Y": 58.568016,
+ "Z": -181.87
+ },
+ "TerritoryId": 614,
+ "MaximumDistance": 50
+ }
+ }
+ },
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 1022417,
+ "Position": {
+ "X": 365.6825,
+ "Y": 100.83898,
+ "Z": -93.91931
+ },
+ "StopDistance": 0.5,
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "DataId": 1022416,
+ "Position": {
+ "X": 675.92883,
+ "Y": 98.45921,
+ "Z": -103.80713
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 3,
+ "Steps": [
+ {
+ "DataId": 1022418,
+ "Position": {
+ "X": 734.5845,
+ "Y": 119.698425,
+ "Z": -35.05005
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 4,
+ "Steps": [
+ {
+ "Position": {
+ "X": 720.75977,
+ "Y": 116.93192,
+ "Z": -60.349487
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Combat",
+ "Fly": true,
+ "EnemySpawnType": "AutoOnEnterArea",
+ "KillEnemyDataIds": [
+ 7540
+ ]
+ }
+ ]
+ },
+ {
+ "Sequence": 5,
+ "Steps": [
+ {
+ "DataId": 1022418,
+ "Position": {
+ "X": 734.5845,
+ "Y": 119.698425,
+ "Z": -35.05005
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1019312,
+ "Position": {
+ "X": 473.80774,
+ "Y": 58.448307,
+ "Z": -182.78784
+ },
+ "TerritoryId": 614,
+ "InteractionType": "CompleteQuest",
+ "AetheryteShortcut": "Yanxia - Namai",
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "NearPosition": {
+ "Position": {
+ "X": 435.81787,
+ "Y": 68.84845,
+ "Z": -94.02999
+ },
+ "TerritoryId": 614,
+ "MaximumDistance": 150
+ }
+ }
+ },
+ "Fly": true,
+ "NextQuestId": 2740
+ }
+ ]
+ }
+ ]
+}
diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2740_Kurobana vs Gyorin.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2740_Kurobana vs Gyorin.json
new file mode 100644
index 00000000..f6f3e1fe
--- /dev/null
+++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2740_Kurobana vs Gyorin.json
@@ -0,0 +1,99 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "Theo",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "DataId": 1022399,
+ "Position": {
+ "X": 392.69092,
+ "Y": 80.90235,
+ "Z": -194.9035
+ },
+ "TerritoryId": 614,
+ "InteractionType": "AcceptQuest"
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 1023237,
+ "Position": {
+ "X": -233.72241,
+ "Y": 17.628202,
+ "Z": 485.3131
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "DataId": 1023237,
+ "Position": {
+ "X": -233.72241,
+ "Y": 17.628202,
+ "Z": 485.3131
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact"
+ }
+ ]
+ },
+ {
+ "Sequence": 3,
+ "Steps": [
+ {
+ "DataId": 1023463,
+ "Position": {
+ "X": 563.8666,
+ "Y": 68.09528,
+ "Z": -11.306946
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "AetheryteShortcut": "Yanxia - Namai",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1023465,
+ "Position": {
+ "X": 462.76025,
+ "Y": 68.01855,
+ "Z": -106.55377
+ },
+ "TerritoryId": 614,
+ "InteractionType": "CompleteQuest",
+ "AetheryteShortcut": "Yanxia - Namai",
+ "Fly": true,
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "NearPosition": {
+ "Position": {
+ "X": 462.13455,
+ "Y": 68.01515,
+ "Z": -104.52245
+ },
+ "TerritoryId": 622,
+ "MaximumDistance": 50
+ }
+ }
+ }
+ }
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2747_Amber Alert.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2747_Amber Alert.json
new file mode 100644
index 00000000..52185f15
--- /dev/null
+++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2747_Amber Alert.json
@@ -0,0 +1,93 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "Theo",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "Position": {
+ "X": -297.51367,
+ "Y": 17.31996,
+ "Z": 508.2195
+ },
+ "TerritoryId": 614,
+ "InteractionType": "WalkTo",
+ "Fly": true
+ },
+ {
+ "DataId": 1019298,
+ "Position": {
+ "X": -318.87692,
+ "Y": 17.974895,
+ "Z": 508.29004
+ },
+ "TerritoryId": 614,
+ "InteractionType": "AcceptQuest",
+ "StopDistance": 0.25
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 1019261,
+ "Position": {
+ "X": 403.00586,
+ "Y": 76.169815,
+ "Z": -148.8518
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "Fly": true,
+ "AetheryteShortcut": "Yanxia - Namai"
+ }
+ ]
+ },
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "Position": {
+ "X": -297.51367,
+ "Y": 17.31996,
+ "Z": 508.2195
+ },
+ "TerritoryId": 614,
+ "InteractionType": "WalkTo",
+ "Fly": true
+ },
+ {
+ "DataId": 1019298,
+ "Position": {
+ "X": -318.87692,
+ "Y": 17.974895,
+ "Z": 508.29004
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "StopDistance": 0.25
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1019261,
+ "Position": {
+ "X": 403.00586,
+ "Y": 76.169815,
+ "Z": -148.8518
+ },
+ "TerritoryId": 614,
+ "InteractionType": "CompleteQuest",
+ "Fly": true,
+ "AetheryteShortcut": "Yanxia - Namai",
+ "NextQuestId": 2740
+ }
+ ]
+ }
+ ]
+}
diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2748_Gyorin the Namazu.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2748_Gyorin the Namazu.json
new file mode 100644
index 00000000..910bc8fe
--- /dev/null
+++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2748_Gyorin the Namazu.json
@@ -0,0 +1,143 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "liza",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "DataId": 1023236,
+ "Position": {
+ "X": -300.06866,
+ "Y": 16.806112,
+ "Z": 539.45215
+ },
+ "TerritoryId": 614,
+ "InteractionType": "AcceptQuest",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 1023237,
+ "Position": {
+ "X": -233.72241,
+ "Y": 17.628202,
+ "Z": 485.3131
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "Position": {
+ "X": -463.34363,
+ "Y": 1.3011811,
+ "Z": 578.3476
+ },
+ "TerritoryId": 614,
+ "InteractionType": "WalkTo",
+ "Fly": true
+ },
+ {
+ "DataId": 1023238,
+ "Position": {
+ "X": -464.49988,
+ "Y": 1.3011812,
+ "Z": 577.32495
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact"
+ }
+ ]
+ },
+ {
+ "Sequence": 3,
+ "Steps": [
+ {
+ "Position": {
+ "X": -487.5986,
+ "Y": -0.5999999,
+ "Z": 578.5466
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Dive",
+ "DisableNavmesh": true
+ },
+ {
+ "DataId": 2008799,
+ "Position": {
+ "X": -549.7063,
+ "Y": -109.51398,
+ "Z": 569.32935
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "Fly": true,
+ "Mount": true
+ }
+ ]
+ },
+ {
+ "Sequence": 4,
+ "Steps": [
+ {
+ "Position": {
+ "X": -487.5986,
+ "Y": -0.5999999,
+ "Z": 578.5466
+ },
+ "TerritoryId": 614,
+ "InteractionType": "WalkTo",
+ "DisableNavmesh": true,
+ "RestartNavigationIfCancelled": false
+ },
+ {
+ "Position": {
+ "X": -463.34363,
+ "Y": 1.3011811,
+ "Z": 578.3476
+ },
+ "TerritoryId": 614,
+ "InteractionType": "WalkTo",
+ "Fly": true
+ },
+ {
+ "DataId": 1023238,
+ "Position": {
+ "X": -464.49988,
+ "Y": 1.3011812,
+ "Z": 577.32495
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact"
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1023237,
+ "Position": {
+ "X": -233.72241,
+ "Y": 17.628202,
+ "Z": 485.3131
+ },
+ "TerritoryId": 614,
+ "InteractionType": "CompleteQuest",
+ "Fly": true,
+ "NextQuestId": 2749
+ }
+ ]
+ }
+ ]
+}
diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2749_No Wealth Like Mineral Wealth.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2749_No Wealth Like Mineral Wealth.json
new file mode 100644
index 00000000..d85ab406
--- /dev/null
+++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2749_No Wealth Like Mineral Wealth.json
@@ -0,0 +1,138 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "Theo",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "DataId": 1023237,
+ "Position": {
+ "X": -233.72241,
+ "Y": 17.628202,
+ "Z": 485.3131
+ },
+ "TerritoryId": 614,
+ "InteractionType": "AcceptQuest"
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 1023239,
+ "Position": {
+ "X": -392.72144,
+ "Y": 46.670254,
+ "Z": 452.93335
+ },
+ "StopDistance": 0.5,
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "Position": {
+ "X": -239.56377,
+ "Y": 49.354053,
+ "Z": 284.94565
+ },
+ "TerritoryId": 614,
+ "InteractionType": "WalkTo",
+ "Fly": true,
+ "SkipConditions": {
+ "StepIf": {
+ "Flying": "Locked"
+ }
+ }
+ },
+ {
+ "DataId": 1023240,
+ "Position": {
+ "X": -258.6557,
+ "Y": 38.181896,
+ "Z": 217.9751
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 3,
+ "Steps": [
+ {
+ "Position": {
+ "X": -287.37323,
+ "Y": 39.150906,
+ "Z": 206.95801
+ },
+ "StopDistance": 0.5,
+ "TerritoryId": 614,
+ "InteractionType": "Combat",
+ "Fly": true,
+ "EnemySpawnType": "AutoOnEnterArea",
+ "KillEnemyDataIds": [
+ 7541
+ ]
+ }
+ ]
+ },
+ {
+ "Sequence": 4,
+ "Steps": [
+ {
+ "DataId": 1023240,
+ "Position": {
+ "X": -258.6557,
+ "Y": 38.181896,
+ "Z": 217.9751
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 5,
+ "Steps": [
+ {
+ "DataId": 2008801,
+ "Position": {
+ "X": -234.24127,
+ "Y": 17.593567,
+ "Z": 486.9917
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1023237,
+ "Position": {
+ "X": -233.72241,
+ "Y": 17.628202,
+ "Z": 485.3131
+ },
+ "TerritoryId": 614,
+ "InteractionType": "CompleteQuest",
+ "Fly": true,
+ "NextQuestId": 2750
+ }
+ ]
+ }
+ ]
+}
diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2750_Fresh Flesh.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2750_Fresh Flesh.json
new file mode 100644
index 00000000..79b79e9b
--- /dev/null
+++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2750_Fresh Flesh.json
@@ -0,0 +1,107 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "Theo",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "DataId": 1023237,
+ "Position": {
+ "X": -233.72241,
+ "Y": 17.628202,
+ "Z": 485.3131
+ },
+ "TerritoryId": 614,
+ "InteractionType": "AcceptQuest"
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "Position": {
+ "X": 151.29321,
+ "Y": -0.2997286,
+ "Z": 229.44983
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Combat",
+ "Fly": true,
+ "EnemySpawnType": "OverworldEnemies",
+ "ComplexCombatData": [
+ {
+ "DataId": 6682,
+ "KillCount": 3
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "DataId": 1023237,
+ "Position": {
+ "X": -233.72241,
+ "Y": 17.628202,
+ "Z": 485.3131
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 3,
+ "Steps": [
+ {
+ "DataId": 2008802,
+ "Position": {
+ "X": -235.03479,
+ "Y": 17.654663,
+ "Z": 487.32727
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact"
+ }
+ ]
+ },
+ {
+ "Sequence": 4,
+ "Steps": [
+ {
+ "DataId": 1023243,
+ "Position": {
+ "X": -88.85327,
+ "Y": -0.35101318,
+ "Z": 654.4442
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1023237,
+ "Position": {
+ "X": -233.72241,
+ "Y": 17.628202,
+ "Z": 485.3131
+ },
+ "TerritoryId": 614,
+ "InteractionType": "CompleteQuest",
+ "Fly": true,
+ "NextQuestId": 2751
+ }
+ ]
+ }
+ ]
+}
diff --git a/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2751_Show Me the New Money.json b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2751_Show Me the New Money.json
new file mode 100644
index 00000000..4a9a8aa8
--- /dev/null
+++ b/QuestPaths/4.x - Stormblood/Side Quests/Yanxia/2751_Show Me the New Money.json
@@ -0,0 +1,121 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "Theo",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "DataId": 1023237,
+ "Position": {
+ "X": -233.72241,
+ "Y": 17.628202,
+ "Z": 485.3131
+ },
+ "TerritoryId": 614,
+ "InteractionType": "AcceptQuest"
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 1023244,
+ "Position": {
+ "X": -290.15033,
+ "Y": 17.31996,
+ "Z": 490.86743
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "DataId": 1023245,
+ "Position": {
+ "X": 133.1654,
+ "Y": 13.172864,
+ "Z": 483.7871
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 3,
+ "Steps": [
+ {
+ "DataId": 1023246,
+ "Position": {
+ "X": 401.3275,
+ "Y": 14.6418705,
+ "Z": 630.15173
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 4,
+ "Steps": [
+ {
+ "Position": {
+ "X": 447.20697,
+ "Y": 14.621715,
+ "Z": 673.4272
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Combat",
+ "Fly": true,
+ "EnemySpawnType": "AutoOnEnterArea",
+ "KillEnemyDataIds": [
+ 7525
+ ]
+ }
+ ]
+ },
+ {
+ "Sequence": 5,
+ "Steps": [
+ {
+ "DataId": 1023246,
+ "Position": {
+ "X": 401.3275,
+ "Y": 14.6418705,
+ "Z": 630.15173
+ },
+ "TerritoryId": 614,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1023244,
+ "Position": {
+ "X": -290.15033,
+ "Y": 17.31996,
+ "Z": 490.86743
+ },
+ "TerritoryId": 614,
+ "InteractionType": "CompleteQuest",
+ "Fly": true,
+ "NextQuestId": 2747
+ }
+ ]
+ }
+ ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Role Quests/5188_Picking Up the Torch.json b/QuestPaths/7.x - Dawntrail/Role Quests/5188_Picking Up the Torch.json
new file mode 100644
index 00000000..d8d59f15
--- /dev/null
+++ b/QuestPaths/7.x - Dawntrail/Role Quests/5188_Picking Up the Torch.json
@@ -0,0 +1,161 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "liza",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "DataId": 1050871,
+ "Position": {
+ "X": -51.895935,
+ "Y": -17.97287,
+ "Z": 182.7268
+ },
+ "TerritoryId": 1185,
+ "InteractionType": "AcceptQuest",
+ "AetheryteShortcut": "Tuliyollal",
+ "AethernetShortcut": [
+ "[Tuliyollal] Aetheryte Plaza",
+ "[Tuliyollal] The For'ard Cabins"
+ ],
+ "SkipConditions": {
+ "AetheryteShortcutIf": {
+ "InSameTerritory": true
+ }
+ }
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 1001657,
+ "Position": {
+ "X": 94.80432,
+ "Y": 7.9804688,
+ "Z": -34.042908
+ },
+ "TerritoryId": 131,
+ "InteractionType": "Interact",
+ "AetheryteShortcut": "Ul'dah",
+ "AethernetShortcut": [
+ "[Ul'dah] Aetheryte Plaza",
+ "[Ul'dah] Sapphire Avenue Exchange"
+ ],
+ "CompletionQuestVariablesFlags": [
+ null,
+ null,
+ null,
+ null,
+ null,
+ 32
+ ]
+ },
+ {
+ "DataId": 1006440,
+ "Position": {
+ "X": 140.3982,
+ "Y": 4,
+ "Z": -54.154297
+ },
+ "TerritoryId": 131,
+ "InteractionType": "Interact",
+ "CompletionQuestVariablesFlags": [
+ null,
+ null,
+ null,
+ null,
+ null,
+ 64
+ ]
+ },
+ {
+ "DataId": 1051655,
+ "Position": {
+ "X": 137.74304,
+ "Y": 4,
+ "Z": 5.9662476
+ },
+ "TerritoryId": 131,
+ "InteractionType": "Interact",
+ "CompletionQuestVariablesFlags": [
+ null,
+ null,
+ null,
+ null,
+ null,
+ 128
+ ]
+ }
+ ]
+ },
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "Position": {
+ "X": 146.12386,
+ "Y": 4,
+ "Z": -23.562449
+ },
+ "StopDistance": 0.5,
+ "TerritoryId": 131,
+ "InteractionType": "Emote",
+ "Emote": "angry"
+ }
+ ]
+ },
+ {
+ "Sequence": 3,
+ "Steps": [
+ {
+ "DataId": 1051656,
+ "Position": {
+ "X": 56.443115,
+ "Y": 10,
+ "Z": 5.935669
+ },
+ "TerritoryId": 131,
+ "InteractionType": "Interact"
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 2012114,
+ "Position": {
+ "X": 0,
+ "Y": 1.15,
+ "Z": 10.23451
+ },
+ "TerritoryId": 1255,
+ "InteractionType": "Interact",
+ "TargetTerritoryId": 131,
+ "SkipConditions": {
+ "StepIf": {
+ "InTerritory": [
+ 131
+ ]
+ }
+ }
+ },
+ {
+ "DataId": 1051656,
+ "Position": {
+ "X": 56.443115,
+ "Y": 10,
+ "Z": 5.935669
+ },
+ "StopDistance": 7,
+ "TerritoryId": 131,
+ "InteractionType": "CompleteQuest",
+ "NextQuestId": 5189
+ }
+ ]
+ }
+ ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Role Quests/5189_Imposing Views.json b/QuestPaths/7.x - Dawntrail/Role Quests/5189_Imposing Views.json
new file mode 100644
index 00000000..17c2bf46
--- /dev/null
+++ b/QuestPaths/7.x - Dawntrail/Role Quests/5189_Imposing Views.json
@@ -0,0 +1,129 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "liza",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "DataId": 1051656,
+ "Position": {
+ "X": 56.443115,
+ "Y": 10,
+ "Z": 5.935669
+ },
+ "StopDistance": 7,
+ "TerritoryId": 131,
+ "InteractionType": "AcceptQuest"
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 2014419,
+ "Position": {
+ "X": -158.86176,
+ "Y": 7.4921875,
+ "Z": 493.88867
+ },
+ "TerritoryId": 146,
+ "InteractionType": "Interact",
+ "AetheryteShortcut": "Southern Thanalan - Forgotten Springs",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "DataId": 1051661,
+ "Position": {
+ "X": 1.7852783,
+ "Y": 19.026453,
+ "Z": 581.62805
+ },
+ "StopDistance": 5,
+ "TerritoryId": 146,
+ "InteractionType": "Interact",
+ "DialogueChoices": [
+ {
+ "Type": "List",
+ "Prompt": "TEXT_KINGBZ002_05189_Q1_000_000",
+ "Answer": "TEXT_KINGBZ002_05189_A1_000_001"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "Sequence": 3,
+ "Steps": [
+ {
+ "DataId": 1051663,
+ "Position": {
+ "X": 51.68225,
+ "Y": 0.7631253,
+ "Z": 711.57385
+ },
+ "TerritoryId": 146,
+ "InteractionType": "Combat",
+ "EnemySpawnType": "AfterInteraction",
+ "KillEnemyDataIds": [
+ 18178
+ ],
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 4,
+ "Steps": [
+ {
+ "DataId": 1051663,
+ "Position": {
+ "X": 51.68225,
+ "Y": 0.7631253,
+ "Z": 711.57385
+ },
+ "TerritoryId": 146,
+ "InteractionType": "Interact"
+ }
+ ]
+ },
+ {
+ "Sequence": 5,
+ "Steps": [
+ {
+ "DataId": 1051668,
+ "Position": {
+ "X": 170.42798,
+ "Y": 15.943722,
+ "Z": 897.94763
+ },
+ "TerritoryId": 146,
+ "InteractionType": "Interact",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1051668,
+ "Position": {
+ "X": 170.42798,
+ "Y": 15.943722,
+ "Z": 897.94763
+ },
+ "TerritoryId": 146,
+ "InteractionType": "CompleteQuest",
+ "NextQuestId": 5190
+ }
+ ]
+ }
+ ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Role Quests/5190_Enforcing Freedom.json b/QuestPaths/7.x - Dawntrail/Role Quests/5190_Enforcing Freedom.json
new file mode 100644
index 00000000..6f05c439
--- /dev/null
+++ b/QuestPaths/7.x - Dawntrail/Role Quests/5190_Enforcing Freedom.json
@@ -0,0 +1,175 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "liza",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "DataId": 1051668,
+ "Position": {
+ "X": 170.42798,
+ "Y": 15.943722,
+ "Z": 897.94763
+ },
+ "TerritoryId": 146,
+ "InteractionType": "AcceptQuest"
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 1050871,
+ "Position": {
+ "X": -51.895935,
+ "Y": -17.97287,
+ "Z": 182.7268
+ },
+ "TerritoryId": 1185,
+ "InteractionType": "Interact",
+ "AetheryteShortcut": "Tuliyollal",
+ "AethernetShortcut": [
+ "[Tuliyollal] Aetheryte Plaza",
+ "[Tuliyollal] The For'ard Cabins"
+ ]
+ }
+ ]
+ },
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "DataId": 1051670,
+ "Position": {
+ "X": -15.976257,
+ "Y": -19.928413,
+ "Z": 224.90259
+ },
+ "TerritoryId": 1185,
+ "InteractionType": "Interact"
+ }
+ ]
+ },
+ {
+ "Sequence": 3,
+ "Steps": [
+ {
+ "DataId": 1051675,
+ "Position": {
+ "X": 358.23608,
+ "Y": 5.957184,
+ "Z": 428.36658
+ },
+ "StopDistance": 1,
+ "TerritoryId": 1190,
+ "InteractionType": "Interact",
+ "AetheryteShortcut": "Shaaloani - Hhusatahwi",
+ "Fly": true
+ }
+ ]
+ },
+ {
+ "Sequence": 4,
+ "Steps": [
+ {
+ "Position": {
+ "X": 363.81656,
+ "Y": 5.9295864,
+ "Z": 435.17932
+ },
+ "TerritoryId": 1190,
+ "InteractionType": "WalkTo"
+ },
+ {
+ "DataId": 1051677,
+ "Position": {
+ "X": 371.4198,
+ "Y": 5.95728,
+ "Z": 425.4978
+ },
+ "TerritoryId": 1190,
+ "InteractionType": "Interact"
+ }
+ ]
+ },
+ {
+ "Sequence": 5,
+ "Steps": [
+ {
+ "DataId": 1051677,
+ "Position": {
+ "X": 371.4198,
+ "Y": 5.95728,
+ "Z": 425.4978
+ },
+ "TerritoryId": 1190,
+ "InteractionType": "Emote",
+ "Emote": "unbound"
+ }
+ ]
+ },
+ {
+ "Sequence": 6,
+ "Steps": [
+ {
+ "DataId": 1051682,
+ "Position": {
+ "X": 387.5028,
+ "Y": -0.60167974,
+ "Z": 426.99304
+ },
+ "TerritoryId": 1190,
+ "InteractionType": "Interact"
+ }
+ ]
+ },
+ {
+ "Sequence": 7,
+ "Steps": [
+ {
+ "Position": {
+ "X": 425.24307,
+ "Y": 0.7699772,
+ "Z": 473.79095
+ },
+ "TerritoryId": 1190,
+ "InteractionType": "WalkTo",
+ "Fly": true
+ },
+ {
+ "DataId": 1051684,
+ "Position": {
+ "X": 426.04712,
+ "Y": 0.7461932,
+ "Z": 472.3125
+ },
+ "TerritoryId": 1190,
+ "InteractionType": "Interact"
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1050871,
+ "Position": {
+ "X": -51.895935,
+ "Y": -17.97287,
+ "Z": 182.7268
+ },
+ "TerritoryId": 1185,
+ "InteractionType": "CompleteQuest",
+ "AetheryteShortcut": "Tuliyollal",
+ "AethernetShortcut": [
+ "[Tuliyollal] Aetheryte Plaza",
+ "[Tuliyollal] The For'ard Cabins"
+ ],
+ "NextQuestId": 5191
+ }
+ ]
+ }
+ ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Role Quests/5191_Bar the Passage.json b/QuestPaths/7.x - Dawntrail/Role Quests/5191_Bar the Passage.json
new file mode 100644
index 00000000..ac9a8790
--- /dev/null
+++ b/QuestPaths/7.x - Dawntrail/Role Quests/5191_Bar the Passage.json
@@ -0,0 +1,182 @@
+{
+ "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
+ "Author": "liza",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "DataId": 1050871,
+ "Position": {
+ "X": -51.895935,
+ "Y": -17.97287,
+ "Z": 182.7268
+ },
+ "TerritoryId": 1185,
+ "InteractionType": "AcceptQuest"
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 1051689,
+ "Position": {
+ "X": 273.33484,
+ "Y": 15.999998,
+ "Z": 740.6576
+ },
+ "TerritoryId": 1190,
+ "InteractionType": "SinglePlayerDuty",
+ "AethernetShortcut": [
+ "[Tuliyollal] The For'ard Cabins",
+ "[Tuliyollal] Xak Tural Skygate (Shaaloani)"
+ ]
+ }
+ ]
+ },
+ {
+ "Sequence": 2
+ },
+ {
+ "Sequence": 3,
+ "Steps": [
+ {
+ "DataId": 1051691,
+ "Position": {
+ "X": 273.85364,
+ "Y": 15.999996,
+ "Z": 738.2771
+ },
+ "TerritoryId": 1190,
+ "InteractionType": "Interact"
+ }
+ ]
+ },
+ {
+ "Sequence": 4,
+ "Steps": [
+ {
+ "DataId": 1050871,
+ "Position": {
+ "X": -51.895935,
+ "Y": -17.97287,
+ "Z": 182.7268
+ },
+ "TerritoryId": 1185,
+ "InteractionType": "Interact",
+ "AetheryteShortcut": "Tuliyollal",
+ "AethernetShortcut": [
+ "[Tuliyollal] Aetheryte Plaza",
+ "[Tuliyollal] The For'ard Cabins"
+ ]
+ }
+ ]
+ },
+ {
+ "Sequence": 5,
+ "Steps": [
+ {
+ "DataId": 1051672,
+ "Position": {
+ "X": -14.816589,
+ "Y": -19.881973,
+ "Z": 223.3158
+ },
+ "TerritoryId": 1185,
+ "InteractionType": "Interact"
+ }
+ ]
+ },
+ {
+ "Sequence": 6,
+ "Steps": [
+ {
+ "DataId": 1051673,
+ "Position": {
+ "X": -15.243774,
+ "Y": -19.762682,
+ "Z": 221.72876
+ },
+ "StopDistance": 5,
+ "TerritoryId": 1185,
+ "InteractionType": "Interact"
+ }
+ ]
+ },
+ {
+ "Sequence": 7,
+ "Steps": [
+ {
+ "DataId": 1051670,
+ "Position": {
+ "X": -15.976257,
+ "Y": -19.928413,
+ "Z": 224.90259
+ },
+ "StopDistance": 5,
+ "TerritoryId": 1185,
+ "InteractionType": "Interact"
+ }
+ ]
+ },
+ {
+ "Sequence": 8,
+ "Steps": [
+ {
+ "DataId": 1051671,
+ "Position": {
+ "X": -17.95996,
+ "Y": -19.784014,
+ "Z": 224.17017
+ },
+ "StopDistance": 5,
+ "TerritoryId": 1185,
+ "InteractionType": "Interact"
+ }
+ ]
+ },
+ {
+ "Sequence": 9,
+ "Steps": [
+ {
+ "DataId": 1051674,
+ "Position": {
+ "X": -16.617126,
+ "Y": -19.752277,
+ "Z": 222.64429
+ },
+ "TerritoryId": 1185,
+ "InteractionType": "Interact"
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "Position": {
+ "X": -44.643284,
+ "Y": -17.972864,
+ "Z": 203.87883
+ },
+ "TerritoryId": 1185,
+ "InteractionType": "WalkTo"
+ },
+ {
+ "DataId": 1046521,
+ "Position": {
+ "X": -46.616333,
+ "Y": -17.97287,
+ "Z": 180.3158
+ },
+ "StopDistance": 5,
+ "TerritoryId": 1185,
+ "InteractionType": "CompleteQuest",
+ "DisableNavmesh": true
+ }
+ ]
+ }
+ ]
+}
diff --git a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5083_The Wind's Blessing.json b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5083_The Wind's Blessing.json
index 903ee73e..c02008d7 100644
--- a/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5083_The Wind's Blessing.json
+++ b/QuestPaths/7.x - Dawntrail/Side Quests/Kozama'uka/5083_The Wind's Blessing.json
@@ -96,6 +96,7 @@
},
"TerritoryId": 1188,
"InteractionType": "CompleteQuest",
+ "Fly": true,
"NextQuestId": 5084
}
]
diff --git a/QuestPaths/quest-v1.json b/QuestPaths/quest-v1.json
index 99105c93..0ca8c368 100644
--- a/QuestPaths/quest-v1.json
+++ b/QuestPaths/quest-v1.json
@@ -47,6 +47,10 @@
},
"Comment": {
"type": "string"
+ },
+ "$": {
+ "type": "string",
+ "description": "Dev Comment (not visible in-game)"
}
},
"required": [
@@ -183,7 +187,8 @@
"null"
],
"description": "The Item to use",
- "exclusiveMinimum": 0
+ "exclusiveMinimum": 0,
+ "maximum": 2010000
},
"SkipConditions": {
"type": "object",
@@ -291,6 +296,7 @@
"type": "string",
"enum": [
"WakingSandsMainArea",
+ "WakingSandsSolar",
"RisingStonesSolar",
"RoguesGuild",
"DockStorehouse"
@@ -648,13 +654,15 @@
"type": "object",
"properties": {
"ItemId": {
- "type": "integer"
+ "type": "integer",
+ "maximum": 2010000
},
"Condition": {
"type": "string",
"enum": [
"Incapacitated",
- "Health%"
+ "Health%",
+ "MissingStatus"
]
},
"Value": {
@@ -695,9 +703,7 @@
"const": "UseItem"
},
"ItemId": {
- "not": {
- "const": 30362
- }
+ "minimum": 2000000
}
}
},
@@ -860,7 +866,9 @@
"mogdance",
"salute",
"laugh",
- "greeting"
+ "greeting",
+ "angry",
+ "unbound"
]
}
}
diff --git a/Questionable.Model/Questing/Converter/CombatItemUseConditionConverter.cs b/Questionable.Model/Questing/Converter/CombatItemUseConditionConverter.cs
index 1b4086ff..deadc4f6 100644
--- a/Questionable.Model/Questing/Converter/CombatItemUseConditionConverter.cs
+++ b/Questionable.Model/Questing/Converter/CombatItemUseConditionConverter.cs
@@ -9,5 +9,6 @@ public sealed class CombatItemUseConditionConverter() : EnumConverter(Values)
{
private static readonly Dictionary Values = new()
{
+ { EEmote.Angry, "angry" },
{ EEmote.Bow, "bow" },
{ EEmote.Cheer, "cheer" },
{ EEmote.Clap, "clap" },
@@ -45,5 +46,6 @@ public sealed class EmoteConverter() : EnumConverter(Values)
{ EEmote.Box, "box" },
{ EEmote.Greeting, "greeting" },
{ EEmote.Uchiwasshoi, "uchiwasshoi" },
+ { EEmote.Unbound, "unbound" },
};
}
diff --git a/Questionable.Model/Questing/Converter/SkipConditionConverter.cs b/Questionable.Model/Questing/Converter/SkipConditionConverter.cs
index 3de919b9..eb917950 100644
--- a/Questionable.Model/Questing/Converter/SkipConditionConverter.cs
+++ b/Questionable.Model/Questing/Converter/SkipConditionConverter.cs
@@ -8,6 +8,7 @@ public sealed class SkipConditionConverter() : EnumConverter Values = new()
{
{ EExtraSkipCondition.WakingSandsMainArea, "WakingSandsMainArea" },
+ { EExtraSkipCondition.WakingSandsSolar, "WakingSandsSolar" },
{ EExtraSkipCondition.RisingStonesSolar, "RisingStonesSolar"},
{ EExtraSkipCondition.RoguesGuild, "RoguesGuild"},
{ EExtraSkipCondition.DockStorehouse, "DockStorehouse"},
diff --git a/Questionable.Model/Questing/ECombatItemUseCondition.cs b/Questionable.Model/Questing/ECombatItemUseCondition.cs
index 7bb4e2b2..fbbea236 100644
--- a/Questionable.Model/Questing/ECombatItemUseCondition.cs
+++ b/Questionable.Model/Questing/ECombatItemUseCondition.cs
@@ -5,4 +5,5 @@ public enum ECombatItemUseCondition
None,
Incapacitated,
HealthPercent,
+ MissingStatus,
}
diff --git a/Questionable.Model/Questing/EEmote.cs b/Questionable.Model/Questing/EEmote.cs
index 78e7b650..7855bd15 100644
--- a/Questionable.Model/Questing/EEmote.cs
+++ b/Questionable.Model/Questing/EEmote.cs
@@ -8,6 +8,7 @@ public enum EEmote
{
None = 0,
+ Angry = 2,
Bow = 5,
Cheer = 6,
Clap = 7,
@@ -45,6 +46,7 @@ public enum EEmote
Respect = 140,
Box = 166,
Greeting = 172,
- Uchiwasshoi = 278
+ Uchiwasshoi = 278,
+ Unbound = 282,
}
diff --git a/Questionable.Model/Questing/EExtraSkipCondition.cs b/Questionable.Model/Questing/EExtraSkipCondition.cs
index d9d7b0be..8ec77d49 100644
--- a/Questionable.Model/Questing/EExtraSkipCondition.cs
+++ b/Questionable.Model/Questing/EExtraSkipCondition.cs
@@ -8,6 +8,7 @@ public enum EExtraSkipCondition
{
None,
WakingSandsMainArea,
+ WakingSandsSolar,
RisingStonesSolar,
///
diff --git a/Questionable/Controller/CombatController.cs b/Questionable/Controller/CombatController.cs
index 73fe17df..ea10fa7c 100644
--- a/Questionable/Controller/CombatController.cs
+++ b/Questionable/Controller/CombatController.cs
@@ -157,7 +157,7 @@ internal sealed class CombatController : IDisposable
{
int currentTargetPriority = GetKillPriority(target);
var nextTarget = FindNextTarget();
- int nextTargetPriority = GetKillPriority(target);
+ int nextTargetPriority = nextTarget != null ? GetKillPriority(nextTarget) : 0;
if (nextTarget != null && nextTarget.Equals(target))
{
@@ -176,7 +176,7 @@ internal sealed class CombatController : IDisposable
}
else if (nextTarget != null)
{
- if (nextTargetPriority > currentTargetPriority)
+ if (nextTargetPriority > currentTargetPriority || currentTargetPriority == 0)
SetTarget(nextTarget);
}
else
diff --git a/Questionable/Controller/CombatModules/ItemUseModule.cs b/Questionable/Controller/CombatModules/ItemUseModule.cs
index 26a92ff3..95dbea56 100644
--- a/Questionable/Controller/CombatModules/ItemUseModule.cs
+++ b/Questionable/Controller/CombatModules/ItemUseModule.cs
@@ -108,6 +108,7 @@ internal sealed class ItemUseModule : ICombatModule
_delegate.Stop();
unsafe
{
+ _logger.LogInformation("Using item {ItemId}", _combatData.CombatItemUse.ItemId);
AgentInventoryContext.Instance()->UseItem(_combatData.CombatItemUse.ItemId);
}
_continueAt = DateTime.Now.AddSeconds(2);
@@ -147,6 +148,9 @@ internal sealed class ItemUseModule : ICombatModule
if (_combatData.CombatItemUse.Condition == ECombatItemUseCondition.HealthPercent)
return (100f * battleChara->Health / battleChara->MaxHealth) < _combatData.CombatItemUse.Value;
+
+ if (_combatData.CombatItemUse.Condition == ECombatItemUseCondition.MissingStatus)
+ return !battleChara->StatusManager.HasStatus((uint)_combatData.CombatItemUse.Value);
}
return false;
diff --git a/Questionable/Controller/GameUi/HelpUiController.cs b/Questionable/Controller/GameUi/HelpUiController.cs
index 0d869add..504f8cd0 100644
--- a/Questionable/Controller/GameUi/HelpUiController.cs
+++ b/Questionable/Controller/GameUi/HelpUiController.cs
@@ -3,6 +3,7 @@ using Dalamud.Game.Addon.Lifecycle;
using Dalamud.Game.Addon.Lifecycle.AddonArgTypes;
using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Component.GUI;
+using LLib.GameUI;
using Microsoft.Extensions.Logging;
namespace Questionable.Controller.GameUi;
@@ -11,17 +12,45 @@ internal sealed class HelpUiController : IDisposable
{
private readonly QuestController _questController;
private readonly IAddonLifecycle _addonLifecycle;
+ private readonly IGameGui _gameGui;
private readonly ILogger _logger;
- public HelpUiController(QuestController questController, IAddonLifecycle addonLifecycle, ILogger logger)
+ public HelpUiController(
+ QuestController questController,
+ IAddonLifecycle addonLifecycle,
+ IGameGui gameGui,
+ ILogger logger)
{
_questController = questController;
_addonLifecycle = addonLifecycle;
+ _gameGui = gameGui;
_logger = logger;
+ _questController.AutomationTypeChanged += CloseHelpWindowsWhenStartingQuests;
+
_addonLifecycle.RegisterListener(AddonEvent.PostSetup, "AkatsukiNote", UnendingCodexPostSetup);
_addonLifecycle.RegisterListener(AddonEvent.PostSetup, "ContentsTutorial", ContentsTutorialPostSetup);
_addonLifecycle.RegisterListener(AddonEvent.PostSetup, "MultipleHelpWindow", MultipleHelpWindowPostSetup);
+ _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "JobHudNotice", JobHudNoticePostSetup);
+ _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "Guide", GuidePostSetup);
+ }
+
+ private unsafe void CloseHelpWindowsWhenStartingQuests(object sender, QuestController.EAutomationType e)
+ {
+ if (e is QuestController.EAutomationType.Manual)
+ return;
+
+ if (_gameGui.TryGetAddonByName("Guide", out AtkUnitBase* addonGuide))
+ {
+ _logger.LogInformation("Guide window is open");
+ GuidePostSetup(addonGuide);
+ }
+
+ if (_gameGui.TryGetAddonByName("JobHudNotice", out AtkUnitBase* addonJobHudNotice))
+ {
+ _logger.LogInformation("JobHudNotice window is open");
+ JobHudNoticePostSetup(addonJobHudNotice);
+ }
}
private unsafe void UnendingCodexPostSetup(AddonEvent type, AddonArgs args)
@@ -36,7 +65,7 @@ internal sealed class HelpUiController : IDisposable
private unsafe void ContentsTutorialPostSetup(AddonEvent type, AddonArgs args)
{
- if (_questController.StartedQuest?.Quest.Id.Value == 245)
+ if (_questController.StartedQuest?.Quest.Id.Value is 245 or 3872)
{
_logger.LogInformation("Closing ContentsTutorial");
AtkUnitBase* addon = (AtkUnitBase*)args.Addon;
@@ -58,10 +87,38 @@ internal sealed class HelpUiController : IDisposable
}
}
+ private unsafe void JobHudNoticePostSetup(AddonEvent type, AddonArgs args)
+ {
+ if (_questController.IsRunning || _questController.AutomationType != QuestController.EAutomationType.Manual)
+ JobHudNoticePostSetup((AtkUnitBase*)args.Addon);
+ }
+
+ private unsafe void JobHudNoticePostSetup(AtkUnitBase* addon)
+ {
+ _logger.LogInformation("Clicking the JobHudNotice window to open the relevant Guide page");
+ addon->FireCallbackInt(0);
+ }
+
+ private unsafe void GuidePostSetup(AddonEvent type, AddonArgs args)
+ {
+ if (_questController.IsRunning || _questController.AutomationType != QuestController.EAutomationType.Manual)
+ GuidePostSetup((AtkUnitBase*)args.Addon);
+ }
+
+ private unsafe void GuidePostSetup(AtkUnitBase* addon)
+ {
+ _logger.LogInformation("Closing Guide window");
+ addon->FireCallbackInt(-1);
+ }
+
public void Dispose()
{
+ _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "Guide", GuidePostSetup);
+ _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "JobHudNotice", JobHudNoticePostSetup);
_addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "MultipleHelpWindow", MultipleHelpWindowPostSetup);
_addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "ContentsTutorial", ContentsTutorialPostSetup);
_addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "AkatsukiNote", UnendingCodexPostSetup);
+
+ _questController.AutomationTypeChanged -= CloseHelpWindowsWhenStartingQuests;
}
}
diff --git a/Questionable/Controller/GatheringController.cs b/Questionable/Controller/GatheringController.cs
index bbe6d2e4..28de31f9 100644
--- a/Questionable/Controller/GatheringController.cs
+++ b/Questionable/Controller/GatheringController.cs
@@ -49,9 +49,10 @@ internal sealed unsafe class GatheringController : MiniTaskController logger,
ICondition condition,
IServiceProvider serviceProvider,
+ InterruptHandler interruptHandler,
IDataManager dataManager,
IPluginLog pluginLog)
- : base(chatGui, condition, serviceProvider, dataManager, logger)
+ : base(chatGui, condition, serviceProvider, interruptHandler, dataManager, logger)
{
_movementController = movementController;
_gatheringPointRegistry = gatheringPointRegistry;
diff --git a/Questionable/Controller/InterruptHandler.cs b/Questionable/Controller/InterruptHandler.cs
new file mode 100644
index 00000000..49b24abc
--- /dev/null
+++ b/Questionable/Controller/InterruptHandler.cs
@@ -0,0 +1,164 @@
+using System;
+using System.Diagnostics.CodeAnalysis;
+using System.Runtime.InteropServices;
+using Dalamud.Game;
+using Dalamud.Hooking;
+using Dalamud.Plugin.Services;
+using FFXIVClientStructs.FFXIV.Client.Game;
+using FFXIVClientStructs.FFXIV.Client.Game.Character;
+using FFXIVClientStructs.FFXIV.Common.Math;
+using JetBrains.Annotations;
+using Microsoft.Extensions.Logging;
+using Questionable.Data;
+
+namespace Questionable.Controller;
+
+internal sealed unsafe class InterruptHandler : IDisposable
+{
+ private readonly Hook _processActionEffectHook;
+ private readonly IClientState _clientState;
+ private readonly TerritoryData _territoryData;
+ private readonly ILogger _logger;
+
+ private delegate void ProcessActionEffect(uint sourceId, Character* sourceCharacter, Vector3* pos,
+ EffectHeader* effectHeader, EffectEntry* effectArray, ulong* effectTail);
+
+ public InterruptHandler(IGameInteropProvider gameInteropProvider, IClientState clientState,
+ TerritoryData territoryData, ILogger logger)
+ {
+ _clientState = clientState;
+ _territoryData = territoryData;
+ _logger = logger;
+ _processActionEffectHook =
+ gameInteropProvider.HookFromSignature(Signatures.ActionEffect,
+ HandleProcessActionEffect);
+ _processActionEffectHook.Enable();
+ }
+
+ public event EventHandler? Interrupted;
+
+ private void HandleProcessActionEffect(uint sourceId, Character* sourceCharacter, Vector3* pos,
+ EffectHeader* effectHeader, EffectEntry* effectArray, ulong* effectTail)
+ {
+ try
+ {
+ if (!_territoryData.IsDutyInstance(_clientState.TerritoryType))
+ {
+ for (int i = 0; i < effectHeader->TargetCount; i++)
+ {
+ uint targetId = (uint)(effectTail[i] & uint.MaxValue);
+ EffectEntry* effect = effectArray + 8 * i;
+
+ if (targetId == _clientState.LocalPlayer?.GameObjectId &&
+ effect->Type is EActionEffectType.Damage or EActionEffectType.BlockedDamage
+ or EActionEffectType.ParriedDamage)
+ {
+ _logger.LogTrace("Damage action effect on self, from {SourceId} ({EffectType})", sourceId,
+ effect->Type);
+ Interrupted?.Invoke(this, EventArgs.Empty);
+ break;
+ }
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ _logger.LogWarning(e, "Unable to process action effect");
+ }
+ finally
+ {
+ _processActionEffectHook.Original(sourceId, sourceCharacter, pos, effectHeader, effectArray, effectTail);
+ }
+ }
+
+ public void Dispose()
+ {
+ _processActionEffectHook.Disable();
+ _processActionEffectHook.Dispose();
+ }
+
+ private static class Signatures
+ {
+ internal const string ActionEffect = "40 ?? 56 57 41 ?? 41 ?? 41 ?? 48 ?? ?? ?? ?? ?? ?? ?? 48";
+ }
+
+ [StructLayout(LayoutKind.Explicit)]
+ private struct EffectEntry
+ {
+ [FieldOffset(0)] public EActionEffectType Type;
+ [FieldOffset(1)] public byte Param0;
+ [FieldOffset(2)] public byte Param1;
+ [FieldOffset(3)] public byte Param2;
+ [FieldOffset(4)] public byte Mult;
+ [FieldOffset(5)] public byte Flags;
+ [FieldOffset(6)] public ushort Value;
+
+ public byte AttackType => (byte)(Param1 & 0xF);
+
+ public override string ToString()
+ {
+ return
+ $"Type: {Type}, p0: {Param0:D3}, p1: {Param1:D3}, p2: {Param2:D3} 0x{Param2:X2} '{Convert.ToString(Param2, 2).PadLeft(8, '0')}', mult: {Mult:D3}, flags: {Flags:D3} | {Convert.ToString(Flags, 2).PadLeft(8, '0')}, value: {Value:D6} ATTACK TYPE: {AttackType}";
+ }
+ }
+
+ [StructLayout(LayoutKind.Explicit)]
+ private struct EffectHeader
+ {
+ [FieldOffset(0)] public ulong AnimationTargetId;
+ [FieldOffset(8)] public uint ActionID;
+ [FieldOffset(12)] public uint GlobalEffectCounter;
+ [FieldOffset(16)] public float AnimationLockTime;
+ [FieldOffset(20)] public uint SomeTargetID;
+ [FieldOffset(24)] public ushort SourceSequence;
+ [FieldOffset(26)] public ushort Rotation;
+ [FieldOffset(28)] public ushort AnimationId;
+ [FieldOffset(30)] public byte Variation;
+ [FieldOffset(31)] public ActionType ActionType;
+ [FieldOffset(33)] public byte TargetCount;
+ }
+
+ [UsedImplicitly(ImplicitUseTargetFlags.Members)]
+ private enum EActionEffectType : byte
+ {
+ None = 0,
+ Miss = 1,
+ FullResist = 2,
+ Damage = 3,
+ Heal = 4,
+ BlockedDamage = 5,
+ ParriedDamage = 6,
+ Invulnerable = 7,
+ NoEffectText = 8,
+ Unknown0 = 9,
+ MpLoss = 10,
+ MpGain = 11,
+ TpLoss = 12,
+ TpGain = 13,
+ ApplyStatusEffectTarget = 14,
+ ApplyStatusEffectSource = 15,
+ RecoveredFromStatusEffect = 16,
+ LoseStatusEffectTarget = 17,
+ LoseStatusEffectSource = 18,
+ StatusNoEffect = 20,
+ ThreatPosition = 24,
+ EnmityAmountUp = 25,
+ EnmityAmountDown = 26,
+ StartActionCombo = 27,
+ ComboSucceed = 28,
+ Retaliation = 29,
+ Knockback = 32,
+ Attract1 = 33, //Here is an issue bout knockback. some is 32 some is 33.
+ Attract2 = 34,
+ Mount = 40,
+ FullResistStatus = 52,
+ FullResistStatus2 = 55,
+ VFX = 59,
+ Gauge = 60,
+ JobGauge = 61,
+ SetModelState = 72,
+ SetHP = 73,
+ PartialInvulnerable = 74,
+ Interrupt = 75,
+ }
+}
diff --git a/Questionable/Controller/MiniTaskController.cs b/Questionable/Controller/MiniTaskController.cs
index 6055a68c..4099a17d 100644
--- a/Questionable/Controller/MiniTaskController.cs
+++ b/Questionable/Controller/MiniTaskController.cs
@@ -17,26 +17,31 @@ using Mount = Questionable.Controller.Steps.Common.Mount;
namespace Questionable.Controller;
-internal abstract class MiniTaskController
+internal abstract class MiniTaskController : IDisposable
{
protected readonly TaskQueue _taskQueue = new();
private readonly IChatGui _chatGui;
private readonly ICondition _condition;
private readonly IServiceProvider _serviceProvider;
+ private readonly InterruptHandler _interruptHandler;
private readonly ILogger _logger;
private readonly string _actionCanceledText;
+ private readonly string _cantExecuteDueToStatusText;
protected MiniTaskController(IChatGui chatGui, ICondition condition, IServiceProvider serviceProvider,
- IDataManager dataManager, ILogger logger)
+ InterruptHandler interruptHandler, IDataManager dataManager, ILogger logger)
{
_chatGui = chatGui;
_logger = logger;
_serviceProvider = serviceProvider;
+ _interruptHandler = interruptHandler;
_condition = condition;
_actionCanceledText = dataManager.GetString(1314, x => x.Text)!;
+ _cantExecuteDueToStatusText = dataManager.GetString(7728, x => x.Text)!;
+ _interruptHandler.Interrupted += HandleInterruption;
}
protected virtual void UpdateCurrentTask()
@@ -65,7 +70,7 @@ internal abstract class MiniTaskController
{
_logger.LogError(e, "Failed to start task {TaskName}", upcomingTask.ToString());
_chatGui.PrintError(
- $"[Questionable] Failed to start task '{upcomingTask}', please check /xllog for details.");
+ $"Failed to start task '{upcomingTask}', please check /xllog for details.", CommandHandler.MessageTag, CommandHandler.TagColor);
Stop("Task failed to start");
return;
}
@@ -90,7 +95,7 @@ internal abstract class MiniTaskController
_logger.LogError(e, "Failed to update task {TaskName}",
_taskQueue.CurrentTaskExecutor.CurrentTask.ToString());
_chatGui.PrintError(
- $"[Questionable] Failed to update task '{_taskQueue.CurrentTaskExecutor.CurrentTask}', please check /xllog for details.");
+ $"Failed to update task '{_taskQueue.CurrentTaskExecutor.CurrentTask}', please check /xllog for details.", CommandHandler.MessageTag, CommandHandler.TagColor);
Stop("Task failed to update");
return;
}
@@ -180,6 +185,19 @@ internal abstract class MiniTaskController
else
_taskQueue.InterruptWith([new WaitAtEnd.WaitDelay()]);
+ LogTasksAfterInterruption();
+ }
+
+ private void InterruptWithoutCombat()
+ {
+ _logger.LogWarning("Interrupted, attempting to redo previous tasks (not in combat)");
+ _taskQueue.InterruptWith([new WaitAtEnd.WaitDelay()]);
+
+ LogTasksAfterInterruption();
+ }
+
+ private void LogTasksAfterInterruption()
+ {
_logger.LogInformation("Remaining tasks after interruption:");
foreach (ITask task in _taskQueue.RemainingTasks)
_logger.LogInformation("- {TaskName}", task);
@@ -198,8 +216,23 @@ internal abstract class MiniTaskController
if (!isHandled)
{
if (GameFunctions.GameStringEquals(_actionCanceledText, message.TextValue) &&
- !_condition[ConditionFlag.InFlight])
+ !_condition[ConditionFlag.InFlight] &&
+ _taskQueue.CurrentTaskExecutor?.ShouldInterruptOnDamage() == true)
InterruptQueueWithCombat();
+ else if (GameFunctions.GameStringEquals(_cantExecuteDueToStatusText, message.TextValue))
+ InterruptWithoutCombat();
}
}
+
+ protected virtual void HandleInterruption(object? sender, EventArgs e)
+ {
+ if (!_condition[ConditionFlag.InFlight] &&
+ _taskQueue.CurrentTaskExecutor?.ShouldInterruptOnDamage() == true)
+ InterruptQueueWithCombat();
+ }
+
+ public virtual void Dispose()
+ {
+ _interruptHandler.Interrupted -= HandleInterruption;
+ }
}
diff --git a/Questionable/Controller/QuestController.cs b/Questionable/Controller/QuestController.cs
index 9d17fed1..def1c297 100644
--- a/Questionable/Controller/QuestController.cs
+++ b/Questionable/Controller/QuestController.cs
@@ -19,7 +19,7 @@ using Quest = Questionable.Model.Quest;
namespace Questionable.Controller;
-internal sealed class QuestController : MiniTaskController, IDisposable
+internal sealed class QuestController : MiniTaskController
{
private readonly IClientState _clientState;
private readonly GameFunctions _gameFunctions;
@@ -75,8 +75,9 @@ internal sealed class QuestController : MiniTaskController, IDi
YesAlreadyIpc yesAlreadyIpc,
TaskCreator taskCreator,
IServiceProvider serviceProvider,
+ InterruptHandler interruptHandler,
IDataManager dataManager)
- : base(chatGui, condition, serviceProvider, dataManager, logger)
+ : base(chatGui, condition, serviceProvider, interruptHandler, dataManager, logger)
{
_clientState = clientState;
_gameFunctions = gameFunctions;
@@ -110,9 +111,13 @@ internal sealed class QuestController : MiniTaskController, IDi
_logger.LogInformation("Setting automation type to {NewAutomationType} (previous: {OldAutomationType})",
value, _automationType);
_automationType = value;
+ AutomationTypeChanged?.Invoke(this, value);
}
}
+ public delegate void AutomationTypeChangedEventHandler(object sender, EAutomationType e);
+ public event AutomationTypeChangedEventHandler? AutomationTypeChanged;
+
public (QuestProgress Progress, ECurrentQuestType Type)? CurrentQuestDetails
{
get
@@ -622,7 +627,7 @@ internal sealed class QuestController : MiniTaskController, IDi
catch (Exception e)
{
_logger.LogError(e, "Failed to create tasks");
- _chatGui.PrintError("[Questionable] Failed to start next task sequence, please check /xllog for details.");
+ _chatGui.PrintError("Failed to start next task sequence, please check /xllog for details.", CommandHandler.MessageTag, CommandHandler.TagColor);
Stop("Tasks failed to create");
}
}
@@ -801,11 +806,23 @@ internal sealed class QuestController : MiniTaskController, IDi
_gatheringController.OnNormalToast(message);
}
- public void Dispose()
+ protected override void HandleInterruption(object? sender, EventArgs e)
+ {
+ if (!IsRunning)
+ return;
+
+ if (AutomationType == EAutomationType.Manual)
+ return;
+
+ base.HandleInterruption(sender, e);
+ }
+
+ public override void Dispose()
{
_toastGui.ErrorToast -= OnErrorToast;
_toastGui.Toast -= OnNormalToast;
_condition.ConditionChange -= OnConditionChange;
+ base.Dispose();
}
public sealed record StepProgress(
diff --git a/Questionable/Controller/QuestRegistry.cs b/Questionable/Controller/QuestRegistry.cs
index d6641073..7808b095 100644
--- a/Questionable/Controller/QuestRegistry.cs
+++ b/Questionable/Controller/QuestRegistry.cs
@@ -234,7 +234,11 @@ internal sealed class QuestRegistry
public List GetKnownClassJobQuests(EClassJob classJob)
{
- return _questData.GetClassJobQuests(classJob)
+ List allQuests = [.._questData.GetClassJobQuests(classJob)];
+ if (classJob.AsJob() != classJob)
+ allQuests.AddRange(_questData.GetClassJobQuests(classJob.AsJob()));
+
+ return allQuests
.Where(x => IsKnownQuest(x.QuestId))
.ToList();
}
diff --git a/Questionable/Controller/Steps/Common/Mount.cs b/Questionable/Controller/Steps/Common/Mount.cs
index 1e03d8e9..4f35f4d9 100644
--- a/Questionable/Controller/Steps/Common/Mount.cs
+++ b/Questionable/Controller/Steps/Common/Mount.cs
@@ -110,6 +110,8 @@ internal static class Mount
? ETaskResult.TaskComplete
: ETaskResult.StillRunning;
}
+
+ public override bool ShouldInterruptOnDamage() => false;
}
internal enum MountResult
@@ -197,6 +199,8 @@ internal static class Mount
return false;
}
+
+ public override bool ShouldInterruptOnDamage() => false;
}
public enum EMountIf
diff --git a/Questionable/Controller/Steps/Common/NextQuest.cs b/Questionable/Controller/Steps/Common/NextQuest.cs
index 7f4b0261..3ac7758d 100644
--- a/Questionable/Controller/Steps/Common/NextQuest.cs
+++ b/Questionable/Controller/Steps/Common/NextQuest.cs
@@ -61,5 +61,7 @@ internal static class NextQuest
}
public override ETaskResult Update() => ETaskResult.TaskComplete;
+
+ public override bool ShouldInterruptOnDamage() => false;
}
}
diff --git a/Questionable/Controller/Steps/Common/SendNotification.cs b/Questionable/Controller/Steps/Common/SendNotification.cs
index cf116028..6d8bbcec 100644
--- a/Questionable/Controller/Steps/Common/SendNotification.cs
+++ b/Questionable/Controller/Steps/Common/SendNotification.cs
@@ -104,5 +104,7 @@ internal static class SendNotification
}
public override ETaskResult Update() => ETaskResult.TaskComplete;
+
+ public override bool ShouldInterruptOnDamage() => false;
}
}
diff --git a/Questionable/Controller/Steps/Common/WaitConditionTask.cs b/Questionable/Controller/Steps/Common/WaitConditionTask.cs
index 367fdfec..8203c056 100644
--- a/Questionable/Controller/Steps/Common/WaitConditionTask.cs
+++ b/Questionable/Controller/Steps/Common/WaitConditionTask.cs
@@ -25,5 +25,7 @@ internal static class WaitCondition
return DateTime.Now >= _continueAt ? ETaskResult.TaskComplete : ETaskResult.StillRunning;
}
+
+ public override bool ShouldInterruptOnDamage() => false;
}
}
diff --git a/Questionable/Controller/Steps/Gathering/DoGather.cs b/Questionable/Controller/Steps/Gathering/DoGather.cs
index 0f4c8c7f..bf4ab4aa 100644
--- a/Questionable/Controller/Steps/Gathering/DoGather.cs
+++ b/Questionable/Controller/Steps/Gathering/DoGather.cs
@@ -236,6 +236,8 @@ internal static class DoGather
EAction action = PickAction(minerAction, botanistAction);
return ActionManager.Instance()->GetActionStatus(ActionType.Action, (uint)action) == 0;
}
+
+ public override bool ShouldInterruptOnDamage() => false;
}
[SuppressMessage("ReSharper", "NotAccessedPositionalProperty.Local")]
diff --git a/Questionable/Controller/Steps/Gathering/DoGatherCollectable.cs b/Questionable/Controller/Steps/Gathering/DoGatherCollectable.cs
index 2b91f353..fcd5efad 100644
--- a/Questionable/Controller/Steps/Gathering/DoGatherCollectable.cs
+++ b/Questionable/Controller/Steps/Gathering/DoGatherCollectable.cs
@@ -198,6 +198,8 @@ internal static class DoGatherCollectable
else
return botanistAction;
}
+
+ public override bool ShouldInterruptOnDamage() => false;
}
[SuppressMessage("ReSharper", "NotAccessedPositionalProperty.Local")]
diff --git a/Questionable/Controller/Steps/Gathering/MoveToLandingLocation.cs b/Questionable/Controller/Steps/Gathering/MoveToLandingLocation.cs
index 38fa30cd..bc183013 100644
--- a/Questionable/Controller/Steps/Gathering/MoveToLandingLocation.cs
+++ b/Questionable/Controller/Steps/Gathering/MoveToLandingLocation.cs
@@ -59,5 +59,6 @@ internal static class MoveToLandingLocation
public override ETaskResult Update() => moveExecutor.Update();
public bool OnErrorToast(SeString message) => moveExecutor.OnErrorToast(message);
+ public override bool ShouldInterruptOnDamage() => moveExecutor.ShouldInterruptOnDamage();
}
}
diff --git a/Questionable/Controller/Steps/Gathering/TurnInDelivery.cs b/Questionable/Controller/Steps/Gathering/TurnInDelivery.cs
index caf2b0f4..0483605b 100644
--- a/Questionable/Controller/Steps/Gathering/TurnInDelivery.cs
+++ b/Questionable/Controller/Steps/Gathering/TurnInDelivery.cs
@@ -80,5 +80,8 @@ internal static class TurnInDelivery
addon->FireCallback(2, pickGatheringItem);
return ETaskResult.StillRunning;
}
+
+ // not even sure if any turn-in npcs are NEAR mobs; but we also need to be on a gathering/crafting job
+ public override bool ShouldInterruptOnDamage() => false;
}
}
diff --git a/Questionable/Controller/Steps/Interactions/Action.cs b/Questionable/Controller/Steps/Interactions/Action.cs
index 7255fa0b..f7f97502 100644
--- a/Questionable/Controller/Steps/Interactions/Action.cs
+++ b/Questionable/Controller/Steps/Interactions/Action.cs
@@ -124,6 +124,8 @@ internal static class Action
return ETaskResult.TaskComplete;
}
+
+ public override bool ShouldInterruptOnDamage() => false;
}
internal sealed record UseMudraOnObject(uint DataId, EAction Action) : ITask
@@ -187,5 +189,7 @@ internal static class Action
logger.LogError("Unable to find relevant combo for {Action}", Task.Action);
return ETaskResult.TaskComplete;
}
+
+ public override bool ShouldInterruptOnDamage() => false;
}
}
diff --git a/Questionable/Controller/Steps/Interactions/AetherCurrent.cs b/Questionable/Controller/Steps/Interactions/AetherCurrent.cs
index b244bbea..7c1f6338 100644
--- a/Questionable/Controller/Steps/Interactions/AetherCurrent.cs
+++ b/Questionable/Controller/Steps/Interactions/AetherCurrent.cs
@@ -26,7 +26,8 @@ internal static class AetherCurrent
if (!aetherCurrentData.IsValidAetherCurrent(step.TerritoryId, step.AetherCurrentId.Value))
{
chatGui.PrintError(
- $"[Questionable] Aether current with id {step.AetherCurrentId} is referencing an invalid aether current, will skip attunement");
+ $"Aether current with id {step.AetherCurrentId} is referencing an invalid aether current, will skip attunement",
+ CommandHandler.MessageTag, CommandHandler.TagColor);
return null;
}
@@ -65,5 +66,7 @@ internal static class AetherCurrent
gameFunctions.IsAetherCurrentUnlocked(Task.AetherCurrentId)
? ETaskResult.TaskComplete
: ETaskResult.StillRunning;
+
+ public override bool ShouldInterruptOnDamage() => true;
}
}
diff --git a/Questionable/Controller/Steps/Interactions/AethernetShard.cs b/Questionable/Controller/Steps/Interactions/AethernetShard.cs
index b1af7fe9..db2c5212 100644
--- a/Questionable/Controller/Steps/Interactions/AethernetShard.cs
+++ b/Questionable/Controller/Steps/Interactions/AethernetShard.cs
@@ -53,5 +53,7 @@ internal static class AethernetShard
aetheryteFunctions.IsAetheryteUnlocked(Task.AetheryteLocation)
? ETaskResult.TaskComplete
: ETaskResult.StillRunning;
+
+ public override bool ShouldInterruptOnDamage() => true;
}
}
diff --git a/Questionable/Controller/Steps/Interactions/Aetheryte.cs b/Questionable/Controller/Steps/Interactions/Aetheryte.cs
index d9754776..dd40fc69 100644
--- a/Questionable/Controller/Steps/Interactions/Aetheryte.cs
+++ b/Questionable/Controller/Steps/Interactions/Aetheryte.cs
@@ -52,5 +52,7 @@ internal static class Aetheryte
aetheryteFunctions.IsAetheryteUnlocked(Task.AetheryteLocation)
? ETaskResult.TaskComplete
: ETaskResult.StillRunning;
+
+ public override bool ShouldInterruptOnDamage() => true;
}
}
diff --git a/Questionable/Controller/Steps/Interactions/Combat.cs b/Questionable/Controller/Steps/Interactions/Combat.cs
index 463c32ce..e63058a8 100644
--- a/Questionable/Controller/Steps/Interactions/Combat.cs
+++ b/Questionable/Controller/Steps/Interactions/Combat.cs
@@ -190,5 +190,7 @@ internal static class Combat
return ETaskResult.TaskComplete;
}
}
+
+ public override bool ShouldInterruptOnDamage() => false;
}
}
diff --git a/Questionable/Controller/Steps/Interactions/Dive.cs b/Questionable/Controller/Steps/Interactions/Dive.cs
index b5389774..eea9cd87 100644
--- a/Questionable/Controller/Steps/Interactions/Dive.cs
+++ b/Questionable/Controller/Steps/Interactions/Dive.cs
@@ -71,6 +71,8 @@ internal static class Dive
return base.Update();
}
+ public override bool ShouldInterruptOnDamage() => false;
+
protected override ETaskResult UpdateInternal()
{
if (condition[ConditionFlag.Diving])
diff --git a/Questionable/Controller/Steps/Interactions/Duty.cs b/Questionable/Controller/Steps/Interactions/Duty.cs
index 5e20accf..b59f8ce7 100644
--- a/Questionable/Controller/Steps/Interactions/Duty.cs
+++ b/Questionable/Controller/Steps/Interactions/Duty.cs
@@ -93,6 +93,8 @@ internal static class Duty
? ETaskResult.TaskComplete
: ETaskResult.StillRunning;
}
+
+ public override bool ShouldInterruptOnDamage() => false;
}
internal sealed record WaitAutoDutyTask(uint ContentFinderConditionId) : ITask
@@ -117,6 +119,8 @@ internal static class Duty
? ETaskResult.TaskComplete
: ETaskResult.StillRunning;
}
+
+ public override bool ShouldInterruptOnDamage() => false;
}
internal sealed record OpenDutyFinderTask(uint ContentFinderConditionId) : ITask
@@ -138,5 +142,7 @@ internal static class Duty
}
public override ETaskResult Update() => ETaskResult.TaskComplete;
+
+ public override bool ShouldInterruptOnDamage() => false;
}
}
diff --git a/Questionable/Controller/Steps/Interactions/Emote.cs b/Questionable/Controller/Steps/Interactions/Emote.cs
index 085b0356..d6dd7146 100644
--- a/Questionable/Controller/Steps/Interactions/Emote.cs
+++ b/Questionable/Controller/Steps/Interactions/Emote.cs
@@ -51,6 +51,8 @@ internal static class Emote
chatFunctions.UseEmote(Task.DataId, Task.Emote);
return true;
}
+
+ public override bool ShouldInterruptOnDamage() => true;
}
internal sealed record UseOnSelf(EEmote Emote) : ITask
@@ -65,5 +67,7 @@ internal static class Emote
chatFunctions.UseEmote(Task.Emote);
return true;
}
+
+ public override bool ShouldInterruptOnDamage() => true;
}
}
diff --git a/Questionable/Controller/Steps/Interactions/EquipItem.cs b/Questionable/Controller/Steps/Interactions/EquipItem.cs
index f5cd4e11..d761926d 100644
--- a/Questionable/Controller/Steps/Interactions/EquipItem.cs
+++ b/Questionable/Controller/Steps/Interactions/EquipItem.cs
@@ -183,5 +183,7 @@ internal static class EquipItem
return false;
}
+
+ public override bool ShouldInterruptOnDamage() => true;
}
}
diff --git a/Questionable/Controller/Steps/Interactions/EquipRecommended.cs b/Questionable/Controller/Steps/Interactions/EquipRecommended.cs
index 3b2be0f1..a71cc3b0 100644
--- a/Questionable/Controller/Steps/Interactions/EquipRecommended.cs
+++ b/Questionable/Controller/Steps/Interactions/EquipRecommended.cs
@@ -40,9 +40,11 @@ internal static class EquipRecommended
public override string ToString() => "EquipRecommended";
}
- internal sealed unsafe class DoEquipRecommended(IClientState clientState, IChatGui chatGui, ICondition condition) : TaskExecutor
+ internal sealed unsafe class DoEquipRecommended(IClientState clientState, IChatGui chatGui, ICondition condition)
+ : TaskExecutor
{
- private bool _equipped;
+ private bool _checkedOrTriggeredEquipmentUpdate;
+ private DateTime _continueAt = DateTime.MinValue;
protected override bool Start()
{
@@ -59,44 +61,53 @@ internal static class EquipRecommended
if (recommendedEquipModule->IsUpdating)
return ETaskResult.StillRunning;
- if (!_equipped)
+ if (!_checkedOrTriggeredEquipmentUpdate)
{
- InventoryManager* inventoryManager = InventoryManager.Instance();
- InventoryContainer* equippedItems =
- inventoryManager->GetInventoryContainer(InventoryType.EquippedItems);
- bool isAllEquipped = true;
- foreach (var recommendedItemPtr in recommendedEquipModule->RecommendedItems)
+ if (!IsAllRecommendeGearEquipped())
{
- var recommendedItem = recommendedItemPtr.Value;
- if (recommendedItem == null || recommendedItem->ItemId == 0)
- continue;
-
- bool isEquipped = false;
- for (int i = 0; i < equippedItems->Size; ++i)
- {
- var equippedItem = equippedItems->Items[i];
- if (equippedItem.ItemId != 0 && equippedItem.ItemId == recommendedItem->ItemId)
- {
- isEquipped = true;
- break;
- }
- }
-
- if (!isEquipped)
- isAllEquipped = false;
- }
-
- if (!isAllEquipped)
- {
- chatGui.Print("Equipping recommended gear.", "Questionable");
+ chatGui.Print("Equipping recommended gear.", CommandHandler.MessageTag, CommandHandler.TagColor);
recommendedEquipModule->EquipRecommendedGear();
+ _continueAt = DateTime.Now.AddSeconds(1);
}
- _equipped = true;
+ _checkedOrTriggeredEquipmentUpdate = true;
return ETaskResult.StillRunning;
}
- return ETaskResult.TaskComplete;
+ return DateTime.Now >= _continueAt ? ETaskResult.TaskComplete : ETaskResult.StillRunning;
}
+
+ private bool IsAllRecommendeGearEquipped()
+ {
+ var recommendedEquipModule = RecommendEquipModule.Instance();
+ InventoryManager* inventoryManager = InventoryManager.Instance();
+ InventoryContainer* equippedItems =
+ inventoryManager->GetInventoryContainer(InventoryType.EquippedItems);
+ bool isAllEquipped = true;
+ foreach (var recommendedItemPtr in recommendedEquipModule->RecommendedItems)
+ {
+ var recommendedItem = recommendedItemPtr.Value;
+ if (recommendedItem == null || recommendedItem->ItemId == 0)
+ continue;
+
+ bool isEquipped = false;
+ for (int i = 0; i < equippedItems->Size; ++i)
+ {
+ var equippedItem = equippedItems->Items[i];
+ if (equippedItem.ItemId != 0 && equippedItem.ItemId == recommendedItem->ItemId)
+ {
+ isEquipped = true;
+ break;
+ }
+ }
+
+ if (!isEquipped)
+ isAllEquipped = false;
+ }
+
+ return isAllEquipped;
+ }
+
+ public override bool ShouldInterruptOnDamage() => true;
}
}
diff --git a/Questionable/Controller/Steps/Interactions/Interact.cs b/Questionable/Controller/Steps/Interactions/Interact.cs
index 0ca70c11..0073349b 100644
--- a/Questionable/Controller/Steps/Interactions/Interact.cs
+++ b/Questionable/Controller/Steps/Interactions/Interact.cs
@@ -228,6 +228,8 @@ internal static class Interact
}
}
+ public override bool ShouldInterruptOnDamage() => true;
+
private enum EInteractionState
{
None,
diff --git a/Questionable/Controller/Steps/Interactions/Jump.cs b/Questionable/Controller/Steps/Interactions/Jump.cs
index f7b9892d..3238405c 100644
--- a/Questionable/Controller/Steps/Interactions/Jump.cs
+++ b/Questionable/Controller/Steps/Interactions/Jump.cs
@@ -80,6 +80,8 @@ internal static class Jump
return ETaskResult.TaskComplete;
}
+
+ public override bool ShouldInterruptOnDamage() => true;
}
internal sealed class DoSingleJump(
diff --git a/Questionable/Controller/Steps/Interactions/Say.cs b/Questionable/Controller/Steps/Interactions/Say.cs
index f13ab4ab..ffb56215 100644
--- a/Questionable/Controller/Steps/Interactions/Say.cs
+++ b/Questionable/Controller/Steps/Interactions/Say.cs
@@ -48,5 +48,7 @@ internal static class Say
chatFunctions.ExecuteCommand($"/say {Task.ChatMessage}");
return true;
}
+
+ public override bool ShouldInterruptOnDamage() => true;
}
}
diff --git a/Questionable/Controller/Steps/Interactions/StatusOff.cs b/Questionable/Controller/Steps/Interactions/StatusOff.cs
index 746f7394..c9b2b4ca 100644
--- a/Questionable/Controller/Steps/Interactions/StatusOff.cs
+++ b/Questionable/Controller/Steps/Interactions/StatusOff.cs
@@ -43,5 +43,7 @@ internal static class StatusOff
{
return gameFunctions.HasStatus(Task.Status) ? ETaskResult.StillRunning : ETaskResult.TaskComplete;
}
+
+ public override bool ShouldInterruptOnDamage() => false;
}
}
diff --git a/Questionable/Controller/Steps/Interactions/UseItem.cs b/Questionable/Controller/Steps/Interactions/UseItem.cs
index bf779a02..abc427ad 100644
--- a/Questionable/Controller/Steps/Interactions/UseItem.cs
+++ b/Questionable/Controller/Steps/Interactions/UseItem.cs
@@ -205,6 +205,8 @@ internal static class UseItem
else
return TimeSpan.FromSeconds(5);
}
+
+ public override bool ShouldInterruptOnDamage() => true;
}
internal sealed record UseOnGround(
diff --git a/Questionable/Controller/Steps/Leves/InitiateLeve.cs b/Questionable/Controller/Steps/Leves/InitiateLeve.cs
index ab584cef..31cf4705 100644
--- a/Questionable/Controller/Steps/Leves/InitiateLeve.cs
+++ b/Questionable/Controller/Steps/Leves/InitiateLeve.cs
@@ -50,6 +50,8 @@ internal static class InitiateLeve
return ETaskResult.TaskComplete;
}
+
+ public override bool ShouldInterruptOnDamage() => false;
}
internal sealed record OpenJournal(ElementId ElementId) : ITask
@@ -85,6 +87,8 @@ internal static class InitiateLeve
return ETaskResult.StillRunning;
}
+
+ public override bool ShouldInterruptOnDamage() => false;
}
internal sealed record Initiate(ElementId ElementId) : ITask
@@ -111,6 +115,8 @@ internal static class InitiateLeve
return ETaskResult.StillRunning;
}
+
+ public override bool ShouldInterruptOnDamage() => false;
}
internal sealed class SelectDifficulty : ITask
@@ -138,5 +144,7 @@ internal static class InitiateLeve
return ETaskResult.StillRunning;
}
+
+ public override bool ShouldInterruptOnDamage() => false;
}
}
diff --git a/Questionable/Controller/Steps/Shared/AethernetShortcut.cs b/Questionable/Controller/Steps/Shared/AethernetShortcut.cs
index e63b69c0..460aa440 100644
--- a/Questionable/Controller/Steps/Shared/AethernetShortcut.cs
+++ b/Questionable/Controller/Steps/Shared/AethernetShortcut.cs
@@ -269,5 +269,7 @@ internal static class AethernetShortcut
return ETaskResult.TaskComplete;
}
+
+ public override bool ShouldInterruptOnDamage() => true;
}
}
diff --git a/Questionable/Controller/Steps/Shared/AetheryteShortcut.cs b/Questionable/Controller/Steps/Shared/AetheryteShortcut.cs
index af575333..4a56e929 100644
--- a/Questionable/Controller/Steps/Shared/AetheryteShortcut.cs
+++ b/Questionable/Controller/Steps/Shared/AetheryteShortcut.cs
@@ -201,7 +201,7 @@ internal static class AetheryteShortcut
if (!aetheryteFunctions.IsAetheryteUnlocked(Task.TargetAetheryte))
{
- chatGui.PrintError($"[Questionable] Aetheryte {Task.TargetAetheryte} is not unlocked.");
+ chatGui.PrintError($"Aetheryte {Task.TargetAetheryte} is not unlocked.", CommandHandler.MessageTag, CommandHandler.TagColor);
throw new TaskException("Aetheryte is not unlocked");
}
@@ -215,12 +215,14 @@ internal static class AetheryteShortcut
}
else
{
- chatGui.Print("[Questionable] Unable to teleport to aetheryte.");
+ chatGui.Print("Unable to teleport to aetheryte.", CommandHandler.MessageTag, CommandHandler.TagColor);
throw new TaskException("Unable to teleport to aetheryte");
}
}
public override bool WasInterrupted() => condition[ConditionFlag.InCombat] || base.WasInterrupted();
+
+ public override bool ShouldInterruptOnDamage() => true;
}
internal sealed record MoveAwayFromAetheryte(EAetheryteLocation TargetAetheryte) : ITask
@@ -264,5 +266,7 @@ internal static class AetheryteShortcut
}
public override ETaskResult Update() => moveExecutor.Update();
+
+ public override bool ShouldInterruptOnDamage() => true;
}
}
diff --git a/Questionable/Controller/Steps/Shared/Craft.cs b/Questionable/Controller/Steps/Shared/Craft.cs
index 26493ca0..d986368f 100644
--- a/Questionable/Controller/Steps/Shared/Craft.cs
+++ b/Questionable/Controller/Steps/Shared/Craft.cs
@@ -133,5 +133,8 @@ internal static class Craft
return inventoryManager->GetInventoryItemCount(Task.ItemId, isHq: false, checkEquipped: false)
+ inventoryManager->GetInventoryItemCount(Task.ItemId, isHq: true, checkEquipped: false);
}
+
+ // we're on a crafting class, so combat doesn't make much sense (we also can't change classes in combat...)
+ public override bool ShouldInterruptOnDamage() => false;
}
}
diff --git a/Questionable/Controller/Steps/Shared/Gather.cs b/Questionable/Controller/Steps/Shared/Gather.cs
index 73dd8d12..f4aad9c9 100644
--- a/Questionable/Controller/Steps/Shared/Gather.cs
+++ b/Questionable/Controller/Steps/Shared/Gather.cs
@@ -100,6 +100,8 @@ internal static class Gather
minCollectability: (short)itemToGather.Collectability) >=
itemToGather.ItemCount;
}
+
+ public override bool ShouldInterruptOnDamage() => false;
}
internal sealed record GatheringTask(
@@ -140,6 +142,9 @@ internal static class Gather
gatheringController.OnErrorToast(ref message, ref isHandled);
return isHandled;
}
+
+ // we're on a gathering class, so combat doesn't make much sense (we also can't change classes in combat...)
+ public override bool ShouldInterruptOnDamage() => false;
}
///
@@ -154,5 +159,7 @@ internal static class Gather
{
protected override bool Start() => true;
public override ETaskResult Update() => ETaskResult.TaskComplete;
+
+ public override bool ShouldInterruptOnDamage() => false;
}
}
diff --git a/Questionable/Controller/Steps/Shared/MoveTo.cs b/Questionable/Controller/Steps/Shared/MoveTo.cs
index 4df2870f..60d83aed 100644
--- a/Questionable/Controller/Steps/Shared/MoveTo.cs
+++ b/Questionable/Controller/Steps/Shared/MoveTo.cs
@@ -228,6 +228,17 @@ internal static class MoveTo
}
}
}
+ else if (!ShouldResolveCombatBeforeNextInteraction() &&
+ _movementController is { IsPathfinding: false, IsPathRunning: false } &&
+ mountExecutor.EvaluateMountState() == Mount.MountResult.DontMount)
+ {
+ // except for e.g. jumping which would maybe break if combat navigates us away, if we don't
+ // need a mount anymore we can just skip combat and assume that the interruption is handled
+ // later.
+ //
+ // without this, the character would just stand around while getting hit
+ _nestedExecutor = (new NoOpTaskExecutor(), new NoOpTask(), true);
+ }
}
else if (nestedExecutor.Executor.Update() == ETaskResult.TaskComplete)
{
@@ -286,6 +297,17 @@ internal static class MoveTo
return base.WasInterrupted();
}
+ public override bool ShouldInterruptOnDamage()
+ {
+ // have we stopped moving, and are we
+ // (a) waiting for a mount to complete, or
+ // (b) want combat to be done before any other interaction?
+ return _movementController is { IsPathfinding: false, IsPathRunning: false } &&
+ (_nestedExecutor is { Triggered: false, Executor: Mount.MountExecutor } || ShouldResolveCombatBeforeNextInteraction());
+ }
+
+ private bool ShouldResolveCombatBeforeNextInteraction() => Task.InteractionType is EInteractionType.Jump;
+
public bool OnErrorToast(SeString message)
{
if (GameFunctions.GameStringEquals(_cannotExecuteAtThisTime, message.TextValue))
@@ -302,6 +324,8 @@ internal static class MoveTo
protected override bool Start() => true;
public override ETaskResult Update() => ETaskResult.TaskComplete;
+
+ public override bool ShouldInterruptOnDamage() => false;
}
internal sealed record MoveTask(
@@ -361,6 +385,8 @@ internal static class MoveTo
return ETaskResult.TaskComplete;
}
+
+ public override bool ShouldInterruptOnDamage() => false;
}
internal sealed class LandTask : ITask
@@ -421,5 +447,7 @@ internal static class MoveTo
return false;
}
+
+ public override bool ShouldInterruptOnDamage() => false;
}
}
diff --git a/Questionable/Controller/Steps/Shared/RedeemRewardItems.cs b/Questionable/Controller/Steps/Shared/RedeemRewardItems.cs
index 408b92f7..c7abcae7 100644
--- a/Questionable/Controller/Steps/Shared/RedeemRewardItems.cs
+++ b/Questionable/Controller/Steps/Shared/RedeemRewardItems.cs
@@ -74,5 +74,7 @@ internal static class RedeemRewardItems
return DateTime.Now <= _continueAt ? ETaskResult.StillRunning : ETaskResult.TaskComplete;
}
+
+ public override bool ShouldInterruptOnDamage() => true;
}
}
diff --git a/Questionable/Controller/Steps/Shared/SkipCondition.cs b/Questionable/Controller/Steps/Shared/SkipCondition.cs
index 5abab059..bd953539 100644
--- a/Questionable/Controller/Steps/Shared/SkipCondition.cs
+++ b/Questionable/Controller/Steps/Shared/SkipCondition.cs
@@ -307,6 +307,7 @@ internal static class SkipCondition
return condition switch
{
EExtraSkipCondition.WakingSandsMainArea => territoryType == 212 && position.X < 24,
+ EExtraSkipCondition.WakingSandsSolar => territoryType == 212 && position.X >= 24,
EExtraSkipCondition.RisingStonesSolar => territoryType == 351 && position.Z <= -28,
EExtraSkipCondition.RoguesGuild => territoryType == 129 && position.Y <= -115,
EExtraSkipCondition.DockStorehouse => territoryType == 137 && position.Y <= -20,
@@ -315,5 +316,7 @@ internal static class SkipCondition
}
public override ETaskResult Update() => ETaskResult.SkipRemainingTasksForStep;
+
+ public override bool ShouldInterruptOnDamage() => false;
}
}
diff --git a/Questionable/Controller/Steps/Shared/StepDisabled.cs b/Questionable/Controller/Steps/Shared/StepDisabled.cs
index f7065359..de58cac3 100644
--- a/Questionable/Controller/Steps/Shared/StepDisabled.cs
+++ b/Questionable/Controller/Steps/Shared/StepDisabled.cs
@@ -31,5 +31,7 @@ internal static class StepDisabled
logger.LogInformation("Skipping step, as it is disabled");
return ETaskResult.SkipRemainingTasksForStep;
}
+
+ public override bool ShouldInterruptOnDamage() => false;
}
}
diff --git a/Questionable/Controller/Steps/Shared/SwitchClassJob.cs b/Questionable/Controller/Steps/Shared/SwitchClassJob.cs
index 59477fec..18bfef7e 100644
--- a/Questionable/Controller/Steps/Shared/SwitchClassJob.cs
+++ b/Questionable/Controller/Steps/Shared/SwitchClassJob.cs
@@ -52,5 +52,8 @@ internal static class SwitchClassJob
}
protected override ETaskResult UpdateInternal() => ETaskResult.TaskComplete;
+
+ // can we even take damage while switching jobs? we should be out of combat...
+ public override bool ShouldInterruptOnDamage() => false;
}
}
diff --git a/Questionable/Controller/Steps/Shared/WaitAtEnd.cs b/Questionable/Controller/Steps/Shared/WaitAtEnd.cs
index 0b3a02ba..d39c7c2a 100644
--- a/Questionable/Controller/Steps/Shared/WaitAtEnd.cs
+++ b/Questionable/Controller/Steps/Shared/WaitAtEnd.cs
@@ -157,6 +157,8 @@ internal static class WaitAtEnd
Delay = Task.Delay;
return true;
}
+
+ public override bool ShouldInterruptOnDamage() => false;
}
internal sealed class WaitNextStepOrSequence : ITask
@@ -169,6 +171,8 @@ internal static class WaitAtEnd
protected override bool Start() => true;
public override ETaskResult Update() => ETaskResult.StillRunning;
+
+ public override bool ShouldInterruptOnDamage() => false;
}
internal sealed record WaitForCompletionFlags(QuestId Quest, QuestStep Step) : ITask
@@ -190,6 +194,8 @@ internal static class WaitAtEnd
? ETaskResult.TaskComplete
: ETaskResult.StillRunning;
}
+
+ public override bool ShouldInterruptOnDamage() => false;
}
internal sealed record WaitObjectAtPosition(
@@ -209,6 +215,8 @@ internal static class WaitAtEnd
gameFunctions.IsObjectAtPosition(Task.DataId, Task.Destination, Task.Distance)
? ETaskResult.TaskComplete
: ETaskResult.StillRunning;
+
+ public override bool ShouldInterruptOnDamage() => false;
}
internal sealed record WaitQuestAccepted(ElementId ElementId) : ITask
@@ -226,6 +234,8 @@ internal static class WaitAtEnd
? ETaskResult.TaskComplete
: ETaskResult.StillRunning;
}
+
+ public override bool ShouldInterruptOnDamage() => false;
}
internal sealed record WaitQuestCompleted(ElementId ElementId) : ITask
@@ -241,6 +251,8 @@ internal static class WaitAtEnd
{
return questFunctions.IsQuestComplete(Task.ElementId) ? ETaskResult.TaskComplete : ETaskResult.StillRunning;
}
+
+ public override bool ShouldInterruptOnDamage() => false;
}
internal sealed record NextStep(ElementId ElementId, int Sequence) : ILastTask
@@ -253,6 +265,8 @@ internal static class WaitAtEnd
protected override bool Start() => true;
public override ETaskResult Update() => ETaskResult.NextStep;
+
+ public override bool ShouldInterruptOnDamage() => false;
}
internal sealed class EndAutomation : ILastTask
@@ -268,5 +282,7 @@ internal static class WaitAtEnd
protected override bool Start() => true;
public override ETaskResult Update() => ETaskResult.End;
+
+ public override bool ShouldInterruptOnDamage() => false;
}
}
diff --git a/Questionable/Controller/Steps/Shared/WaitAtStart.cs b/Questionable/Controller/Steps/Shared/WaitAtStart.cs
index c2c304b4..8386e636 100644
--- a/Questionable/Controller/Steps/Shared/WaitAtStart.cs
+++ b/Questionable/Controller/Steps/Shared/WaitAtStart.cs
@@ -31,6 +31,7 @@ internal static class WaitAtStart
Delay = Task.Delay;
return true;
}
- }
+ public override bool ShouldInterruptOnDamage() => false;
+ }
}
diff --git a/Questionable/Controller/Steps/TaskExecutor.cs b/Questionable/Controller/Steps/TaskExecutor.cs
index d0315dbc..30e10b64 100644
--- a/Questionable/Controller/Steps/TaskExecutor.cs
+++ b/Questionable/Controller/Steps/TaskExecutor.cs
@@ -13,6 +13,8 @@ internal interface ITaskExecutor
bool Start(ITask task);
+ bool ShouldInterruptOnDamage();
+
bool WasInterrupted();
ETaskResult Update();
@@ -56,4 +58,6 @@ internal abstract class TaskExecutor : ITaskExecutor
}
public abstract ETaskResult Update();
+
+ public abstract bool ShouldInterruptOnDamage();
}
diff --git a/Questionable/Data/QuestData.cs b/Questionable/Data/QuestData.cs
index 65225863..f84edb95 100644
--- a/Questionable/Data/QuestData.cs
+++ b/Questionable/Data/QuestData.cs
@@ -189,6 +189,12 @@ internal sealed class QuestData
AddPreviousQuest(new QuestId(3833), new QuestId(spearfishing));
*/
+ // Shadow Walk with Me
+ AddPreviousQuest(new QuestId(3629), new QuestId(3248));
+ AddPreviousQuest(new QuestId(3629), new QuestId(3272));
+ AddPreviousQuest(new QuestId(3629), new QuestId(3278));
+ AddPreviousQuest(new QuestId(3629), new QuestId(3628));
+
// The Hero's Journey
AddPreviousQuest(new QuestId(3986), new QuestId(2115));
AddPreviousQuest(new QuestId(3986), new QuestId(2116));
@@ -197,6 +203,11 @@ internal sealed class QuestData
AddPreviousQuest(new QuestId(3986), new QuestId(2395));
AddPreviousQuest(new QuestId(3986), new QuestId(3985));
+ // Picking up the Torch has half the quests in the sheets(??)
+ AddPreviousQuest(new QuestId(5188), new QuestId(4841));
+ AddPreviousQuest(new QuestId(5188), new QuestId(4847));
+ AddPreviousQuest(new QuestId(5188), new QuestId(4959));
+
// initial city quests are side quests
// unclear if 470 can be started as the required quest isn't available anymore
ushort[] limsaSideQuests =
diff --git a/Questionable/QuestionablePlugin.cs b/Questionable/QuestionablePlugin.cs
index a4b5bae9..e0794c2d 100644
--- a/Questionable/QuestionablePlugin.cs
+++ b/Questionable/QuestionablePlugin.cs
@@ -247,6 +247,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin
serviceCollection.AddSingleton();
serviceCollection.AddSingleton();
serviceCollection.AddSingleton();
+ serviceCollection.AddSingleton();
serviceCollection.AddSingleton();
serviceCollection.AddSingleton();