1
0
Fork 0

Minor cleanup for HW part 2

master
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(),
Assignment(nameof(SkipStepConditions.Item), skipStepConditions.Item, emptyStep.Item)
.AsSyntaxNodeOrToken(),
AssignmentList(nameof(SkipStepConditions.QuestsAccepted),
skipStepConditions.QuestsAccepted).AsSyntaxNodeOrToken(),
AssignmentList(nameof(SkipStepConditions.QuestsCompleted),
skipStepConditions.QuestsCompleted).AsSyntaxNodeOrToken(),
Assignment(nameof(SkipStepConditions.ExtraCondition),
skipStepConditions.ExtraCondition, emptyStep.ExtraCondition)
.AsSyntaxNodeOrToken()))));

View File

@ -20,6 +20,58 @@
{
"Sequence": 1,
"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,
"Position": {
@ -29,7 +81,15 @@
},
"TerritoryId": 400,
"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,
@ -40,7 +100,58 @@
},
"TerritoryId": 400,
"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,
@ -50,7 +161,15 @@
"Z": 379.3545
},
"TerritoryId": 400,
"InteractionType": "Interact"
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
}
]
},
@ -65,7 +184,8 @@
"Z": 347.0968
},
"TerritoryId": 400,
"InteractionType": "CompleteQuest"
"InteractionType": "CompleteQuest",
"DisableNavmesh": true
}
]
}

View File

@ -39,7 +39,15 @@
},
"TerritoryId": 399,
"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,
@ -50,7 +58,15 @@
},
"TerritoryId": 399,
"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,
@ -60,7 +76,15 @@
"Z": 34.74475
},
"TerritoryId": 399,
"InteractionType": "Interact"
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
}
]
},

View File

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

View File

@ -29,7 +29,14 @@
},
"TerritoryId": 463,
"InteractionType": "Interact",
"TargetTerritoryId": 399
"TargetTerritoryId": 399,
"SkipConditions": {
"StepIf": {
"NotInTerritory": [
463
]
}
}
},
{
"DataId": 2006061,
@ -44,7 +51,15 @@
"KillEnemyDataIds": [
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,
@ -59,7 +74,15 @@
"KillEnemyDataIds": [
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,
@ -73,6 +96,14 @@
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [
44
],
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
}
]

View File

@ -29,7 +29,15 @@
},
"TerritoryId": 401,
"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,
@ -40,7 +48,15 @@
},
"TerritoryId": 401,
"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,
@ -50,7 +66,15 @@
"Z": -564.3549
},
"TerritoryId": 401,
"InteractionType": "Interact"
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
}
]
},

View File

@ -29,7 +29,15 @@
},
"TerritoryId": 401,
"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,
@ -40,7 +48,15 @@
},
"TerritoryId": 401,
"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,
@ -50,7 +66,15 @@
"Z": -417.74628
},
"TerritoryId": 401,
"InteractionType": "Interact"
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
}
]
},

View File

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

View File

@ -26,6 +26,17 @@
{
"Sequence": 1,
"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,
"Position": {
@ -35,8 +46,7 @@
},
"TerritoryId": 155,
"InteractionType": "SinglePlayerDuty",
"Fly": true,
"AetheryteShortcut": "Coerthas Central Highlands - Camp Dragonhead"
"Fly": true
}
]
},

View File

@ -26,6 +26,34 @@
{
"Sequence": 1,
"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,
"Position": {
@ -35,7 +63,15 @@
},
"TerritoryId": 398,
"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,
@ -46,17 +82,15 @@
},
"TerritoryId": 398,
"InteractionType": "Interact",
"$": "1 0 0 0 0 128 -> 2 0 0 0 0 160"
},
{
"DataId": 1011920,
"Position": {
"X": 519.8595,
"Y": -51.071976,
"Z": 88.24292
},
"TerritoryId": 398,
"InteractionType": "Interact"
"$": "1 0 0 0 0 128 -> 2 0 0 0 0 160",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
}
]
},

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -12,6 +12,7 @@
"Y": 23.979128,
"Z": 12.802246
},
"StopDistance": 5,
"TerritoryId": 418,
"InteractionType": "AcceptQuest"
}
@ -27,6 +28,7 @@
"Y": 23.979126,
"Z": 10.452393
},
"StopDistance": 5,
"TerritoryId": 418,
"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,
@ -74,6 +88,7 @@
"Y": 42.34489,
"Z": -207.04968
},
"StopDistance": 7,
"TerritoryId": 419,
"InteractionType": "Interact"
}
@ -105,6 +120,7 @@
"Y": 16.009666,
"Z": -4.196289
},
"StopDistance": 5,
"TerritoryId": 419,
"InteractionType": "CompleteQuest"
}

