1
0
forked from liza/Questionable

Minor cleanup for HW part 2

This commit is contained in:
Liza 2024-07-28 21:03:44 +02:00
parent bfc107dc6d
commit fd62d925e4
Signed by: liza
GPG Key ID: 7199F8D727D55F67
67 changed files with 850 additions and 111 deletions

View File

@ -270,6 +270,10 @@ public static class RoslynShortcuts
skipStepConditions.NotInTerritory).AsSyntaxNodeOrToken(), skipStepConditions.NotInTerritory).AsSyntaxNodeOrToken(),
Assignment(nameof(SkipStepConditions.Item), skipStepConditions.Item, emptyStep.Item) Assignment(nameof(SkipStepConditions.Item), skipStepConditions.Item, emptyStep.Item)
.AsSyntaxNodeOrToken(), .AsSyntaxNodeOrToken(),
AssignmentList(nameof(SkipStepConditions.QuestsAccepted),
skipStepConditions.QuestsAccepted).AsSyntaxNodeOrToken(),
AssignmentList(nameof(SkipStepConditions.QuestsCompleted),
skipStepConditions.QuestsCompleted).AsSyntaxNodeOrToken(),
Assignment(nameof(SkipStepConditions.ExtraCondition), Assignment(nameof(SkipStepConditions.ExtraCondition),
skipStepConditions.ExtraCondition, emptyStep.ExtraCondition) skipStepConditions.ExtraCondition, emptyStep.ExtraCondition)
.AsSyntaxNodeOrToken())))); .AsSyntaxNodeOrToken()))));

View File

@ -20,6 +20,58 @@
{ {
"Sequence": 1, "Sequence": 1,
"Steps": [ "Steps": [
{
"Position": {
"X": -526.363,
"Y": 50.165375,
"Z": 407.25165
},
"TerritoryId": 400,
"InteractionType": "WalkTo",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
-64
]
},
{
"Position": {
"X": -533.25507,
"Y": 53.07081,
"Z": 414.5445
},
"TerritoryId": 400,
"InteractionType": "WalkTo",
"DisableNavmesh": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
-64
]
},
{
"Position": {
"X": -515.5652,
"Y": 57.261906,
"Z": 444.5247
},
"TerritoryId": 400,
"InteractionType": "WalkTo",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
-64
]
},
{ {
"DataId": 1013424, "DataId": 1013424,
"Position": { "Position": {
@ -29,7 +81,15 @@
}, },
"TerritoryId": 400, "TerritoryId": 400,
"InteractionType": "Interact", "InteractionType": "Interact",
"$": "0 0 0 0 0 0 -> 17 0 0 0 0 64" "$": "0 0 0 0 0 0 -> 17 0 0 0 0 64",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
}, },
{ {
"DataId": 1013425, "DataId": 1013425,
@ -40,7 +100,58 @@
}, },
"TerritoryId": 400, "TerritoryId": 400,
"InteractionType": "Interact", "InteractionType": "Interact",
"$": "17 0 0 0 0 64 -> 33 16 0 0 0 96" "$": "17 0 0 0 0 64 -> 33 16 0 0 0 96",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
},
{
"Position": {
"X": -456.7709,
"Y": 43.310535,
"Z": 387.23517
},
"TerritoryId": 400,
"InteractionType": "WalkTo",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
-128
]
},
{
"Position": {
"X": -445.09866,
"Y": 51.348675,
"Z": 390.17886
},
"StopDistance": 0.25,
"TerritoryId": 400,
"InteractionType": "Jump",
"DisableNavmesh": true,
"JumpDestination": {
"Position": {
"X": -441.6318,
"Y": 53.80215,
"Z": 380.9018
}
},
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
-128
]
}, },
{ {
"DataId": 1013421, "DataId": 1013421,
@ -50,7 +161,15 @@
"Z": 379.3545 "Z": 379.3545
}, },
"TerritoryId": 400, "TerritoryId": 400,
"InteractionType": "Interact" "InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
} }
] ]
}, },
@ -65,7 +184,8 @@
"Z": 347.0968 "Z": 347.0968
}, },
"TerritoryId": 400, "TerritoryId": 400,
"InteractionType": "CompleteQuest" "InteractionType": "CompleteQuest",
"DisableNavmesh": true
} }
] ]
} }

View File

@ -39,7 +39,15 @@
}, },
"TerritoryId": 399, "TerritoryId": 399,
"InteractionType": "Interact", "InteractionType": "Interact",
"$": "0 0 0 0 0 0 -> 16 16 16 0 0 64" "$": "0 0 0 0 0 0 -> 16 16 16 0 0 64",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
}, },
{ {
"DataId": 2005879, "DataId": 2005879,
@ -50,7 +58,15 @@
}, },
"TerritoryId": 399, "TerritoryId": 399,
"InteractionType": "Interact", "InteractionType": "Interact",
"$": "16 16 16 0 0 64 -> 32 17 32 0 0 96" "$": "16 16 16 0 0 64 -> 32 17 32 0 0 96",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
}, },
{ {
"DataId": 2005877, "DataId": 2005877,
@ -60,7 +76,15 @@
"Z": 34.74475 "Z": 34.74475
}, },
"TerritoryId": 399, "TerritoryId": 399,
"InteractionType": "Interact" "InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
} }
] ]
}, },

View File

@ -52,17 +52,27 @@
"Z": 82.59637 "Z": 82.59637
}, },
"TerritoryId": 399, "TerritoryId": 399,
"InteractionType": "Combat", "InteractionType": "WalkTo"
"EnemySpawnType": "AutoOnEnterArea",
"KillEnemyDataIds": [
5042
]
} }
] ]
}, },
{ {
"Sequence": 3, "Sequence": 3,
"Steps": [ "Steps": [
{
"Position": {
"X": -403.42465,
"Y": 154.8542,
"Z": 82.59637
},
"TerritoryId": 399,
"InteractionType": "Combat",
"EnemySpawnType": "AutoOnEnterArea",
"KillEnemyDataIds": [
5042
],
"CombatDelaySecondsAtStart": 1
},
{ {
"DataId": 2005885, "DataId": 2005885,
"Position": { "Position": {

View File

@ -29,7 +29,14 @@
}, },
"TerritoryId": 463, "TerritoryId": 463,
"InteractionType": "Interact", "InteractionType": "Interact",
"TargetTerritoryId": 399 "TargetTerritoryId": 399,
"SkipConditions": {
"StepIf": {
"NotInTerritory": [
463
]
}
}
}, },
{ {
"DataId": 2006061, "DataId": 2006061,
@ -44,7 +51,15 @@
"KillEnemyDataIds": [ "KillEnemyDataIds": [
44 44
], ],
"$": "0 0 0 0 0 0 -> 16 1 0 0 0 128" "$": "0 0 0 0 0 0 -> 16 1 0 0 0 128",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
}, },
{ {
"DataId": 2006062, "DataId": 2006062,
@ -59,7 +74,15 @@
"KillEnemyDataIds": [ "KillEnemyDataIds": [
44 44
], ],
"$": "16 1 0 0 0 128 -> 33 1 0 0 0 192" "$": "16 1 0 0 0 128 -> 33 1 0 0 0 192",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
}, },
{ {
"DataId": 2006063, "DataId": 2006063,
@ -73,6 +96,14 @@
"EnemySpawnType": "AfterInteraction", "EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [ "KillEnemyDataIds": [
44 44
],
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
] ]
} }
] ]

