1
0
forked from liza/Questionable

Gridania start, various quest fixes, automatically start GC quest, automatically start chocobo quest

This commit is contained in:
Liza 2024-06-15 14:12:32 +02:00
parent 5a4a693d66
commit 5bcaba7eba
Signed by: liza
GPG Key ID: 7199F8D727D55F67
55 changed files with 3086 additions and 95 deletions

View File

@ -48,6 +48,9 @@ public class QuestSourceGenerator : ISourceGenerator
quests.Add((id, quest)); quests.Add((id, quest));
} }
if (quests.Count == 0)
return;
quests = quests.OrderBy(x => x.Item1).ToList(); quests = quests.OrderBy(x => x.Item1).ToList();
var code = var code =

View File

@ -0,0 +1,210 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"TerritoryBlacklist": [
225
],
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1000421,
"Position": {
"X": 98.25281,
"Y": -8,
"Z": -78.446655
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1000465,
"Position": {
"X": 298.63428,
"Y": 9.999997,
"Z": 119.035645
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1000465,
"Position": {
"X": 298.63428,
"Y": 9.999997,
"Z": 119.035645
},
"TerritoryId": 148,
"InteractionType": "WaitForManualProgress",
"Comment": "Manual Quest Progress (very combat heavy)",
"$": "TODO Remove later"
},
{
"DataId": 1000512,
"Position": {
"X": 311.69592,
"Y": 14.8470745,
"Z": 164.47693
},
"TerritoryId": 148,
"InteractionType": "Interact",
"Disabled": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 1000513,
"Position": {
"X": 303.8833,
"Y": 15.899703,
"Z": 160.87585
},
"TerritoryId": 148,
"InteractionType": "Interact",
"Disabled": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"DataId": 1000514,
"Position": {
"X": 296.1012,
"Y": 15.999987,
"Z": 171.4961
},
"TerritoryId": 148,
"InteractionType": "Interact",
"Disabled": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
},
{
"DataId": 1000515,
"Position": {
"X": 291.21838,
"Y": 19.86808,
"Z": 175.21924
},
"TerritoryId": 148,
"InteractionType": "Interact",
"Disabled": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
16
]
},
{
"DataId": 1000516,
"Position": {
"X": 284.65698,
"Y": 21.97319,
"Z": 188.18945
},
"TerritoryId": 148,
"InteractionType": "Interact",
"Disabled": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
8
]
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1000740,
"Position": {
"X": 260.18152,
"Y": 24.000002,
"Z": 192.2179
},
"TerritoryId": 148,
"InteractionType": "SinglePlayerDuty"
}
]
},
{
"Sequence": 5,
"Steps": [
{
"Position": {
"X": 319.9492,
"Y": 13.866494,
"Z": 156.2647
},
"TerritoryId": 148,
"InteractionType": "WalkTo"
},
{
"DataId": 1000465,
"Position": {
"X": 298.63428,
"Y": 9.999997,
"Z": 119.035645
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1000100,
"Position": {
"X": 23.819275,
"Y": -8,
"Z": 115.92273
},
"TerritoryId": 132,
"InteractionType": "Interact",
"AetheryteShortcut": "Gridania",
"AethernetShortcut": [
"[Gridania] Aetheryte Plaza",
"[Gridania] Airship Landing"
]
}
]
}
]
}

View File

@ -0,0 +1,165 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1000471,
"Position": {
"X": -60.471558,
"Y": 0.19999865,
"Z": 6.301941
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1000484,
"Position": {
"X": 2.0598755,
"Y": -7.9139543,
"Z": -22.171448
},
"TerritoryId": 148,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
},
{
"DataId": 1000476,
"Position": {
"X": 27.0542,
"Y": -6.881897,
"Z": 14.145081
},
"TerritoryId": 148,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 1000483,
"Position": {
"X": 85.496216,
"Y": -6.0870457,
"Z": 67.00232
},
"TerritoryId": 148,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1000471,
"Position": {
"X": -60.471558,
"Y": 0.19999865,
"Z": 6.301941
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 3,
"Steps": [
{
"Position": {
"X": 9.630515,
"Y": -22.580793,
"Z": 242.32327
},
"TerritoryId": 148,
"InteractionType": "WalkTo"
},
{
"DataId": 1003002,
"Position": {
"X": -189.13562,
"Y": -26.70127,
"Z": 295.52136
},
"TerritoryId": 148,
"InteractionType": "SinglePlayerDuty"
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 1003002,
"Position": {
"X": -189.13562,
"Y": -26.70127,
"Z": 295.52136
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 5,
"Steps": [
{
"DataId": 1000471,
"Position": {
"X": -60.471558,
"Y": 0.19999865,
"Z": 6.301941
},
"TerritoryId": 148,
"InteractionType": "Interact",
"AetheryteShortcut": "Central Shroud - Bentbranch Meadows"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1000471,
"Position": {
"X": -60.471558,
"Y": 0.19999865,
"Z": 6.301941
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
}
]
}

View File

@ -0,0 +1,117 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1000449,
"Position": {
"X": 201.83093,
"Y": -5.5419664,
"Z": -107.25574
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 1,
"Comment": "Very likely this needs manual combat and/or manual continues",
"Steps": [
{
"DataId": 2000141,
"Position": {
"X": 179.4613,
"Y": -10.666138,
"Z": 99.56506
},
"TerritoryId": 148,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
],
"$": "QuestVariables if done first: 17 0 16 0 0 128"
},
{
"DataId": 2000147,
"Position": {
"X": 168.07812,
"Y": -12.008911,
"Z": 120.80554
},
"TerritoryId": 148,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
],
"$": "QuestVariables if done first: 17 16 17 0 0 192"
},
{
"DataId": 2000149,
"Position": {
"X": 154.0398,
"Y": -10.75769,
"Z": 120.3479
},
"TerritoryId": 148,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
16
],
"$": "QuestVariables if done first: 33 17 17 16 0 208"
},
{
"DataId": 2000148,
"Position": {
"X": 126.14636,
"Y": -12.008911,
"Z": 142.35144
},
"TerritoryId": 148,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1000685,
"Position": {
"X": 287.92236,
"Y": -3.297,
"Z": -32.6391
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
}
]
}

View File

@ -0,0 +1,48 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1000100,
"Position": {
"X": 23.819275,
"Y": -8,
"Z": 115.92273
},
"TerritoryId": 132,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 3,
"Position": {
"X": 13.076904,
"Y": 0.56451416,
"Z": 35.90442
},
"StopDistance": 10,
"TerritoryId": 148,
"InteractionType": "AttuneAetheryte",
"AethernetShortcut": ["[Gridania] Aetheryte Plaza", "[Gridania] Blue Badger Gate (Central Shroud)"]
},
{
"DataId": 1000470,
"Position": {
"X": -59.006653,
"Y": -0.010835781,
"Z": 26.41333
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
}
]
}

View File

@ -0,0 +1,37 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1000421,
"Position": {
"X": 98.25281,
"Y": -8,
"Z": -78.446655
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1000421,
"Position": {
"X": 98.25281,
"Y": -8,
"Z": -78.446655
},
"TerritoryId": 148,
"InteractionType": "Interact",
"Comment": "All starting gear (except the hat) is ilvl 5 already"
}
]
}
]
}

View File

@ -0,0 +1,46 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1000100,
"Position": {
"X": 23.819275,
"Y": -8,
"Z": 115.92273
},
"TerritoryId": 132,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"Position": {
"X": 158.06026,
"Y": -12.97808,
"Z": 158.08466
},
"TerritoryId": 132,
"InteractionType": "WalkTo",
"TargetTerritoryId": 148
},
{
"DataId": 1000421,
"Position": {
"X": 98.25281,
"Y": -8,
"Z": -78.446655
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
}
]
}

View File

@ -0,0 +1,87 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1000470,
"Position": {
"X": -59.006653,
"Y": -0.010835781,
"Z": 26.41333
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"Position": {
"X": -61.749943,
"Y": 0.9481318,
"Z": -38.52144
},
"TerritoryId": 148,
"InteractionType": "Jump",
"JumpDestination": {
"Position": {
"X": -67.083466,
"Y": -4.478065,
"Z": -45.204926
},
"StopDistance": 3
}
},
{
"DataId": 1000748,
"Position": {
"X": -125.230774,
"Y": 4.1573725,
"Z": -43.595093
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"Position": {
"X": -171.87439,
"Y": 1.7183347,
"Z": -70.586975
},
"TerritoryId": 148,
"InteractionType": "Combat",
"EnemySpawnType": "OverworldEnemies",
"KillEnemyDataIds": [
771
],
"Comment": "Kill Qiqirn manually"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1000748,
"Position": {
"X": -125.230774,
"Y": 4.1573725,
"Z": -43.595093
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
}
]
}

View File

