1
0
forked from liza/Questionable

Combat (experimental) for overworld enemies, better quest list window, fix landing for certain quests, Kozama'uka quests

This commit is contained in:
Liza 2024-07-14 21:31:07 +02:00
parent 72c2858cae
commit 3800ce8b69
Signed by: liza
GPG Key ID: 7199F8D727D55F67
56 changed files with 3464 additions and 138 deletions

View File

@ -32,7 +32,8 @@
"EnemySpawnType": "AfterInteraction", "EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [ "KillEnemyDataIds": [
11443 11443
] ],
"Fly": true
} }
] ]
}, },

View File

@ -20,6 +20,16 @@
{ {
"Sequence": 1, "Sequence": 1,
"Steps": [ "Steps": [
{
"Position": {
"X": -466.72015,
"Y": 44.63006,
"Z": -310.0618
},
"TerritoryId": 816,
"InteractionType": "WalkTo",
"Fly": true
},
{ {
"DataId": 1032140, "DataId": 1032140,
"Position": { "Position": {
@ -32,7 +42,25 @@
"ChatMessage": { "ChatMessage": {
"Key": "TEXT_BANPIX103_03691_SAYTODO_000_030" "Key": "TEXT_BANPIX103_03691_SAYTODO_000_030"
}, },
"Fly": true "SkipIf": [
"NotTargetable"
]
},
{
"DataId": 1032142,
"Position": {
"X": -472.7398,
"Y": 50.10258,
"Z": -328.26733
},
"TerritoryId": 816,
"InteractionType": "Say",
"ChatMessage": {
"Key": "TEXT_BANPIX103_03691_SAYTODO_000_030"
},
"SkipIf": [
"NotTargetable"
]
} }
] ]
}, },

View File

@ -0,0 +1,10 @@
## Sharing is Caring
QuestWork:
```
0 0 0 x 0 0
2 → 1032142
unknown
? → 1032140
```

View File

@ -29,15 +29,7 @@
}, },
"TerritoryId": 816, "TerritoryId": 816,
"InteractionType": "WalkTo", "InteractionType": "WalkTo",
"Fly": true, "Fly": true
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
-128
]
}, },
{ {
"DataId": 2010860, "DataId": 2010860,
@ -48,13 +40,8 @@
}, },
"TerritoryId": 816, "TerritoryId": 816,
"InteractionType": "Interact", "InteractionType": "Interact",
"CompletionQuestVariablesFlags": [ "SkipIf": [
null, "NotTargetable"
null,
null,
null,
null,
128
] ]
}, },
{ {
@ -83,6 +70,20 @@
"NotTargetable" "NotTargetable"
], ],
"IgnoreDistanceToObject": true "IgnoreDistanceToObject": true
},
{
"DataId": 2010862,
"Position": {
"X": -276.96655,
"Y": 42.893066,
"Z": 453.6659
},
"TerritoryId": 816,
"InteractionType": "Interact",
"SkipIf": [
"NotTargetable"
],
"IgnoreDistanceToObject": true
} }
] ]
}, },

View File

@ -0,0 +1,7 @@
## The Aesthetician of Il Mheg
QuestWork:
```
0 x 0 0 0 0
5 → 2010861, 2010862
```

View File

@ -0,0 +1,57 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1031809,
"Position": {
"X": -454.3069,
"Y": 71.43217,
"Z": 575.1278
},
"TerritoryId": 816,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2010894,
"Position": {
"X": 268.51294,
"Y": 33.707153,
"Z": -78.14148
},
"TerritoryId": 816,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [
11448
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1031809,
"Position": {
"X": -454.3069,
"Y": 71.43217,
"Z": 575.1278
},
"TerritoryId": 816,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Il Mheg - Lydha Lran",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,112 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1031809,
"Position": {
"X": -454.3069,
"Y": 71.43217,
"Z": 575.1278
},
"TerritoryId": 816,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1032261,
"Position": {
"X": -258.38104,
"Y": 50.977943,
"Z": 601.2206
},
"TerritoryId": 816,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 2010895,
"Position": {
"X": 718.28796,
"Y": 188.06738,
"Z": 296.77258
},
"TerritoryId": 816,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 2010897,
"Position": {
"X": 769.0698,
"Y": 191.60742,
"Z": 251.88062
},
"TerritoryId": 816,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1032261,
"Position": {
"X": -258.38104,
"Y": 50.977943,
"Z": 601.2206
},
"TerritoryId": 816,
"InteractionType": "Interact",
"AetheryteShortcut": "Il Mheg - Lydha Lran",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1031809,
"Position": {
"X": -454.3069,
"Y": 71.43217,
"Z": 575.1278
},
"TerritoryId": 816,
"InteractionType": "CompleteQuest",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,64 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1031809,
"Position": {
"X": -454.3069,
"Y": 71.43217,
"Z": 575.1278
},
"TerritoryId": 816,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2010900,
"Position": {
"X": 787.92993,
"Y": 187.33496,
"Z": 174.33423
},
"TerritoryId": 816,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"Position": {
"X": 743.3476,
"Y": 186.89098,
"Z": 193.8602
},
"TerritoryId": 816,
"InteractionType": "WalkTo",
"Comment": "TODO it probably isn't necessary to walk that far"
},
{
"DataId": 1031809,
"Position": {
"X": -454.3069,
"Y": 71.43217,
"Z": 575.1278
},
"TerritoryId": 816,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Il Mheg - Lydha Lran",
"Fly": true
}
]
}
]
}

View File

@ -33,7 +33,8 @@
"KillEnemyDataIds": [ "KillEnemyDataIds": [
14674, 14674,
14675 14675
] ],
"Fly": true
} }
] ]
}, },

View File

@ -49,6 +49,7 @@
}, },
"TerritoryId": 957, "TerritoryId": 957,
"InteractionType": "Interact", "InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [ "CompletionQuestVariablesFlags": [
null, null,
null, null,

View File

@ -0,0 +1,81 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1042301,
"Position": {
"X": -66.02582,
"Y": 39.994705,
"Z": 321.06494
},
"TerritoryId": 957,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1042390,
"Position": {
"X": 376.089,
"Y": 3.1168795,
"Z": -241.77924
},
"TerritoryId": 957,
"InteractionType": "Interact",
"AetheryteShortcut": "Thavnair - Palaka's Stand",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"DataId": 1042389,
"Position": {
"X": -416.31195,
"Y": 10.9610405,
"Z": 11.48999
},
"TerritoryId": 957,
"InteractionType": "Interact",
"Fly": true,
"AetheryteShortcut": "Thavnair - Great Work",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1042301,
"Position": {
"X": -66.02582,
"Y": 39.994705,
"Z": 321.06494
},
"TerritoryId": 957,
"InteractionType": "CompleteQuest",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,70 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1042301,
"Position": {
"X": -66.02582,
"Y": 39.994705,
"Z": 321.06494
},
"TerritoryId": 957,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2012884,
"Position": {
"X": 111.46704,
"Y": 5.935669,
"Z": -294.36182
},
"TerritoryId": 957,
"InteractionType": "UseItem",
"ItemId": 2003420,
"Fly": true,
"AetheryteShortcut": "Thavnair - Palaka's Stand"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 2012884,
"Position": {
"X": 111.46704,
"Y": 5.935669,
"Z": -294.36182
},
"TerritoryId": 957,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1042301,
"Position": {
"X": -66.02582,
"Y": 39.994705,
"Z": 321.06494
},
"TerritoryId": 957,
"InteractionType": "CompleteQuest",
"Fly": true
}
]
}
]
}

View File