View File

@ -29,7 +29,15 @@
}, },
"TerritoryId": 401, "TerritoryId": 401,
"InteractionType": "Interact", "InteractionType": "Interact",
"$": "0 0 0 0 0 0 -> 16 1 16 0 0 128" "$": "0 0 0 0 0 0 -> 16 1 16 0 0 128",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
}, },
{ {
"DataId": 2005826, "DataId": 2005826,
@ -40,7 +48,15 @@
}, },
"TerritoryId": 401, "TerritoryId": 401,
"InteractionType": "Interact", "InteractionType": "Interact",
"$": "16 1 16 0 0 128 -> 32 17 32 0 0 160" "$": "16 1 16 0 0 128 -> 32 17 32 0 0 160",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
}, },
{ {
"DataId": 2005825, "DataId": 2005825,
@ -50,7 +66,15 @@
"Z": -564.3549 "Z": -564.3549
}, },
"TerritoryId": 401, "TerritoryId": 401,
"InteractionType": "Interact" "InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
} }
] ]
}, },

View File

@ -29,7 +29,15 @@
}, },
"TerritoryId": 401, "TerritoryId": 401,
"InteractionType": "Interact", "InteractionType": "Interact",
"$": "0 0 0 0 0 0 -> 16 16 0 0 0 64" "$": "0 0 0 0 0 0 -> 16 16 0 0 0 64",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
}, },
{ {
"DataId": 1012071, "DataId": 1012071,
@ -40,7 +48,15 @@
}, },
"TerritoryId": 401, "TerritoryId": 401,
"InteractionType": "Interact", "InteractionType": "Interact",
"$": "16 16 0 0 0 64 -> 32 17 0 0 0 96" "$": "16 16 0 0 0 64 -> 32 17 0 0 0 96",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
}, },
{ {
"DataId": 1012069, "DataId": 1012069,
@ -50,7 +66,15 @@
"Z": -417.74628 "Z": -417.74628
}, },
"TerritoryId": 401, "TerritoryId": 401,
"InteractionType": "Interact" "InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
} }
] ]
}, },

View File

@ -19,7 +19,8 @@
"AetheryteShortcutIf": { "AetheryteShortcutIf": {
"InSameTerritory": true "InSameTerritory": true
} }
} },
"Fly": true
} }
] ]
}, },

View File

@ -26,6 +26,17 @@
{ {
"Sequence": 1, "Sequence": 1,
"Steps": [ "Steps": [
{
"Position": {
"X": 465.77087,
"Y": 367.76678,
"Z": -658.1668
},
"TerritoryId": 155,
"InteractionType": "WalkTo",
"Fly": true,
"AetheryteShortcut": "Coerthas Central Highlands - Camp Dragonhead"
},
{ {
"DataId": 1014199, "DataId": 1014199,
"Position": { "Position": {
@ -35,8 +46,7 @@
}, },
"TerritoryId": 155, "TerritoryId": 155,
"InteractionType": "SinglePlayerDuty", "InteractionType": "SinglePlayerDuty",
"Fly": true, "Fly": true
"AetheryteShortcut": "Coerthas Central Highlands - Camp Dragonhead"
} }
] ]
}, },

View File

@ -26,6 +26,34 @@
{ {
"Sequence": 1, "Sequence": 1,
"Steps": [ "Steps": [
{
"DataId": 1011920,
"Position": {
"X": 519.8595,
"Y": -51.071976,
"Z": 88.24292
},
"TerritoryId": 398,
"InteractionType": "Interact",
"AetheryteShortcut": "The Dravanian Forelands - Tailfeather",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"Position": {
"X": 502.8876,
"Y": -48.989826,
"Z": 34.93356
},
"TerritoryId": 398,
"InteractionType": "WalkTo"
},
{ {
"DataId": 1011919, "DataId": 1011919,
"Position": { "Position": {
@ -35,7 +63,15 @@
}, },
"TerritoryId": 398, "TerritoryId": 398,
"InteractionType": "Interact", "InteractionType": "Interact",
"$": "0 0 0 0 0 0 -> 1 0 0 0 0 128" "$": "0 0 0 0 0 0 -> 1 0 0 0 0 128",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
}, },
{ {
"DataId": 1011921, "DataId": 1011921,
@ -46,17 +82,15 @@
}, },
"TerritoryId": 398, "TerritoryId": 398,
"InteractionType": "Interact", "InteractionType": "Interact",
"$": "1 0 0 0 0 128 -> 2 0 0 0 0 160" "$": "1 0 0 0 0 128 -> 2 0 0 0 0 160",
}, "CompletionQuestVariablesFlags": [
{ null,
"DataId": 1011920, null,
"Position": { null,
"X": 519.8595, null,
"Y": -51.071976, null,
"Z": 88.24292 32
}, ]
"TerritoryId": 398,
"InteractionType": "Interact"
} }
] ]
}, },

View File

@ -78,7 +78,8 @@
"TerritoryId": 138, "TerritoryId": 138,
"InteractionType": "Interact", "InteractionType": "Interact",
"Fly": true, "Fly": true,
"StopDistance": 1 "StopDistance": 1,
"AetheryteShortcut": "Western La Noscea - Aleport"
} }
] ]
}, },

View File

@ -47,6 +47,7 @@
"Y": 37.760002, "Y": 37.760002,
"Z": 78.812744 "Z": 78.812744
}, },
"StopDistance": 5,
"TerritoryId": 131, "TerritoryId": 131,
"InteractionType": "CompleteQuest" "InteractionType": "CompleteQuest"
} }

View File

@ -12,6 +12,7 @@
"Y": 37.760002, "Y": 37.760002,
"Z": 78.812744 "Z": 78.812744
}, },
"StopDistance": 5,
"TerritoryId": 131, "TerritoryId": 131,
"InteractionType": "AcceptQuest" "InteractionType": "AcceptQuest"
} }
@ -44,6 +45,7 @@
"Y": 0, "Y": 0,
"Z": -9.079163 "Z": -9.079163
}, },
"StopDistance": 5,
"TerritoryId": 351, "TerritoryId": 351,
"InteractionType": "CompleteQuest" "InteractionType": "CompleteQuest"
} }

View File

@ -12,6 +12,7 @@
"Y": 0, "Y": 0,
"Z": -9.079163 "Z": -9.079163
}, },
"StopDistance": 5,
"TerritoryId": 351, "TerritoryId": 351,
"InteractionType": "AcceptQuest" "InteractionType": "AcceptQuest"
} }
@ -62,6 +63,7 @@
"Y": -9.313226E-10, "Y": -9.313226E-10,
"Z": 5.9052124 "Z": 5.9052124
}, },
"StopDistance": 5,
"TerritoryId": 433, "TerritoryId": 433,
"InteractionType": "Interact" "InteractionType": "Interact"
} }
@ -77,6 +79,7 @@
"Y": 1.1443481, "Y": 1.1443481,
"Z": 13.199036 "Z": 13.199036
}, },
"StopDistance": 4,
"TerritoryId": 433, "TerritoryId": 433,
"InteractionType": "Interact", "InteractionType": "Interact",
"TargetTerritoryId": 419 "TargetTerritoryId": 419

View File

