Show quest dependencies in quest selection window, add /qst zone as shortcut to show all (mapped) quests starting in the current zone

This commit is contained in:
Liza 2024-07-15 20:20:46 +02:00
parent a0e675cbdc
commit 0eb77927b3
Signed by: liza
GPG Key ID: 7199F8D727D55F67
35 changed files with 2775 additions and 33 deletions

View File

@ -173,6 +173,8 @@ public static class RoslynShortcuts
SyntaxNodeList(
Assignment(nameof(ComplexCombatData.DataId), complexCombatData.DataId, default(uint))
.AsSyntaxNodeOrToken(),
Assignment(nameof(ComplexCombatData.MinimumKillCount), complexCombatData.MinimumKillCount, null)
.AsSyntaxNodeOrToken(),
Assignment(nameof(ComplexCombatData.RewardItemId), complexCombatData.RewardItemId, null)
.AsSyntaxNodeOrToken(),
Assignment(nameof(ComplexCombatData.RewardItemCount), complexCombatData.RewardItemCount, null)

View File

@ -0,0 +1,56 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048960,
"Position": {
"X": -405.84424,
"Y": 23.562847,
"Z": -476.61554
},
"TerritoryId": 1189,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"Position": {
"X": -455.06216,
"Y": 20.027777,
"Z": 46.272446
},
"TerritoryId": 1189,
"InteractionType": "Combat",
"EnemySpawnType": "OverworldEnemies",
"KillEnemyDataIds": [
17268
],
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048960,
"Position": {
"X": -405.84424,
"Y": 23.562847,
"Z": -476.61554
},
"TerritoryId": 1189,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Yak T'el - Iq Br'aax"
}
]
}
]
}

View File

@ -0,0 +1,102 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1051071,
"Position": {
"X": -554.03986,
"Y": 1.3156406,
"Z": -489.3416
},
"TerritoryId": 1189,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"Position": {
"X": -596.55597,
"Y": 2.3708515,
"Z": -493.64908
},
"TerritoryId": 1189,
"InteractionType": "WalkTo",
"Fly": true
},
{
"Position": {
"X": -615.2386,
"Y": -44.093876,
"Z": -495.7548
},
"TerritoryId": 1189,
"InteractionType": "WalkTo",
"Fly": true,
"DisableNavmesh": true
},
{
"DataId": 2014307,
"Position": {
"X": -729.7932,
"Y": -107.83557,
"Z": -674.8608
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"Position": {
"X": -615.2386,
"Y": -44.093876,
"Z": -495.7548
},
"TerritoryId": 1189,
"InteractionType": "WalkTo",
"Fly": true
},
{
"Position": {
"X": -596.55597,
"Y": 2.3708515,
"Z": -493.64908
},
"TerritoryId": 1189,
"InteractionType": "WalkTo",
"Fly": true,
"DisableNavmesh": true
},
{
"DataId": 1051071,
"Position": {
"X": -554.03986,
"Y": 1.3156406,
"Z": -489.3416
},
"TerritoryId": 1189,
"InteractionType": "CompleteQuest",
"Fly": true,
"DialogueChoices": [
{
"Type": "List",
"Prompt": "TEXT_KINGZD002_05091_Q1_000_000",
"Answer": "TEXT_KINGZD002_05091_A1_000_001"
}
]
}
]
}
]
}

View File

@ -0,0 +1,78 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1051057,
"Position": {
"X": -343.67902,
"Y": 18.885578,
"Z": -404.22675
},
"TerritoryId": 1189,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"Position": {
"X": 158.97704,
"Y": 0.80940175,
"Z": -773.5188
},
"StopDistance": 1,
"TerritoryId": 1189,
"InteractionType": "Combat",
"AetheryteShortcut": "Tuliyollal",
"EnemySpawnType": "AutoOnEnterArea",
"KillEnemyDataIds": [
17663
],
"AethernetShortcut": [
"[Tuliyollal] Aetheryte Plaza",
"[Tuliyollal] Dirigible Landing (Yak T'el)"
]
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1051058,
"Position": {
"X": 159.47205,
"Y": 0.81595546,
"Z": -770.19916
},
"StopDistance": 7,
"TerritoryId": 1189,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1051057,
"Position": {
"X": -343.67902,
"Y": 18.885578,
"Z": -404.22675
},
"TerritoryId": 1189,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Yak T'el - Iq Br'aax",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,67 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048928,
"Position": {
"X": 36.301147,
"Y": 8.205902,
"Z": -645.1362
},
"TerritoryId": 1189,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1051072,
"Position": {
"X": -39.07837,
"Y": 4.3051004,
"Z": -332.87555
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1051072,
"Position": {
"X": -39.07837,
"Y": 4.3051004,
"Z": -332.87555
},
"TerritoryId": 1189,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048928,
"Position": {
"X": 36.301147,
"Y": 8.205902,
"Z": -645.1362
},
"TerritoryId": 1189,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -0,0 +1,75 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1051061,
"Position": {
"X": -407.79742,
"Y": 28.068892,
"Z": -360.55542
},
"TerritoryId": 1189,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1051062,
"Position": {
"X": -489.5247,
"Y": -29.96456,
"Z": -94.83484
},
"TerritoryId": 1189,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [
17664,
17665
],
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1051062,
"Position": {
"X": -489.5247,
"Y": -29.96456,
"Z": -94.83484
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"StopDistance": 7
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1051061,
"Position": {
"X": -407.79742,
"Y": 28.068892,
"Z": -360.55542
},
"TerritoryId": 1189,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Yak T'el - Iq Br'aax",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,99 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1051065,
"Position": {
"X": 380.7583,
"Y": 21.437008,
"Z": -496.84903
},
"TerritoryId": 1189,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2014264,
"Position": {
"X": 405.1422,
"Y": 20.85907,
"Z": -482.10883
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 2014266,
"Position": {
"X": 430.83838,
"Y": 20.126648,
"Z": -456.71783
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"DataId": 2014265,
"Position": {
"X": 395.92578,
"Y": 20.34021,
"Z": -453.02515
},
"TerritoryId": 1189,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [
17666
],
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1051065,
"Position": {
"X": 380.7583,
"Y": 21.437008,
"Z": -496.84903
},
"TerritoryId": 1189,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -0,0 +1,103 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1051364,
"Position": {
"X": -9.353821,
"Y": 8.205902,
"Z": -652.9183
},
"TerritoryId": 1189,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1048961,
"Position": {
"X": -444.38855,
"Y": 28.068893,
"Z": -363.66827
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"AetheryteShortcut": "Yak T'el - Iq Br'aax",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"Position": {
"X": -632.6718,
"Y": 25.245409,
"Z": -159.94264
},
"TerritoryId": 1189,
"InteractionType": "WalkTo",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
-128
]
},
{
"DataId": 1048995,
"Position": {
"X": -639.27673,
"Y": 26.716875,
"Z": -161.05902
},
"StopDistance": 7,
"TerritoryId": 1189,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1051410,
"Position": {
"X": -9.140198,
"Y": 8.205902,
"Z": -652.9183
},
"TerritoryId": 1189,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Tuliyollal",
"AethernetShortcut": [
"[Tuliyollal] Aetheryte Plaza",
"[Tuliyollal] Dirigible Landing (Yak T'el)"
]
}
]
}
]
}