@ -0,0 +1,197 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1000435,
"Position": {
"X": -127.06189,
"Y": 4.1490583,
"Z": -44.296997
},
"StopDistance": 5,
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2000750,
"Position": {
"X": -151.26276,
"Y": 14.358704,
"Z": -73.014465
},
"TerritoryId": 148,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
},
{
"DataId": 2000749,
"Position": {
"X": -164.11078,
"Y": 23.025818,
"Z": -86.167725
},
"TerritoryId": 148,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"Position": {
"X": -180.18181,
"Y": 31.66525,
"Z": -91.84381
},
"TerritoryId": 148,
"InteractionType": "WalkTo",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
-128
]
},
{
"Position": {
"X": -184.41872,
"Y": 29.940958,
"Z": -93.809525
},
"TerritoryId": 148,
"InteractionType": "WalkTo",
"DisableNavmesh": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
-128
]
},
{
"DataId": 2000748,
"Position": {
"X": -189.25769,
"Y": 30.44165,
"Z": -98.83276
},
"TerritoryId": 148,
"InteractionType": "Interact",
"DisableNavmesh": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"Position": {
"X": -179.84062,
"Y": 31.476957,
"Z": -91.05707
},
"TerritoryId": 148,
"InteractionType": "WalkTo",
"DisableNavmesh": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
-16
]
},
{
"Position": {
"X": -171.76294,
"Y": 23.022184,
"Z": -76.32822
},
"TerritoryId": 148,
"InteractionType": "WalkTo",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
-16
]
},
{
"DataId": 2000751,
"Position": {
"X": -169.3294,
"Y": 18.600708,
"Z": -72.129456
},
"TerritoryId": 148,
"InteractionType": "Interact",
"DisableNavmesh": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
16
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"Position": {
"X": -166.56161,
"Y": 0.63666093,
"Z": -61.089085
},
"TerritoryId": 148,
"InteractionType": "WalkTo",
"DisableNavmesh": true,
"Comment": "Jumping back up isn't trivial"
},
{
"DataId": 1000436,
"Position": {
"X": -193.22504,
"Y": 56.264572,
"Z": -116.47211
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
}
]
}

View File

@ -0,0 +1,66 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1000436,
"Position": {
"X": -193.22504,
"Y": 56.264572,
"Z": -116.47211
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1000748,
"Position": {
"X": -125.230774,
"Y": 4.1573725,
"Z": -43.595093
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 2000689,
"Position": {
"X": -95.47571,
"Y": 3.4942627,
"Z": -150.80493
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1000748,
"Position": {
"X": -125.230774,
"Y": 4.1573725,
"Z": -43.595093
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
}
]
}

View File

@ -0,0 +1,66 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1000748,
"Position": {
"X": -125.230774,
"Y": 4.1573725,
"Z": -43.595093
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1001280,
"Position": {
"X": 89.28052,
"Y": -6.351089,
"Z": -121.96539
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1000483,
"Position": {
"X": 85.496216,
"Y": -6.0870457,
"Z": 67.00232
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1000741,
"Position": {
"X": -66.7583,
"Y": 0.2,
"Z": 11.36792
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
}
]
}

View File

@ -0,0 +1,55 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1000741,
"Position": {
"X": -66.7583,
"Y": 0.2,
"Z": 11.36792
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2001006,
"Position": {
"X": 99.65662,
"Y": -15.732117,
"Z": 193.01135
},
"TerritoryId": 148,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [
12
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1000491,
"Position": {
"X": 47.958984,
"Y": -24,
"Z": 228.5343
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
}
]
}

View File

@ -0,0 +1,51 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1000491,
"Position": {
"X": 47.958984,
"Y": -24,
"Z": 228.5343
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1002932,
"Position": {
"X": -65.049255,
"Y": -36.79766,
"Z": 477.59204
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1000503,
"Position": {
"X": 178.33215,
"Y": -32.015224,
"Z": 333.30273
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
}
]
}

View File

@ -0,0 +1,55 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1000421,
"Position": {
"X": 98.25281,
"Y": -8,
"Z": -78.446655
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"Position": {
"X": 194.08282,
"Y": -8.422037,
"Z": -47.295006
},
"TerritoryId": 148,
"InteractionType": "Combat",
"EnemySpawnType": "OverworldEnemies",
"KillEnemyDataIds": [
43
],
"Comment": "Kill Chigoes manually"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1000449,
"Position": {
"X": 201.83093,
"Y": -5.5419664,
"Z": -107.25574
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
}
]
}

View File

@ -0,0 +1,79 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1000685,
"Position": {
"X": 287.92236,
"Y": -3.297,
"Z": -32.6391
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 1,
"Comment": "TODO Figure out quest flags if picking up egg first OR doing the combat first",
"Steps": [
{
"DataId": 2000010,
"Position": {
"X": 480.88794,
"Y": 30.746826,
"Z": -49.729187
},
"TerritoryId": 148,
"InteractionType": "Interact"
},
{
"Position": {
"X": 480.88794,
"Y": 30.746826,
"Z": -49.729187
},
"TerritoryId": 148,
"InteractionType": "Combat",
"EnemySpawnType": "OverworldEnemies",
"KillEnemyDataIds": [142],
"Comment": "Depending on how many enemies you fought on the way to the egg, this step could be optional"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1000685,
"Position": {
"X": 287.92236,
"Y": -3.297,
"Z": -32.6391
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1000408,
"Position": {
"X": 106.85889,
"Y": -8,
"Z": -75.669556
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
}
]
}

View File

@ -0,0 +1,66 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1000503,
"Position": {
"X": 178.33215,
"Y": -32.015224,
"Z": 333.30273
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2001018,
"Position": {
"X": 155.47412,
"Y": -23.66681,
"Z": 490.74524
},
"TerritoryId": 148,
"InteractionType": "Combat",
"EnemySpawnType": "AutoOnEnterArea",
"KillEnemyDataIds": [
26
]
},
{
"DataId": 2001016,
"Position": {
"X": 152.60547,
"Y": -23.758362,
"Z": 494.71265
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1000470,
"Position": {
"X": -59.006653,
"Y": -0.010835781,
"Z": 26.41333
},
"TerritoryId": 148,
"InteractionType": "Interact",
"AetheryteShortcut": "Central Shroud - Bentbranch Meadows"
}
]
}
]
}

View File

@ -0,0 +1,36 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1001148,
"Position": {
"X": 117.112915,
"Y": -12.506256,
"Z": 143.63306
},
"TerritoryId": 183,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1001140,
"Position": {
"X": 23.788818,
"Y": -8,
"Z": 115.861694
},
"TerritoryId": 183,
"InteractionType": "Interact"
}
]
}
]
}

View File

@ -0,0 +1,69 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"TerritoryBlacklist": [
233
],
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1000421,
"Position": {
"X": 98.25281,
"Y": -8,
"Z": -78.446655
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2000953,
"Position": {
"X": 323.5979,
"Y": 0.3508911,
"Z": -309.55975
},
"TerritoryId": 148,
"InteractionType": "SinglePlayerDuty"
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 2001194,
"Position": {
"X": 323.627,
"Y": 0.3168333,
"Z": -309.5412
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1000421,
"Position": {
"X": 98.25281,
"Y": -8,
"Z": -78.446655
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
}
]
}

View File

@ -0,0 +1,41 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1000471,
"Position": {
"X": -60.471558,
"Y": 0.19999865,
"Z": 6.301941
},
"TerritoryId": 148,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1000100,
"Position": {
"X": 23.819275,
"Y": -8,
"Z": 115.92273
},
"TerritoryId": 132,
"InteractionType": "Interact",
"AetheryteShortcut": "Gridania",
"AethernetShortcut": [
"[Gridania] Aetheryte Plaza",
"[Gridania] Airship Landing"
]
}
]
}
]
}

View File

@ -0,0 +1,118 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1000100,
"Position": {
"X": 23.819275,
"Y": -8,
"Z": 115.92273
},
"TerritoryId": 132,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"Position": {
"X": 49.65071,
"Y": -8.046952,
"Z": 102.32186
},
"TerritoryId": 132,
"InteractionType": "WalkTo",
"$": "New Gridania Navmesh workaround"
},
{
"DataId": 1000423,
"Position": {
"X": 232.04382,
"Y": 1.999974,
"Z": 45.578613
},
"TerritoryId": 132,
"InteractionType": "Interact",
"AethernetShortcut": ["[Gridania] Aetheryte Plaza", "[Gridania] Archers' Guild"],
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_MANFST007_00447_Q1_000_1",
"Yes": true
}
]
},
{
"DataId": 1003061,
"Position": {
"X": -0.015319824,
"Y": 0.500025,
"Z": -4.3793945
},
"StopDistance": 7,
"TerritoryId": 204,
"InteractionType": "Interact",
"DisableNavmesh": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1000456,
"Position": {
"X": -303.5172,
"Y": 21.902342,
"Z": 127.45862
},
"TerritoryId": 148,
"InteractionType": "SinglePlayerDuty",
"AetheryteShortcut": "Central Shroud - Bentbranch Meadows"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1000423,
"Position": {
"X": 232.04382,
"Y": 1.999974,
"Z": 45.578613
},
"TerritoryId": 132,
"InteractionType": "Interact",
"AetheryteShortcut": "Gridania",
"AethernetShortcut": ["[Gridania] Aetheryte Plaza", "[Gridania] Archers' Guild"],
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_MANFST007_00447_Q1_000_1",
"Yes": true
}
]
},
{
"DataId": 1003061,
"Position": {
"X": -0.015319824,
"Y": 0.500025,
"Z": -4.3793945
},
"StopDistance": 7,
"TerritoryId": 204,
"InteractionType": "Interact",
"DisableNavmesh": true
}
]
}
]
}