@ -56,6 +56,7 @@
"Y": -1.1916885, "Y": -1.1916885,
"Z": -354.94012 "Z": -354.94012
}, },
"StopDistance": 7,
"TerritoryId": 400, "TerritoryId": 400,
"InteractionType": "CompleteQuest" "InteractionType": "CompleteQuest"
} }

View File

@ -12,6 +12,7 @@
"Y": -1.1916885, "Y": -1.1916885,
"Z": -354.94012 "Z": -354.94012
}, },
"StopDistance": 7,
"TerritoryId": 400, "TerritoryId": 400,
"InteractionType": "AcceptQuest" "InteractionType": "AcceptQuest"
} }
@ -29,6 +30,7 @@
}, },
"TerritoryId": 400, "TerritoryId": 400,
"InteractionType": "CompleteQuest", "InteractionType": "CompleteQuest",
"AetheryteShortcut": "The Churning Mists - Zenith",
"Fly": true "Fly": true
} }
] ]

View File

@ -27,6 +27,7 @@
"Y": 27.979128, "Y": 27.979128,
"Z": -116.41113 "Z": -116.41113
}, },
"StopDistance": 7,
"TerritoryId": 418, "TerritoryId": 418,
"InteractionType": "CompleteQuest" "InteractionType": "CompleteQuest"
} }

View File

@ -12,6 +12,7 @@
"Y": 27.979128, "Y": 27.979128,
"Z": -116.41113 "Z": -116.41113
}, },
"StopDistance": 7,
"TerritoryId": 418, "TerritoryId": 418,
"InteractionType": "AcceptQuest" "InteractionType": "AcceptQuest"
} }
@ -47,6 +48,7 @@
"Y": -9.313226E-10, "Y": -9.313226E-10,
"Z": 7.6447144 "Z": 7.6447144
}, },
"StopDistance": 5,
"TerritoryId": 433, "TerritoryId": 433,
"InteractionType": "CompleteQuest" "InteractionType": "CompleteQuest"
} }

View File

@ -12,6 +12,7 @@
"Y": -9.313226E-10, "Y": -9.313226E-10,
"Z": 6.362976 "Z": 6.362976
}, },
"StopDistance": 7,
"TerritoryId": 433, "TerritoryId": 433,
"InteractionType": "AcceptQuest" "InteractionType": "AcceptQuest"
} }
@ -20,17 +21,6 @@
{ {
"Sequence": 1, "Sequence": 1,
"Steps": [ "Steps": [
{
"DataId": 2005334,
"Position": {
"X": -0.015319824,
"Y": 1.1443481,
"Z": 13.199036
},
"TerritoryId": 433,
"InteractionType": "Interact",
"TargetTerritoryId": 419
},
{ {
"DataId": 1013381, "DataId": 1013381,
"Position": { "Position": {
@ -59,7 +49,15 @@
}, },
"TerritoryId": 418, "TerritoryId": 418,
"InteractionType": "Interact", "InteractionType": "Interact",
"$": "0 0 0 0 0 0 -> 1 0 0 0 0 32" "$": "0 0 0 0 0 0 -> 1 0 0 0 0 32",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
}, },
{ {
"DataId": 1013341, "DataId": 1013341,
@ -70,7 +68,15 @@
}, },
"TerritoryId": 418, "TerritoryId": 418,
"InteractionType": "Interact", "InteractionType": "Interact",
"$": "1 0 0 0 0 32 -> 2 0 0 0 0 96" "$": "1 0 0 0 0 32 -> 2 0 0 0 0 96",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
}, },
{ {
"DataId": 1013340, "DataId": 1013340,
@ -80,7 +86,15 @@
"Z": 54.276245 "Z": 54.276245
}, },
"TerritoryId": 418, "TerritoryId": 418,
"InteractionType": "Interact" "InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
} }
] ]
}, },

View File

@ -57,6 +57,7 @@
"Y": -12.020914, "Y": -12.020914,
"Z": 48.41687 "Z": 48.41687
}, },
"StopDistance": 7,
"TerritoryId": 418, "TerritoryId": 418,
"InteractionType": "Interact" "InteractionType": "Interact"
} }
@ -87,6 +88,7 @@
"Y": 23.979128, "Y": 23.979128,
"Z": 12.802246 "Z": 12.802246
}, },
"StopDistance": 5,
"TerritoryId": 418, "TerritoryId": 418,
"InteractionType": "CompleteQuest" "InteractionType": "CompleteQuest"
} }

View File

@ -12,6 +12,7 @@
"Y": 23.979128, "Y": 23.979128,
"Z": 12.802246 "Z": 12.802246
}, },
"StopDistance": 5,
"TerritoryId": 418, "TerritoryId": 418,
"InteractionType": "AcceptQuest" "InteractionType": "AcceptQuest"
} }
@ -27,6 +28,7 @@
"Y": 23.979126, "Y": 23.979126,
"Z": 10.452393 "Z": 10.452393
}, },
"StopDistance": 5,
"TerritoryId": 418, "TerritoryId": 418,
"InteractionType": "Interact" "InteractionType": "Interact"
} }
@ -62,7 +64,19 @@
] ]
}, },
{ {
"Sequence": 4 "Sequence": 4,
"Steps": [
{
"Position": {
"X": 0,
"Y": 0,
"Z": 0
},
"TerritoryId": 1,
"InteractionType": "WalkTo",
"Comment": "Filler"
}
]
}, },
{ {
"Sequence": 5, "Sequence": 5,
@ -74,6 +88,7 @@
"Y": 42.34489, "Y": 42.34489,
"Z": -207.04968 "Z": -207.04968
}, },
"StopDistance": 7,
"TerritoryId": 419, "TerritoryId": 419,
"InteractionType": "Interact" "InteractionType": "Interact"
} }
@ -105,6 +120,7 @@
"Y": 16.009666, "Y": 16.009666,
"Z": -4.196289 "Z": -4.196289
}, },
"StopDistance": 5,
"TerritoryId": 419, "TerritoryId": 419,
"InteractionType": "CompleteQuest" "InteractionType": "CompleteQuest"
} }

View File

@ -12,6 +12,7 @@
"Y": 16.009666, "Y": 16.009666,
"Z": -4.196289 "Z": -4.196289
}, },
"StopDistance": 5,
"TerritoryId": 419, "TerritoryId": 419,
"InteractionType": "AcceptQuest" "InteractionType": "AcceptQuest"
} }

View File