View File

@ -0,0 +1,185 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048996,
"Position": {
"X": -618.43286,
"Y": 25.709108,
"Z": -153.91785
},
"TerritoryId": 1189,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1051365,
"Position": {
"X": -738.3383,
"Y": 22.137896,
"Z": -85.404785
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"Position": {
"X": -580.44604,
"Y": 22.457048,
"Z": -3.286837
},
"TerritoryId": 1189,
"InteractionType": "WalkTo",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
-128
]
},
{
"DataId": 2014313,
"Position": {
"X": -581.75024,
"Y": 23.697266,
"Z": -2.9450073
},
"TerritoryId": 1189,
"InteractionType": "UseItem",
"ItemId": 2003683,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"Position": {
"X": -506.6366,
"Y": 22.817732,
"Z": 32.985153
},
"TerritoryId": 1189,
"InteractionType": "WalkTo",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
-64
]
},
{
"DataId": 2014314,
"Position": {
"X": -505.9129,
"Y": 23.88031,
"Z": 32.455933
},
"TerritoryId": 1189,
"InteractionType": "UseItem",
"ItemId": 2003683,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"Position": {
"X": -414.84598,
"Y": 20.493914,
"Z": 74.74898
},
"TerritoryId": 1189,
"InteractionType": "WalkTo",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
-32
]
},
{
"DataId": 2014315,
"Position": {
"X": -413.96204,
"Y": 21.896606,
"Z": 74.021484
},
"TerritoryId": 1189,
"InteractionType": "UseItem",
"ItemId": 2003683,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1051365,
"Position": {
"X": -738.3383,
"Y": 22.137896,
"Z": -85.404785
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048996,
"Position": {
"X": -618.43286,
"Y": 25.709108,
"Z": -153.91785
},
"TerritoryId": 1189,
"InteractionType": "CompleteQuest",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,52 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1051366,
"Position": {
"X": -399.95422,
"Y": 20.145584,
"Z": -402.4262
},
"TerritoryId": 1189,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1051367,
"Position": {
"X": -503.95975,
"Y": 29.007706,
"Z": -394.43048
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1051368,
"Position": {
"X": -501.27414,
"Y": 28.982998,
"Z": -394.3084
},
"TerritoryId": 1189,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -0,0 +1,53 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048982,
"Position": {
"X": 595.45276,
"Y": -137.17401,
"Z": 564.8126
},
"TerritoryId": 1189,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2014250,
"Position": {
"X": 598.3214,
"Y": -137.19391,
"Z": 557.7018
},
"TerritoryId": 1189,
"InteractionType": "Instruction",
"Comment": "Inspect Flag, Red Head, Blue Head"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048982,
"Position": {
"X": 595.45276,
"Y": -137.17401,
"Z": 564.8126
},
"StopDistance": 7,
"TerritoryId": 1189,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -0,0 +1,152 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048984,
"Position": {
"X": 673.06006,
"Y": -135.17874,
"Z": 577.47766
},
"TerritoryId": 1189,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"Position": {
"X": -92.00457,
"Y": -212.91975,
"Z": 624.4216
},
"TerritoryId": 1189,
"InteractionType": "WalkTo",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
-128
]
},
{
"DataId": 1051049,
"Position": {
"X": -89.49426,
"Y": -213.64497,
"Z": 625.574
},
"StopDistance": 4,
"TerritoryId": 1189,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
-128
]
},
{
"Position": {
"X": -122.188805,
"Y": -214.08376,
"Z": 674.54083
},
"TerritoryId": 1189,
"InteractionType": "WalkTo",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
-32
]
},
{
"DataId": 1051051,
"Position": {
"X": -122.88098,
"Y": -213.78055,
"Z": 673.39575
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
},
{
"Position": {
"X": -142.65875,
"Y": -213.42487,
"Z": 608.63165
},
"TerritoryId": 1189,
"InteractionType": "WalkTo",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
-64
]
},
{
"DataId": 1051050,
"Position": {
"X": -143.63324,
"Y": -213.18237,
"Z": 609.0028
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048984,
"Position": {
"X": 673.06006,
"Y": -135.17874,
"Z": 577.47766
},
"TerritoryId": 1189,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Yak T'el - Mamook",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,116 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048988,
"Position": {
"X": 584.4967,
"Y": -143.46597,
"Z": 648.64575
},
"TerritoryId": 1189,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2014369,
"Position": {
"X": 328.20618,
"Y": -157.21375,
"Z": 429.4651
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
16
]
},
{
"DataId": 2014368,
"Position": {
"X": 323.7201,
"Y": -157.76306,
"Z": 434.19543
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"DataId": 2014256,
"Position": {
"X": 139.17749,
"Y": -162.24927,
"Z": 679.95715
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 2014257,
"Position": {
"X": 144.67078,
"Y": -163.25635,
"Z": 663.84375
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048988,
"Position": {
"X": 584.4967,
"Y": -143.46597,
"Z": 648.64575
},
"TerritoryId": 1189,
"InteractionType": "CompleteQuest",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,163 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048987,
"Position": {
"X": 596.97876,
"Y": -142.60623,
"Z": 441.7334
},
"TerritoryId": 1189,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1051053,
"Position": {
"X": 257.1908,
"Y": -165.78062,
"Z": 146.74597
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"Fly": true,
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_KINGZD105_05104_SYSTEM_100_004",
"Yes": true
}
]
}
]
},
{
"Sequence": 2,
"Steps": [
{
"Position": {
"X": 272.75598,
"Y": -161.77667,
"Z": 117.129616
},
"TerritoryId": 1189,
"InteractionType": "WalkTo",
"Mount": true,
"DisableNavmesh": true
},
{
"Position": {
"X": 255.7041,
"Y": -161.34225,
"Z": 101.95002
},
"TerritoryId": 1189,
"InteractionType": "WalkTo",
"DisableNavmesh": true
},
{
"DataId": 1051053,
"Position": {
"X": 218.3051,
"Y": -160.72849,
"Z": 78.95244
},
"TerritoryId": 1189,
"InteractionType": "WaitForNpcAtPosition",
"DisableNavmesh": true
},
{
"DataId": 1051053,
"Position": {
"X": 168.0448,
"Y": -158.83824,
"Z": 31.171473
},
"TerritoryId": 1189,
"InteractionType": "WaitForNpcAtPosition",
"DisableNavmesh": true
},
{
"DataId": 1051053,
"Position": {
"X": 144.163,
"Y": -156.25887,
"Z": -57.818764
},
"TerritoryId": 1189,
"InteractionType": "WaitForNpcAtPosition",
"DisableNavmesh": true
},
{
"Position": {
"X": 83.32947,
"Y": -157.21858,
"Z": -67.64331
},
"StopDistance": 1,
"TerritoryId": 1189,
"InteractionType": "WalkTo",
"DisableNavmesh": true
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1051054,
"Position": {
"X": 83.32947,
"Y": -157.21858,
"Z": -67.64331
},
"TerritoryId": 1189,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 2014259,
"Position": {
"X": 65.049194,
"Y": -184.1612,
"Z": -70.237305
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"DisableNavmesh": true,
"Mount": false
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048987,
"Position": {
"X": 596.97876,
"Y": -142.60623,
"Z": 441.7334
},
"TerritoryId": 1189,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Yak T'el - Mamook",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,92 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1051055,
"Position": {
"X": 563.5918,
"Y": -144.04688,
"Z": 702.26587
},
"TerritoryId": 1189,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"Position": {
"X": -45.87303,
"Y": -174.86252,
"Z": 649.25995
},
"TerritoryId": 1189,
"InteractionType": "WalkTo",
"Fly": true
},
{
"DataId": 1051056,
"Position": {
"X": -49.149292,
"Y": -174.58734,
"Z": 651.4839
},
"StopDistance": 5,
"TerritoryId": 1189,
"InteractionType": "Interact",
"DisableNavmesh": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1051056,
"Position": {
"X": -49.149292,
"Y": -174.58734,
"Z": 651.4839
},
"StopDistance": 5,
"TerritoryId": 1189,
"InteractionType": "Say",
"ChatMessage": {
"Key": "TEXT_KINGZD106_05105_SAYTODO_000_011"
}
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1051055,
"Position": {
"X": 563.5918,
"Y": -144.04688,
"Z": 702.26587
},
"TerritoryId": 1189,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Yak T'el - Mamook",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,90 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048991,
"Position": {
"X": 211.10852,
"Y": -160.27475,
"Z": 432.4253
},
"TerritoryId": 1189,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"Position": {
"X": 178.30347,
"Y": -195.42366,
"Z": 241.28633
},
"TerritoryId": 1189,
"InteractionType": "WalkTo",
"Fly": true
},
{
"DataId": 2014260,
"Position": {
"X": 177.44714,
"Y": -194.11005,
"Z": 239.61243
},
"TerritoryId": 1189,
"InteractionType": "UseItem",
"ItemId": 2003667,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 2014261,
"Position": {
"X": 164.47693,
"Y": -194.2627,
"Z": 237.50659
},
"TerritoryId": 1189,
"InteractionType": "UseItem",
"ItemId": 2003667,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048991,
"Position": {
"X": 211.10852,
"Y": -160.27475,
"Z": 432.4253
},
"TerritoryId": 1189,
"InteractionType": "CompleteQuest",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,107 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048998,
"Position": {
"X": 220.29443,
"Y": -156.80957,
"Z": 457.02295
},
"TerritoryId": 1189,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1051408,
"Position": {
"X": 631.2809,
"Y": -137.12654,
"Z": 509.6665
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"AetheryteShortcut": "Yak T'el - Mamook",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"DataId": 1048974,
"Position": {
"X": 621.51514,
"Y": -135.12726,
"Z": 531.1207
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
},
{
"DataId": 1048989,
"Position": {
"X": 523.4302,
"Y": -135.12724,
"Z": 578.14905
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048998,
"Position": {
"X": 220.29443,
"Y": -156.80957,
"Z": 457.02295
},
"TerritoryId": 1189,
"InteractionType": "CompleteQuest",
"Fly": true,
"DialogueChoices": [
{
"Type": "List",
"Prompt": "TEXT_KINGZD108_05107_Q1_000_000",
"Answer": "TEXT_KINGZD108_05107_A1_000_001"
}
]
}
]
}
]
}

View File

@ -0,0 +1,60 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1051067,
"Position": {
"X": -372.70166,
"Y": -162.24626,
"Z": 546.25757
},
"TerritoryId": 1189,
"InteractionType": "AcceptQuest",
"Fly": true
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2014262,
"Position": {
"X": -443.83917,
"Y": -158.1903,
"Z": 343.34326
},
"TerritoryId": 1189,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [
17743,
17744,
17745
],
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1051067,
"Position": {
"X": -372.70166,
"Y": -162.24626,
"Z": 546.25757
},
"TerritoryId": 1189,
"InteractionType": "CompleteQuest",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,97 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048997,
"Position": {
"X": -363.9124,
"Y": -162.23582,
"Z": 550.01135
},
"TerritoryId": 1189,
"InteractionType": "AcceptQuest",
"Fly": true
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1051387,
"Position": {
"X": -383.4745,
"Y": -166.23917,
"Z": 662.95874
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"Position": {
"X": -433.617,
"Y": -156.24463,
"Z": 776.9229
},
"TerritoryId": 1189,
"InteractionType": "Instruction",
"Comment": "TODO Needs item use; manual for now (also unsure on health percent)",
"EnemySpawnType": "OverworldEnemies",
"ComplexCombatData": [
{
"DataId": 17267,
"MinimumKillCount": 2,
"ItemId": 2003669,
"ItemUseHealthMaxPercent": 25,
"RewardItemId": 2003670,
"RewardItemCount": 2
}
],
"Fly": true
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1051387,
"Position": {
"X": -383.4745,
"Y": -166.23917,
"Z": 662.95874
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048997,
"Position": {
"X": -363.9124,
"Y": -162.23582,
"Z": 550.01135
},
"TerritoryId": 1189,
"InteractionType": "CompleteQuest",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,97 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1050873,
"Position": {
"X": -455.10034,
"Y": 17.027555,
"Z": -478.8739
},
"TerritoryId": 1189,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1050874,
"Position": {
"X": -508.87314,
"Y": 29.61908,
"Z": -350.1183
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1050876,
"Position": {
"X": -455.92438,
"Y": 30.374397,
"Z": -423.148
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 1050875,
"Position": {
"X": -391.01245,
"Y": 28.068893,
"Z": -365.0111
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1050874,
"Position": {
"X": -508.87314,
"Y": 29.61908,
"Z": -350.1183
},
"TerritoryId": 1189,
"InteractionType": "CompleteQuest",
"Fly": true,
"NextQuestId": 5112
}
]
}
]
}

View File

@ -0,0 +1,77 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1050874,
"Position": {
"X": -508.87314,
"Y": 29.61908,
"Z": -350.1183
},
"TerritoryId": 1189,
"InteractionType": "AcceptQuest",
"DialogueChoices": [
{
"Type": "List",
"Prompt": "TEXT_KINGZD203_05112_Q1_000_000",
"Answer": "TEXT_KINGZD203_05112_A1_000_001"
}
]
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1050877,
"Position": {
"X": -39.871887,
"Y": 0.35915944,
"Z": -312.1233
},
"StopDistance": 1,
"TerritoryId": 1189,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 2014144,
"Position": {
"X": -43.10681,
"Y": 0.503479,
"Z": -312.36743
},
"TerritoryId": 1189,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1050878,
"Position": {
"X": 475.30322,
"Y": 18.197147,
"Z": -326.95508
},
"TerritoryId": 1189,
"InteractionType": "CompleteQuest",
"Fly": true,
"NextQuestId": 5113
}
]
}
]
}