View File

@ -0,0 +1,102 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1003061,
"Position": {
"X": -0.015319824,
"Y": 0.500025,
"Z": -4.3793945
},
"StopDistance": 7,
"TerritoryId": 204,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2001215,
"Position": {
"X": 0.002457563,
"Y": 1.052062,
"Z": 9.820032
},
"TerritoryId": 204,
"InteractionType": "Interact",
"TargetTerritoryId": 132
},
{
"DataId": 1000100,
"Position": {
"X": 23.819275,
"Y": -8,
"Z": 115.92273
},
"TerritoryId": 132,
"InteractionType": "Interact",
"AethernetShortcut": [
"[Gridania] Archers' Guild",
"[Gridania] Airship Landing"
]
}
]
},
{
"Sequence": 2,
"Steps": [
{
"Position": {
"X": 49.65071,
"Y": -8.046952,
"Z": 102.32186
},
"TerritoryId": 132,
"InteractionType": "WalkTo",
"$": "New Gridania Navmesh workaround"
},
{
"DataId": 1000153,
"Position": {
"X": -44.87683,
"Y": -1.2500024,
"Z": 56.839844
},
"TerritoryId": 132,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"Position": {
"X": 49.65071,
"Y": -8.046952,
"Z": 102.32186
},
"TerritoryId": 132,
"InteractionType": "WalkTo",
"$": "New Gridania Navmesh workaround"
},
{
"DataId": 1000100,
"Position": {
"X": 23.819275,
"Y": -8,
"Z": 115.92273
},
"TerritoryId": 132,
"InteractionType": "Interact"
}
]
}
]
}

View File

@ -0,0 +1,112 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1000100,
"Position": {
"X": 23.819275,
"Y": -8,
"Z": 115.92273
},
"TerritoryId": 132,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"TerritoryId": 132,
"InteractionType": "EquipItem",
"ItemId": 2651
},
{
"Position": {
"X": 49.65071,
"Y": -8.046952,
"Z": 102.32186
},
"TerritoryId": 132,
"InteractionType": "WalkTo",
"$": "New Gridania Navmesh workaround"
},
{
"DataId": 1000286,
"Position": {
"X": -53.574463,
"Y": 7.2025366,
"Z": -118.36426
},
"TerritoryId": 133,
"InteractionType": "Interact",
"AethernetShortcut": [
"[Gridania] Aetheryte Plaza",
"[Gridania] Mih Khetto's Amphitheatre"
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 2000087,
"Position": {
"X": 0.015197754,
"Y": 1.449585,
"Z": 7.7057495
},
"TerritoryId": 179,
"InteractionType": "Interact",
"TargetTerritoryId": 132
},
{
"Position": {
"X": 49.65071,
"Y": -8.046952,
"Z": 102.32186
},
"TerritoryId": 132,
"InteractionType": "WalkTo",
"$": "New Gridania Navmesh workaround"
},
{
"DataId": 1000460,
"Position": {
"X": -159.41101,
"Y": 4.054107,
"Z": -4.1047363
},
"TerritoryId": 133,
"InteractionType": "Interact",
"AethernetShortcut": [
"[Gridania] Aetheryte Plaza",
"[Gridania] Conjurers' Guild"
],
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_MANFST009_00449_Q2_000_1",
"Yes": true
}
]
},
{
"DataId": 1003027,
"Position": {
"X": 4.8981323,
"Y": -1.92944,
"Z": -0.19836426
},
"TerritoryId": 205,
"InteractionType": "Interact"
}
]
}
]
}

View File

@ -0,0 +1,383 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1003027,
"Position": {
"X": 4.8981323,
"Y": -1.92944,
"Z": -0.19836426
},
"TerritoryId": 205,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2001216,
"Position": {
"X": 45.87172,
"Y": 7.763558,
"Z": 47.41661
},
"TerritoryId": 205,
"InteractionType": "Interact",
"TargetTerritoryId": 133
},
{
"DataId": 1000100,
"Position": {
"X": 23.819275,
"Y": -8,
"Z": 115.92273
},
"TerritoryId": 132,
"InteractionType": "Interact",
"AethernetShortcut": [
"[Gridania] Conjurers' Guild",
"[Gridania] Airship Landing"
]
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1000106,
"Position": {
"X": 29.007324,
"Y": -19.000002,
"Z": 105.485596
},
"TerritoryId": 132,
"InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_MANFST200_00507_Q1_000_1",
"Yes": true
}
]
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 2001666,
"Position": {
"X": 7.179191,
"Y": -21.93796,
"Z": 124.1005
},
"TerritoryId": 132,
"InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_MANFST200_00507_Q2_000_1",
"Yes": true
}
]
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 1002703,
"Position": {
"X": -12.375122,
"Y": 91.499985,
"Z": -0.5340576
},
"TerritoryId": 128,
"InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_MANFST200_00507_Q5_000_1",
"Yes": true
}
],
"Comment": "Limsa Arrivals Attendant"
},
{
"DataId": 1002693,
"Position": {
"X": -6.515625,
"Y": 91.49996,
"Z": -13.656921
},
"TerritoryId": 128,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 5,
"Steps": [
{
"DataId": 1003583,
"Position": {
"X": -7.248047,
"Y": 91.49999,
"Z": -16.128845
},
"TerritoryId": 128,
"InteractionType": "Interact",
"TargetTerritoryId": 129,
"DialogueChoices": [
{
"Type": "List",
"ExcelSheet": "Warp",
"Prompt": null,
"Answer": 131094
}
]
},
{
"DataId": 1001029,
"Position": {
"X": 9.170593,
"Y": 20.999403,
"Z": -15.213318
},
"TerritoryId": 129,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 6,
"Steps": [
{
"DataId": 8,
"Position": {
"X": -84.00108,
"Y": 20.77683,
"Z": 0.03414845
},
"StopDistance": 10,
"TerritoryId": 129,
"InteractionType": "AttuneAetheryte"
},
{
"DataId": 49,
"Position": {
"X": -213.61108,
"Y": 16.739136,
"Z": 51.80432
},
"TerritoryId": 129,
"InteractionType": "AttuneAethernetShard",
"Comment": "Hawkers' Alley"
},
{
"DataId": 43,
"Position": {
"X": -335.1645,
"Y": 12.619202,
"Z": 56.381958
},
"TerritoryId": 129,
"InteractionType": "AttuneAethernetShard",
"Comment": "Arcanists' Guild"
},
{
"DataId": 44,
"Position": {
"X": -179.40033,
"Y": 4.8065186,
"Z": 182.97095
},
"TerritoryId": 129,
"InteractionType": "AttuneAethernetShard",
"Comment": "Fishermens' Guild",
"AethernetShortcut": [
"[Limsa Lominsa] Arcanists' Guild",
"[Limsa Lominsa] Hawkers' Alley"
]
},
{
"Position": {
"X": -83.8817,
"Y": 18.475962,
"Z": -29.903847
},
"TerritoryId": 129,
"InteractionType": "WalkTo",
"TargetTerritoryId": 128,
"Comment": "Walk to Culinarians' Guild",
"AethernetShortcut": [
"[Limsa Lominsa] Fishermens' Guild",
"[Limsa Lominsa] Aetheryte Plaza"
]
},
{
"DataId": 42,
"Position": {
"X": -56.50421,
"Y": 44.47998,
"Z": -131.45648
},
"TerritoryId": 128,
"InteractionType": "AttuneAethernetShard",
"Comment": "Culinarians' Guild"
},
{
"DataId": 48,
"Position": {
"X": -5.1728516,
"Y": 44.63257,
"Z": -218.06671
},
"TerritoryId": 128,
"InteractionType": "AttuneAethernetShard",
"Comment": "Marauders' Guild"
},
{
"DataId": 41,
"Position": {
"X": 16.067688,
"Y": 40.787354,
"Z": 68.80286
},
"TerritoryId": 128,
"InteractionType": "AttuneAethernetShard",
"Comment": "Aftcastle"
},
{
"DataId": 1002695,
"Position": {
"X": -25.92511,
"Y": 91.999954,
"Z": -3.6774292
},
"TerritoryId": 128,
"InteractionType": "Interact",
"AethernetShortcut": [
"[Limsa Lominsa] The Aftcastle",
"[Limsa Lominsa] Airship Landing"
],
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_MANFST200_00507_Q6_000_1",
"Yes": true
}
]
}
]
},
{
"Sequence": 7,
"Steps": [
{
"DataId": 2001669,
"Position": {
"X": -11.12384,
"Y": 92.0271,
"Z": 17.166382
},
"TerritoryId": 128,
"InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_MANFST200_00507_Q4_000_1",
"Yes": true
}
]
}
]
},
{
"Sequence": 8,
"Steps": [
{
"DataId": 1004434,
"Position": {
"X": -27.17633,
"Y": 83.19998,
"Z": 2.304016
},
"TerritoryId": 130,
"InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_MANFST200_00507_Q7_000_1",
"Yes": true
}
],
"Comment": "Ul'dah Arrivals Attendant"
},
{
"DataId": 1004336,
"Position": {
"X": -12.619263,
"Y": 82.99987,
"Z": 4.562378
},
"TerritoryId": 130,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1004339,
"Position": {
"X": -25.986206,
"Y": 81.799995,
"Z": -31.99823
},
"TerritoryId": 130,
"InteractionType": "Interact",
"TargetTerritoryId": 131,
"DialogueChoices": [
{
"Type": "List",
"ExcelSheet": "Warp",
"Prompt": null,
"Answer": 131096
}
]
},
{
"DataId": 51,
"Position": {
"X": 6.6376343,
"Y": 30.655273,
"Z": -24.826477
},
"TerritoryId": 131,
"InteractionType": "AttuneAethernetShard"
},
{
"DataId": 1001821,
"Position": {
"X": -24.124573,
"Y": 38.000004,
"Z": 85.31323
},
"TerritoryId": 131,
"InteractionType": "Interact"
}
]
}
]
}