@ -20,6 +20,25 @@
{ {
"Sequence": 1, "Sequence": 1,
"Steps": [ "Steps": [
{
"Position": {
"X": 90.44213,
"Y": -3.7030487,
"Z": 76.662605
},
"TerritoryId": 418,
"InteractionType": "WalkTo"
},
{
"Position": {
"X": 101.28695,
"Y": -20.020874,
"Z": 76.39896
},
"TerritoryId": 418,
"InteractionType": "WalkTo",
"DisableNavmesh": true
},
{ {
"DataId": 1012169, "DataId": 1012169,
"Position": { "Position": {

View File

@ -20,6 +20,25 @@
{ {
"Sequence": 1, "Sequence": 1,
"Steps": [ "Steps": [
{
"Position": {
"X": 90.44213,
"Y": -3.7030487,
"Z": 76.662605
},
"TerritoryId": 418,
"InteractionType": "WalkTo"
},
{
"Position": {
"X": 101.28695,
"Y": -20.020874,
"Z": 76.39896
},
"TerritoryId": 418,
"InteractionType": "WalkTo",
"DisableNavmesh": true
},
{ {
"DataId": 1013340, "DataId": 1013340,
"Position": { "Position": {

View File

@ -12,6 +12,7 @@
"Y": 24.390423, "Y": 24.390423,
"Z": -4.4709473 "Z": -4.4709473
}, },
"StopDistance": 7,
"TerritoryId": 418, "TerritoryId": 418,
"InteractionType": "AcceptQuest" "InteractionType": "AcceptQuest"
} }

View File

@ -28,7 +28,11 @@
"Z": -26.199768 "Z": -26.199768
}, },
"TerritoryId": 419, "TerritoryId": 419,
"InteractionType": "Interact" "InteractionType": "Interact",
"AethernetShortcut": [
"[Ishgard] Skysteel Manufactory",
"[Ishgard] Athenaeum Astrologicum"
]
} }
] ]
}, },

View File

@ -38,7 +38,7 @@
"Z": 113.54166 "Z": 113.54166
}, },
"TerritoryId": 401, "TerritoryId": 401,
"InteractionType": "Emote", "InteractionType": "SinglePlayerDuty",
"Emote": "lookout", "Emote": "lookout",
"StopDistance": 0.25 "StopDistance": 0.25
} }
@ -71,6 +71,7 @@
"Y": -35.95642, "Y": -35.95642,
"Z": 18.722778 "Z": 18.722778
}, },
"StopDistance": 7,
"TerritoryId": 401, "TerritoryId": 401,
"InteractionType": "CompleteQuest" "InteractionType": "CompleteQuest"
} }

View File

@ -12,6 +12,7 @@
"Y": -35.95642, "Y": -35.95642,
"Z": 18.722778 "Z": 18.722778
}, },
"StopDistance": 7,
"TerritoryId": 401, "TerritoryId": 401,
"InteractionType": "AcceptQuest" "InteractionType": "AcceptQuest"
} }
@ -35,6 +36,22 @@
{ {
"Sequence": 2, "Sequence": 2,
"Steps": [ "Steps": [
{
"Position": {
"X": -756.4804,
"Y": -13.877342,
"Z": -121.33485
},
"TerritoryId": 401,
"InteractionType": "Jump",
"JumpDestination": {
"Position": {
"X": -759.4263,
"Y": -9.201294,
"Z": -110.85681
}
}
},
{ {
"DataId": 2006229, "DataId": 2006229,
"Position": { "Position": {
@ -44,7 +61,17 @@
}, },
"TerritoryId": 401, "TerritoryId": 401,
"InteractionType": "AttuneAetherCurrent", "InteractionType": "AttuneAetherCurrent",
"AetherCurrentId": 2818117 "AetherCurrentId": 2818117,
"DisableNavmesh": true
},
{
"Position": {
"X": -755.9033,
"Y": -14.112402,
"Z": -177.06593
},
"TerritoryId": 401,
"InteractionType": "WalkTo"
}, },
{ {
"DataId": 1013090, "DataId": 1013090,

View File

@ -100,6 +100,7 @@
"Y": -14.153766, "Y": -14.153766,
"Z": -543.0228 "Z": -543.0228
}, },
"StopDistance": 5,
"TerritoryId": 401, "TerritoryId": 401,
"InteractionType": "CompleteQuest" "InteractionType": "CompleteQuest"
} }

View File

@ -12,6 +12,7 @@
"Y": -14.153766, "Y": -14.153766,
"Z": -543.0228 "Z": -543.0228
}, },
"StopDistance": 5,
"TerritoryId": 401, "TerritoryId": 401,
"InteractionType": "AcceptQuest" "InteractionType": "AcceptQuest"
} }

View File

@ -12,6 +12,7 @@
"Y": -14.153783, "Y": -14.153783,
"Z": -541.558 "Z": -541.558
}, },
"StopDistance": 5,
"TerritoryId": 401, "TerritoryId": 401,
"InteractionType": "AcceptQuest" "InteractionType": "AcceptQuest"
} }
@ -27,6 +28,7 @@
"Y": -15.134373, "Y": -15.134373,
"Z": 37.094604 "Z": 37.094604
}, },
"StopDistance": 7,
"TerritoryId": 419, "TerritoryId": 419,
"InteractionType": "CompleteQuest" "InteractionType": "CompleteQuest"
} }

View File

@ -12,6 +12,7 @@
"Y": -15.134371, "Y": -15.134371,
"Z": 38.52893 "Z": 38.52893
}, },
"StopDistance": 7,
"TerritoryId": 419, "TerritoryId": 419,
"InteractionType": "AcceptQuest" "InteractionType": "AcceptQuest"
} }

View File

@ -29,6 +29,7 @@
}, },
"TerritoryId": 133, "TerritoryId": 133,
"InteractionType": "Interact", "InteractionType": "Interact",
"TargetTerritoryId": 205,
"DialogueChoices": [ "DialogueChoices": [
{ {
"Type": "YesNo", "Type": "YesNo",
@ -93,6 +94,7 @@
"Y": -8, "Y": -8,
"Z": 98.13074 "Z": 98.13074
}, },
"StopDistance": 5,
"TerritoryId": 132, "TerritoryId": 132,
"InteractionType": "CompleteQuest" "InteractionType": "CompleteQuest"
} }

View File

@ -12,6 +12,7 @@
"Y": -8, "Y": -8,
"Z": 98.13074 "Z": 98.13074
}, },
"StopDistance": 5,
"TerritoryId": 132, "TerritoryId": 132,
"InteractionType": "AcceptQuest" "InteractionType": "AcceptQuest"
} }
@ -33,6 +34,14 @@
"AethernetShortcut": [ "AethernetShortcut": [
"[Gridania] Aetheryte Plaza", "[Gridania] Aetheryte Plaza",
"[Gridania] Leatherworkers' Guild & Shaded Bower" "[Gridania] Leatherworkers' Guild & Shaded Bower"
],
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
] ]
}, },
{ {
@ -47,6 +56,14 @@
"AethernetShortcut": [ "AethernetShortcut": [
"[Gridania] Leatherworkers' Guild & Shaded Bower", "[Gridania] Leatherworkers' Guild & Shaded Bower",
"[Gridania] Conjurers' Guild" "[Gridania] Conjurers' Guild"
],
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
] ]
} }
] ]

View File

@ -67,6 +67,11 @@
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"TerritoryId": 478,
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Idyllshire] West Idyllshire"
},
{ {
"DataId": 1012097, "DataId": 1012097,
"Position": { "Position": {
@ -75,7 +80,11 @@
"Z": 23.483582 "Z": 23.483582
}, },
"TerritoryId": 478, "TerritoryId": 478,
"InteractionType": "CompleteQuest" "InteractionType": "CompleteQuest",
"AethernetShortcut": [
"[Idyllshire] West Idyllshire",
"[Idyllshire] Aetheryte Plaza"
]
} }
] ]
} }

View File