View File

@ -0,0 +1,90 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1050878,
"Position": {
"X": 475.30322,
"Y": 18.197147,
"Z": -326.95508
},
"TerritoryId": 1189,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1050879,
"Position": {
"X": 595.7274,
"Y": 18.8562,
"Z": -85.55737
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"Position": {
"X": 705.4334,
"Y": 28.302685,
"Z": 2.3153868
},
"StopDistance": 1,
"TerritoryId": 1189,
"InteractionType": "Combat",
"EnemySpawnType": "AutoOnEnterArea",
"KillEnemyDataIds": [
17671,
17672
],
"Fly": true
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1050881,
"Position": {
"X": 595.6052,
"Y": 18.84498,
"Z": -85.55737
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1050882,
"Position": {
"X": -408.31616,
"Y": 20.383144,
"Z": -399.28284
},
"TerritoryId": 1189,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Yak T'el - Iq Br'aax"
}
]
}
]
}

View File

@ -0,0 +1,125 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1050888,
"Position": {
"X": 515.58704,
"Y": -146.73436,
"Z": 477.0122
},
"TerritoryId": 1189,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2014147,
"Position": {
"X": 440.66528,
"Y": -150.77448,
"Z": 427.7256
},
"TerritoryId": 1189,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [
17674
],
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 2014148,
"Position": {
"X": 395.4679,
"Y": -152.42242,
"Z": 372.7931
},
"TerritoryId": 1189,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [
17674
],
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"DataId": 2014149,
"Position": {
"X": 267.9026,
"Y": -160.05188,
"Z": 354.45166
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 2014150,
"Position": {
"X": 236.95728,
"Y": -167.52887,
"Z": 307.97278
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1050890,
"Position": {
"X": 661.7991,
"Y": -137.174,
"Z": 557.76294
},
"TerritoryId": 1189,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Yak T'el - Mamook",
"Fly": true,
"NextQuestId": 5116
}
]
}
]
}