View File

@ -0,0 +1,201 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1001140,
"Position": {
"X": 23.788818,
"Y": -8,
"Z": 115.861694
},
"TerritoryId": 183,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"Position": {
"X": 49.65071,
"Y": -8.046952,
"Z": 102.32186
},
"TerritoryId": 132,
"InteractionType": "WalkTo",
"$": "New Gridania Navmesh workaround"
},
{
"DataId": 2,
"Position": {
"X": 32.913696,
"Y": 2.670288,
"Z": 30.014404
},
"StopDistance": 10,
"TerritoryId": 132,
"InteractionType": "AttuneAetheryte",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 25,
"Position": {
"X": 166.58276,
"Y": -1.7243042,
"Z": 86.13721
},
"TerritoryId": 132,
"InteractionType": "AttuneAethernetShard",
"Comment": "Archers' Guild"
},
{
"Position": {
"X": 102.810745,
"Y": 5.4071116,
"Z": 12.54738
},
"TerritoryId": 132,
"InteractionType": "WalkTo",
"TargetTerritoryId": 133
},
{
"DataId": 1000768,
"Position": {
"X": 172.35059,
"Y": 15.5,
"Z": -89.951965
},
"TerritoryId": 133,
"InteractionType": "Interact",
"Comment": "TODO Questflags",
"$": "If done after aetheryte: 33 1 0 0 0 128"
},
{
"DataId": 26,
"Position": {
"X": 101.27405,
"Y": 9.018005,
"Z": -111.31464
},
"TerritoryId": 133,
"InteractionType": "AttuneAethernetShard",
"Comment": "Leatherworkers' Guild"
},
{
"DataId": 27,
"Position": {
"X": 121.23291,
"Y": 12.649658,
"Z": -229.63306
},
"TerritoryId": 133,
"InteractionType": "AttuneAethernetShard",
"Comment": "Lancers' Guild"
},
{
"DataId": 1000251,
"Position": {
"X": 147.08167,
"Y": 15.5,
"Z": -267.99426
},
"TerritoryId": 133,
"InteractionType": "Interact",
"Comment": "Lancer Receptionist"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1000251,
"Position": {
"X": 147.08167,
"Y": 15.5,
"Z": -267.99426
},
"TerritoryId": 133,
"InteractionType": "Interact",
"Comment": "Pick up Class Quest"
},
{
"DataId": 30,
"Position": {
"X": -73.92999,
"Y": 7.9804688,
"Z": -140.15417
},
"TerritoryId": 133,
"InteractionType": "AttuneAethernetShard",
"AethernetShortcut": [
"[Gridania] Lancers' Guild",
"[Gridania] Leatherworkers' Guild & Shaded Bower"
],
"Comment": "Mih Khetto's Amphitheatre"
},
{
"Position": {
"X": -174.09056,
"Y": 10.91981,
"Z": -162.12527
},
"TerritoryId": 133,
"InteractionType": "WalkTo"
},
{
"DataId": 29,
"Position": {
"X": -311.0857,
"Y": 7.94989,
"Z": -177.05048
},
"TerritoryId": 133,
"InteractionType": "AttuneAethernetShard",
"Comment": "Botanists' Guild"
},
{
"DataId": 28,
"Position": {
"X": -145.15906,
"Y": 4.9591064,
"Z": -11.7647705
},
"TerritoryId": 133,
"InteractionType": "AttuneAethernetShard",
"AethernetShortcut": [
"[Gridania] Botanists' Guild",
"[Gridania] Mih Khetto's Amphitheatre"
],
"Comment": "Conjurers' Guild"
},
{
"DataId": 1000100,
"Position": {
"X": 23.819275,
"Y": -8,
"Z": 115.92273
},
"TerritoryId": 132,
"InteractionType": "Interact",
"AethernetShortcut": [
"[Gridania] Conjurers' Guild",
"[Gridania] Airship Landing"
]
}
]
}
]
}

View File

@ -82,6 +82,7 @@
"Y": 0.9999907, "Y": 0.9999907,
"Z": 211.68835 "Z": 211.68835
}, },
"StopDistance": 7,
"TerritoryId": 129, "TerritoryId": 129,
"InteractionType": "Interact", "InteractionType": "Interact",
"TargetTerritoryId": 138, "TargetTerritoryId": 138,

View File