View File

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

View File

@ -20,6 +20,25 @@
{
"Sequence": 1,
"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,
"Position": {

View File

@ -20,6 +20,25 @@
{
"Sequence": 1,
"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,
"Position": {

View File

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

View File

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

View File

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

View File

@ -12,6 +12,7 @@
"Y": -35.95642,
"Z": 18.722778
},
"StopDistance": 7,
"TerritoryId": 401,
"InteractionType": "AcceptQuest"
}
@ -35,6 +36,22 @@
{
"Sequence": 2,
"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,
"Position": {
@ -44,7 +61,17 @@
},
"TerritoryId": 401,
"InteractionType": "AttuneAetherCurrent",
"AetherCurrentId": 2818117
"AetherCurrentId": 2818117,
"DisableNavmesh": true
},
{
"Position": {
"X": -755.9033,
"Y": -14.112402,
"Z": -177.06593
},
"TerritoryId": 401,
"InteractionType": "WalkTo"
},
{
"DataId": 1013090,

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -12,6 +12,7 @@
"Y": -14.34896,
"Z": 51.651733
},
"StopDistance": 5,
"TerritoryId": 419,
"InteractionType": "AcceptQuest"
}
@ -48,6 +49,14 @@
"AethernetShortcut": [
"[Ishgard] Athenaeum Astrologicum",
"[Ishgard] The Forgotten Knight"
],
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
@ -59,7 +68,50 @@
},
"TerritoryId": 418,
"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,
@ -69,7 +121,15 @@
"Z": 40.268433
},
"TerritoryId": 418,
"InteractionType": "Interact"
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
}
]
},
@ -98,6 +158,7 @@
"Y": -9.313226E-10,
"Z": 5.661072
},
"StopDistance": 7,
"TerritoryId": 433,
"InteractionType": "Interact"
}

View File

@ -29,7 +29,15 @@
},
"TerritoryId": 402,
"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,
@ -40,7 +48,15 @@
},
"TerritoryId": 402,
"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,
@ -50,7 +66,15 @@
"Z": -477.92786
},
"TerritoryId": 402,
"InteractionType": "Interact"
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
}
]
},

View File

@ -12,6 +12,7 @@
"Y": -176.4502,
"Z": -579.3393
},
"StopDistance": 7,
"TerritoryId": 402,
"InteractionType": "AcceptQuest",
"DialogueChoices": [
@ -34,6 +35,7 @@
"Y": -176.4502,
"Z": -577.5082
},
"StopDistance": 5,
"TerritoryId": 402,
"InteractionType": "Interact"
}
@ -57,6 +59,24 @@
{
"Sequence": 3,
"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,
"Position": {
@ -80,7 +100,8 @@
"Z": -619.8978
},
"TerritoryId": 402,
"InteractionType": "CompleteQuest"
"InteractionType": "CompleteQuest",
"DisableNavmesh": true
}
]
}

View File

@ -48,7 +48,15 @@
"KillEnemyDataIds": [
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,
@ -64,7 +72,15 @@
4943,
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,
@ -79,6 +95,14 @@
"KillEnemyDataIds": [
4614,
4942
],
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
}
]
@ -101,6 +125,24 @@
{
"Sequence": 255,
"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,
"Position": {

View File

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

View File

@ -13,7 +13,8 @@
"Z": -5.2339478
},
"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,
@ -88,6 +101,7 @@
"Y": 0.022254243,
"Z": 4.623413
},
"StopDistance": 5,
"TerritoryId": 433,
"InteractionType": "CompleteQuest"
}

View File

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

View File