@ -129,7 +129,7 @@
null, null,
null, null,
null, null,
32 -32
] ]
}, },
{ {

View File

@ -0,0 +1,136 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048779,
"Position": {
"X": -231.15894,
"Y": 3.221878,
"Z": -453.17773
},
"TerritoryId": 1188,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"Position": {
"X": -93.41179,
"Y": 15.238003,
"Z": -677.9412
},
"TerritoryId": 1188,
"InteractionType": "WalkTo",
"Fly": true
},
{
"DataId": 2014160,
"Position": {
"X": -95.23157,
"Y": 16.464417,
"Z": -677.8821
},
"TerritoryId": 1188,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"Position": {
"X": 183.02583,
"Y": -0.40592146,
"Z": -568.2219
},
"TerritoryId": 1188,
"InteractionType": "WalkTo",
"Fly": true
},
{
"DataId": 2014163,
"Position": {
"X": 181.8722,
"Y": 0.99176025,
"Z": -568.5359
},
"TerritoryId": 1188,
"InteractionType": "UseItem",
"ItemId": 2003626,
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
},
{
"DataId": 2014161,
"Position": {
"X": 221.57617,
"Y": 0.99176025,
"Z": -610.7423
},
"TerritoryId": 1188,
"InteractionType": "UseItem",
"ItemId": 2003626,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 2014162,
"Position": {
"X": 244.953,
"Y": 1.1138916,
"Z": -569.2684
},
"TerritoryId": 1188,
"InteractionType": "UseItem",
"ItemId": 2003626,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048779,
"Position": {
"X": -231.15894,
"Y": 3.221878,
"Z": -453.17773
},
"TerritoryId": 1188,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Kozama'uka - Ok'hanu",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,71 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048780,
"Position": {
"X": -103.868225,
"Y": 25.199324,
"Z": -525.41394
},
"TerritoryId": 1188,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"Position": {
"X": -95.05529,
"Y": 25.199324,
"Z": -523.8404
},
"TerritoryId": 1188,
"InteractionType": "WalkTo",
"Mount": true,
"SkipIf": [
"FlyingLocked"
]
},
{
"DataId": 2014195,
"Position": {
"X": -314.2901,
"Y": 0.38146973,
"Z": -211.26117
},
"TerritoryId": 1188,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [
17656
],
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048780,
"Position": {
"X": -103.868225,
"Y": 25.199324,
"Z": -525.41394
},
"TerritoryId": 1188,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Kozama'uka - Ok'hanu",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,58 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048781,
"Position": {
"X": -213.09229,
"Y": 6.2771482,
"Z": -510.70422
},
"TerritoryId": 1188,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2014196,
"Position": {
"X": 728.7556,
"Y": 8.010925,
"Z": -287.95306
},
"TerritoryId": 1188,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [
17657,
17658
],
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048781,
"Position": {
"X": -213.09229,
"Y": 6.2771482,
"Z": -510.70422
},
"TerritoryId": 1188,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Kozama'uka - Ok'hanu"
}
]
}
]
}

View File

@ -0,0 +1,98 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048815,
"Position": {
"X": 127.03125,
"Y": 3.8414035,
"Z": -279.92682
},
"TerritoryId": 1188,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2014165,
"Position": {
"X": 255.57336,
"Y": -0.015319824,
"Z": -350.57605
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"DataId": 2014166,
"Position": {
"X": 198.74878,
"Y": -0.015319824,
"Z": -385.39716
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
},
{
"DataId": 2014164,
"Position": {
"X": 92.69849,
"Y": -0.015319824,
"Z": -409.26227
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048821,
"Position": {
"X": -39.35309,
"Y": 21.48717,
"Z": -69.44385
},
"TerritoryId": 1188,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -0,0 +1,98 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048831,
"Position": {
"X": 252.76562,
"Y": 13.481276,
"Z": -579.30884
},
"TerritoryId": 1188,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1048786,
"Position": {
"X": -193.3471,
"Y": 6.277148,
"Z": -443.50348
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"AetheryteShortcut": "Kozama'uka - Ok'hanu",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"DataId": 1048787,
"Position": {
"X": -143.51111,
"Y": 9.842161,
"Z": -425.7115
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
},
{
"DataId": 1048785,
"Position": {
"X": -121.26343,
"Y": 9.773314,
"Z": -551.1406
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048831,
"Position": {
"X": 252.76562,
"Y": 13.481276,
"Z": -579.30884
},
"TerritoryId": 1188,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -0,0 +1,84 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048836,
"Position": {
"X": -578.91205,
"Y": 6.1739964,
"Z": -472.80084
},
"TerritoryId": 1188,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1048837,
"Position": {
"X": -613.2754,
"Y": 93.595924,
"Z": -476.95123
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"Position": {
"X": -607.3569,
"Y": 93.57029,
"Z": -472.15475
},
"StopDistance": 0.5,
"TerritoryId": 1188,
"InteractionType": "Emote",
"Emote": "pray"
}
]
},
{
"Sequence": 3,
"Steps": [
{
"Position": {
"X": -585.36694,
"Y": 6.317712,
"Z": -463.53406
},
"TerritoryId": 1188,
"InteractionType": "WalkTo",
"DisableNavmesh": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048836,
"Position": {
"X": -578.91205,
"Y": 6.1739964,
"Z": -472.80084
},
"StopDistance": 7,
"TerritoryId": 1188,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -0,0 +1,74 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048783,
"Position": {
"X": -269.91687,
"Y": 5.9870257,
"Z": -431.47937
},
"TerritoryId": 1188,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1050705,
"Position": {
"X": -218.24988,
"Y": 0.4,
"Z": -41.519836
},
"TerritoryId": 1188,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [
17659
],
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1050705,
"Position": {
"X": -218.24988,
"Y": 0.4,
"Z": -41.519836
},
"StopDistance": 7,
"TerritoryId": 1188,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048783,
"Position": {
"X": -269.91687,
"Y": 5.9870257,
"Z": -431.47937
},
"TerritoryId": 1188,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Kozama'uka - Ok'hanu",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,83 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1050707,
"Position": {
"X": -183.73395,
"Y": 10.893587,
"Z": -584.2832
},
"TerritoryId": 1188,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2014172,
"Position": {
"X": -70.96979,
"Y": 6.515503,
"Z": -496.2692
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"Position": {
"X": 623.9169,
"Y": 46.050114,
"Z": -526.32715
},
"TerritoryId": 1188,
"InteractionType": "WalkTo",
"Fly": true,
"SkipIf": [
"FlyingLocked"
]
},
{
"DataId": 2014173,
"Position": {
"X": 670.5576,
"Y": 42.923584,
"Z": -515.55664
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1050707,
"Position": {
"X": -183.73395,
"Y": 10.893587,
"Z": -584.2832
},
"TerritoryId": 1188,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Kozama'uka - Ok'hanu",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,99 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048784,
"Position": {
"X": -115.617676,
"Y": 25.086319,
"Z": -551.5984
},
"TerritoryId": 1188,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1048898,
"Position": {
"X": 524.1931,
"Y": 15.639493,
"Z": 5.4473877
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"AetheryteShortcut": "Kozama'uka - Many Fires",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
},
{
"DataId": 1048897,
"Position": {
"X": 551.6593,
"Y": 12.326415,
"Z": -32.852783
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"DataId": 1048896,
"Position": {
"X": 513.0541,
"Y": 15.9776535,
"Z": -54.36792
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048784,
"Position": {
"X": -115.617676,
"Y": 25.086319,
"Z": -551.5984
},
"TerritoryId": 1188,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Kozama'uka - Ok'hanu"
}
]
}
]
}

View File

@ -0,0 +1,52 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1051372,
"Position": {
"X": -183.79492,
"Y": 6.5185943,
"Z": -498.0392
},
"TerritoryId": 1188,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1051373,
"Position": {
"X": -232.07446,
"Y": 10.1700535,
"Z": -395.68176
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1051374,
"Position": {
"X": -229.02264,
"Y": 10.041226,
"Z": -396.2005
},
"TerritoryId": 1188,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -0,0 +1,79 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048853,
"Position": {
"X": -431.99817,
"Y": 121.63345,
"Z": 304.3412
},
"TerritoryId": 1188,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2014174,
"Position": {
"X": -756.89325,
"Y": 135.66797,
"Z": 83.78723
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 2014175,
"Position": {
"X": -786.3432,
"Y": 135.66797,
"Z": 121.9043
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048853,
"Position": {
"X": -431.99817,
"Y": 121.63345,
"Z": 304.3412
},
"TerritoryId": 1188,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Kozama'uka - Earthenshire"
}
]
}
]
}

View File

@ -0,0 +1,103 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048867,
"Position": {
"X": -489.0364,
"Y": 121.63345,
"Z": 368.00183
},
"TerritoryId": 1188,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"Position": {
"X": -298.1575,
"Y": 112.88461,
"Z": 684.6612
},
"TerritoryId": 1188,
"InteractionType": "WalkTo",
"Fly": true
},
{
"DataId": 1050708,
"Position": {
"X": -296.52863,
"Y": 112.804924,
"Z": 686.2439
},
"TerritoryId": 1188,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 2014176,
"Position": {
"X": -127.15344,
"Y": 109.57495,
"Z": 523.7964
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 3,
"Steps": [
{
"Position": {
"X": -298.1575,
"Y": 112.88461,
"Z": 684.6612
},
"TerritoryId": 1188,
"InteractionType": "WalkTo",
"Fly": true
},
{
"DataId": 1050708,
"Position": {
"X": -296.52863,
"Y": 112.804924,
"Z": 686.2439
},
"TerritoryId": 1188,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048867,
"Position": {
"X": -489.0364,
"Y": 121.63345,
"Z": 368.00183
},
"TerritoryId": 1188,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Kozama'uka - Earthenshire"
}
]
}
]
}

View File

@ -0,0 +1,118 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048854,
"Position": {
"X": -514.1833,
"Y": 121.63345,
"Z": 293.38513
},
"TerritoryId": 1188,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2014177,
"Position": {
"X": -351.40002,
"Y": 109.57495,
"Z": 62.210938
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 2014178,
"Position": {
"X": -172.32019,
"Y": 109.54443,
"Z": 128.67932
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"DataId": 2014179,
"Position": {
"X": 142.96167,
"Y": 109.57495,
"Z": 169.604
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
},
{
"DataId": 2014180,
"Position": {
"X": 214.86218,
"Y": 109.54443,
"Z": 138.68921
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
16
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048854,
"Position": {
"X": -514.1833,
"Y": 121.63345,
"Z": 293.38513
},
"TerritoryId": 1188,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Kozama'uka - Earthenshire"
}
]
}
]
}

View File

@ -0,0 +1,121 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048856,
"Position": {
"X": -499.6262,
"Y": 121.63344,
"Z": 347.70728
},
"TerritoryId": 1188,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"Position": {
"X": -74.84617,
"Y": 116.64437,
"Z": 590.74945
},
"TerritoryId": 1188,
"InteractionType": "WalkTo",
"Fly": true,
"SkipIf": [
"FlyingLocked"
],
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
-32
]
},
{
"DataId": 2014184,
"Position": {
"X": -5.1728516,
"Y": -6.729248,
"Z": 619.98914
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"DisableNavmesh": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
},
{
"DataId": 2014182,
"Position": {
"X": 112.93201,
"Y": -2.7314453,
"Z": 542.9617
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 2014183,
"Position": {
"X": 266.3462,
"Y": -1.9684448,
"Z": 498.58838
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048856,
"Position": {
"X": -499.6262,
"Y": 121.63344,
"Z": 347.70728
},
"TerritoryId": 1188,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Kozama'uka - Many Fires"
}
]
}
]
}