@ -29,7 +29,8 @@
}, },
"TerritoryId": 141, "TerritoryId": 141,
"InteractionType": "Interact", "InteractionType": "Interact",
"Comment": "'Forging the Spirit'" "Comment": "'Forging the Spirit'",
"AetheryteShortcut": "Central Thanalan - Black Brush Station"
}, },
{ {
"DataId": 1001426, "DataId": 1001426,

View File

@ -20,6 +20,16 @@
{ {
"Sequence": 1, "Sequence": 1,
"Steps": [ "Steps": [
{
"Position": {
"X": -316.29608,
"Y": 23.44405,
"Z": -345.24487
},
"TerritoryId": 140,
"InteractionType": "WalkTo",
"AetheryteShortcut": "Western Thanalan - Horizon"
},
{ {
"DataId": 1004603, "DataId": 1004603,
"Position": { "Position": {
@ -28,14 +38,22 @@
"Z": -381.97913 "Z": -381.97913
}, },
"TerritoryId": 140, "TerritoryId": 140,
"InteractionType": "Interact", "InteractionType": "Interact"
"AetheryteShortcut": "Western Thanalan - Horizon"
} }
] ]
}, },
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"Position": {
"X": -493.3852,
"Y": 21,
"Z": -382.50455
},
"TerritoryId": 140,
"InteractionType": "WalkTo"
},
{ {
"DataId": 2001711, "DataId": 2001711,
"Position": { "Position": {

View File

@ -50,6 +50,7 @@
"Y": 0.32037354, "Y": 0.32037354,
"Z": -166.58276 "Z": -166.58276
}, },
"StopDistance": 10,
"TerritoryId": 141, "TerritoryId": 141,
"InteractionType": "AttuneAetheryte", "InteractionType": "AttuneAetheryte",
"AetheryteShortcut": "Ul'dah", "AetheryteShortcut": "Ul'dah",
@ -68,6 +69,16 @@
"InteractionType": "WalkTo", "InteractionType": "WalkTo",
"TargetTerritoryId": 145 "TargetTerritoryId": 145
}, },
{
"Position": {
"X": -423.0189,
"Y": -37.96352,
"Z": 176.73677
},
"TerritoryId": 145,
"InteractionType": "WalkTo",
"$": "Camp Drybone Lantern"
},
{ {
"DataId": 18, "DataId": 18,
"Position": { "Position": {
@ -75,6 +86,7 @@
"Y": -57.1756, "Y": -57.1756,
"Z": 142.59558 "Z": 142.59558
}, },
"StopDistance": 10,
"TerritoryId": 145, "TerritoryId": 145,
"InteractionType": "AttuneAetheryte" "InteractionType": "AttuneAetheryte"
}, },

View File

@ -137,7 +137,7 @@
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{ {
"TerritoryId": 145, "TerritoryId": 133,
"InteractionType": "UseItem", "InteractionType": "UseItem",
"ItemId": 30362, "ItemId": 30362,
"TargetTerritoryId": 140 "TargetTerritoryId": 140

View File

@ -95,6 +95,26 @@
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"Position": {
"X": -378.46735,
"Y": -38.009487,
"Z": 159.38092
},
"TerritoryId": 145,
"InteractionType": "WalkTo",
"$": "Camp Drybone cliff jump"
},
{
"Position": {
"X": -379.3895,
"Y": -59.000004,
"Z": 147.99257
},
"TerritoryId": 145,
"InteractionType": "WalkTo",
"DisableNavmesh": true
},
{ {
"DataId": 1003929, "DataId": 1003929,
"Position": { "Position": {

View File

@ -46,6 +46,7 @@
"Y": 48.203125, "Y": 48.203125,
"Z": -227.039 "Z": -227.039
}, },
"StopDistance": 10,
"TerritoryId": 140, "TerritoryId": 140,
"InteractionType": "AttuneAetheryte", "InteractionType": "AttuneAetheryte",
"AethernetShortcut": [ "AethernetShortcut": [

View File

@ -23,6 +23,16 @@
{ {
"Sequence": 1, "Sequence": 1,
"Steps": [ "Steps": [
{
"Position": {
"X": 49.65071,
"Y": -8.046952,
"Z": 102.32186
},
"TerritoryId": 132,
"InteractionType": "WalkTo",
"$": "New Gridania Navmesh workaround"
},
{ {
"DataId": 3, "DataId": 3,
"Position": { "Position": {
@ -63,6 +73,17 @@
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"Position": {
"X": 49.65071,
"Y": -8.046952,
"Z": 102.32186
},
"TerritoryId": 132,
"InteractionType": "WalkTo",
"$": "New Gridania Navmesh workaround",
"AetheryteShortcut": "Gridania"
},
{ {
"DataId": 1000100, "DataId": 1000100,
"Position": { "Position": {
@ -71,8 +92,7 @@
"Z": 115.92273 "Z": 115.92273
}, },
"TerritoryId": 132, "TerritoryId": 132,
"InteractionType": "Interact", "InteractionType": "Interact"
"AetheryteShortcut": "Gridania"
} }
] ]
} }

View File

@ -0,0 +1,105 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1004884,
"Position": {
"X": 38.895264,
"Y": 1.2000012,
"Z": 3.463745
},
"TerritoryId": 212,
"InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_MANFST302_00680_Q1_000_1",
"Yes": true
}
]
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1002394,
"Position": {
"X": -69.5354,
"Y": -0.50095016,
"Z": -9.99469
},
"TerritoryId": 132,
"InteractionType": "Interact",
"AetheryteShortcut": "Gridania",
"DialogueChoices": [
{
"Type": "List",
"Prompt": "TEXT_MANFST302_00680_Q2_000_1",
"Answer": "TEXT_MANFST302_00680_A2_000_2"
}
]
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1001263,
"Position": {
"X": 181.41443,
"Y": -2.3519497,
"Z": -240.40594
},
"TerritoryId": 133,
"InteractionType": "Interact",
"TargetTerritoryId": 152,
"AethernetShortcut": [
"[Gridania] Aetheryte Plaza",
"[Gridania] Lancers' Guild"
],
"DialogueChoices": [
{
"Type": "List",
"ExcelSheet": "Warp",
"Prompt": null,
"Answer": 131077
}
]
},
{
"DataId": 1004886,
"Position": {
"X": 30.319702,
"Y": 8.422709,
"Z": 475.30322
},
"TerritoryId": 152,
"InteractionType": "SinglePlayerDuty"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1002394,
"Position": {
"X": -69.5354,
"Y": -0.50095016,
"Z": -9.99469
},
"TerritoryId": 132,
"InteractionType": "Interact",
"AetheryteShortcut": "Gridania"
}
]
}
]
}

View File

@ -4,8 +4,25 @@
"QuestSequence": [ "QuestSequence": [
{ {
"Sequence": 0, "Sequence": 0,
"Steps": [], "Steps": [
"Comment": "Quest start is intentionally empty, so you pick a Grand Company" {
"DataId": 1004885,
"Position": {
"X": 36.453735,
"Y": 1.2000011,
"Z": 4.6845093
},
"TerritoryId": 212,
"InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_MANSEA302_00681_Q1_000_1",
"Yes": true
}
]
}
]
}, },
{ {
"Sequence": 1, "Sequence": 1,

View File

@ -0,0 +1,62 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1002394,
"Position": {
"X": -69.5354,
"Y": -0.50095016,
"Z": -9.99469
},
"TerritoryId": 132,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"TerritoryId": 132,
"InteractionType": "UseItem",
"ItemId": 30362,
"TargetTerritoryId": 140
},
{
"Position": {
"X": -492.96475,
"Y": 20.999884,
"Z": -380.82272
},
"TerritoryId": 140,
"InteractionType": "WalkTo"
},
{
"DataId": 2001711,
"Position": {
"X": -480.9181,
"Y": 18.00103,
"Z": -386.862
},
"TerritoryId": 140,
"InteractionType": "Interact",
"TargetTerritoryId": 212
},
{
"DataId": 1005012,
"Position": {
"X": 22.507019,
"Y": 0.9999986,
"Z": -2.02948
},
"TerritoryId": 212,
"InteractionType": "Interact"
}
]
}
]
}

View File

@ -0,0 +1,78 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1000168,
"Position": {
"X": -75.48645,
"Y": -0.5013741,
"Z": -5.081299
},
"TerritoryId": 132,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1002394,
"Position": {
"X": -69.5354,
"Y": -0.50095016,
"Z": -9.99469
},
"TerritoryId": 132,
"InteractionType": "Instruction",
"Comment": "Buy Serpent Chocobo Issuance"
},
{
"DataId": 1000136,
"Position": {
"X": 32.303345,
"Y": -0.050583772,
"Z": 70.29822
},
"TerritoryId": 132,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1006001,
"Position": {
"X": 35.38562,
"Y": -0.89902794,
"Z": 67.551636
},
"StopDistance": 7,
"TerritoryId": 132,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1000136,
"Position": {
"X": 32.303345,
"Y": -0.050583772,
"Z": 70.29822
},
"TerritoryId": 132,
"InteractionType": "Interact"
}
]
}
]
}

View File

@ -0,0 +1,99 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1003281,
"Position": {
"X": 97.520386,
"Y": 40.248554,
"Z": 81.1322
},
"TerritoryId": 128,
"InteractionType": "Interact",
"AetheryteShortcut": "Limsa Lominsa",
"AethernetShortcut": ["[Limsa Lominsa] Aetheryte Plaza", "[Limsa Lominsa] The Aftcastle"]
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1002387,
"Position": {
"X": 95.750244,
"Y": 40.250286,
"Z": 76.67651
},
"TerritoryId": 128,
"InteractionType": "Instruction",
"Comment": "Buy Storm Chocobo Issuance"
},
{
"DataId": 1003597,
"Position": {
"X": 8.194031,
"Y": 39.999973,
"Z": 17.746216
},
"TerritoryId": 128,
"InteractionType": "Interact",
"TargetTerritoryId": 129,
"DialogueChoices": [
{
"Type": "List",
"ExcelSheet": "Warp",
"Prompt": null,
"Answer": 131094
}
]
},
{
"DataId": 1001027,
"Position": {
"X": 45.792236,
"Y": 20,
"Z": -8.1026
},
"TerritoryId": 129,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1006002,
"Position": {
"X": 49.576538,
"Y": 20,
"Z": -5.722229
},
"StopDistance": 7,
"TerritoryId": 129,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1001027,
"Position": {
"X": 45.792236,
"Y": 20,
"Z": -8.1026
},
"TerritoryId": 129,
"InteractionType": "Interact"
}
]
}
]
}

View File

@ -0,0 +1,44 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1000168,
"Position": {
"X": -75.48645,
"Y": -0.5013741,
"Z": -5.081299
},
"TerritoryId": 132,
"InteractionType": "Interact",
"AetheryteShortcut": "Gridania",
"SkipIf": [
"AetheryteShortcutIfInSameTerritory"
]
}
]
},
{
"Sequence": 1,
"Steps": [
{
"Position": {
"X": -75.48645,
"Y": -0.5013741,
"Z": -5.081299
},
"TerritoryId": 132,
"InteractionType": "UseItem",
"ItemId": 6001,
"SkipIf": [
"ChocoboUnlocked"
],
"Comment": "Use Chocobo whistle (if not yet unlocked)"
}
]
}
]
}

View File

@ -350,7 +350,9 @@
"Never", "Never",
"FlyingLocked", "FlyingLocked",
"FlyingUnlocked", "FlyingUnlocked",
"DifferentTerritory" "DifferentTerritory",
"ChocoboUnlocked",
"AetheryteShortcutIfInSameTerritory"
] ]
} }
}, },

View File