@ -20,16 +20,6 @@
{ {
"Sequence": 1, "Sequence": 1,
"Steps": [ "Steps": [
{
"Position": {
"X": 148.52824,
"Y": 207,
"Z": 117.84323
},
"TerritoryId": 478,
"InteractionType": "WalkTo",
"TargetTerritoryId": 399
},
{ {
"DataId": 1012416, "DataId": 1012416,
"Position": { "Position": {
@ -38,7 +28,11 @@
"Z": 6.3324585 "Z": 6.3324585
}, },
"TerritoryId": 399, "TerritoryId": 399,
"InteractionType": "SinglePlayerDuty" "InteractionType": "SinglePlayerDuty",
"AethernetShortcut": [
"[Idyllshire] Aetheryte Plaza",
"[Idyllshire] Epilogue Gate (Eastern Hinterlands)"
]
} }
] ]
}, },
@ -52,6 +46,7 @@
"Y": 77.859474, "Y": 77.859474,
"Z": -5.9052734 "Z": -5.9052734
}, },
"StopDistance": 7,
"TerritoryId": 399, "TerritoryId": 399,
"InteractionType": "Interact" "InteractionType": "Interact"
} }

View File

@ -42,6 +42,7 @@
"Y": 203.98, "Y": 203.98,
"Z": 127.91626 "Z": 127.91626
}, },
"StopDistance": 5,
"TerritoryId": 478, "TerritoryId": 478,
"InteractionType": "CompleteQuest" "InteractionType": "CompleteQuest"
} }

View File

@ -12,6 +12,7 @@
"Y": 203.98, "Y": 203.98,
"Z": 127.91626 "Z": 127.91626
}, },
"StopDistance": 5,
"TerritoryId": 478, "TerritoryId": 478,
"InteractionType": "AcceptQuest" "InteractionType": "AcceptQuest"
} }

View File

@ -12,6 +12,7 @@
"Y": 38.43, "Y": 38.43,
"Z": 15.854065 "Z": 15.854065
}, },
"StopDistance": 7,
"TerritoryId": 463, "TerritoryId": 463,
"InteractionType": "AcceptQuest" "InteractionType": "AcceptQuest"
} }
@ -27,6 +28,7 @@
"Y": 38.43, "Y": 38.43,
"Z": 15.854065 "Z": 15.854065
}, },
"StopDistance": 7,
"TerritoryId": 463, "TerritoryId": 463,
"InteractionType": "Interact" "InteractionType": "Interact"
} }
@ -42,6 +44,7 @@
"Y": 38.43, "Y": 38.43,
"Z": 3.5552979 "Z": 3.5552979
}, },
"StopDistance": 7,
"TerritoryId": 463, "TerritoryId": 463,
"InteractionType": "Interact" "InteractionType": "Interact"
} }
@ -59,7 +62,23 @@
}, },
"TerritoryId": 463, "TerritoryId": 463,
"InteractionType": "Interact", "InteractionType": "Interact",
"TargetTerritoryId": 399 "TargetTerritoryId": 399,
"SkipConditions": {
"StepIf": {
"NotInTerritory": [
463
]
}
}
},
{
"Position": {
"X": 228.06944,
"Y": 228.11594,
"Z": 767.1184
},
"TerritoryId": 399,
"InteractionType": "WalkTo"
}, },
{ {
"DataId": 1012427, "DataId": 1012427,
@ -69,7 +88,8 @@
"Z": 767.87964 "Z": 767.87964
}, },
"TerritoryId": 399, "TerritoryId": 399,
"InteractionType": "Interact" "InteractionType": "Interact",
"DisableNavmesh": true
} }
] ]
}, },
@ -86,6 +106,16 @@
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"Position": {
"X": 228.06944,
"Y": 228.11594,
"Z": 767.1184
},
"TerritoryId": 399,
"InteractionType": "WalkTo",
"DisableNavmesh": true
},
{ {
"DataId": 2005336, "DataId": 2005336,
"Position": { "Position": {

View File

@ -27,6 +27,7 @@
"Y": 137.42972, "Y": 137.42972,
"Z": 701.4724 "Z": 701.4724
}, },
"StopDistance": 7,
"TerritoryId": 399, "TerritoryId": 399,
"InteractionType": "Interact" "InteractionType": "Interact"
} }

View File

@ -12,6 +12,7 @@
"Y": -14.34896, "Y": -14.34896,
"Z": 51.651733 "Z": 51.651733
}, },
"StopDistance": 5,
"TerritoryId": 419, "TerritoryId": 419,
"InteractionType": "AcceptQuest" "InteractionType": "AcceptQuest"
} }
@ -48,6 +49,14 @@
"AethernetShortcut": [ "AethernetShortcut": [
"[Ishgard] Athenaeum Astrologicum", "[Ishgard] Athenaeum Astrologicum",
"[Ishgard] The Forgotten Knight" "[Ishgard] The Forgotten Knight"
],
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
] ]
}, },
{ {
@ -59,7 +68,50 @@
}, },
"TerritoryId": 418, "TerritoryId": 418,
"InteractionType": "Interact", "InteractionType": "Interact",
"$": "16 1 0 0 0 128 -> 33 1 0 0 0 192" "$": "16 1 0 0 0 128 -> 33 1 0 0 0 192",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"Position": {
"X": 89.00678,
"Y": 1.6069314,
"Z": 67.770386
},
"TerritoryId": 418,
"InteractionType": "WalkTo",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
-32
]
},
{
"Position": {
"X": 74.918564,
"Y": -13.879314,
"Z": 68.86857
},
"TerritoryId": 418,
"InteractionType": "WalkTo",
"DisableNavmesh": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
-32
]
}, },
{ {
"DataId": 1012251, "DataId": 1012251,
@ -69,7 +121,15 @@
"Z": 40.268433 "Z": 40.268433
}, },
"TerritoryId": 418, "TerritoryId": 418,
"InteractionType": "Interact" "InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
} }
] ]
}, },
@ -98,6 +158,7 @@
"Y": -9.313226E-10, "Y": -9.313226E-10,
"Z": 5.661072 "Z": 5.661072
}, },
"StopDistance": 7,
"TerritoryId": 433, "TerritoryId": 433,
"InteractionType": "Interact" "InteractionType": "Interact"
} }

View File

@ -29,7 +29,15 @@
}, },
"TerritoryId": 402, "TerritoryId": 402,
"InteractionType": "Interact", "InteractionType": "Interact",
"$": "0 0 0 0 0 0 -> 17 0 0 0 0 64" "$": "0 0 0 0 0 0 -> 17 0 0 0 0 64",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
}, },
{ {
"DataId": 2006236, "DataId": 2006236,
@ -40,7 +48,15 @@
}, },
"TerritoryId": 402, "TerritoryId": 402,
"InteractionType": "Interact", "InteractionType": "Interact",
"$": "17 0 0 0 0 64 -> 33 1 0 0 0 192" "$": "17 0 0 0 0 64 -> 33 1 0 0 0 192",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
}, },
{ {
"DataId": 2006238, "DataId": 2006238,
@ -50,7 +66,15 @@
"Z": -477.92786 "Z": -477.92786
}, },
"TerritoryId": 402, "TerritoryId": 402,
"InteractionType": "Interact" "InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
} }
] ]
}, },

View File