View File

@ -0,0 +1,80 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1050891,
"Position": {
"X": 662.8672,
"Y": -137.17401,
"Z": 556.115
},
"TerritoryId": 1189,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1048985,
"Position": {
"X": 595.11694,
"Y": -143.83003,
"Z": 710.68884
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"Position": {
"X": -61.729744,
"Y": -212.69492,
"Z": 523.0088
},
"TerritoryId": 1189,
"InteractionType": "WalkTo",
"Fly": true
},
{
"DataId": 2014151,
"Position": {
"X": -60.95984,
"Y": -210.83392,
"Z": 522.02637
},
"TerritoryId": 1189,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1050891,
"Position": {
"X": 662.8672,
"Y": -137.17401,
"Z": 556.115
},
"TerritoryId": 1189,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Yak T'el - Mamook",
"Fly": true,
"NextQuestId": 5117
}
]
}
]
}

View File

@ -0,0 +1,86 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1050891,
"Position": {
"X": 662.8672,
"Y": -137.17401,
"Z": 556.115
},
"TerritoryId": 1189,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2014153,
"Position": {
"X": 500.5111,
"Y": -150.04199,
"Z": 704.12744
},
"TerritoryId": 1189,
"InteractionType": "UseItem",
"ItemId": 2003624,
"GroundTarget": true,
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"DataId": 2014152,
"Position": {
"X": 486.90015,
"Y": -150.04199,
"Z": 355.8556
},
"TerritoryId": 1189,
"InteractionType": "UseItem",
"ItemId": 2003624,
"GroundTarget": true,
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1050891,
"Position": {
"X": 662.8672,
"Y": -137.17401,
"Z": 556.115
},
"TerritoryId": 1189,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Yak T'el - Mamook",
"Fly": true,
"NextQuestId": 5118
}
]
}
]
}