@ -9,5 +9,7 @@ public sealed class SkipConditionConverter() : EnumConverter<ESkipCondition>(Val
{ ESkipCondition.Never, "Never" }, { ESkipCondition.Never, "Never" },
{ ESkipCondition.FlyingLocked, "FlyingLocked" }, { ESkipCondition.FlyingLocked, "FlyingLocked" },
{ ESkipCondition.FlyingUnlocked, "FlyingUnlocked" }, { ESkipCondition.FlyingUnlocked, "FlyingUnlocked" },
{ ESkipCondition.ChocoboUnlocked, "ChocoboUnlocked" },
{ ESkipCondition.AetheryteShortcutIfInSameTerritory, "AetheryteShortcutIfInSameTerritory" },
}; };
} }

View File

@ -10,4 +10,6 @@ public enum ESkipCondition
Never, Never,
FlyingLocked, FlyingLocked,
FlyingUnlocked, FlyingUnlocked,
ChocoboUnlocked,
AetheryteShortcutIfInSameTerritory,
} }

View File

@ -1,4 +1,5 @@
using Dalamud.Configuration; using Dalamud.Configuration;
using FFXIVClientStructs.FFXIV.Client.UI.Agent;
using LLib.ImGui; using LLib.ImGui;
namespace Questionable; namespace Questionable;
@ -15,6 +16,7 @@ internal sealed class Configuration : IPluginConfiguration
{ {
public bool AutoAcceptNextQuest { get; set; } public bool AutoAcceptNextQuest { get; set; }
public uint MountId { get; set; } = 71; public uint MountId { get; set; } = 71;
public GrandCompany GrandCompany { get; set; } = GrandCompany.None;
} }
internal sealed class AdvancedConfiguration internal sealed class AdvancedConfiguration

View File

@ -386,10 +386,8 @@ internal sealed class GameUiController : IDisposable
{ {
if (_questController.CurrentQuest?.Quest.QuestId == 245) if (_questController.CurrentQuest?.Quest.QuestId == 245)
{ {
// TODO Test this
_logger.LogInformation("Closing ContentsTutorial"); _logger.LogInformation("Closing ContentsTutorial");
AtkUnitBase* addon = (AtkUnitBase*)args.Addon; AtkUnitBase* addon = (AtkUnitBase*)args.Addon;
//addon->FireCallbackInt(-2);
addon->FireCallbackInt(13); addon->FireCallbackInt(13);
} }
} }

View File

@ -44,7 +44,7 @@ internal sealed class MovementController : IDisposable
public bool IsNavmeshReady => _navmeshIpc.IsReady; public bool IsNavmeshReady => _navmeshIpc.IsReady;
public bool IsPathRunning => _navmeshIpc.IsPathRunning; public bool IsPathRunning => _navmeshIpc.IsPathRunning;
public bool IsPathfinding => _pathfindTask is { IsCompleted: false }; public bool IsPathfinding => _pathfindTask is { IsCompleted: false };
public DestinationData? Destination { get; private set; } public DestinationData? Destination { get; set; }
public DateTime MovementStartedAt { get; private set; } = DateTime.MaxValue; public DateTime MovementStartedAt { get; private set; } = DateTime.MaxValue;
public void Update() public void Update()

View File

@ -1,23 +1,12 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Numerics;
using System.Threading;
using System.Threading.Tasks;
using Dalamud.Game.ClientState.Conditions;
using Dalamud.Game.ClientState.Keys; using Dalamud.Game.ClientState.Keys;
using Dalamud.Game.ClientState.Objects.Types;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Application.Network.WorkDefinitions;
using FFXIVClientStructs.FFXIV.Client.Game;
using FFXIVClientStructs.FFXIV.Client.Game.UI;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.Controller.Steps; using Questionable.Controller.Steps;
using Questionable.Data;
using Questionable.External;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.V1;
using Questionable.Model.V1.Converter;
namespace Questionable.Controller; namespace Questionable.Controller;
@ -464,11 +453,6 @@ internal sealed class QuestController
} }
} }
// TODO is this still required?
public sealed record StepProgress(
DateTime StartedAt,
int DialogueChoicesSelected = 0);
public void Skip(ushort questQuestId, byte currentQuestSequence) public void Skip(ushort questQuestId, byte currentQuestSequence)
{ {
lock (_lock) lock (_lock)
@ -498,4 +482,7 @@ internal sealed class QuestController
} }
} }
} }
public sealed record StepProgress(
DateTime StartedAt);
} }

View File