View File

@ -0,0 +1,53 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048857,
"Position": {
"X": -515.7092,
"Y": 122.40314,
"Z": 342.9159
},
"TerritoryId": 1188,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1048843,
"Position": {
"X": 588.7998,
"Y": 121.14124,
"Z": 176.98938
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"AetheryteShortcut": "Kozama'uka - Many Fires"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048857,
"Position": {
"X": -515.7092,
"Y": 122.40314,
"Z": 342.9159
},
"TerritoryId": 1188,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Kozama'uka - Earthenshire"
}
]
}
]
}

View File

@ -0,0 +1,82 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048858,
"Position": {
"X": -426.87115,
"Y": 121.63345,
"Z": 320.88184
},
"TerritoryId": 1188,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2014185,
"Position": {
"X": -427.38995,
"Y": 122.91138,
"Z": 319.38647
},
"TerritoryId": 1188,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 2014187,
"Position": {
"X": -548.2719,
"Y": 133.83679,
"Z": 698.1765
},
"TerritoryId": 1188,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1048880,
"Position": {
"X": -552.3613,
"Y": 133.86514,
"Z": 696.16235
},
"TerritoryId": 1188,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048858,
"Position": {
"X": -426.87115,
"Y": 121.63345,
"Z": 320.88184
},
"TerritoryId": 1188,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Kozama'uka - Earthenshire"
}
]
}
]
}

View File

@ -0,0 +1,116 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048843,
"Position": {
"X": 588.7998,
"Y": 121.14124,
"Z": 176.98938
},
"TerritoryId": 1188,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1048847,
"Position": {
"X": 615.2589,
"Y": 119.49003,
"Z": 197.58899
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
16
]
},
{
"DataId": 1048845,
"Position": {
"X": 568.7495,
"Y": 119.49004,
"Z": 159.53308
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"DataId": 1048846,
"Position": {
"X": 512.2606,
"Y": 114.99095,
"Z": 183.85596
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
},
{
"DataId": 1048844,
"Position": {
"X": 476.40186,
"Y": 119.9383,
"Z": 101.79285
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048843,
"Position": {
"X": 588.7998,
"Y": 121.14124,
"Z": 176.98938
},
"TerritoryId": 1188,
"InteractionType": "CompleteQuest",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,113 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1048848,
"Position": {
"X": 621.51514,
"Y": 119.49004,
"Z": 175.00574
},
"TerritoryId": 1188,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"Position": {
"X": 444.93774,
"Y": 112.59213,
"Z": 206.74438
},
"TerritoryId": 1188,
"InteractionType": "Combat",
"EnemySpawnType": "OverworldEnemies",
"ComplexCombatData": [
{
"DataId": 17241,
"RewardItemId": 2003643,
"RewardItemCount": 1,
"CompletionQuestVariablesFlags": [
null,
null,
16,
null,
null,
null
]
}
],
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
16,
null,
null,
null
],
"$": "16 0 16 0 0 0"
},
{
"Position": {
"X": -21.622044,
"Y": 109.937355,
"Z": 217.64447
},
"TerritoryId": 1188,
"InteractionType": "Combat",
"EnemySpawnType": "OverworldEnemies",
"ComplexCombatData": [
{
"DataId": 17242,
"RewardItemId": 2003642,
"RewardItemCount": 1,
"CompletionQuestVariablesFlags": [
null,
1,
null,
null,
null,
null
]
}
],
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
1,
null,
null,
null,
null
],
"$": "16 1 0 0 0 0"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1048848,
"Position": {
"X": 621.51514,
"Y": 119.49004,
"Z": 175.00574
},
"TerritoryId": 1188,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Kozama'uka - Many Fires",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,99 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1050714,
"Position": {
"X": 495.6587,
"Y": 113.678986,
"Z": 181.23132
},
"TerritoryId": 1188,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2014189,
"Position": {
"X": 194.93396,
"Y": 109.4834,
"Z": 145.25061
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 2014191,
"Position": {
"X": 53.3302,
"Y": 109.17822,
"Z": 246.3263
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
},
{
"DataId": 2014190,
"Position": {
"X": -19.119629,
"Y": 109.57495,
"Z": 182.02478
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1050714,
"Position": {
"X": 495.6587,
"Y": 113.678986,
"Z": 181.23132
},
"TerritoryId": 1188,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Kozama'uka - Many Fires"
}
]
}
]
}

View File

@ -0,0 +1,107 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1051243,
"Position": {
"X": -128.893,
"Y": 9.842161,
"Z": -416.95276
},
"TerritoryId": 1188,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1051244,
"Position": {
"X": 224.01758,
"Y": 10.257621,
"Z": -570.64166
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 2014281,
"Position": {
"X": 222.58337,
"Y": 10.72699,
"Z": -568.44434
},
"TerritoryId": 1188,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 3,
"Steps": [
{
"Position": {
"X": 37.763844,
"Y": 1.8493831,
"Z": -555.61774
},
"TerritoryId": 1188,
"InteractionType": "WalkTo"
},
{
"DataId": 2014284,
"Position": {
"X": -123.30823,
"Y": 9.84198,
"Z": -419.11957
},
"TerritoryId": 1188,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 1051243,
"Position": {
"X": -128.893,
"Y": 9.842161,
"Z": -416.95276
},
"TerritoryId": 1188,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1051246,
"Position": {
"X": -127.45862,
"Y": 9.842161,
"Z": -419.6994
},
"TerritoryId": 1188,
"InteractionType": "CompleteQuest",
"NextQuestId": 5083
}
]
}
]
}

View File

@ -0,0 +1,104 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1051243,
"Position": {
"X": -128.893,
"Y": 9.842161,
"Z": -416.95276
},
"TerritoryId": 1188,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1051247,
"Position": {
"X": 341.66467,
"Y": 9.178029,
"Z": -213.15332
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 2014198,
"Position": {
"X": 438.04077,
"Y": -0.015319824,
"Z": -395.43762
},
"TerritoryId": 1188,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [
17661
],
"Fly": true
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 2014286,
"Position": {
"X": 440.78735,
"Y": 1.1749268,
"Z": -397.1161
},
"TerritoryId": 1188,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 1051247,
"Position": {
"X": 341.66467,
"Y": 9.178029,
"Z": -213.15332
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1051251,
"Position": {
"X": 654.7798,
"Y": 26.32866,
"Z": -490.95905
},
"TerritoryId": 1188,
"InteractionType": "CompleteQuest",
"NextQuestId": 5084
}
]
}
]
}

View File