@ -12,6 +12,7 @@
"Y": -176.4502, "Y": -176.4502,
"Z": -579.3393 "Z": -579.3393
}, },
"StopDistance": 7,
"TerritoryId": 402, "TerritoryId": 402,
"InteractionType": "AcceptQuest", "InteractionType": "AcceptQuest",
"DialogueChoices": [ "DialogueChoices": [
@ -34,6 +35,7 @@
"Y": -176.4502, "Y": -176.4502,
"Z": -577.5082 "Z": -577.5082
}, },
"StopDistance": 5,
"TerritoryId": 402, "TerritoryId": 402,
"InteractionType": "Interact" "InteractionType": "Interact"
} }
@ -57,6 +59,24 @@
{ {
"Sequence": 3, "Sequence": 3,
"Steps": [ "Steps": [
{
"Position": {
"X": -138.06377,
"Y": -158.1412,
"Z": -496.24612
},
"TerritoryId": 402,
"InteractionType": "WalkTo"
},
{
"Position": {
"X": -147.24174,
"Y": -154.81604,
"Z": -498.42224
},
"TerritoryId": 402,
"InteractionType": "WalkTo"
},
{ {
"DataId": 2006363, "DataId": 2006363,
"Position": { "Position": {
@ -80,7 +100,8 @@
"Z": -619.8978 "Z": -619.8978
}, },
"TerritoryId": 402, "TerritoryId": 402,
"InteractionType": "CompleteQuest" "InteractionType": "CompleteQuest",
"DisableNavmesh": true
} }
] ]
} }

View File

@ -48,7 +48,15 @@
"KillEnemyDataIds": [ "KillEnemyDataIds": [
4942 4942
], ],
"$": "0 0 0 0 0 0 -> 18 0 0 0 0 64" "$": "0 0 0 0 0 0 -> 18 0 0 0 0 64",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
}, },
{ {
"DataId": 2005569, "DataId": 2005569,
@ -64,7 +72,15 @@
4943, 4943,
4623 4623
], ],
"$": "18 0 0 0 0 64 -> 34 48 0 0 0 96" "$": "18 0 0 0 0 64 -> 34 48 0 0 0 96",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
}, },
{ {
"DataId": 2005567, "DataId": 2005567,
@ -79,6 +95,14 @@
"KillEnemyDataIds": [ "KillEnemyDataIds": [
4614, 4614,
4942 4942
],
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
] ]
} }
] ]
@ -101,6 +125,24 @@
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"Position": {
"X": 780.2551,
"Y": -21.268166,
"Z": -478.28162
},
"TerritoryId": 402,
"InteractionType": "WalkTo"
},
{
"Position": {
"X": 778.6274,
"Y": -17.943024,
"Z": -487.80676
},
"TerritoryId": 402,
"InteractionType": "WalkTo"
},
{ {
"DataId": 2006364, "DataId": 2006364,
"Position": { "Position": {

View File

@ -1,6 +1,9 @@
{ {
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json", "$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "JerryWester", "Author": "JerryWester",
"TerritoryBlacklist": [
459
],
"QuestSequence": [ "QuestSequence": [
{ {
"Sequence": 0, "Sequence": 0,
@ -12,6 +15,7 @@
"Y": 10.474376, "Y": 10.474376,
"Z": 77.50049 "Z": 77.50049
}, },
"StopDistance": 7,
"TerritoryId": 402, "TerritoryId": 402,
"InteractionType": "AcceptQuest" "InteractionType": "AcceptQuest"
} }
@ -82,7 +86,8 @@
"Z": 456.53467 "Z": 456.53467
}, },
"TerritoryId": 402, "TerritoryId": 402,
"InteractionType": "CompleteQuest" "InteractionType": "CompleteQuest",
"DisableNavmesh": true
} }
] ]
} }

View File

@ -13,7 +13,8 @@
"Z": -5.2339478 "Z": -5.2339478
}, },
"TerritoryId": 402, "TerritoryId": 402,
"InteractionType": "AcceptQuest" "InteractionType": "AcceptQuest",
"Fly": true
} }
] ]
}, },
@ -66,7 +67,19 @@
] ]
}, },
{ {
"Sequence": 4 "Sequence": 4,
"Steps": [
{
"Position": {
"X": 0,
"Y": 0,
"Z": 0
},
"TerritoryId": 1,
"InteractionType": "WalkTo",
"Comment": "Filler"
}
]
}, },
{ {
"Sequence": 5, "Sequence": 5,
@ -88,6 +101,7 @@
"Y": 0.022254243, "Y": 0.022254243,
"Z": 4.623413 "Z": 4.623413
}, },
"StopDistance": 5,
"TerritoryId": 433, "TerritoryId": 433,
"InteractionType": "CompleteQuest" "InteractionType": "CompleteQuest"
} }

View File

@ -325,14 +325,24 @@
"if": { "if": {
"properties": { "properties": {
"InteractionType": { "InteractionType": {
"anyOf": [
{
"const": "Interact" "const": "Interact"
}
}
},
"then": {
"required": [
"DataId"
]
}
}, },
{ {
"if": {
"properties": {
"InteractionType": {
"const": "SinglePlayerDuty" "const": "SinglePlayerDuty"
} },
] "Emote": {
"not": true
} }
} }
}, },
@ -607,6 +617,9 @@
}, },
{ {
"const": "CompleteQuest" "const": "CompleteQuest"
},
{
"const": "SinglePlayerDuty"
} }
] ]
} }
@ -1009,7 +1022,9 @@
"not": { "not": {
"anyOf": [ "anyOf": [
{ {
"required": ["SkipIf"] "required": [
"SkipIf"
]
} }
] ]
} }

View File

@ -19,6 +19,12 @@ public sealed class SkipStepConditions
{ {
if (Never) if (Never)
return false; return false;
return Flying != null || Chocobo != null || InTerritory.Count > 0 || NotInTerritory.Count > 0 || Item != null; return Flying != null ||
Chocobo != null ||
InTerritory.Count > 0 ||
NotInTerritory.Count > 0 ||
Item != null ||
QuestsAccepted.Count > 0 ||
QuestsCompleted.Count > 0;
} }
} }