@ -25,7 +25,11 @@ internal static class AetheryteShortcut
var task = serviceProvider.GetRequiredService<UseAetheryteShortcut>() var task = serviceProvider.GetRequiredService<UseAetheryteShortcut>()
.With(step, step.AetheryteShortcut.Value, aetheryteData.TerritoryIds[step.AetheryteShortcut.Value]); .With(step, step.AetheryteShortcut.Value, aetheryteData.TerritoryIds[step.AetheryteShortcut.Value]);
return [new WaitConditionTask(gameFunctions.CanTeleport, "CanTeleport"), task]; return
[
new WaitConditionTask(() => gameFunctions.CanTeleport(step.AetheryteShortcut.Value), "CanTeleport"),
task
];
} }
public ITask CreateTask(Quest quest, QuestSequence sequence, QuestStep step) public ITask CreateTask(Quest quest, QuestSequence sequence, QuestStep step)
@ -64,6 +68,12 @@ internal static class AetheryteShortcut
ushort territoryType = clientState.TerritoryType; ushort territoryType = clientState.TerritoryType;
if (ExpectedTerritoryId == territoryType) if (ExpectedTerritoryId == territoryType)
{ {
if (Step.SkipIf.Contains(ESkipCondition.AetheryteShortcutIfInSameTerritory))
{
logger.LogInformation("Skipping aetheryte teleport due to SkipIf");
return false;
}
Vector3 pos = clientState.LocalPlayer!.Position; Vector3 pos = clientState.LocalPlayer!.Position;
if (aetheryteData.CalculateDistance(pos, territoryType, TargetAetheryte) < 11 || if (aetheryteData.CalculateDistance(pos, territoryType, TargetAetheryte) < 11 ||
(Step.AethernetShortcut != null && (Step.AethernetShortcut != null &&

View File

@ -1,5 +1,8 @@
using System; using System;
using System.Collections.Generic;
using System.Linq;
using FFXIVClientStructs.FFXIV.Application.Network.WorkDefinitions; using FFXIVClientStructs.FFXIV.Application.Network.WorkDefinitions;
using FFXIVClientStructs.FFXIV.Client.Game.UI;
using FFXIVClientStructs.FFXIV.Client.System.Framework; using FFXIVClientStructs.FFXIV.Client.System.Framework;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@ -17,11 +20,13 @@ internal static class SkipCondition
if (step.SkipIf.Contains(ESkipCondition.Never)) if (step.SkipIf.Contains(ESkipCondition.Never))
return null; return null;
if (step.SkipIf.Count == 0 && step.CompletionQuestVariablesFlags.Count == 0) var relevantConditions =
step.SkipIf.Where(x => x != ESkipCondition.AetheryteShortcutIfInSameTerritory).ToList();
if (relevantConditions.Count == 0 && step.CompletionQuestVariablesFlags.Count == 0)
return null; return null;
return serviceProvider.GetRequiredService<CheckTask>() return serviceProvider.GetRequiredService<CheckTask>()
.With(step, quest.QuestId); .With(step, relevantConditions, quest.QuestId);
} }
} }
@ -30,33 +35,42 @@ internal static class SkipCondition
GameFunctions gameFunctions) : ITask GameFunctions gameFunctions) : ITask
{ {
public QuestStep Step { get; set; } = null!; public QuestStep Step { get; set; } = null!;
public List<ESkipCondition> SkipConditions { get; set; } = null!;
public ushort QuestId { get; set; } public ushort QuestId { get; set; }
public ITask With(QuestStep step, ushort questId) public ITask With(QuestStep step, List<ESkipCondition> skipConditions, ushort questId)
{ {
Step = step; Step = step;
SkipConditions = skipConditions;
QuestId = questId; QuestId = questId;
return this; return this;
} }
public bool Start() public unsafe bool Start()
{ {
logger.LogInformation("Checking skip conditions; {ConfiguredConditions}", string.Join(",", Step.SkipIf)); logger.LogInformation("Checking skip conditions; {ConfiguredConditions}", string.Join(",", SkipConditions));
if (Step.SkipIf.Contains(ESkipCondition.FlyingUnlocked) && if (SkipConditions.Contains(ESkipCondition.FlyingUnlocked) &&
gameFunctions.IsFlyingUnlocked(Step.TerritoryId)) gameFunctions.IsFlyingUnlocked(Step.TerritoryId))
{ {
logger.LogInformation("Skipping step, as flying is unlocked"); logger.LogInformation("Skipping step, as flying is unlocked");
return true; return true;
} }
if (Step.SkipIf.Contains(ESkipCondition.FlyingLocked) && if (SkipConditions.Contains(ESkipCondition.FlyingLocked) &&
!gameFunctions.IsFlyingUnlocked(Step.TerritoryId)) !gameFunctions.IsFlyingUnlocked(Step.TerritoryId))
{ {
logger.LogInformation("Skipping step, as flying is locked"); logger.LogInformation("Skipping step, as flying is locked");
return true; return true;
} }
if (SkipConditions.Contains(ESkipCondition.ChocoboUnlocked) &&
PlayerState.Instance()->IsMountUnlocked(1))
{
logger.LogInformation("Skipping step, as chocobo is unlocked");
return true;
}
if (Step is if (Step is
{ {
DataId: not null, DataId: not null,
@ -87,6 +101,6 @@ internal static class SkipCondition
public ETaskResult Update() => ETaskResult.SkipRemainingTasksForStep; public ETaskResult Update() => ETaskResult.SkipRemainingTasksForStep;
public override string ToString() => $"CheckSkip({string.Join(", ", Step.SkipIf)})"; public override string ToString() => $"CheckSkip({string.Join(", ", SkipConditions)})";
} }
} }

View File

@ -35,6 +35,7 @@ internal static class WaitAtEnd
return [ return [
serviceProvider.GetRequiredService<WaitDelay>(), serviceProvider.GetRequiredService<WaitDelay>(),
notInCombat, notInCombat,
serviceProvider.GetRequiredService<WaitDelay>(),
Next(quest, sequence, step) Next(quest, sequence, step)
]; ];

View File

@ -27,8 +27,7 @@ internal static class EquipItem
} }
} }
internal sealed class DoEquip(IDataManager dataManager, ILogger<DoEquip> logger) internal sealed class DoEquip(IDataManager dataManager, ILogger<DoEquip> logger) : ITask
: AbstractDelayedTask(TimeSpan.FromSeconds(1))
{ {
private static readonly IReadOnlyList<InventoryType> SourceInventoryTypes = private static readonly IReadOnlyList<InventoryType> SourceInventoryTypes =
[ [
@ -55,6 +54,8 @@ internal static class EquipItem
private Item _item = null!; private Item _item = null!;
private List<ushort> _targetSlots = []; private List<ushort> _targetSlots = [];
private DateTime _continueAt = DateTime.MaxValue;
public ITask With(uint itemId) public ITask With(uint itemId)
{ {
_itemId = itemId; _itemId = itemId;
@ -64,7 +65,32 @@ internal static class EquipItem
return this; return this;
} }
protected override unsafe bool StartInternal() public bool Start()
{
Equip();
_continueAt = DateTime.Now.AddSeconds(1);
return true;
}
public unsafe ETaskResult Update()
{
if (DateTime.Now < _continueAt)
return ETaskResult.StillRunning;
InventoryManager* inventoryManager = InventoryManager.Instance();
if (inventoryManager == null)
return ETaskResult.StillRunning;
if (_targetSlots.Any(x =>
inventoryManager->GetInventorySlot(InventoryType.EquippedItems, x)->ItemID == _itemId))
return ETaskResult.TaskComplete;
Equip();
_continueAt = DateTime.Now.AddSeconds(1);
return ETaskResult.StillRunning;
}
private unsafe bool Equip()
{ {
var inventoryManager = InventoryManager.Instance(); var inventoryManager = InventoryManager.Instance();
if (inventoryManager == null) if (inventoryManager == null)
@ -108,26 +134,13 @@ internal static class EquipItem
int result = inventoryManager->MoveItemSlot(sourceInventoryType, sourceSlot, int result = inventoryManager->MoveItemSlot(sourceInventoryType, sourceSlot,
InventoryType.EquippedItems, targetSlot, 1); InventoryType.EquippedItems, targetSlot, 1);
logger.LogInformation("MoveItemSlot result: {Result}", result); logger.LogInformation("MoveItemSlot result: {Result}", result);
return true; return result == 0;
} }
} }
return false; return false;
} }
protected override unsafe ETaskResult UpdateInternal()
{
InventoryManager* inventoryManager = InventoryManager.Instance();
if (inventoryManager == null)
return ETaskResult.StillRunning;
if (_targetSlots.Any(x =>
inventoryManager->GetInventorySlot(InventoryType.EquippedItems, x)->ItemID == _itemId))
return ETaskResult.TaskComplete;
return ETaskResult.StillRunning;
}
private static List<ushort>? GetEquipSlot(Item item) private static List<ushort>? GetEquipSlot(Item item)
{ {
return item.EquipSlotCategory.Row switch return item.EquipSlotCategory.Row switch

View File

@ -1,6 +1,8 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using FFXIVClientStructs.FFXIV.Client.Game;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Questionable.Controller.Steps.BaseTasks; using Questionable.Controller.Steps.BaseTasks;
using Questionable.Model; using Questionable.Model;
using Questionable.Model.V1; using Questionable.Model.V1;
@ -9,6 +11,8 @@ namespace Questionable.Controller.Steps.InteractionFactory;
internal static class UseItem internal static class UseItem
{ {
public const int VesperBayAetheryteTicket = 30362;
internal sealed class Factory(IServiceProvider serviceProvider) : ITaskFactory internal sealed class Factory(IServiceProvider serviceProvider) : ITaskFactory
{ {
public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step) public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step)
@ -45,30 +49,58 @@ internal static class UseItem
=> throw new InvalidOperationException(); => throw new InvalidOperationException();
} }
internal abstract class UseItemBase : ITask internal abstract class UseItemBase(ILogger logger) : ITask
{ {
private bool _usedItem; private bool _usedItem;
private DateTime _continueAt; private DateTime _continueAt;
private int _itemCount;
public uint ItemId { get; set; } public uint ItemId { get; set; }
protected abstract bool UseItem(); protected abstract bool UseItem();
public bool Start() public unsafe bool Start()
{ {
InventoryManager* inventoryManager = InventoryManager.Instance();
if (inventoryManager == null)
throw new TaskException("No InventoryManager");
_itemCount = inventoryManager->GetInventoryItemCount(ItemId);
if (_itemCount == 0)
throw new TaskException($"Don't have any {ItemId} in inventory (NQ only)");
_usedItem = UseItem(); _usedItem = UseItem();
if (ItemId == 30362) // vesper bay aether ticket if (ItemId == VesperBayAetheryteTicket)
_continueAt = DateTime.Now.AddSeconds(11); _continueAt = DateTime.Now.AddSeconds(11);
else else
_continueAt = DateTime.Now.AddSeconds(2); _continueAt = DateTime.Now.AddSeconds(2);
return true; return true;
} }
public ETaskResult Update() public unsafe ETaskResult Update()
{ {
if (DateTime.Now <= _continueAt) if (DateTime.Now <= _continueAt)
return ETaskResult.StillRunning; return ETaskResult.StillRunning;
if (ItemId == VesperBayAetheryteTicket)
{
InventoryManager* inventoryManager = InventoryManager.Instance();
if (inventoryManager == null)
{
logger.LogWarning("InventoryManager is not available");
return ETaskResult.StillRunning;
}
int itemCount = inventoryManager->GetInventoryItemCount(ItemId);
if (itemCount == _itemCount)
{
// TODO Better handling for game-provided errors, i.e. reacting to the 'Could not use' messages. UseItem() is successful in this case (and returns 0)
logger.LogInformation("Attempted to use vesper bay aetheryte ticket, but it didn't consume an item - reattempting next frame");
_usedItem = false;
return ETaskResult.StillRunning;
}
}
if (!_usedItem) if (!_usedItem)
{ {
_usedItem = UseItem(); _usedItem = UseItem();
@ -81,7 +113,7 @@ internal static class UseItem
} }
internal sealed class UseOnGround(GameFunctions gameFunctions) : UseItemBase internal sealed class UseOnGround(GameFunctions gameFunctions, ILogger<UseOnGround> logger) : UseItemBase(logger)
{ {
public uint DataId { get; set; } public uint DataId { get; set; }
@ -97,7 +129,7 @@ internal static class UseItem
public override string ToString() => $"UseItem({ItemId} on ground at {DataId})"; public override string ToString() => $"UseItem({ItemId} on ground at {DataId})";
} }
internal sealed class UseOnObject(GameFunctions gameFunctions) : UseItemBase internal sealed class UseOnObject(GameFunctions gameFunctions, ILogger<UseOnObject> logger) : UseItemBase(logger)
{ {
public uint DataId { get; set; } public uint DataId { get; set; }
@ -113,7 +145,7 @@ internal static class UseItem
public override string ToString() => $"UseItem({ItemId} on {DataId})"; public override string ToString() => $"UseItem({ItemId} on {DataId})";
} }
internal sealed class Use(GameFunctions gameFunctions) : UseItemBase internal sealed class Use(GameFunctions gameFunctions, ILogger<Use> logger) : UseItemBase(logger)
{ {
public ITask With(uint itemId) public ITask With(uint itemId)
{ {

View File

@ -32,6 +32,7 @@ using ContentFinderCondition = Lumina.Excel.GeneratedSheets.ContentFinderConditi
using ContentTalk = Lumina.Excel.GeneratedSheets.ContentTalk; using ContentTalk = Lumina.Excel.GeneratedSheets.ContentTalk;
using Emote = Lumina.Excel.GeneratedSheets.Emote; using Emote = Lumina.Excel.GeneratedSheets.Emote;
using GameObject = Dalamud.Game.ClientState.Objects.Types.GameObject; using GameObject = Dalamud.Game.ClientState.Objects.Types.GameObject;
using GrandCompany = FFXIVClientStructs.FFXIV.Client.UI.Agent.GrandCompany;
using Quest = Questionable.Model.Quest; using Quest = Questionable.Model.Quest;
using TerritoryType = Lumina.Excel.GeneratedSheets.TerritoryType; using TerritoryType = Lumina.Excel.GeneratedSheets.TerritoryType;
@ -102,6 +103,50 @@ internal sealed unsafe class GameFunctions
public DateTime ReturnRequestedAt { get; set; } = DateTime.MinValue; public DateTime ReturnRequestedAt { get; set; } = DateTime.MinValue;
public (ushort CurrentQuest, byte Sequence) GetCurrentQuest() public (ushort CurrentQuest, byte Sequence) GetCurrentQuest()
{
var (currentQuest, sequence) = GetCurrentQuestInternal();
QuestManager* questManager = QuestManager.Instance();
PlayerState* playerState = PlayerState.Instance();
if (currentQuest == 0)
{
if (_clientState.TerritoryType == 181) // Starting in Limsa
return (107, 0);
if (_clientState.TerritoryType == 183) // Starting in Gridania
return (39, 0);
return default;
}
else if (currentQuest == 681)
{
// if we have already picked up the GC quest, just return the progress for it
if (questManager->IsQuestAccepted(currentQuest) || QuestManager.IsQuestComplete(currentQuest))
return (currentQuest, sequence);
// The company you keep...
return _configuration.General.GrandCompany switch
{
GrandCompany.TwinAdder => (680, 0),
GrandCompany.Maelstrom => (681, 0),
_ => default
};
}
else if (currentQuest == 3856 && !playerState->IsMountUnlocked(1)) // we come in peace
{
ushort chocoboQuest = (GrandCompany)playerState->GrandCompany switch
{
GrandCompany.TwinAdder => 700,
GrandCompany.Maelstrom => 701,
_ => 0
};
if (chocoboQuest != 0 && !QuestManager.IsQuestComplete(chocoboQuest))
return (chocoboQuest, QuestManager.GetQuestSequence(chocoboQuest));
}
return (currentQuest, sequence);
}
public (ushort CurrentQuest, byte Sequence) GetCurrentQuestInternal()
{ {
ushort currentQuest; ushort currentQuest;
@ -135,12 +180,7 @@ internal sealed unsafe class GameFunctions
currentQuest = scenarioTree->Data->CurrentScenarioQuest; currentQuest = scenarioTree->Data->CurrentScenarioQuest;
if (currentQuest == 0) if (currentQuest == 0)
{
if (_clientState.TerritoryType == 181) // Starting Limsa
return (107, 0);
return default; return default;
}
return (currentQuest, QuestManager.GetQuestSequence(currentQuest)); return (currentQuest, QuestManager.GetQuestSequence(currentQuest));
} }
@ -157,39 +197,23 @@ internal sealed unsafe class GameFunctions
var uiState = UIState.Instance(); var uiState = UIState.Instance();
return uiState != null && uiState->IsAetheryteUnlocked(aetheryteId); return uiState != null && uiState->IsAetheryteUnlocked(aetheryteId);
/*
var telepo = Telepo.Instance();
if (telepo == null || telepo->UpdateAetheryteList() == null)
{
subIndex = 0;
return false;
}
for (ulong i = 0; i < telepo->TeleportList.Size(); ++i)
{
var data = telepo->TeleportList.Get(i);
if (data.AetheryteId == aetheryteId)
{
subIndex = data.SubIndex;
return true;
}
}
subIndex = 0;
return false;
*/
} }
public bool IsAetheryteUnlocked(EAetheryteLocation aetheryteLocation) public bool IsAetheryteUnlocked(EAetheryteLocation aetheryteLocation)
=> IsAetheryteUnlocked((uint)aetheryteLocation, out _); => IsAetheryteUnlocked((uint)aetheryteLocation, out _);
public bool CanTeleport() => ActionManager.Instance()->GetActionStatus(ActionType.Action, 5) == 0; public bool CanTeleport(EAetheryteLocation aetheryteLocation)
{
if ((ushort)aetheryteLocation == PlayerState.Instance()->HomeAetheryteId &&
ActionManager.Instance()->GetActionStatus(ActionType.GeneralAction, 8) == 0)
return true;
return ActionManager.Instance()->GetActionStatus(ActionType.Action, 5) == 0;
}
public bool TeleportAetheryte(uint aetheryteId) public bool TeleportAetheryte(uint aetheryteId)
{ {
var status = ActionManager.Instance()->GetActionStatus(ActionType.Action, 5);
if (status != 0)
return false;
if (IsAetheryteUnlocked(aetheryteId, out var subIndex)) if (IsAetheryteUnlocked(aetheryteId, out var subIndex))
{ {
@ -201,6 +225,7 @@ internal sealed unsafe class GameFunctions
return true; return true;
} }
if (ActionManager.Instance()->GetActionStatus(ActionType.Action, 5) == 0)
// fallback if return isn't available or (more likely) on a different aetheryte // fallback if return isn't available or (more likely) on a different aetheryte
return Telepo.Instance()->Teleport(aetheryteId, subIndex); return Telepo.Instance()->Teleport(aetheryteId, subIndex);
} }

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net8.0-windows</TargetFramework> <TargetFramework>net8.0-windows</TargetFramework>
<Version>0.14</Version> <Version>0.15</Version>
<LangVersion>12</LangVersion> <LangVersion>12</LangVersion>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>

View File

@ -1,5 +1,4 @@
using System; using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Linq; using System.Linq;
using Dalamud.Interface.Colors; using Dalamud.Interface.Colors;
@ -8,6 +7,7 @@ using Dalamud.Plugin.Services;
using ImGuiNET; using ImGuiNET;
using LLib.ImGui; using LLib.ImGui;
using Lumina.Excel.GeneratedSheets; using Lumina.Excel.GeneratedSheets;
using GrandCompany = FFXIVClientStructs.FFXIV.Client.UI.Agent.GrandCompany;
namespace Questionable.Windows; namespace Questionable.Windows;
@ -19,6 +19,9 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig
private readonly uint[] _mountIds; private readonly uint[] _mountIds;
private readonly string[] _mountNames; private readonly string[] _mountNames;
private readonly string[] _grandCompanyNames =
["None (manually pick quest)", "Maelstrom", "Twin Adder"/*, "Immortal Flames"*/];
[SuppressMessage("Performance", "CA1861", Justification = "One time initialization")] [SuppressMessage("Performance", "CA1861", Justification = "One time initialization")]
public ConfigWindow(DalamudPluginInterface pluginInterface, Configuration configuration, IDataManager dataManager) public ConfigWindow(DalamudPluginInterface pluginInterface, Configuration configuration, IDataManager dataManager)
: base("Config - Questionable###QuestionableConfig", ImGuiWindowFlags.AlwaysAutoResize) : base("Config - Questionable###QuestionableConfig", ImGuiWindowFlags.AlwaysAutoResize)
@ -58,6 +61,14 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig
Save(); Save();
} }
int grandCompany = (int)_configuration.General.GrandCompany;
if (ImGui.Combo("Preferred Grand Company", ref grandCompany, _grandCompanyNames,
_grandCompanyNames.Length))
{
_configuration.General.GrandCompany = (GrandCompany)grandCompany;
Save();
}
ImGui.EndTabItem(); ImGui.EndTabItem();
} }

View File

@ -310,8 +310,12 @@ internal sealed class DebugWindow : LWindow, IPersistableWindowConfig
map->FlagMapMarker.TerritoryId != _clientState.TerritoryType || map->FlagMapMarker.TerritoryId != _clientState.TerritoryType ||
!_navmeshIpc.IsReady); !_navmeshIpc.IsReady);
if (ImGui.Button("Move to Flag")) if (ImGui.Button("Move to Flag"))
{
_movementController.Destination = null;
_gameFunctions.ExecuteCommand( _gameFunctions.ExecuteCommand(
$"/vnav {(_gameFunctions.IsFlyingUnlockedInCurrentZone() ? "flyflag" : "moveflag")}"); $"/vnav {(_gameFunctions.IsFlyingUnlockedInCurrentZone() ? "flyflag" : "moveflag")}");
}
ImGui.EndDisabled(); ImGui.EndDisabled();
ImGui.SameLine(); ImGui.SameLine();