@ -0,0 +1,154 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1051252,
"Position": {
"X": 654.6272,
"Y": 26.32866,
"Z": -491.02008
},
"TerritoryId": 1188,
"InteractionType": "AcceptQuest",
"DialogueChoices": [
{
"Type": "List",
"Prompt": "TEXT_KINGZC204_05084_Q1_000_100",
"Answer": "TEXT_KINGZC204_05084_A2_000_100"
}
]
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1051253,
"Position": {
"X": -122.972534,
"Y": 9.842161,
"Z": -421.1643
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"AetheryteShortcut": "Kozama'uka - Ok'hanu"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1048786,
"Position": {
"X": -193.3471,
"Y": 6.277148,
"Z": -443.50348
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
},
{
"DataId": 1048783,
"Position": {
"X": -269.91687,
"Y": 5.9870257,
"Z": -431.47937
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 1048785,
"Position": {
"X": -121.26343,
"Y": 9.773314,
"Z": -551.1406
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1051255,
"Position": {
"X": -128.98456,
"Y": 9.84216,
"Z": -420.58447
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 1051258,
"Position": {
"X": 658.7167,
"Y": 5.2940493,
"Z": -335.07288
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1051261,
"Position": {
"X": -130.9682,
"Y": 9.842161,
"Z": -416.58655
},
"TerritoryId": 1188,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Kozama'uka - Ok'hanu"
}
]
}
]
}

View File

@ -0,0 +1,82 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1051265,
"Position": {
"X": -444.78522,
"Y": 122.89024,
"Z": 342.8855
},
"TerritoryId": 1188,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1048850,
"Position": {
"X": -472.5567,
"Y": 121.77377,
"Z": 271.229
},
"TerritoryId": 1188,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1051263,
"Position": {
"X": -521.0193,
"Y": 121.63345,
"Z": 319.38647
},
"TerritoryId": 1188,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1051265,
"Position": {
"X": -444.78522,
"Y": 122.89024,
"Z": 342.8855
},
"TerritoryId": 1188,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1051263,
"Position": {
"X": -521.0193,
"Y": 121.63345,
"Z": 319.38647
},
"TerritoryId": 1188,
"InteractionType": "CompleteQuest",
"NextQuestId": 5087
}
]
}
]
}

View File

@ -0,0 +1,89 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1051263,
"Position": {
"X": -521.0193,
"Y": 121.63345,
"Z": 319.38647
},
"TerritoryId": 1188,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1051266,
"Position": {
"X": 565.8197,
"Y": 115.49999,
"Z": 195.30017
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"AetheryteShortcut": "Kozama'uka - Many Fires"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"Position": {
"X": 627.93854,
"Y": 110.09355,
"Z": 334.26776
},
"TerritoryId": 1188,
"InteractionType": "Combat",
"EnemySpawnType": "OverworldEnemies",
"KillEnemyDataIds": [
17244
],
"Fly": true
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1051266,
"Position": {
"X": 565.8197,
"Y": 115.49999,
"Z": 195.30017
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"AetheryteShortcut": "Kozama'uka - Many Fires"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1051267,
"Position": {
"X": -447.5014,
"Y": 122.95055,
"Z": 343.099
},
"TerritoryId": 1188,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Kozama'uka - Earthenshire",
"NextQuestId": 5088
}
]
}
]
}

View File

@ -0,0 +1,127 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1051267,
"Position": {
"X": -447.5014,
"Y": 122.95055,
"Z": 343.099
},
"TerritoryId": 1188,
"InteractionType": "AcceptQuest",
"DialogueChoices": [
{
"Type": "List",
"Prompt": "TEXT_KINGZC304_05088_Q1_000_100",
"Answer": "TEXT_KINGZC304_05088_A2_000_100"
}
]
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2014289,
"Position": {
"X": -422.50708,
"Y": 122.88086,
"Z": 338.88757
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Mount": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 2014290,
"Position": {
"X": -519.4629,
"Y": 123.88794,
"Z": 252.61304
},
"TerritoryId": 1188,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 3,
"Steps": [
{
"Position": {
"X": -759,
"Y": 129.30363,
"Z": 237.35704
},
"TerritoryId": 1188,
"InteractionType": "Combat",
"EnemySpawnType": "AutoOnEnterArea",
"KillEnemyDataIds": [
17662
],
"Fly": true
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 1051268,
"Position": {
"X": -756.80176,
"Y": 129.29285,
"Z": 240.7721
},
"StopDistance": 7,
"TerritoryId": 1188,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 5,
"Steps": [
{
"DataId": 1051269,
"Position": {
"X": -566.73535,
"Y": 133.78297,
"Z": 721.3396
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1051267,
"Position": {
"X": -447.5014,
"Y": 122.95055,
"Z": 343.099
},
"TerritoryId": 1188,
"InteractionType": "CompleteQuest",
"NextQuestId": 5089,
"AetheryteShortcut": "Kozama'uka - Earthenshire"
}
]
}
]
}

View File

@ -0,0 +1,132 @@
{
"$schema": "https://carvel.li/questionable/quest-1.0",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1051271,
"Position": {
"X": -447.04358,
"Y": 122.95054,
"Z": 343.4348
},
"StopDistance": 5,
"TerritoryId": 1188,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1051273,
"Position": {
"X": 565.54517,
"Y": 115.5,
"Z": 193.22498
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"AetheryteShortcut": "Kozama'uka - Many Fires"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1051275,
"Position": {
"X": -645.7771,
"Y": 127.95559,
"Z": 661.76843
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"AetheryteShortcut": "Kozama'uka - Earthenshire",
"Fly": true
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1051270,
"Position": {
"X": -565.2705,
"Y": 133.77481,
"Z": 720.7294
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true,
"DialogueChoices": [
{
"Type": "List",
"Prompt": "TEXT_KINGZC401_05089_Q1_000_100",
"Answer": "TEXT_KINGZC401_05089_A1_000_100"
}
]
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 1051277,
"Position": {
"X": -647.0283,
"Y": 127.88751,
"Z": 660.57825
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 5,
"Steps": [
{
"DataId": 1051278,
"Position": {
"X": -130.69354,
"Y": 9.84216,
"Z": -415.21326
},
"TerritoryId": 1188,
"InteractionType": "Interact",
"AetheryteShortcut": "Kozama'uka - Ok'hanu",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_KINGZC401_05089_Q100_000_100",
"Yes": true
}
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1051280,
"Position": {
"X": -125.20032,
"Y": 9.842161,
"Z": -418.08197
},
"TerritoryId": 1188,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -415,35 +415,7 @@
} }
}, },
"CompletionQuestVariablesFlags": { "CompletionQuestVariablesFlags": {
"type": "array", "$ref": "#/$defs/CompletionFlags"
"description": "Quest Variables that dictate whether or not this step is skipped: null is don't check, positive values need to be set, negative values need to be unset",
"items": {
"type": [
"integer",
"null"
],
"enum": [
null,
1,
2,
4,
8,
16,
32,
64,
128,
-1,
-2,
-4,
-8,
-16,
-32,
-64,
-128
]
},
"minItems": 6,
"maxItems": 6
}, },
"DelaySecondsAtStart": { "DelaySecondsAtStart": {
"description": "Time to wait before starting", "description": "Time to wait before starting",
@ -567,13 +539,49 @@
"items": { "items": {
"type": "integer" "type": "integer"
} }
},
"ComplexCombatData": {
"description": "If multiple different enemies are supposed to be killed in a single quest step, this typically is handled via items",
"type": "array",
"items": {
"type": "object",
"properties": {
"DataId": {
"description": "The enemy data id which is supposed to be killed",
"type": "integer"
},
"RewardItemId": {
"type": "integer"
},
"RewardItemCount": {
"type": "integer"
},
"CompletionQuestVariablesFlags": {
"$ref": "#/$defs/CompletionFlags"
}
},
"required": [
"DataId"
]
}
} }
}, },
"required": [ "required": [
"Position", "Position",
"EnemySpawnType", "EnemySpawnType"
],
"oneOf": [
{
"required": [
"KillEnemyDataIds" "KillEnemyDataIds"
] ]
},
{
"required": [
"ComplexCombatData"
]
}
]
} }
}, },
{ {
@ -1027,5 +1035,38 @@
"QuestSequence", "QuestSequence",
"Author" "Author"
], ],
"additionalProperties": false "additionalProperties": false,
"$defs": {
"CompletionFlags": {
"type": "array",
"description": "Quest Variables that dictate whether or not this step is skipped: null is don't check, positive values need to be set, negative values need to be unset",
"items": {
"type": [
"integer",
"null"
],
"enum": [
null,
1,
2,
4,
8,
16,
32,
64,
128,
-1,
-2,
-4,
-8,
-16,
-32,
-64,
-128
]
},
"minItems": 6,
"maxItems": 6
}
}
} }