View File

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Globalization; using System.Globalization;
using System.Linq; using System.Linq;
using System.Numerics; using System.Numerics;
@ -110,8 +111,24 @@ internal sealed class MovementController : IDisposable
} }
if (!Destination.IsFlying) if (!Destination.IsFlying)
_movementOverrideController.AdjustPath(navPoints); {
(navPoints, bool recalculateNavmesh) = _movementOverrideController.AdjustPath(navPoints);
if (recalculateNavmesh && Destination.NavmeshCalculations < 10)
{
Destination.NavmeshCalculations++;
Destination.PartialRoute.AddRange(navPoints);
_logger.LogInformation("Running navmesh recalculation with fudged point ({From} to {To})", navPoints.Last(), Destination.Position);
_cancellationTokenSource = new();
_cancellationTokenSource.CancelAfter(TimeSpan.FromSeconds(30));
_pathfindTask =
_navmeshIpc.Pathfind(navPoints.Last(), Destination.Position, Destination.IsFlying,
_cancellationTokenSource.Token);
return;
}
}
navPoints = Destination.PartialRoute.Concat(navPoints).ToList();
_logger.LogInformation("Navigating via route: [{Route}]", _logger.LogInformation("Navigating via route: [{Route}]",
string.Join(" → ", string.Join(" → ",
_pathfindTask.Result.Select(x => x.ToString("G", CultureInfo.InvariantCulture)))); _pathfindTask.Result.Select(x => x.ToString("G", CultureInfo.InvariantCulture))));
@ -245,6 +262,7 @@ internal sealed class MovementController : IDisposable
return pointOnFloor != null && Math.Abs(pointOnFloor.Value.Y - p.Y) > 0.5f; return pointOnFloor != null && Math.Abs(pointOnFloor.Value.Y - p.Y) > 0.5f;
} }
[MemberNotNull(nameof(Destination))]
private void PrepareNavigation(EMovementType type, uint? dataId, Vector3 to, bool fly, bool sprint, private void PrepareNavigation(EMovementType type, uint? dataId, Vector3 to, bool fly, bool sprint,
float? stopDistance, bool ignoreDistanceToObject, bool land, bool useNavmesh) float? stopDistance, bool ignoreDistanceToObject, bool land, bool useNavmesh)
{ {
@ -271,6 +289,7 @@ internal sealed class MovementController : IDisposable
PrepareNavigation(type, dataId, to, fly, sprint, stopDistance, ignoreDistanceToObject, land, true); PrepareNavigation(type, dataId, to, fly, sprint, stopDistance, ignoreDistanceToObject, land, true);
_logger.LogInformation("Pathfinding to {Destination}", Destination); _logger.LogInformation("Pathfinding to {Destination}", Destination);
Destination.NavmeshCalculations++;
_cancellationTokenSource = new(); _cancellationTokenSource = new();
_cancellationTokenSource.CancelAfter(TimeSpan.FromSeconds(30)); _cancellationTokenSource.CancelAfter(TimeSpan.FromSeconds(30));
_pathfindTask = _pathfindTask =
@ -336,7 +355,11 @@ internal sealed class MovementController : IDisposable
bool CanSprint, bool CanSprint,
bool IgnoreDistanceToObject, bool IgnoreDistanceToObject,
bool Land, bool Land,
bool UseNavmesh); bool UseNavmesh)
{
public int NavmeshCalculations { get; set; }
public List<Vector3> PartialRoute { get; } = [];
}
public sealed class PathfindingFailedException : Exception public sealed class PathfindingFailedException : Exception
{ {

View File

@ -0,0 +1,13 @@
using System.Globalization;
using System.Numerics;
namespace Questionable.Controller.NavigationOverrides;
public sealed record AlternateLocation(Vector3 Point, bool RecalculateNavmesh)
{
public override string ToString()
{
return string.Create(CultureInfo.InvariantCulture,
$"{nameof(Point)}: {Point:G}, {nameof(RecalculateNavmesh)}: {RecalculateNavmesh}");
}
}

View File

@ -6,14 +6,15 @@ internal sealed record BlacklistedArea(
ushort TerritoryId, ushort TerritoryId,
Vector3 Center, Vector3 Center,
float MinDistance, float MinDistance,
float MaxDistance) : IBlacklistedLocation float MaxDistance,
bool RecalculateNavmesh = false) : IBlacklistedLocation
{ {
public Vector3? AdjustPoint(Vector3 point) public AlternateLocation? AdjustPoint(Vector3 point)
{ {
float distance = (point - Center).Length(); float distance = (point - Center).Length();
if (distance < MinDistance || distance > MaxDistance) if (distance < MinDistance || distance > MaxDistance)
return null; return null;
return Center + Vector3.Normalize(point - Center) * MaxDistance; return new AlternateLocation(Center + Vector3.Normalize(point - Center) * MaxDistance, RecalculateNavmesh);
} }
} }

View File

@ -6,14 +6,15 @@ public sealed record BlacklistedPoint(
ushort TerritoryId, ushort TerritoryId,
Vector3 Original, Vector3 Original,
Vector3 Replacement, Vector3 Replacement,
float CheckDistance = 0.05f) : IBlacklistedLocation float CheckDistance = 0.05f,
bool RecalculateNavmesh = false) : IBlacklistedLocation
{ {
public Vector3? AdjustPoint(Vector3 point) public AlternateLocation? AdjustPoint(Vector3 point)
{ {
float distance = (point - Original).Length(); float distance = (point - Original).Length();
if (distance > CheckDistance) if (distance > CheckDistance)
return null; return null;
return Replacement; return new AlternateLocation(Replacement, RecalculateNavmesh);
} }
} }

View File

@ -6,5 +6,5 @@ internal interface IBlacklistedLocation
{ {
ushort TerritoryId { get; } ushort TerritoryId { get; }
Vector3? AdjustPoint(Vector3 point); AlternateLocation? AdjustPoint(Vector3 point);
} }

View File

@ -1,5 +1,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.Linq;
using System.Numerics; using System.Numerics;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@ -25,6 +26,7 @@ internal sealed class MovementOverrideController
// New Gridania Navmesh workaround - planter box outside the Carline Canopy // New Gridania Navmesh workaround - planter box outside the Carline Canopy
new BlacklistedPoint(132, new(45.5f, -8f, 101f), new(50.53978f, -8.046954f, 101.06045f)), new BlacklistedPoint(132, new(45.5f, -8f, 101f), new(50.53978f, -8.046954f, 101.06045f)),
new BlacklistedPoint(132, new(48.5f, -8f, 98.25f), new(50.53978f, -8.046954f, 101.06045f)),
// ul'dah lamp near adventuer's guild // ul'dah lamp near adventuer's guild
new BlacklistedPoint(130, new(59.5f, 4.25f, -118f), new(60.551353f, 4f, -119.76446f)), new BlacklistedPoint(130, new(59.5f, 4.25f, -118f), new(60.551353f, 4f, -119.76446f)),
@ -53,6 +55,9 @@ internal sealed class MovementOverrideController
// moghome, mogmug's trial // moghome, mogmug's trial
new BlacklistedPoint(400, new(384, -74, 648.75f), new(386.0543f, -72.409454f, 652.0184f), 3), new BlacklistedPoint(400, new(384, -74, 648.75f), new(386.0543f, -72.409454f, 652.0184f), 3),
// leaving idyllshiret through the west gate attempts to run into this wall
new BlacklistedPoint(399, new(-514.4851f, 149.63762f, -480.58087f), new(-528.78656f, 151.17374f, -473.07077f), 5, true),
new BlacklistedPoint(1189, new(574f, -142.25f, 504.25f), new(574.44183f, -142.12766f, 507.60065f)), new BlacklistedPoint(1189, new(574f, -142.25f, 504.25f), new(574.44183f, -142.12766f, 507.60065f)),
// kholusia, random rocks // kholusia, random rocks
@ -84,7 +89,7 @@ internal sealed class MovementOverrideController
/// walked on without jumping, but if you teleport to the wrong side you're fucked otherwise. /// walked on without jumping, but if you teleport to the wrong side you're fucked otherwise.
/// </summary> /// </summary>
/// <param name="navPoints">list of points to check</param> /// <param name="navPoints">list of points to check</param>
public void AdjustPath(List<Vector3> navPoints) public (List<Vector3>, bool) AdjustPath(List<Vector3> navPoints)
{ {
foreach (var blacklistedArea in BlacklistedLocations) foreach (var blacklistedArea in BlacklistedLocations)
{ {
@ -93,17 +98,21 @@ internal sealed class MovementOverrideController
for (int i = 0; i < navPoints.Count; ++i) for (int i = 0; i < navPoints.Count; ++i)
{ {
Vector3? updatedPoint = blacklistedArea.AdjustPoint(navPoints[i]); AlternateLocation? alternateLocation = blacklistedArea.AdjustPoint(navPoints[i]);
if (updatedPoint != null) if (alternateLocation != null)
{ {
_logger.LogInformation("Fudging navmesh point from {Original} to {Replacement} in blacklisted area", _logger.LogInformation("Fudging navmesh point from {Original} to {Replacement} in blacklisted area",
navPoints[i].ToString("G", CultureInfo.InvariantCulture), navPoints[i].ToString("G", CultureInfo.InvariantCulture),
updatedPoint.Value.ToString("G", CultureInfo.InvariantCulture)); alternateLocation);
navPoints[i] = updatedPoint.Value; navPoints[i] = alternateLocation.Point;
if (alternateLocation.RecalculateNavmesh)
return (navPoints.Take(i + 1).ToList(), true);
} }
} }
} }
return (navPoints, false);
} }
} }