View File

@ -0,0 +1,219 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1050891,
"Position": {
"X": 662.8672,
"Y": -137.17401,
"Z": 556.115
},
"TerritoryId": 1189,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1050897,
"Position": {
"X": 755.94714,
"Y": -132.59648,
"Z": 505.94324
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"Fly": true,
"DialogueChoices": [
{
"Type": "List",
"Prompt": "TEXT_KINGZD401_05118_Q1_000_000",
"Answer": "TEXT_KINGZD401_05118_A1_000_001"
}
]
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1050891,
"Position": {
"X": 662.8672,
"Y": -137.17401,
"Z": 556.115
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1050901,
"Position": {
"X": 627.25244,
"Y": -137.174,
"Z": 591.8517
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"DataId": 1050900,
"Position": {
"X": 575.55493,
"Y": -137.174,
"Z": 540.0929
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 1048989,
"Position": {
"X": 523.4302,
"Y": -135.12724,
"Z": 578.14905
},
"TerritoryId": 1189,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 5,
"Steps": [
{
"DataId": 1050891,
"Position": {
"X": 662.8672,
"Y": -137.17401,
"Z": 556.115
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 6,
"Steps": [
{
"DataId": 1050904,
"Position": {
"X": 263.84375,
"Y": -157.31726,
"Z": 738.6129
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 7,
"Steps": [
{
"DataId": 2014154,
"Position": {
"X": 255.9701,
"Y": -150.68292,
"Z": 807.64465
},
"TerritoryId": 1189,
"InteractionType": "UseItem",
"ItemId": 2003625,
"Fly": true
}
]
},
{
"Sequence": 8,
"Steps": [
{
"DataId": 2014248,
"Position": {
"X": 255.9701,
"Y": -150.68292,
"Z": 807.64465
},
"TerritoryId": 1189,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [
17675
]
}
]
},
{
"Sequence": 9,
"Steps": [
{
"DataId": 1050904,
"Position": {
"X": 263.84375,
"Y": -157.31726,
"Z": 738.6129
},
"TerritoryId": 1189,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1050903,
"Position": {
"X": 663.9962,
"Y": -137.17401,
"Z": 554.589
},
"TerritoryId": 1189,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Yak T'el - Mamook",
"Fly": true
}
]
}
]
}

View File

@ -550,6 +550,10 @@
"description": "The enemy data id which is supposed to be killed",
"type": "integer"
},
"MinimumKillCount": {
"description": "Overworld mobs: If this number of mobs has been killed, will wait a bit before attempting to pull another mob to see if the quest progresses",
"type": "integer"
},
"RewardItemId": {
"type": "integer"
},

View File

@ -5,6 +5,10 @@ namespace Questionable.Model.V1;
public sealed class ComplexCombatData
{
public uint DataId { get; set; }
// TODO Use this
public uint? MinimumKillCount { get; set; }
public uint? RewardItemId { get; set; }
public int? RewardItemCount { get; set; }
public IList<short?> CompletionQuestVariablesFlags { get; set; } = new List<short?>();

View File

@ -22,11 +22,14 @@ internal sealed class CommandHandler : IDisposable
private readonly QuestWindow _questWindow;
private readonly QuestSelectionWindow _questSelectionWindow;
private readonly ITargetManager _targetManager;
private readonly GameFunctions _gameFunctions;
private readonly IClientState _clientState;
public CommandHandler(ICommandManager commandManager, IChatGui chatGui, QuestController questController,
MovementController movementController, QuestRegistry questRegistry,
ConfigWindow configWindow, DebugOverlay debugOverlay, QuestWindow questWindow,
QuestSelectionWindow questSelectionWindow, ITargetManager targetManager)
QuestSelectionWindow questSelectionWindow, ITargetManager targetManager, GameFunctions gameFunctions,
IClientState clientState)
{
_commandManager = commandManager;
_chatGui = chatGui;
@ -38,6 +41,8 @@ internal sealed class CommandHandler : IDisposable
_questWindow = questWindow;
_questSelectionWindow = questSelectionWindow;
_targetManager = targetManager;
_gameFunctions = gameFunctions;
_clientState = clientState;
_commandManager.AddHandler("/qst", new CommandInfo(ProcessCommand)
{
@ -77,7 +82,12 @@ internal sealed class CommandHandler : IDisposable
break;
case "which":
_questSelectionWindow.Open(_targetManager.Target);
_questSelectionWindow.OpenForTarget(_targetManager.Target);
break;
case "z":
case "zone":
_questSelectionWindow.OpenForZone(_clientState.TerritoryType);
break;
default:
@ -96,7 +106,9 @@ internal sealed class CommandHandler : IDisposable
if (arguments.Length >= 1 && ushort.TryParse(arguments[0], out ushort questId))
{
if (_questRegistry.TryGetQuest(questId, out Quest? quest))
if (_gameFunctions.IsQuestLocked(questId, 0))
_chatGui.PrintError($"[Questionable] Quest {questId} is locked.");
else if (_questRegistry.TryGetQuest(questId, out Quest? quest))
{
_debugOverlay.HighlightedQuest = questId;
_chatGui.Print($"[Questionable] Set highlighted quest to {questId} ({quest.Info.Name}).");

View File

@ -36,6 +36,7 @@ internal sealed class QuestRegistry
_logger = logger;
}
public IEnumerable<Quest> AllQuests => _quests.Values;
public int Count => _quests.Count;
public void Reload()

View File

@ -18,24 +18,33 @@ internal static class NextQuest
if (step.NextQuestId == null)
return null;
if (step.NextQuestId.Value == quest.QuestId)
return null;
return serviceProvider.GetRequiredService<SetQuest>()
.With(step.NextQuestId.Value);
.With(step.NextQuestId.Value, quest.QuestId);
}
}
internal sealed class SetQuest(QuestRegistry questRegistry, QuestController questController, ILogger<SetQuest> logger) : ITask
internal sealed class SetQuest(QuestRegistry questRegistry, QuestController questController, GameFunctions gameFunctions, ILogger<SetQuest> logger) : ITask
{
public ushort NextQuestId { get; set; }
public ushort CurrentQuestId { get; set; }
public ITask With(ushort nextQuestId)
public ITask With(ushort nextQuestId, ushort currentQuestId)
{
NextQuestId = nextQuestId;
CurrentQuestId = currentQuestId;
return this;
}
public bool Start()
{
if (questRegistry.TryGetQuest(NextQuestId, out Quest? quest))
if (gameFunctions.IsQuestLocked(NextQuestId, CurrentQuestId))
{
logger.LogInformation("Can't set next quest to {QuestId}, quest is locked", NextQuestId);
}
else if (questRegistry.TryGetQuest(NextQuestId, out Quest? quest))
{
logger.LogInformation("Setting next quest to {QuestId}: '{QuestName}'", NextQuestId, quest.Info.Name);
questController.SetNextQuest(quest);

View File

@ -21,6 +21,8 @@ using Lumina.Excel.CustomSheets;
using Lumina.Excel.GeneratedSheets2;
using Microsoft.Extensions.Logging;
using Questionable.Controller;
using Questionable.Data;
using Questionable.Model;
using Questionable.Model.V1;
using Action = Lumina.Excel.GeneratedSheets2.Action;
using BattleChara = FFXIVClientStructs.FFXIV.Client.Game.Character.BattleChara;
@ -45,6 +47,7 @@ internal sealed unsafe class GameFunctions
private readonly ICondition _condition;
private readonly IClientState _clientState;
private readonly QuestRegistry _questRegistry;
private readonly QuestData _questData;
private readonly IGameGui _gameGui;
private readonly Configuration _configuration;
private readonly ILogger<GameFunctions> _logger;
@ -55,6 +58,7 @@ internal sealed unsafe class GameFunctions
ICondition condition,
IClientState clientState,
QuestRegistry questRegistry,
QuestData questData,
IGameGui gameGui,
Configuration configuration,
ILogger<GameFunctions> logger)
@ -65,6 +69,7 @@ internal sealed unsafe class GameFunctions
_condition = condition;
_clientState = clientState;
_questRegistry = questRegistry;
_questData = questData;
_gameGui = gameGui;
_configuration = configuration;
_logger = logger;
@ -246,7 +251,7 @@ internal sealed unsafe class GameFunctions
public bool IsQuestAcceptedOrComplete(ushort questId)
{
return QuestManager.IsQuestComplete(questId) || IsQuestAccepted(questId);
return IsQuestComplete(questId) || IsQuestAccepted(questId);
}
public bool IsQuestAccepted(ushort questId)
@ -255,6 +260,38 @@ internal sealed unsafe class GameFunctions
return questManager->IsQuestAccepted(questId);
}
public bool IsQuestComplete(ushort questId)
{
return QuestManager.IsQuestComplete(questId);
}
public bool IsQuestLocked(ushort questId, ushort? extraCompletedQuest = null)
{
var questInfo = _questData.GetQuestInfo(questId);
if (questInfo.QuestLocks.Count > 0)
{
var completedQuests = questInfo.QuestLocks.Count(x => IsQuestComplete(x) || x == extraCompletedQuest);
if (questInfo.QuestLockJoin == QuestInfo.QuestJoin.All && questInfo.QuestLocks.Count == completedQuests)
return true;
else if (questInfo.QuestLockJoin == QuestInfo.QuestJoin.AtLeastOne && completedQuests > 0)
return true;
}
if (questInfo.PreviousQuests.Count > 0)
{
var completedQuests = questInfo.PreviousQuests.Count(x => IsQuestComplete(x) || x == extraCompletedQuest);
if (questInfo.PreviousQuestJoin == QuestInfo.QuestJoin.All &&
questInfo.PreviousQuests.Count == completedQuests)
return false;
else if (questInfo.PreviousQuestJoin == QuestInfo.QuestJoin.AtLeastOne && completedQuests > 0)
return false;
else
return true;
}
return false;
}
public bool IsAetheryteUnlocked(uint aetheryteId, out byte subIndex)
{
subIndex = 0;

View File

@ -1,5 +1,9 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using Dalamud.Game.Text;
using JetBrains.Annotations;
using ExcelQuest = Lumina.Excel.GeneratedSheets.Quest;
namespace Questionable.Model;
@ -13,6 +17,11 @@ internal sealed class QuestInfo
Level = quest.ClassJobLevel0;
IssuerDataId = quest.IssuerStart;
IsRepeatable = quest.IsRepeatable;
PreviousQuests = quest.PreviousQuest.Select(x => (ushort)(x.Row & 0xFFFF)).Where(x => x != 0).ToImmutableList();
PreviousQuestJoin = (QuestJoin)quest.PreviousQuestJoin;
QuestLocks = quest.QuestLock.Select(x => (ushort)(x.Row & 0xFFFFF)).Where(x => x != 0).ToImmutableList();
QuestLockJoin = (QuestJoin)quest.QuestLockJoin;
IsMainScenarioQuest = quest.JournalGenre?.Value?.JournalCategory?.Value?.JournalSection?.Row is 0 or 1;
}
public ushort QuestId { get; }
@ -20,7 +29,20 @@ internal sealed class QuestInfo
public ushort Level { get; }
public uint IssuerDataId { get; }
public bool IsRepeatable { get; }
public ImmutableList<ushort> PreviousQuests { get; }
public QuestJoin PreviousQuestJoin { get; }
public bool IsMainScenarioQuest { get; }
public ImmutableList<ushort> QuestLocks { get; set; }
public QuestJoin QuestLockJoin { get; set; }
public string SimplifiedName => Name
.TrimStart(SeIconChar.QuestSync.ToIconChar(), SeIconChar.QuestRepeatable.ToIconChar(), ' ');
[UsedImplicitly(ImplicitUseKindFlags.Assign, ImplicitUseTargetFlags.Members)]
public enum QuestJoin : byte
{
None = 0,
All = 1,
AtLeastOne = 2,
}
}

View File

@ -29,13 +29,15 @@ internal sealed class QuestSelectionWindow : LWindow
private readonly QuestController _questController;
private readonly QuestRegistry _questRegistry;
private readonly IDalamudPluginInterface _pluginInterface;
private readonly TerritoryData _territoryData;
private List<QuestInfo> _quests = [];
private List<QuestInfo> _offeredQuests = [];
private bool _onlyAvailableQuests = true;
public QuestSelectionWindow(QuestData questData, IGameGui gameGui, IChatGui chatGui, GameFunctions gameFunctions,
QuestController questController, QuestRegistry questRegistry, IDalamudPluginInterface pluginInterface)
QuestController questController, QuestRegistry questRegistry, IDalamudPluginInterface pluginInterface,
TerritoryData territoryData)
: base($"Quest Selection{WindowId}")
{
_questData = questData;
@ -45,6 +47,7 @@ internal sealed class QuestSelectionWindow : LWindow
_questController = questController;
_questRegistry = questRegistry;
_pluginInterface = pluginInterface;
_territoryData = territoryData;
Size = new Vector2(500, 200);
SizeCondition = ImGuiCond.Once;
@ -57,7 +60,7 @@ internal sealed class QuestSelectionWindow : LWindow
public uint TargetId { get; private set; }
public string TargetName { get; private set; } = string.Empty;
public unsafe void Open(IGameObject? gameObject)
public unsafe void OpenForTarget(IGameObject? gameObject)
{
if (gameObject != null)
{
@ -85,6 +88,28 @@ internal sealed class QuestSelectionWindow : LWindow
IsOpen = _quests.Count > 0;
}
public void OpenForZone(ushort territoryId)
{
TargetId = territoryId;
TargetName = _territoryData.GetNameAndId(territoryId);
WindowName = $"Quests starting in {TargetName}{WindowId}";
_quests = _questRegistry.AllQuests
.Where(x => x.FindSequence(0)?.FindStep(0)?.TerritoryId == territoryId)
.Select(x => _questData.GetQuestInfo(x.QuestId))
.ToList();
_offeredQuests = [];
IsOpen = true;
}
public override void OnClose()
{
TargetId = default;
TargetName = default;
_quests = [];
_offeredQuests = [];
}
public override void Draw()
{
if (_offeredQuests.Count != 0)
@ -119,32 +144,42 @@ internal sealed class QuestSelectionWindow : LWindow
if (ImGui.TableNextColumn())
{
ImGui.AlignTextToFramePadding();
using var font = _pluginInterface.UiBuilder.IconFontFixedWidthHandle.Push();
FontAwesomeIcon icon;
Vector4 color;
if (_gameFunctions.IsQuestAccepted(quest.QuestId))
var (color, icon, tooltipText) = GetQuestStyle(quest.QuestId);
using (var _ = _pluginInterface.UiBuilder.IconFontFixedWidthHandle.Push())
{
color = ImGuiColors.DalamudYellow;
icon = FontAwesomeIcon.Running;
}
else if (_gameFunctions.IsQuestAcceptedOrComplete(quest.QuestId))
{
color = ImGuiColors.ParsedGreen;
icon = FontAwesomeIcon.Check;
}
else
{
color = ImGuiColors.DalamudRed;
icon = FontAwesomeIcon.Times;
}
if (isKnownQuest)
ImGui.TextColored(color, icon.ToIconString());
else
ImGui.TextColored(ImGuiColors.DalamudGrey, icon.ToIconString());
}
if (ImGui.IsItemHovered())
{
using var tooltip = ImRaii.Tooltip();
if (tooltip)
{
ImGui.TextColored(color, tooltipText);
if (quest.IsRepeatable)
{
ImGui.SameLine();
ImGui.TextUnformatted("Repeatable");
}
if (!_questRegistry.IsKnownQuest(quest.QuestId))
{
ImGui.SameLine();
ImGui.TextUnformatted("NoQuestPath");
}
if (quest.PreviousQuests.Count > 0)
{
ImGui.Separator();
DrawQuestUnlocks(quest, 0);
}
}
}
}
if (ImGui.TableNextColumn())
{
ImGui.AlignTextToFramePadding();
@ -165,7 +200,9 @@ internal sealed class QuestSelectionWindow : LWindow
ImGui.SameLine();
if (knownQuest != null && !_gameFunctions.IsQuestAccepted(quest.QuestId) &&
if (knownQuest != null &&
!_gameFunctions.IsQuestAccepted(quest.QuestId) &&
!_gameFunctions.IsQuestLocked(quest.QuestId) &&
(quest.IsRepeatable || !_gameFunctions.IsQuestAcceptedOrComplete(quest.QuestId)))
{
ImGui.BeginDisabled(_questController.NextQuest != null || _questController.SimulatedQuest != null);
@ -199,4 +236,97 @@ internal sealed class QuestSelectionWindow : LWindow
ImGui.SetClipboardText(fileName);
_chatGui.Print($"Copied '{fileName}' to clipboard");
}
private (Vector4 color, FontAwesomeIcon icon, string status) GetQuestStyle(ushort questId)
{
if (_gameFunctions.IsQuestAccepted(questId))
return (ImGuiColors.DalamudYellow, FontAwesomeIcon.Running, "Active");
else if (_gameFunctions.IsQuestAcceptedOrComplete(questId))
return (ImGuiColors.ParsedGreen, FontAwesomeIcon.Check, "Complete");
else if (_gameFunctions.IsQuestLocked(questId))
return (ImGuiColors.DalamudRed, FontAwesomeIcon.Times, "Locked");
else
return (ImGuiColors.DalamudYellow, FontAwesomeIcon.PersonWalkingArrowRight, "Available");
}
private void DrawQuestUnlocks(QuestInfo quest, int counter)
{
if (counter >= 10)
return;
if (counter != 0 && quest.IsMainScenarioQuest)
return;
if (counter > 0)
ImGui.Indent();
if (quest.PreviousQuests.Count > 0)
{
if (quest.PreviousQuests.Count > 1)
{
if (quest.PreviousQuestJoin == QuestInfo.QuestJoin.All)
ImGui.Text("Requires all:");
else if (quest.PreviousQuestJoin == QuestInfo.QuestJoin.AtLeastOne)
ImGui.Text("Requires one:");
}
foreach (var q in quest.PreviousQuests)
{
var qInfo = _questData.GetQuestInfo(q);
var (iconColor, icon, _) = GetQuestStyle(q);
using (var font = _pluginInterface.UiBuilder.IconFontFixedWidthHandle.Push())
{
if (_questRegistry.IsKnownQuest(qInfo.QuestId))
ImGui.TextColored(iconColor, icon.ToIconString());
else
ImGui.TextColored(ImGuiColors.DalamudGrey, icon.ToIconString());
}
ImGui.SameLine();
ImGui.TextUnformatted(FormatQuestUnlockName(qInfo));
DrawQuestUnlocks(qInfo, counter + 1);
}
}
if (counter == 0 && quest.QuestLocks.Count > 0)
{
if (quest.QuestLocks.Count > 1)
{
if (quest.QuestLockJoin == QuestInfo.QuestJoin.All)
ImGui.Text("Blocked if all completed:");
else if (quest.QuestLockJoin == QuestInfo.QuestJoin.AtLeastOne)
ImGui.Text("Blocked if at least completed:");
}
else
ImGui.Text("Blocked by (if completed):");
foreach (var q in quest.QuestLocks)
{
var qInfo = _questData.GetQuestInfo(q);
var (iconColor, icon, _) = GetQuestStyle(q);
using (var font = _pluginInterface.UiBuilder.IconFontFixedWidthHandle.Push())
{
if (_questRegistry.IsKnownQuest(qInfo.QuestId))
ImGui.TextColored(iconColor, icon.ToIconString());
else
ImGui.TextColored(ImGuiColors.DalamudGrey, icon.ToIconString());
}
ImGui.SameLine();
ImGui.TextUnformatted(FormatQuestUnlockName(qInfo));
}
}
if (counter > 0)
ImGui.Unindent();
}
private static string FormatQuestUnlockName(QuestInfo questInfo)
{
if (questInfo.IsMainScenarioQuest)
return $"{questInfo.Name} ({questInfo.QuestId}, MSQ)";
else
return $"{questInfo.Name} ({questInfo.QuestId})";
}
}

View File

@ -452,7 +452,7 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
if (ImGui.IsItemHovered())
ImGui.SetTooltip("Show all Quests starting with your current target.");
if (showQuests)
_questSelectionWindow.Open(_targetManager.Target);
_questSelectionWindow.OpenForTarget(_targetManager.Target);
ImGui.EndDisabled();