View File

@ -0,0 +1,11 @@
using System.Collections.Generic;
namespace Questionable.Model.V1;
public sealed class ComplexCombatData
{
public uint DataId { get; set; }
public uint? RewardItemId { get; set; }
public int? RewardItemCount { get; set; }
public IList<short?> CompletionQuestVariablesFlags { get; set; } = new List<short?>();
}

View File

@ -47,6 +47,7 @@ public sealed class QuestStep
public EEnemySpawnType? EnemySpawnType { get; set; } public EEnemySpawnType? EnemySpawnType { get; set; }
public IList<uint> KillEnemyDataIds { get; set; } = new List<uint>(); public IList<uint> KillEnemyDataIds { get; set; } = new List<uint>();
public IList<ComplexCombatData> ComplexCombatData { get; set; } = new List<ComplexCombatData>();
public JumpDestination? JumpDestination { get; set; } public JumpDestination? JumpDestination { get; set; }
public uint? ContentFinderConditionId { get; set; } public uint? ContentFinderConditionId { get; set; }

View File

@ -6,9 +6,12 @@ using Dalamud.Game.ClientState.Objects;
using Dalamud.Game.ClientState.Objects.Enums; using Dalamud.Game.ClientState.Objects.Enums;
using Dalamud.Game.ClientState.Objects.Types; using Dalamud.Game.ClientState.Objects.Types;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game;
using FFXIVClientStructs.FFXIV.Client.Game.Object; using FFXIVClientStructs.FFXIV.Client.Game.Object;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.Controller.CombatModules; using Questionable.Controller.CombatModules;
using Questionable.Controller.Utils;
using Questionable.Model.V1;
namespace Questionable.Controller; namespace Questionable.Controller;
@ -19,18 +22,21 @@ internal sealed class CombatController
private readonly IObjectTable _objectTable; private readonly IObjectTable _objectTable;
private readonly ICondition _condition; private readonly ICondition _condition;
private readonly IClientState _clientState; private readonly IClientState _clientState;
private readonly GameFunctions _gameFunctions;
private readonly ILogger<CombatController> _logger; private readonly ILogger<CombatController> _logger;
private CurrentFight? _currentFight; private CurrentFight? _currentFight;
public CombatController(IEnumerable<ICombatModule> combatModules, ITargetManager targetManager, public CombatController(IEnumerable<ICombatModule> combatModules, ITargetManager targetManager,
IObjectTable objectTable, ICondition condition, IClientState clientState, ILogger<CombatController> logger) IObjectTable objectTable, ICondition condition, IClientState clientState, GameFunctions gameFunctions,
ILogger<CombatController> logger)
{ {
_combatModules = combatModules.ToList(); _combatModules = combatModules.ToList();
_targetManager = targetManager; _targetManager = targetManager;
_objectTable = objectTable; _objectTable = objectTable;
_condition = condition; _condition = condition;
_clientState = clientState; _clientState = clientState;
_gameFunctions = gameFunctions;
_logger = logger; _logger = logger;
} }
@ -100,15 +106,65 @@ internal sealed class CombatController
private IGameObject? FindNextTarget() private IGameObject? FindNextTarget()
{ {
if (_currentFight == null)
return null;
// check if any complex combat conditions are fulfilled
var complexCombatData = _currentFight.Data.ComplexCombatDatas;
if (complexCombatData.Count > 0)
{
for (int i = 0; i < complexCombatData.Count; ++i)
{
if (_currentFight.Data.CompletedComplexDatas.Contains(i))
continue;
var condition = complexCombatData[i];
if (condition.RewardItemId != null && condition.RewardItemCount != null)
{
unsafe
{
var inventoryManager = InventoryManager.Instance();
if (inventoryManager->GetInventoryItemCount(condition.RewardItemId.Value) >=
condition.RewardItemCount.Value)
{
_logger.LogInformation(
"Complex combat condition fulfilled: itemCount({ItemId}) >= {ItemCount}",
condition.RewardItemId, condition.RewardItemCount);
_currentFight.Data.CompletedComplexDatas.Add(i);
continue;
}
}
}
if (QuestWorkUtils.HasCompletionFlags(condition.CompletionQuestVariablesFlags))
{
var questWork = _gameFunctions.GetQuestEx(_currentFight.Data.QuestId);
if (questWork != null && QuestWorkUtils.MatchesQuestWork(condition.CompletionQuestVariablesFlags,
questWork.Value, false))
{
_logger.LogInformation("Complex combat condition fulfilled: QuestWork matches");
_currentFight.Data.CompletedComplexDatas.Add(i);
continue;
}
}
}
}
return _objectTable.Where(IsEnemyToKill).MinBy(x => (x.Position - _clientState.LocalPlayer!.Position).Length()); return _objectTable.Where(IsEnemyToKill).MinBy(x => (x.Position - _clientState.LocalPlayer!.Position).Length());
} }
private unsafe bool IsEnemyToKill(IGameObject gameObject) private unsafe bool IsEnemyToKill(IGameObject gameObject)
{ {
if (gameObject is IBattleChara battleChara) if (gameObject is IBattleChara battleChara)
{
// TODO this works as somewhat of a delay between killing enemies if certain items/flags are checked
// but also delays killing the next enemy a little
if (_currentFight == null || _currentFight.Data.SpawnType != EEnemySpawnType.OverworldEnemies ||
_currentFight.Data.ComplexCombatDatas.Count == 0)
{ {
if (battleChara.IsDead) if (battleChara.IsDead)
return false; return false;
}
if (!battleChara.IsTargetable) if (!battleChara.IsTargetable)
return false; return false;
@ -116,8 +172,26 @@ internal sealed class CombatController
if (battleChara.TargetObjectId == _clientState.LocalPlayer?.GameObjectId) if (battleChara.TargetObjectId == _clientState.LocalPlayer?.GameObjectId)
return true; return true;
if (_currentFight != null && _currentFight.Data.KillEnemyDataIds.Contains(battleChara.DataId)) if (_currentFight != null)
{
var complexCombatData = _currentFight.Data.ComplexCombatDatas;
if (complexCombatData.Count >= 0)
{
for (int i = 0; i < complexCombatData.Count; ++i)
{
if (_currentFight.Data.CompletedComplexDatas.Contains(i))
continue;
if (complexCombatData[i].DataId == battleChara.DataId)
return true; return true;
}
}
else
{
if (_currentFight.Data.KillEnemyDataIds.Contains(battleChara.DataId))
return true;
}
}
if (battleChara.StatusFlags.HasFlag(StatusFlags.Hostile)) if (battleChara.StatusFlags.HasFlag(StatusFlags.Hostile))
{ {
@ -150,6 +224,11 @@ internal sealed class CombatController
public sealed class CombatData public sealed class CombatData
{ {
public required ReadOnlyCollection<uint> KillEnemyDataIds { get; init; } public required ushort QuestId { get; init; }
public required EEnemySpawnType SpawnType { get; init; }
public required List<uint> KillEnemyDataIds { get; init; }
public required List<ComplexCombatData> ComplexCombatDatas { get; init; }
public HashSet<int> CompletedComplexDatas { get; } = new();
} }
} }

View File

@ -17,24 +17,27 @@ internal sealed class CommandHandler : IDisposable
private readonly QuestController _questController; private readonly QuestController _questController;
private readonly MovementController _movementController; private readonly MovementController _movementController;
private readonly QuestRegistry _questRegistry; private readonly QuestRegistry _questRegistry;
private readonly QuestData _questData;
private readonly ConfigWindow _configWindow; private readonly ConfigWindow _configWindow;
private readonly DebugOverlay _debugOverlay; private readonly DebugOverlay _debugOverlay;
private readonly QuestWindow _questWindow; private readonly QuestWindow _questWindow;
private readonly QuestSelectionWindow _questSelectionWindow;
private readonly ITargetManager _targetManager;
public CommandHandler(ICommandManager commandManager, IChatGui chatGui, QuestController questController, public CommandHandler(ICommandManager commandManager, IChatGui chatGui, QuestController questController,
MovementController movementController, QuestRegistry questRegistry, QuestData questData, MovementController movementController, QuestRegistry questRegistry,
ConfigWindow configWindow, DebugOverlay debugOverlay, QuestWindow questWindow) ConfigWindow configWindow, DebugOverlay debugOverlay, QuestWindow questWindow,
QuestSelectionWindow questSelectionWindow, ITargetManager targetManager)
{ {
_commandManager = commandManager; _commandManager = commandManager;
_chatGui = chatGui; _chatGui = chatGui;
_questController = questController; _questController = questController;
_movementController = movementController; _movementController = movementController;
_questRegistry = questRegistry; _questRegistry = questRegistry;
_questData = questData;
_configWindow = configWindow; _configWindow = configWindow;
_debugOverlay = debugOverlay; _debugOverlay = debugOverlay;
_questWindow = questWindow; _questWindow = questWindow;
_questSelectionWindow = questSelectionWindow;
_targetManager = targetManager;
_commandManager.AddHandler("/qst", new CommandInfo(ProcessCommand) _commandManager.AddHandler("/qst", new CommandInfo(ProcessCommand)
{ {
@ -74,7 +77,7 @@ internal sealed class CommandHandler : IDisposable
break; break;
case "which": case "which":
_questData.ShowQuestsIssuedByTarget(); _questSelectionWindow.Open(_targetManager.Target);
break; break;
default: default:

View File

@ -159,15 +159,38 @@ internal sealed class GameUiController : IDisposable
return; return;
} }
// this is 'Daily Quests' for tribal quests, but not set for normal selections
string? title = addonSelectIconString->AtkValues[0].ReadAtkString();
var currentQuest = _questController.StartedQuest; var currentQuest = _questController.StartedQuest;
if (currentQuest != null && actualPrompt == null) if (currentQuest != null && (actualPrompt == null || title != null))
{
_logger.LogInformation("Checking if current quest {Name} is on the list", currentQuest.Quest.Info.Name);
if (CheckQuestSelection(addonSelectIconString, currentQuest.Quest, answers))
return;
}
var nextQuest = _questController.NextQuest;
if (nextQuest != null && (actualPrompt == null || title != null))
{
_logger.LogInformation("Checking if next quest {Name} is on the list", nextQuest.Quest.Info.Name);
if (CheckQuestSelection(addonSelectIconString, nextQuest.Quest, answers))
return;
}
}
private unsafe bool CheckQuestSelection(AddonSelectIconString* addonSelectIconString, Quest quest, List<string?> answers)
{ {
// it is possible for this to be a quest selection // it is possible for this to be a quest selection
string questName = currentQuest.Quest.Info.Name; string questName = quest.Info.Name;
int questSelection = answers.FindIndex(x => GameStringEquals(questName, x)); int questSelection = answers.FindIndex(x => GameStringEquals(questName, x));
if (questSelection >= 0) if (questSelection >= 0)
{
addonSelectIconString->AtkUnitBase.FireCallbackInt(questSelection); addonSelectIconString->AtkUnitBase.FireCallbackInt(questSelection);
return true;
} }
return false;
} }
public static unsafe List<string?> GetChoices(AddonSelectIconString* addonSelectIconString) public static unsafe List<string?> GetChoices(AddonSelectIconString* addonSelectIconString)

View File

@ -148,7 +148,13 @@ internal sealed class QuestController
else if (_nextQuest != null) else if (_nextQuest != null)
{ {
// if the quest is accepted, we no longer track it // if the quest is accepted, we no longer track it
if (_gameFunctions.IsQuestAcceptedOrComplete(_nextQuest.Quest.QuestId)) bool canUseNextQuest;
if (_nextQuest.Quest.Info.IsRepeatable)
canUseNextQuest = !_gameFunctions.IsQuestAccepted(_nextQuest.Quest.QuestId);
else
canUseNextQuest = !_gameFunctions.IsQuestAcceptedOrComplete(_nextQuest.Quest.QuestId);
if (!canUseNextQuest)
{ {
_logger.LogInformation("Next quest {QuestId} accepted or completed", _nextQuest.Quest.QuestId); _logger.LogInformation("Next quest {QuestId} accepted or completed", _nextQuest.Quest.QuestId);

View File

@ -47,8 +47,7 @@ internal static class Combat
return [unmount, CreateTask(quest, sequence, step)]; return [unmount, CreateTask(quest, sequence, step)];
case EEnemySpawnType.OverworldEnemies: case EEnemySpawnType.OverworldEnemies:
// TODO currently not handled return [unmount, CreateTask(quest, sequence, step)];
return [unmount];
default: default:
throw new ArgumentOutOfRangeException(nameof(step), $"Unknown spawn type {step.EnemySpawnType}"); throw new ArgumentOutOfRangeException(nameof(step), $"Unknown spawn type {step.EnemySpawnType}");
@ -57,27 +56,31 @@ internal static class Combat
public ITask CreateTask(Quest quest, QuestSequence sequence, QuestStep step) public ITask CreateTask(Quest quest, QuestSequence sequence, QuestStep step)
{ {
ArgumentNullException.ThrowIfNull(step.EnemySpawnType);
bool isLastStep = sequence.Steps.Last() == step; bool isLastStep = sequence.Steps.Last() == step;
return serviceProvider.GetRequiredService<HandleCombat>() return serviceProvider.GetRequiredService<HandleCombat>()
.With(quest.QuestId, isLastStep, step.KillEnemyDataIds, step.CompletionQuestVariablesFlags); .With(quest.QuestId, isLastStep, step.EnemySpawnType.Value, step.KillEnemyDataIds,
step.CompletionQuestVariablesFlags, step.ComplexCombatData);
} }
} }
internal sealed class HandleCombat(CombatController combatController, GameFunctions gameFunctions) : ITask internal sealed class HandleCombat(CombatController combatController, GameFunctions gameFunctions) : ITask
{ {
private ushort _questId;
private bool _isLastStep; private bool _isLastStep;
private CombatController.CombatData _combatData = null!; private CombatController.CombatData _combatData = null!;
private IList<short?> _completionQuestVariableFlags = null!; private IList<short?> _completionQuestVariableFlags = null!;
public ITask With(ushort questId, bool isLastStep, IList<uint> killEnemyDataIds, public ITask With(ushort questId, bool isLastStep, EEnemySpawnType enemySpawnType, IList<uint> killEnemyDataIds,
IList<short?> completionQuestVariablesFlags) IList<short?> completionQuestVariablesFlags, IList<ComplexCombatData> complexCombatData)
{ {
_questId = questId;
_isLastStep = isLastStep; _isLastStep = isLastStep;
_combatData = new CombatController.CombatData _combatData = new CombatController.CombatData
{ {
KillEnemyDataIds = killEnemyDataIds.AsReadOnly(), QuestId = questId,
SpawnType = enemySpawnType,
KillEnemyDataIds = killEnemyDataIds.ToList(),
ComplexCombatDatas = complexCombatData.ToList(),
}; };
_completionQuestVariableFlags = completionQuestVariablesFlags; _completionQuestVariableFlags = completionQuestVariablesFlags;
return this; return this;
@ -93,7 +96,7 @@ internal static class Combat
// if our quest step has any completion flags, we need to check if they are set // if our quest step has any completion flags, we need to check if they are set
if (QuestWorkUtils.HasCompletionFlags(_completionQuestVariableFlags)) if (QuestWorkUtils.HasCompletionFlags(_completionQuestVariableFlags))
{ {
var questWork = gameFunctions.GetQuestEx(_questId); var questWork = gameFunctions.GetQuestEx(_combatData.QuestId);
if (questWork == null) if (questWork == null)
return ETaskResult.StillRunning; return ETaskResult.StillRunning;

View File

@ -227,9 +227,12 @@ internal static class Move
{ {
var character = (Character*)(clientState.LocalPlayer?.Address ?? 0); var character = (Character*)(clientState.LocalPlayer?.Address ?? 0);
if (character != null) if (character != null)
{
if (ActionManager.Instance()->GetActionStatus(ActionType.GeneralAction, 23) == 0)
{ {
logger.LogInformation("Attempting to land"); logger.LogInformation("Attempting to land");
return ActionManager.Instance()->UseAction(ActionType.Mount, character->Mount.MountId); return ActionManager.Instance()->UseAction(ActionType.GeneralAction, 23);
}
} }
return false; return false;

View File

@ -28,7 +28,8 @@ internal sealed class DalamudInitializer : IDisposable
WindowSystem windowSystem, WindowSystem windowSystem,
QuestWindow questWindow, QuestWindow questWindow,
DebugOverlay debugOverlay, DebugOverlay debugOverlay,
ConfigWindow configWindow) ConfigWindow configWindow,
QuestSelectionWindow questSelectionWindow)
{ {
_pluginInterface = pluginInterface; _pluginInterface = pluginInterface;
_framework = framework; _framework = framework;
@ -42,6 +43,7 @@ internal sealed class DalamudInitializer : IDisposable
_windowSystem.AddWindow(questWindow); _windowSystem.AddWindow(questWindow);
_windowSystem.AddWindow(configWindow); _windowSystem.AddWindow(configWindow);
_windowSystem.AddWindow(debugOverlay); _windowSystem.AddWindow(debugOverlay);
_windowSystem.AddWindow(questSelectionWindow);
_pluginInterface.UiBuilder.Draw += _windowSystem.Draw; _pluginInterface.UiBuilder.Draw += _windowSystem.Draw;
_pluginInterface.UiBuilder.OpenMainUi += _questWindow.Toggle; _pluginInterface.UiBuilder.OpenMainUi += _questWindow.Toggle;

View File

@ -2,12 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Linq; using System.Linq;
using Dalamud.Game.ClientState.Objects;
using Dalamud.Game.Text;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.UI;
using LLib.GameUI;
using Questionable.Controller;
using Questionable.Model; using Questionable.Model;
using Quest = Lumina.Excel.GeneratedSheets.Quest; using Quest = Lumina.Excel.GeneratedSheets.Quest;
@ -15,18 +10,10 @@ namespace Questionable.Data;
internal sealed class QuestData internal sealed class QuestData
{ {
private readonly ITargetManager _targetManager;
private readonly IChatGui _chatGui;
private readonly IGameGui _gameGui;
private readonly ImmutableDictionary<ushort, QuestInfo> _quests; private readonly ImmutableDictionary<ushort, QuestInfo> _quests;
public QuestData(IDataManager dataManager, ITargetManager targetManager, IChatGui chatGui, IGameGui gameGui) public QuestData(IDataManager dataManager)
{ {
_targetManager = targetManager;
_chatGui = chatGui;
_gameGui = gameGui;
_quests = dataManager.GetExcelSheet<Quest>()! _quests = dataManager.GetExcelSheet<Quest>()!
.Where(x => x.RowId > 0) .Where(x => x.RowId > 0)
.Where(x => x.IssuerLocation.Row > 0) .Where(x => x.IssuerLocation.Row > 0)
@ -47,31 +34,4 @@ internal sealed class QuestData
} }
public bool IsIssuerOfAnyQuest(uint targetId) => _quests.Values.Any(x => x.IssuerDataId == targetId); public bool IsIssuerOfAnyQuest(uint targetId) => _quests.Values.Any(x => x.IssuerDataId == targetId);
public unsafe void ShowQuestsIssuedByTarget()
{
var targetId = _targetManager.Target?.DataId;
if (targetId == null)
{
_chatGui.PrintError("[Questionable] No target selected.");
return;
}
List<QuestInfo> quests = GetAllByIssuerDataId(targetId.Value);
if (_gameGui.TryGetAddonByName<AddonSelectIconString>("SelectIconString", out var addonSelectIconString))
{
var answers = GameUiController.GetChoices(addonSelectIconString);
quests = quests.Where(x => answers.Any(y => GameUiController.GameStringEquals(x.Name, y))).ToList();
_chatGui.Print($"{quests.Count} quest(s) currently offered by target {_targetManager.Target?.Name}:");
}
else
{
_chatGui.Print($"{quests.Count} quest(s) issued by target {_targetManager.Target?.Name}:");
}
foreach (QuestInfo quest in quests)
_chatGui.Print($" {quest.QuestId}_{quest.SimplifiedName}");
}
} }

View File

@ -223,15 +223,22 @@ internal sealed unsafe class GameFunctions
} }
public bool IsReadyToAcceptQuest(ushort questId) public bool IsReadyToAcceptQuest(ushort questId)
{
_questRegistry.TryGetQuest(questId, out var quest);
if (quest is { Info.IsRepeatable: true })
{
if (IsQuestAccepted(questId))
return false;
}
else
{ {
if (IsQuestAcceptedOrComplete(questId)) if (IsQuestAcceptedOrComplete(questId))
return false; return false;
}
// if we're not at a high enough level to continue, we also ignore it // if we're not at a high enough level to continue, we also ignore it
var currentLevel = _clientState.LocalPlayer?.Level ?? 0; var currentLevel = _clientState.LocalPlayer?.Level ?? 0;
if (currentLevel != 0 && if (currentLevel != 0 && quest != null && quest.Info.Level > currentLevel)
_questRegistry.TryGetQuest(questId, out Quest? quest) &&
quest.Info.Level > currentLevel)
return false; return false;
return true; return true;
@ -239,9 +246,11 @@ internal sealed unsafe class GameFunctions
public bool IsQuestAcceptedOrComplete(ushort questId) public bool IsQuestAcceptedOrComplete(ushort questId)
{ {
if (QuestManager.IsQuestComplete(questId)) return QuestManager.IsQuestComplete(questId) || IsQuestAccepted(questId);
return true; }
public bool IsQuestAccepted(ushort questId)
{
QuestManager* questManager = QuestManager.Instance(); QuestManager* questManager = QuestManager.Instance();
return questManager->IsQuestAccepted(questId); return questManager->IsQuestAccepted(questId);
} }

View File

@ -12,12 +12,14 @@ internal sealed class QuestInfo
Name = quest.Name.ToString(); Name = quest.Name.ToString();
Level = quest.ClassJobLevel0; Level = quest.ClassJobLevel0;
IssuerDataId = quest.IssuerStart; IssuerDataId = quest.IssuerStart;
IsRepeatable = quest.IsRepeatable;
} }
public ushort QuestId { get; } public ushort QuestId { get; }
public string Name { get; } public string Name { get; }
public ushort Level { get; } public ushort Level { get; }
public uint IssuerDataId { get; } public uint IssuerDataId { get; }
public bool IsRepeatable { get; }
public string SimplifiedName => Name public string SimplifiedName => Name
.TrimStart(SeIconChar.QuestSync.ToIconChar(), SeIconChar.QuestRepeatable.ToIconChar(), ' '); .TrimStart(SeIconChar.QuestSync.ToIconChar(), SeIconChar.QuestRepeatable.ToIconChar(), ' ');

View File

@ -1,6 +1,6 @@
<Project Sdk="Dalamud.NET.Sdk/9.0.2"> <Project Sdk="Dalamud.NET.Sdk/9.0.2">
<PropertyGroup> <PropertyGroup>
<Version>1.6</Version> <Version>1.7</Version>
<OutputPath>dist</OutputPath> <OutputPath>dist</OutputPath>
<PathMap Condition="$(SolutionDir) != ''">$(SolutionDir)=X:\</PathMap> <PathMap Condition="$(SolutionDir) != ''">$(SolutionDir)=X:\</PathMap>
</PropertyGroup> </PropertyGroup>

View File

@ -127,6 +127,8 @@ public sealed class QuestionablePlugin : IDalamudPlugin
serviceCollection.AddSingleton<QuestWindow>(); serviceCollection.AddSingleton<QuestWindow>();
serviceCollection.AddSingleton<ConfigWindow>(); serviceCollection.AddSingleton<ConfigWindow>();
serviceCollection.AddSingleton<DebugOverlay>(); serviceCollection.AddSingleton<DebugOverlay>();
serviceCollection.AddSingleton<QuestSelectionWindow>();
serviceCollection.AddSingleton<CommandHandler>(); serviceCollection.AddSingleton<CommandHandler>();
serviceCollection.AddSingleton<DalamudInitializer>(); serviceCollection.AddSingleton<DalamudInitializer>();

View File

@ -0,0 +1,202 @@
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Numerics;
using Dalamud.Game.ClientState.Objects.Types;
using Dalamud.Interface;
using Dalamud.Interface.Colors;
using Dalamud.Interface.Components;
using Dalamud.Interface.Utility.Raii;
using Dalamud.Plugin;
using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.UI;
using ImGuiNET;
using LLib.GameUI;
using LLib.ImGui;
using Questionable.Controller;
using Questionable.Data;
using Questionable.Model;
namespace Questionable.Windows;
internal sealed class QuestSelectionWindow : LWindow
{
private const string WindowId = "###QuestionableQuestSelection";
private readonly QuestData _questData;
private readonly IGameGui _gameGui;
private readonly IChatGui _chatGui;
private readonly GameFunctions _gameFunctions;
private readonly QuestController _questController;
private readonly QuestRegistry _questRegistry;
private readonly IDalamudPluginInterface _pluginInterface;
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)
: base($"Quest Selection{WindowId}")
{
_questData = questData;
_gameGui = gameGui;
_chatGui = chatGui;
_gameFunctions = gameFunctions;
_questController = questController;
_questRegistry = questRegistry;
_pluginInterface = pluginInterface;
Size = new Vector2(500, 200);
SizeCondition = ImGuiCond.Once;
SizeConstraints = new WindowSizeConstraints
{
MinimumSize = new Vector2(500, 200),
};
}
public uint TargetId { get; private set; }
public string TargetName { get; private set; } = string.Empty;
public unsafe void Open(IGameObject? gameObject)
{
if (gameObject != null)
{
TargetId = gameObject.DataId;
TargetName = gameObject.Name.ToString();
WindowName = $"Quests starting with {TargetName} [{TargetId}]{WindowId}";
_quests = _questData.GetAllByIssuerDataId(TargetId);
if (_gameGui.TryGetAddonByName<AddonSelectIconString>("SelectIconString", out var addonSelectIconString))
{
var answers = GameUiController.GetChoices(addonSelectIconString);
_offeredQuests = _quests
.Where(x => answers.Any(y => GameUiController.GameStringEquals(x.Name, y)))
.ToList();
}
else
_offeredQuests = [];
}
else
{
_quests = [];
_offeredQuests = [];
}
IsOpen = _quests.Count > 0;
}
public override void Draw()
{
if (_offeredQuests.Count != 0)
ImGui.Checkbox("Only show quests currently offered", ref _onlyAvailableQuests);
using var table = ImRaii.Table("QuestSelection", 4, ImGuiTableFlags.Borders | ImGuiTableFlags.ScrollY);
if (!table)
{
ImGui.Text("Not table");
return;
}
ImGui.TableSetupColumn("Id", ImGuiTableColumnFlags.WidthFixed, 50);
ImGui.TableSetupColumn("", ImGuiTableColumnFlags.WidthFixed, 18);
ImGui.TableSetupColumn("Name", ImGuiTableColumnFlags.None, 200);
ImGui.TableSetupColumn("Actions", ImGuiTableColumnFlags.WidthFixed, 100);
ImGui.TableHeadersRow();
foreach (QuestInfo quest in (_offeredQuests.Count != 0 && _onlyAvailableQuests) ? _offeredQuests : _quests)
{
ImGui.TableNextRow();
string questId = quest.QuestId.ToString(CultureInfo.InvariantCulture);
bool isKnownQuest = _questRegistry.TryGetQuest(quest.QuestId, out var knownQuest);
if (ImGui.TableNextColumn())
{
ImGui.AlignTextToFramePadding();
ImGui.TextUnformatted(questId);
}
if (ImGui.TableNextColumn())
{
ImGui.AlignTextToFramePadding();
using var font = _pluginInterface.UiBuilder.IconFontFixedWidthHandle.Push();
FontAwesomeIcon icon;
Vector4 color;
if (_gameFunctions.IsQuestAccepted(quest.QuestId))
{
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.TableNextColumn())
{
ImGui.AlignTextToFramePadding();
ImGui.TextUnformatted(quest.Name);
}
if (ImGui.TableNextColumn())
{
using var id = ImRaii.PushId(questId);
bool copy = ImGuiComponents.IconButton(FontAwesomeIcon.Copy);
if (ImGui.IsItemHovered())
ImGui.SetTooltip("Copy as file name");
if (copy)
CopyToClipboard(quest, true);
else if (ImGui.IsItemClicked(ImGuiMouseButton.Right))
CopyToClipboard(quest, false);
ImGui.SameLine();
if (knownQuest != null && !_gameFunctions.IsQuestAccepted(quest.QuestId) &&
(quest.IsRepeatable || !_gameFunctions.IsQuestAcceptedOrComplete(quest.QuestId)))
{
ImGui.BeginDisabled(_questController.NextQuest != null || _questController.SimulatedQuest != null);
bool startNextQuest = ImGuiComponents.IconButton(FontAwesomeIcon.Play);
if (ImGui.IsItemHovered())
ImGui.SetTooltip("Start as next quest");
if (startNextQuest)
{
_questController.SetNextQuest(knownQuest);
_questController.ExecuteNextStep(true);
}
ImGui.SameLine();
bool setNextQuest = ImGuiComponents.IconButton(FontAwesomeIcon.AngleDoubleRight);
if (ImGui.IsItemHovered())
ImGui.SetTooltip("Set as next quest");
if (setNextQuest)
_questController.SetNextQuest(knownQuest);
ImGui.EndDisabled();
}
}
}
}
private void CopyToClipboard(QuestInfo quest, bool suffix)
{
string fileName = $"{quest.QuestId}_{quest.SimplifiedName}{(suffix ? ".json" : "")}";
ImGui.SetClipboardText(fileName);
_chatGui.Print($"Copied '{fileName}' to clipboard");
}
}

View File

@ -46,6 +46,8 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
private readonly QuestData _questData; private readonly QuestData _questData;
private readonly TerritoryData _territoryData; private readonly TerritoryData _territoryData;
private readonly ICondition _condition; private readonly ICondition _condition;
private readonly IGameGui _gameGui;
private readonly QuestSelectionWindow _questSelectionWindow;
private readonly ILogger<QuestWindow> _logger; private readonly ILogger<QuestWindow> _logger;
public QuestWindow(IDalamudPluginInterface pluginInterface, public QuestWindow(IDalamudPluginInterface pluginInterface,
@ -64,6 +66,8 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
QuestData questData, QuestData questData,
TerritoryData territoryData, TerritoryData territoryData,
ICondition condition, ICondition condition,
IGameGui gameGui,
QuestSelectionWindow questSelectionWindow,
ILogger<QuestWindow> logger) ILogger<QuestWindow> logger)
: base("Questionable###Questionable", ImGuiWindowFlags.AlwaysAutoResize) : base("Questionable###Questionable", ImGuiWindowFlags.AlwaysAutoResize)
{ {
@ -83,6 +87,8 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
_questData = questData; _questData = questData;
_territoryData = territoryData; _territoryData = territoryData;
_condition = condition; _condition = condition;
_gameGui = gameGui;
_questSelectionWindow = questSelectionWindow;
_logger = logger; _logger = logger;
#if DEBUG #if DEBUG
@ -442,11 +448,12 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
ImGui.SameLine(); ImGui.SameLine();
ImGui.BeginDisabled(!_questData.IsIssuerOfAnyQuest(_targetManager.Target.DataId)); ImGui.BeginDisabled(!_questData.IsIssuerOfAnyQuest(_targetManager.Target.DataId));
bool showQuests = ImGuiComponents.IconButton(FontAwesomeIcon.Bars); bool showQuests = ImGuiComponents.IconButton(FontAwesomeIcon.MapMarkerAlt);
if (ImGui.IsItemHovered()) if (ImGui.IsItemHovered())
ImGui.SetTooltip("Show all Quests starting with your current target."); ImGui.SetTooltip("Show all Quests starting with your current target.");
if (showQuests) if (showQuests)
_questData.ShowQuestsIssuedByTarget(); _questSelectionWindow.Open(_targetManager.Target);
ImGui.EndDisabled(); ImGui.EndDisabled();
ImGui.SameLine(); ImGui.SameLine();
@ -462,10 +469,10 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
ImGui.SameLine(); ImGui.SameLine();
ImGuiComponents.IconButton(FontAwesomeIcon.Copy); bool copy = ImGuiComponents.IconButton(FontAwesomeIcon.Copy);
if (ImGui.IsItemHovered()) if (ImGui.IsItemHovered())
ImGui.SetTooltip("Left click: Copy target position as JSON.\nRight click: Copy target position as C# code."); ImGui.SetTooltip("Left click: Copy target position as JSON.\nRight click: Copy target position as C# code.");
if (ImGui.IsItemClicked(ImGuiMouseButton.Left)) if (copy)
{ {
string interactionType = gameObject->NamePlateIconId switch string interactionType = gameObject->NamePlateIconId switch
{ {
@ -500,10 +507,10 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
} }
else else
{ {
ImGuiComponents.IconButton(FontAwesomeIcon.Copy); bool copy = ImGuiComponents.IconButton(FontAwesomeIcon.Copy);
if (ImGui.IsItemHovered()) if (ImGui.IsItemHovered())
ImGui.SetTooltip("Left click: Copy target position as JSON.\nRight click: Copy target position as C# code."); ImGui.SetTooltip("Left click: Copy your position as JSON.\nRight click: Copy your position as C# code.");
if (ImGui.IsItemClicked(ImGuiMouseButton.Left)) if (copy)
{ {
ImGui.SetClipboardText($$""" ImGui.SetClipboardText($$"""
"Position": { "Position": {
@ -522,6 +529,13 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
$"new({position.X}f, {position.Y}f, {position.Z}f)")); $"new({position.X}f, {position.Y}f, {position.Z}f)"));
} }
} }
ulong hoveredItemId = _gameGui.HoveredItem;
if (hoveredItemId != 0)
{
ImGui.Separator();
ImGui.Text($"Hovered Item: {hoveredItemId}");
}
} }
private unsafe void DrawQuickAccessButtons() private unsafe void DrawQuickAccessButtons()