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",
"KillEnemyDataIds": [
11443
]
],
"Fly": true
}
]
},

View File

@ -20,6 +20,16 @@
{
"Sequence": 1,
"Steps": [
{
"Position": {
"X": -466.72015,
"Y": 44.63006,
"Z": -310.0618
},
"TerritoryId": 816,
"InteractionType": "WalkTo",
"Fly": true
},
{
"DataId": 1032140,
"Position": {
@ -32,7 +42,25 @@
"ChatMessage": {
"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,
"InteractionType": "WalkTo",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
-128
]
"Fly": true
},
{
"DataId": 2010860,
@ -48,13 +40,8 @@
},
"TerritoryId": 816,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
"SkipIf": [
"NotTargetable"
]
},
{
@ -83,6 +70,20 @@
"NotTargetable"
],
"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": [
14674,
14675
]
],
"Fly": true
}
]
},

View File

@ -49,6 +49,7 @@
},
"TerritoryId": 957,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
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,
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": {
"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
"$ref": "#/$defs/CompletionFlags"
},
"DelaySecondsAtStart": {
"description": "Time to wait before starting",
@ -567,12 +539,48 @@
"items": {
"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": [
"Position",
"EnemySpawnType",
"KillEnemyDataIds"
"EnemySpawnType"
],
"oneOf": [
{
"required": [
"KillEnemyDataIds"
]
},
{
"required": [
"ComplexCombatData"
]
}
]
}
},
@ -1027,5 +1035,38 @@
"QuestSequence",
"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 IList<uint> KillEnemyDataIds { get; set; } = new List<uint>();
public IList<ComplexCombatData> ComplexCombatData { get; set; } = new List<ComplexCombatData>();
public JumpDestination? JumpDestination { 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.Types;
using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game;
using FFXIVClientStructs.FFXIV.Client.Game.Object;
using Microsoft.Extensions.Logging;
using Questionable.Controller.CombatModules;
using Questionable.Controller.Utils;
using Questionable.Model.V1;
namespace Questionable.Controller;
@ -19,18 +22,21 @@ internal sealed class CombatController
private readonly IObjectTable _objectTable;
private readonly ICondition _condition;
private readonly IClientState _clientState;
private readonly GameFunctions _gameFunctions;
private readonly ILogger<CombatController> _logger;
private CurrentFight? _currentFight;
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();
_targetManager = targetManager;
_objectTable = objectTable;
_condition = condition;
_clientState = clientState;
_gameFunctions = gameFunctions;
_logger = logger;
}
@ -100,6 +106,50 @@ internal sealed class CombatController
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());
}
@ -107,8 +157,14 @@ internal sealed class CombatController
{
if (gameObject is IBattleChara battleChara)
{
if (battleChara.IsDead)
return false;
// 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)
return false;
}
if (!battleChara.IsTargetable)
return false;
@ -116,8 +172,26 @@ internal sealed class CombatController
if (battleChara.TargetObjectId == _clientState.LocalPlayer?.GameObjectId)
return true;
if (_currentFight != null && _currentFight.Data.KillEnemyDataIds.Contains(battleChara.DataId))
return true;
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;
}
}
else
{
if (_currentFight.Data.KillEnemyDataIds.Contains(battleChara.DataId))
return true;
}
}
if (battleChara.StatusFlags.HasFlag(StatusFlags.Hostile))
{
@ -150,6 +224,11 @@ internal sealed class CombatController
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 MovementController _movementController;
private readonly QuestRegistry _questRegistry;
private readonly QuestData _questData;
private readonly ConfigWindow _configWindow;
private readonly DebugOverlay _debugOverlay;
private readonly QuestWindow _questWindow;
private readonly QuestSelectionWindow _questSelectionWindow;
private readonly ITargetManager _targetManager;
public CommandHandler(ICommandManager commandManager, IChatGui chatGui, QuestController questController,
MovementController movementController, QuestRegistry questRegistry, QuestData questData,
ConfigWindow configWindow, DebugOverlay debugOverlay, QuestWindow questWindow)
MovementController movementController, QuestRegistry questRegistry,
ConfigWindow configWindow, DebugOverlay debugOverlay, QuestWindow questWindow,
QuestSelectionWindow questSelectionWindow, ITargetManager targetManager)
{
_commandManager = commandManager;
_chatGui = chatGui;
_questController = questController;
_movementController = movementController;
_questRegistry = questRegistry;
_questData = questData;
_configWindow = configWindow;
_debugOverlay = debugOverlay;
_questWindow = questWindow;
_questSelectionWindow = questSelectionWindow;
_targetManager = targetManager;
_commandManager.AddHandler("/qst", new CommandInfo(ProcessCommand)
{
@ -74,7 +77,7 @@ internal sealed class CommandHandler : IDisposable
break;
case "which":
_questData.ShowQuestsIssuedByTarget();
_questSelectionWindow.Open(_targetManager.Target);
break;
default:

View File

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

View File

@ -148,7 +148,13 @@ internal sealed class QuestController
else if (_nextQuest != null)
{
// 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);

View File

@ -47,8 +47,7 @@ internal static class Combat
return [unmount, CreateTask(quest, sequence, step)];
case EEnemySpawnType.OverworldEnemies:
// TODO currently not handled
return [unmount];
return [unmount, CreateTask(quest, sequence, step)];
default:
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)
{
ArgumentNullException.ThrowIfNull(step.EnemySpawnType);
bool isLastStep = sequence.Steps.Last() == step;
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
{
private ushort _questId;
private bool _isLastStep;
private CombatController.CombatData _combatData = null!;
private IList<short?> _completionQuestVariableFlags = null!;
public ITask With(ushort questId, bool isLastStep, IList<uint> killEnemyDataIds,
IList<short?> completionQuestVariablesFlags)
public ITask With(ushort questId, bool isLastStep, EEnemySpawnType enemySpawnType, IList<uint> killEnemyDataIds,
IList<short?> completionQuestVariablesFlags, IList<ComplexCombatData> complexCombatData)
{
_questId = questId;
_isLastStep = isLastStep;
_combatData = new CombatController.CombatData
{
KillEnemyDataIds = killEnemyDataIds.AsReadOnly(),
QuestId = questId,
SpawnType = enemySpawnType,
KillEnemyDataIds = killEnemyDataIds.ToList(),
ComplexCombatDatas = complexCombatData.ToList(),
};
_completionQuestVariableFlags = completionQuestVariablesFlags;
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 (QuestWorkUtils.HasCompletionFlags(_completionQuestVariableFlags))
{
var questWork = gameFunctions.GetQuestEx(_questId);
var questWork = gameFunctions.GetQuestEx(_combatData.QuestId);
if (questWork == null)
return ETaskResult.StillRunning;

View File

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

View File

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

View File

@ -2,12 +2,7 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using Dalamud.Game.ClientState.Objects;
using Dalamud.Game.Text;
using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.UI;
using LLib.GameUI;
using Questionable.Controller;
using Questionable.Model;
using Quest = Lumina.Excel.GeneratedSheets.Quest;
@ -15,18 +10,10 @@ namespace Questionable.Data;
internal sealed class QuestData
{
private readonly ITargetManager _targetManager;
private readonly IChatGui _chatGui;
private readonly IGameGui _gameGui;
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>()!
.Where(x => x.RowId > 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 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

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

View File

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

View File

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

View File

@ -127,6 +127,8 @@ public sealed class QuestionablePlugin : IDalamudPlugin
serviceCollection.AddSingleton<QuestWindow>();
serviceCollection.AddSingleton<ConfigWindow>();
serviceCollection.AddSingleton<DebugOverlay>();
serviceCollection.AddSingleton<QuestSelectionWindow>();
serviceCollection.AddSingleton<CommandHandler>();
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 TerritoryData _territoryData;
private readonly ICondition _condition;
private readonly IGameGui _gameGui;
private readonly QuestSelectionWindow _questSelectionWindow;
private readonly ILogger<QuestWindow> _logger;
public QuestWindow(IDalamudPluginInterface pluginInterface,
@ -64,6 +66,8 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
QuestData questData,
TerritoryData territoryData,
ICondition condition,
IGameGui gameGui,
QuestSelectionWindow questSelectionWindow,
ILogger<QuestWindow> logger)
: base("Questionable###Questionable", ImGuiWindowFlags.AlwaysAutoResize)
{
@ -83,6 +87,8 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
_questData = questData;
_territoryData = territoryData;
_condition = condition;
_gameGui = gameGui;
_questSelectionWindow = questSelectionWindow;
_logger = logger;
#if DEBUG
@ -442,11 +448,12 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
ImGui.SameLine();
ImGui.BeginDisabled(!_questData.IsIssuerOfAnyQuest(_targetManager.Target.DataId));
bool showQuests = ImGuiComponents.IconButton(FontAwesomeIcon.Bars);
bool showQuests = ImGuiComponents.IconButton(FontAwesomeIcon.MapMarkerAlt);
if (ImGui.IsItemHovered())
ImGui.SetTooltip("Show all Quests starting with your current target.");
if (showQuests)
_questData.ShowQuestsIssuedByTarget();
_questSelectionWindow.Open(_targetManager.Target);
ImGui.EndDisabled();
ImGui.SameLine();
@ -462,10 +469,10 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
ImGui.SameLine();
ImGuiComponents.IconButton(FontAwesomeIcon.Copy);
bool copy = ImGuiComponents.IconButton(FontAwesomeIcon.Copy);
if (ImGui.IsItemHovered())
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
{
@ -500,10 +507,10 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
}
else
{
ImGuiComponents.IconButton(FontAwesomeIcon.Copy);
bool copy = ImGuiComponents.IconButton(FontAwesomeIcon.Copy);
if (ImGui.IsItemHovered())
ImGui.SetTooltip("Left click: Copy target position as JSON.\nRight click: Copy target position as C# code.");
if (ImGui.IsItemClicked(ImGuiMouseButton.Left))
ImGui.SetTooltip("Left click: Copy your position as JSON.\nRight click: Copy your position as C# code.");
if (copy)
{
ImGui.SetClipboardText($$"""
"Position": {
@ -522,6 +529,13 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
$"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()