@ -19,6 +19,12 @@ public sealed class SkipStepConditions
{
if (Never)
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.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Linq;
using System.Numerics;
@ -110,8 +111,24 @@ internal sealed class MovementController : IDisposable
}
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}]",
string.Join(" → ",
_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;
}
[MemberNotNull(nameof(Destination))]
private void PrepareNavigation(EMovementType type, uint? dataId, Vector3 to, bool fly, bool sprint,
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);
_logger.LogInformation("Pathfinding to {Destination}", Destination);
Destination.NavmeshCalculations++;
_cancellationTokenSource = new();
_cancellationTokenSource.CancelAfter(TimeSpan.FromSeconds(30));
_pathfindTask =
@ -336,7 +355,11 @@ internal sealed class MovementController : IDisposable
bool CanSprint,
bool IgnoreDistanceToObject,
bool Land,
bool UseNavmesh);
bool UseNavmesh)
{
public int NavmeshCalculations { get; set; }
public List<Vector3> PartialRoute { get; } = [];
}
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,
Vector3 Center,
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();
if (distance < MinDistance || distance > MaxDistance)
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,
Vector3 Original,
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();
if (distance > CheckDistance)
return null;
return Replacement;
return new AlternateLocation(Replacement, RecalculateNavmesh);
}
}

View File

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

View File

@ -1,5 +1,6 @@
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Numerics;
using Dalamud.Plugin.Services;
using Microsoft.Extensions.Logging;
@ -25,6 +26,7 @@ internal sealed class MovementOverrideController
// 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(48.5f, -8f, 98.25f), new(50.53978f, -8.046954f, 101.06045f)),
// ul'dah lamp near adventuer's guild
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
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)),
// 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.
/// </summary>
/// <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)
{
@ -93,17 +98,21 @@ internal sealed class MovementOverrideController
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",
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.Keys;
using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game;
using Microsoft.Extensions.Logging;
using Questionable.Controller.Steps;
using Questionable.Controller.Steps.Shared;
@ -28,7 +29,7 @@ internal sealed class QuestController
private readonly YesAlreadyIpc _yesAlreadyIpc;
private readonly IReadOnlyList<ITaskFactory> _taskFactories;
private readonly object _lock = new();
private readonly object _progressLock = new();
private QuestProgress? _startedQuest;
private QuestProgress? _nextQuest;
@ -37,6 +38,13 @@ internal sealed class QuestController
private ITask? _currentTask;
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(
IClientState clientState,
GameFunctions gameFunctions,
@ -90,13 +98,14 @@ internal sealed class QuestController
public void Reload()
{
lock (_lock)
lock (_progressLock)
{
_logger.LogInformation("Reload, resetting curent quest progress");
_startedQuest = null;
_nextQuest = null;
_simulatedQuest = null;
_safeAnimationEnd = DateTime.MinValue;
DebugState = null;
@ -106,6 +115,20 @@ internal sealed class QuestController
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();
if (!_clientState.IsLoggedIn || _condition[ConditionFlag.Unconscious])
@ -116,7 +139,8 @@ internal sealed class QuestController
_movementController.Stop();
_combatController.Stop();
}
} else if (_keyState[VirtualKey.ESCAPE])
}
else if (_keyState[VirtualKey.ESCAPE])
{
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 }
&& DateTime.Now >= CurrentQuest.StepProgress.StartedAt.AddSeconds(15))
{
lock (_lock)
lock (_progressLock)
{
_logger.LogWarning("Quest accept apparently didn't work out, resetting progress");
CurrentQuest.SetStep(0);
@ -149,7 +173,7 @@ internal sealed class QuestController
private void UpdateCurrentQuest()
{
lock (_lock)
lock (_progressLock)
{
DebugState = null;
@ -249,6 +273,12 @@ internal sealed class QuestController
return;
}
if (DateTime.Now < _safeAnimationEnd)
{
DebugState = "Waiting for Animation";
return;
}
if (questToRun.Sequence != currentSequence)
{
questToRun.SetSequence(currentSequence);
@ -302,7 +332,7 @@ internal sealed class QuestController
public void IncreaseStepCount(ushort? questId, int? sequence, bool shouldContinue = false)
{
lock (_lock)
lock (_progressLock)
{
(QuestSequence? seq, QuestStep? step) = GetNextStep();
if (CurrentQuest == null || seq == null || step == null)
@ -587,7 +617,7 @@ internal sealed class QuestController
public void Skip(ushort questQuestId, byte currentQuestSequence)
{
lock (_lock)
lock (_progressLock)
{
if (_currentTask is ISkippableTask)
_currentTask = null;

View File

@ -79,6 +79,20 @@ internal static class SkipCondition
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 &&
SkipConditions.QuestsCompleted.All(gameFunctions.IsQuestComplete))
{