View File

@ -4,6 +4,7 @@ using System.Linq;
using Dalamud.Game.ClientState.Conditions; using Dalamud.Game.ClientState.Conditions;
using Dalamud.Game.ClientState.Keys; using Dalamud.Game.ClientState.Keys;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.Controller.Steps; using Questionable.Controller.Steps;
using Questionable.Controller.Steps.Shared; using Questionable.Controller.Steps.Shared;
@ -28,7 +29,7 @@ internal sealed class QuestController
private readonly YesAlreadyIpc _yesAlreadyIpc; private readonly YesAlreadyIpc _yesAlreadyIpc;
private readonly IReadOnlyList<ITaskFactory> _taskFactories; private readonly IReadOnlyList<ITaskFactory> _taskFactories;
private readonly object _lock = new(); private readonly object _progressLock = new();
private QuestProgress? _startedQuest; private QuestProgress? _startedQuest;
private QuestProgress? _nextQuest; private QuestProgress? _nextQuest;
@ -37,6 +38,13 @@ internal sealed class QuestController
private ITask? _currentTask; private ITask? _currentTask;
private bool _automatic; private bool _automatic;
/// <summary>
/// Some combat encounters finish relatively early (i.e. they're done as part of progressing the quest, but not
/// technically necessary to progress the quest if we'd just run away and back). We add some slight delay, as
/// talking to NPCs, teleporting etc. won't successfully execute.
/// </summary>
private DateTime _safeAnimationEnd = DateTime.MinValue;
public QuestController( public QuestController(
IClientState clientState, IClientState clientState,
GameFunctions gameFunctions, GameFunctions gameFunctions,
@ -90,13 +98,14 @@ internal sealed class QuestController
public void Reload() public void Reload()
{ {
lock (_lock) lock (_progressLock)
{ {
_logger.LogInformation("Reload, resetting curent quest progress"); _logger.LogInformation("Reload, resetting curent quest progress");
_startedQuest = null; _startedQuest = null;
_nextQuest = null; _nextQuest = null;
_simulatedQuest = null; _simulatedQuest = null;
_safeAnimationEnd = DateTime.MinValue;
DebugState = null; DebugState = null;
@ -106,6 +115,20 @@ internal sealed class QuestController
public void Update() public void Update()
{ {
unsafe
{
ActionManager* actionManager = ActionManager.Instance();
if (actionManager != null)
{
float animationLock = Math.Max(actionManager->AnimationLock,
actionManager->CastTimeElapsed > 0
? actionManager->CastTimeTotal - actionManager->CastTimeElapsed
: 0);
if (animationLock > 0)
_safeAnimationEnd = DateTime.Now.AddSeconds(1 + animationLock);
}
}
UpdateCurrentQuest(); UpdateCurrentQuest();
if (!_clientState.IsLoggedIn || _condition[ConditionFlag.Unconscious]) if (!_clientState.IsLoggedIn || _condition[ConditionFlag.Unconscious])
@ -116,7 +139,8 @@ internal sealed class QuestController
_movementController.Stop(); _movementController.Stop();
_combatController.Stop(); _combatController.Stop();
} }
} else if (_keyState[VirtualKey.ESCAPE]) }
else if (_keyState[VirtualKey.ESCAPE])
{ {
if (_currentTask != null || _taskQueue.Count > 0) if (_currentTask != null || _taskQueue.Count > 0)
{ {
@ -134,7 +158,7 @@ internal sealed class QuestController
&& CurrentQuest is { Sequence: 0, Step: 0 } or { Sequence: 0, Step: 255 } && CurrentQuest is { Sequence: 0, Step: 0 } or { Sequence: 0, Step: 255 }
&& DateTime.Now >= CurrentQuest.StepProgress.StartedAt.AddSeconds(15)) && DateTime.Now >= CurrentQuest.StepProgress.StartedAt.AddSeconds(15))
{ {
lock (_lock) lock (_progressLock)
{ {
_logger.LogWarning("Quest accept apparently didn't work out, resetting progress"); _logger.LogWarning("Quest accept apparently didn't work out, resetting progress");
CurrentQuest.SetStep(0); CurrentQuest.SetStep(0);
@ -149,7 +173,7 @@ internal sealed class QuestController
private void UpdateCurrentQuest() private void UpdateCurrentQuest()
{ {
lock (_lock) lock (_progressLock)
{ {
DebugState = null; DebugState = null;
@ -249,6 +273,12 @@ internal sealed class QuestController
return; return;
} }
if (DateTime.Now < _safeAnimationEnd)
{
DebugState = "Waiting for Animation";
return;
}
if (questToRun.Sequence != currentSequence) if (questToRun.Sequence != currentSequence)
{ {
questToRun.SetSequence(currentSequence); questToRun.SetSequence(currentSequence);
@ -302,7 +332,7 @@ internal sealed class QuestController
public void IncreaseStepCount(ushort? questId, int? sequence, bool shouldContinue = false) public void IncreaseStepCount(ushort? questId, int? sequence, bool shouldContinue = false)
{ {
lock (_lock) lock (_progressLock)
{ {
(QuestSequence? seq, QuestStep? step) = GetNextStep(); (QuestSequence? seq, QuestStep? step) = GetNextStep();
if (CurrentQuest == null || seq == null || step == null) if (CurrentQuest == null || seq == null || step == null)
@ -587,7 +617,7 @@ internal sealed class QuestController
public void Skip(ushort questQuestId, byte currentQuestSequence) public void Skip(ushort questQuestId, byte currentQuestSequence)
{ {
lock (_lock) lock (_progressLock)
{ {
if (_currentTask is ISkippableTask) if (_currentTask is ISkippableTask)
_currentTask = null; _currentTask = null;

View File

@ -79,6 +79,20 @@ internal static class SkipCondition
return true; return true;
} }
if (SkipConditions.InTerritory.Count > 0 &&
SkipConditions.InTerritory.Contains(clientState.TerritoryType))
{
logger.LogInformation("Skipping step, as in a skip.InTerritory");
return true;
}
if (SkipConditions.NotInTerritory.Count > 0 &&
!SkipConditions.NotInTerritory.Contains(clientState.TerritoryType))
{
logger.LogInformation("Skipping step, as not in a skip.NotInTerritory");
return true;
}
if (SkipConditions.QuestsCompleted.Count > 0 && if (SkipConditions.QuestsCompleted.Count > 0 &&
SkipConditions.QuestsCompleted.All(gameFunctions.IsQuestComplete)) SkipConditions.QuestsCompleted.All(gameFunctions.IsQuestComplete))
{ {