Compare commits

..

35 Commits

Author SHA1 Message Date
09f8cb9078
Add experimental PurchaseItem step 2024-09-22 14:31:14 +02:00
3b6dc2e03b Merge pull request '[DT][Dungeon Unlocks] - Fix getting stuck finishing quest or starting.' (#55) from kaiserbh/Questionable:fix/dungeon-unlock-dt into master
Reviewed-on: liza/Questionable#55
2024-09-22 10:40:19 +00:00
7d7a4d32e8 Merge pull request '[HW][Allied Society][Vanu Vanu] Added a few story and daily quests' (#54) from plogon_enjoyer/Questionable:vanuvanu into master
Reviewed-on: liza/Questionable#54
2024-09-22 10:37:20 +00:00
88a4310028 Merge pull request '[HW][Allied Society][Vath] Added a few daily quests' (#53) from plogon_enjoyer/Questionable:vath into master
Reviewed-on: liza/Questionable#53
2024-09-22 10:36:32 +00:00
e7a2bb0cba
Removed High Crucible attunement from post-EW 2024-09-22 12:35:15 +02:00
411b121f62
Fix overworld combat delay logic 2024-09-21 23:29:27 +02:00
Plogon Enjoyer
19aa2e90fd Added the following story quest:
- Sundrop the Beat
2024-09-22 00:46:20 +08:00
Plogon Enjoyer
27663c765d Added the following daily quests:
- A Bone to Pick
- A Hut to Dye For
2024-09-22 00:21:14 +08:00
Plogon Enjoyer
eba0902bd1 Added the following daily quests:
- Flight of the Midges
- Fishing in Troubled Waters
2024-09-22 00:21:14 +08:00
Plogon Enjoyer
565022589d Added a few daily quests:
- Reeling in the Vundu
- Nailed Down
- The House That Ginu Built
2024-09-22 00:21:13 +08:00
Plogon Enjoyer
c2a16e1ec1 Added the following daily quests:
- Shoo Fly, Don't Bother Me
- All about the Eggs
- Smells Like Trouble
2024-09-22 00:02:39 +08:00
Plogon Enjoyer
1d3b9a9426 Added the following daily quests:
- Too Much to Bear
- The Foodstuff of Champions
2024-09-22 00:02:39 +08:00
Plogon Enjoyer
f30b6792bf Added the following daily quests:
- A Long Shot
- Where the Silver Dew Grows
- The Caelumtree Wine Spree
2024-09-22 00:02:39 +08:00
Plogon Enjoyer
189087a85b Added new daily quests:
- Getting the Shaft
- Breath of Fresh Air
- Not for the Faint of Heart
2024-09-22 00:02:39 +08:00
kaiser
d9d95f17a8 chore: add fly when finishing quest, the completeQuest is in narnia. 2024-09-21 14:54:05 +10:00
kaiser
f1698d4652 fix: getting stuck when starting quests or finishing, if we are not in the same territory. 2024-09-21 14:32:33 +10:00
0c36dd324f
Update gathering location 2024-09-21 00:36:20 +02:00
4b75388ddc
Fix certain kinds of interactions 2024-09-20 22:00:02 +02:00
e72a57fff4
Fix water transition in 'The Elixir of Life' 2024-09-20 21:46:48 +02:00
8c77cb7e95
Add clear button to priority window 2024-09-20 21:46:27 +02:00
cd16cf93a3
Fix some EventHandler related code if in firmament 2024-09-20 21:46:10 +02:00
f7d56663d2 Merge pull request '[ShB][Allied Society][Qitari] Added new story quests and updated a few daily quests' (#52) from plogon_enjoyer/Questionable:qitari into master
Reviewed-on: liza/Questionable#52
2024-09-20 18:27:39 +00:00
4f4ad144a0 Merge pull request '[EW][Allied Society][Omicrons] Added final story quest Life, the Universe, and Coffee Beans' (#51) from plogon_enjoyer/Questionable:omicron into master
Reviewed-on: liza/Questionable#51
2024-09-20 18:26:58 +00:00
e1cbdbf951
Fix aetheryte location in 'Defned by Loss' 2024-09-20 20:25:28 +02:00
2f8c72cbea
Replace outdated prompt in 'The Claw in the Dark' 2024-09-20 20:12:58 +02:00
3f6a6cd8a9 Merge pull request '[DT][Raid Quests][The Arcadion] Improved.' (#49) from kaiserbh/Questionable:chore-fix-dt-dungeon-unlock into master
Reviewed-on: liza/Questionable#49
2024-09-20 18:08:16 +00:00
66e9a71847
Add teleports to custom delivery unlocks 2024-09-20 19:56:35 +02:00
d4a9bb5f9b
Avoid duplicate quests in priority window 2024-09-20 19:43:19 +02:00
2aa14db916
Log information about tasks after interruption 2024-09-20 19:42:49 +02:00
e54732e798
Fix some Shaaloani/S9 pathing issues 2024-09-20 16:05:39 +02:00
Plogon Enjoyer
798160c250 Added final story quest "Life, the Universe, and Coffee Beans" 2024-09-20 20:08:16 +08:00
Plogon Enjoyer
7453f9269e Updated a few daily quests:
- Rock 'n Ronka
- There's No Clean Like Qhoterl Clean
2024-09-20 20:07:50 +08:00
Plogon Enjoyer
fa3b0db309 Added new story quests:
- Delving Deeper
- The Second Stela: The Hunters and the Hunted
- The Second Stela: Fast Friends
2024-09-20 20:07:49 +08:00
d3e0bba06c
Move NE Shaaloani aether current loop to 'Rroneek Seeker' 2024-09-20 12:14:06 +02:00
kaiser
a45bf3f950 fix: This way we can start the quest and doesn't get stuck accepting quest the first time. 2024-09-16 10:31:22 +10:00
69 changed files with 3138 additions and 176 deletions

View File

@ -1,5 +1,5 @@
<Project>
<PropertyGroup>
<Version>3.5</Version>
<Version>3.6</Version>
</PropertyGroup>
</Project>

View File

@ -45,8 +45,10 @@
"Y": 58.56588,
"Z": -533.6083
},
"MinimumAngle": 155,
"MaximumAngle": 325
"MinimumAngle": 185,
"MaximumAngle": 225,
"MinimumDistance": 2,
"MaximumDistance": 3
}
]
}

2
LLib

@ -1 +1 @@
Subproject commit 43c3dba112c202e2d0ff1a6909020c2b83e20dc3
Subproject commit e6e3a1f29715e2af4976dd7338ed2f09ae82c99c

View File

@ -127,6 +127,8 @@ internal static class QuestStepExtensions
.AsSyntaxNodeOrToken(),
AssignmentList(nameof(QuestStep.PointMenuChoices), step.PointMenuChoices)
.AsSyntaxNodeOrToken(),
Assignment(nameof(QuestStep.PurchaseMenu), step.PurchaseMenu, emptyStep.PurchaseMenu)
.AsSyntaxNodeOrToken(),
Assignment(nameof(QuestStep.PickUpQuestId), step.PickUpQuestId,
emptyStep.PickUpQuestId)
.AsSyntaxNodeOrToken(),

View File

@ -0,0 +1,130 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1016089,
"Position": {
"X": -799.46594,
"Y": -133.2695,
"Z": -404.1352
},
"TerritoryId": 401,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1016091,
"Position": {
"X": -804.25726,
"Y": -133.2695,
"Z": -390.89038
},
"TerritoryId": 401,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1016093,
"Position": {
"X": -776.0281,
"Y": -133.35559,
"Z": -414.32825
},
"TerritoryId": 401,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 3,
"Steps": [
{
"Position": {
"X": -850.9607,
"Y": 2.3374987,
"Z": -234.1339
},
"TerritoryId": 401,
"InteractionType": "WalkTo",
"Fly": true
},
{
"DataId": 1016222,
"Position": {
"X": -853.8186,
"Y": 7.7667847,
"Z": -223.92621
},
"TerritoryId": 401,
"InteractionType": "Action",
"Action": "Buffet (Sanuwa)",
"Fly": true
},
{
"DataId": 1016221,
"Position": {
"X": -576.40955,
"Y": -51.59082,
"Z": -543.8773
},
"TerritoryId": 401,
"InteractionType": "Action",
"Action": "Buffet (Sanuwa)",
"Fly": true
},
{
"DataId": 1016220,
"Position": {
"X": -455.7718,
"Y": -20.828613,
"Z": -610.8644
},
"TerritoryId": 401,
"InteractionType": "Action",
"Action": "Buffet (Sanuwa)",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"Position": {
"X": -660.26556,
"Y": -49.27812,
"Z": -403.1036
},
"TerritoryId": 401,
"InteractionType": "WalkTo",
"AetheryteShortcut": "The Sea of Clouds - Ok' Zundu",
"Fly": true
},
{
"DataId": 1016091,
"Position": {
"X": -804.25726,
"Y": -133.2695,
"Z": -390.89038
},
"TerritoryId": 401,
"InteractionType": "CompleteQuest",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,106 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1016089,
"Position": {
"X": -799.46594,
"Y": -133.2695,
"Z": -404.1352
},
"TerritoryId": 401,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1016090,
"Position": {
"X": -836.51483,
"Y": -133.26949,
"Z": -386.61786
},
"TerritoryId": 401,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"Position": {
"X": 833.7674,
"Y": -97.81962,
"Z": -735.3544
},
"TerritoryId": 401,
"InteractionType": "WalkTo",
"Fly": true
},
{
"DataId": 1016223,
"Position": {
"X": 834.37854,
"Y": -97.83405,
"Z": -738.18567
},
"TerritoryId": 401,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [5239]
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1016223,
"Position": {
"X": 834.37854,
"Y": -97.83405,
"Z": -738.18567
},
"TerritoryId": 401,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"Position": {
"X": -660.26556,
"Y": -49.27812,
"Z": -403.1036
},
"TerritoryId": 401,
"InteractionType": "WalkTo",
"AetheryteShortcut": "The Sea of Clouds - Ok' Zundu",
"Fly": true
},
{
"DataId": 1016090,
"Position": {
"X": -836.51483,
"Y": -133.26949,
"Z": -386.61786
},
"TerritoryId": 401,
"InteractionType": "CompleteQuest",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,109 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1016089,
"Position": {
"X": -799.46594,
"Y": -133.2695,
"Z": -404.1352
},
"TerritoryId": 401,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1016090,
"Position": {
"X": -836.51483,
"Y": -133.26949,
"Z": -386.61786
},
"TerritoryId": 401,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1016093,
"Position": {
"X": -776.0281,
"Y": -133.35559,
"Z": -414.32825
},
"TerritoryId": 401,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1016227,
"Position": {
"X": 473.1975,
"Y": -98.03464,
"Z": -527.7333
},
"TerritoryId": 401,
"InteractionType": "Action",
"Action": "Buffet (Sanuwa)",
"Fly": true
},
{
"DataId": 1016226,
"Position": {
"X": 710.9331,
"Y": -98.032555,
"Z": -741.0239
},
"TerritoryId": 401,
"InteractionType": "Action",
"Action": "Buffet (Sanuwa)",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"Position": {
"X": -660.26556,
"Y": -49.27812,
"Z": -403.1036
},
"TerritoryId": 401,
"InteractionType": "WalkTo",
"AetheryteShortcut": "The Sea of Clouds - Ok' Zundu",
"Fly": true
},
{
"DataId": 1016090,
"Position": {
"X": -836.51483,
"Y": -133.26949,
"Z": -386.61786
},
"TerritoryId": 401,
"InteractionType": "CompleteQuest",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,129 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1016089,
"Position": {
"X": -799.46594,
"Y": -133.2695,
"Z": -404.1352
},
"TerritoryId": 401,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1016092,
"Position": {
"X": -792.6299,
"Y": -133.32184,
"Z": -425.5589
},
"TerritoryId": 401,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 2006676,
"Position": {
"X": -717.0062,
"Y": -13.901062,
"Z": -101.487854
},
"TerritoryId": 401,
"InteractionType": "Interact",
"Fly": true,
"RequiredQuestVariables": [null, null, [16], null, null, null]
},
{
"DataId": 2006762,
"Position": {
"X": -781.52136,
"Y": -13.931519,
"Z": -114.30542
},
"TerritoryId": 401,
"InteractionType": "Interact",
"Fly": true,
"RequiredQuestVariables": [null, null, [32], null, null, null]
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 2006675,
"Position": {
"X": -642.298,
"Y": -207.29382,
"Z": 211.10852
},
"TerritoryId": 401,
"InteractionType": "Combat",
"EnemySpawnType": "AfterItemUse",
"ItemId": 2001912,
"KillEnemyDataIds": [5240],
"Fly": true
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 1012054,
"Position": {
"X": -640.1007,
"Y": -119.56208,
"Z": 469.5963
},
"TerritoryId": 401,
"InteractionType": "Interact",
"Fly": true,
"AetheryteShortcut": "The Sea of Clouds - Camp Cloudtop"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"Position": {
"X": -660.26556,
"Y": -49.27812,
"Z": -403.1036
},
"TerritoryId": 401,
"InteractionType": "WalkTo",
"AetheryteShortcut": "The Sea of Clouds - Ok' Zundu",
"Fly": true
},
{
"DataId": 1016092,
"Position": {
"X": -792.6299,
"Y": -133.32184,
"Z": -425.5589
},
"TerritoryId": 401,
"InteractionType": "CompleteQuest",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,95 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1016089,
"Position": {
"X": -799.46594,
"Y": -133.2695,
"Z": -404.1352
},
"TerritoryId": 401,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1016092,
"Position": {
"X": -792.6299,
"Y": -133.32184,
"Z": -425.5589
},
"TerritoryId": 401,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 2006677,
"Position": {
"X": 117.96753,
"Y": 12.25293,
"Z": -412.92444
},
"TerritoryId": 401,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [5241],
"Fly": true
},
{
"DataId": 2006678,
"Position": {
"X": 160.54016,
"Y": 11.856201,
"Z": -507.65244
},
"TerritoryId": 401,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [5241],
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"Position": {
"X": -660.26556,
"Y": -49.27812,
"Z": -403.1036
},
"TerritoryId": 401,
"InteractionType": "WalkTo",
"AetheryteShortcut": "The Sea of Clouds - Ok' Zundu",
"Fly": true
},
{
"DataId": 1016092,
"Position": {
"X": -792.6299,
"Y": -133.32184,
"Z": -425.5589
},
"TerritoryId": 401,
"InteractionType": "CompleteQuest",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,101 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1016089,
"Position": {
"X": -799.46594,
"Y": -133.2695,
"Z": -404.1352
},
"TerritoryId": 401,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1016092,
"Position": {
"X": -792.6299,
"Y": -133.32184,
"Z": -425.5589
},
"TerritoryId": 401,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 2006679,
"Position": {
"X": -401.175,
"Y": -202.65509,
"Z": 432.39478
},
"TerritoryId": 401,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [5242],
"AetheryteShortcut": "The Sea of Clouds - Camp Cloudtop",
"Fly": true
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 2006680,
"Position": {
"X": -280.8728,
"Y": -202.01422,
"Z": 390.7987
},
"TerritoryId": 401,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [5242],
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"Position": {
"X": -660.26556,
"Y": -49.27812,
"Z": -403.1036
},
"TerritoryId": 401,
"InteractionType": "WalkTo",
"AetheryteShortcut": "The Sea of Clouds - Ok' Zundu",
"Fly": true
},
{
"DataId": 1016092,
"Position": {
"X": -792.6299,
"Y": -133.32184,
"Z": -425.5589
},
"TerritoryId": 401,
"InteractionType": "CompleteQuest",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,121 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1016089,
"Position": {
"X": -799.46594,
"Y": -133.2695,
"Z": -404.1352
},
"TerritoryId": 401,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1016092,
"Position": {
"X": -792.6299,
"Y": -133.32184,
"Z": -425.5589
},
"TerritoryId": 401,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 2006682,
"Position": {
"X": 25.711426,
"Y": 150.46924,
"Z": -133.56226
},
"TerritoryId": 401,
"InteractionType": "Interact",
"Fly": true
},
{
"DataId": 2006681,
"Position": {
"X": 237.07935,
"Y": 163.95813,
"Z": -46.433228
},
"TerritoryId": 401,
"InteractionType": "Interact",
"Fly": true
},
{
"Position": {
"X": 237.02913,
"Y": 169.13622,
"Z": -44.168194
},
"TerritoryId": 401,
"InteractionType": "WalkTo",
"Fly": true
},
{
"DataId": 2006683,
"Position": {
"X": 332.5094,
"Y": 106.79785,
"Z": -68.2536
},
"TerritoryId": 401,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"Position": {
"X": 297.20715,
"Y": 106.011185,
"Z": -25.524097
},
"TerritoryId": 401,
"InteractionType": "WalkTo"
},
{
"Position": {
"X": -660.26556,
"Y": -49.27812,
"Z": -403.1036
},
"TerritoryId": 401,
"InteractionType": "WalkTo",
"AetheryteShortcut": "The Sea of Clouds - Ok' Zundu",
"Fly": true
},
{
"DataId": 1016092,
"Position": {
"X": -792.6299,
"Y": -133.32184,
"Z": -425.5589
},
"TerritoryId": 401,
"InteractionType": "CompleteQuest",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,173 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1016087,
"Position": {
"X": -796.7498,
"Y": -133.2695,
"Z": -410.6966
},
"TerritoryId": 401,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1012064,
"Position": {
"X": -542.7787,
"Y": -37.11544,
"Z": -386.7094
},
"TerritoryId": 401,
"InteractionType": "Interact",
"AetheryteShortcut": "The Sea of Clouds - Ok' Zundu",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1016174,
"Position": {
"X": -606.4088,
"Y": -51.071037,
"Z": -370.87054
},
"TerritoryId": 401,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 3,
"Steps": [
{
"Position": {
"X": -589.2831,
"Y": -1.0348412,
"Z": -340.14413
},
"TerritoryId": 401,
"InteractionType": "WalkTo",
"Fly": true,
"Land": true
},
{
"Position": {
"X": -589.2831,
"Y": -1.0348412,
"Z": -340.14413
},
"TerritoryId": 401,
"InteractionType": "Emote",
"Emote": "dance",
"Mount": false
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 1016174,
"Position": {
"X": -606.4088,
"Y": -51.071037,
"Z": -370.87054
},
"TerritoryId": 401,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 5,
"Steps": [
{
"DataId": 1016175,
"Position": {
"X": 657.557,
"Y": -125.6886,
"Z": 307.60657
},
"TerritoryId": 401,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 6,
"Steps": [
{
"Position": {
"X": 702.4233,
"Y": -60.78939,
"Z": 145.91805
},
"TerritoryId": 401,
"InteractionType": "WalkTo",
"Fly": true,
"Land": true
},
{
"Position": {
"X": 702.4233,
"Y": -60.78939,
"Z": 145.91805
},
"TerritoryId": 401,
"InteractionType": "Emote",
"Emote": "dance",
"Mount": false
}
]
},
{
"Sequence": 7,
"Steps": [
{
"DataId": 1016175,
"Position": {
"X": 657.557,
"Y": -125.6886,
"Z": 307.60657
},
"TerritoryId": 401,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1016174,
"Position": {
"X": -606.4088,
"Y": -51.071037,
"Z": -370.87054
},
"TerritoryId": 401,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "The Sea of Clouds - Ok' Zundu",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,79 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1016803,
"Position": {
"X": 57.297607,
"Y": -47.842846,
"Z": -174.63953
},
"TerritoryId": 398,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2006883,
"Position": {
"X": 31.418213,
"Y": -65.32391,
"Z": 111.74182
},
"TerritoryId": 398,
"InteractionType": "Combat",
"Fly": true,
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [5550]
},
{
"DataId": 2006882,
"Position": {
"X": 307.05725,
"Y": -66.54462,
"Z": 163.43933
},
"TerritoryId": 398,
"InteractionType": "Combat",
"Fly": true,
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [5550]
},
{
"DataId": 2006881,
"Position": {
"X": 352.25452,
"Y": -51.07196,
"Z": -46.982605
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1016803,
"Position": {
"X": 57.297607,
"Y": -47.842846,
"Z": -174.63953
},
"TerritoryId": 398,
"InteractionType": "CompleteQuest",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,119 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1016803,
"Position": {
"X": 57.297607,
"Y": -47.842846,
"Z": -174.63953
},
"TerritoryId": 398,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2006886,
"Position": {
"X": 237.65918,
"Y": -71.45807,
"Z": 99.01575
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true
},
{
"DataId": 2006885,
"Position": {
"X": 284.5349,
"Y": -67.61273,
"Z": 83.878784
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true
},
{
"DataId": 2006884,
"Position": {
"X": 294.94165,
"Y": -68.92505,
"Z": 129.19812
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1016803,
"Position": {
"X": 57.297607,
"Y": -47.842846,
"Z": -174.63953
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1011917,
"Position": {
"X": 535.30164,
"Y": -51.340645,
"Z": 65.293335
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true,
"AetheryteShortcut": "The Dravanian Forelands - Tailfeather"
},
{
"DataId": 1011922,
"Position": {
"X": 448.56934,
"Y": -51.141407,
"Z": 108.93408
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1016803,
"Position": {
"X": 57.297607,
"Y": -47.842846,
"Z": -174.63953
},
"TerritoryId": 398,
"InteractionType": "CompleteQuest",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,80 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1016803,
"Position": {
"X": 57.297607,
"Y": -47.842846,
"Z": -174.63953
},
"TerritoryId": 398,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2006872,
"Position": {
"X": 333.82153,
"Y": -47.53192,
"Z": -331.53284
},
"TerritoryId": 398,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [5546],
"Fly": true
},
{
"DataId": 2006871,
"Position": {
"X": 559.71606,
"Y": -41.24518,
"Z": -333.1808
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true
},
{
"DataId": 2006873,
"Position": {
"X": 707.7285,
"Y": -50.095398,
"Z": -151.47632
},
"TerritoryId": 398,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [5546],
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1016803,
"Position": {
"X": 57.297607,
"Y": -47.842846,
"Z": -174.63953
},
"TerritoryId": 398,
"InteractionType": "CompleteQuest",
"Fly": true,
"AetheryteShortcut": "The Dravanian Forelands - Anyx Trine"
}
]
}
]
}

View File

@ -0,0 +1,109 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1016803,
"Position": {
"X": 57.297607,
"Y": -47.842846,
"Z": -174.63953
},
"TerritoryId": 398,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2006897,
"Position": {
"X": 88.48706,
"Y": -123.43024,
"Z": 561.7914
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true
},
{
"DataId": 2006899,
"Position": {
"X": 137.1023,
"Y": -120.01227,
"Z": 586.08374
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true
},
{
"DataId": 2006898,
"Position": {
"X": 111.86377,
"Y": -119.035645,
"Z": 617.4868
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true
},
{
"DataId": 2006894,
"Position": {
"X": 223.22424,
"Y": -123.6134,
"Z": 697.6272
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true
},
{
"DataId": 2006892,
"Position": {
"X": 209.1554,
"Y": -123.12512,
"Z": 767.91016
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true
},
{
"DataId": 2006893,
"Position": {
"X": 291.03528,
"Y": -119.40192,
"Z": 664.6676
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1016803,
"Position": {
"X": 57.297607,
"Y": -47.842846,
"Z": -174.63953
},
"TerritoryId": 398,
"InteractionType": "CompleteQuest",
"Fly": true,
"AetheryteShortcut": "The Dravanian Forelands - Anyx Trine"
}
]
}
]
}

View File

@ -0,0 +1,109 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1016803,
"Position": {
"X": 57.297607,
"Y": -47.842846,
"Z": -174.63953
},
"TerritoryId": 398,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2006903,
"Position": {
"X": 20.004517,
"Y": -84.00098,
"Z": 282.15454
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true
},
{
"DataId": 2006904,
"Position": {
"X": 52.68933,
"Y": -100.572266,
"Z": 317.1283
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Mount": true
},
{
"DataId": 2006905,
"Position": {
"X": 6.301941,
"Y": -100.206055,
"Z": 351.43042
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Mount": true
},
{
"DataId": 2006902,
"Position": {
"X": -317.49445,
"Y": -80.55243,
"Z": 632.59326
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true
},
{
"DataId": 2006901,
"Position": {
"X": -336.96503,
"Y": -80.55243,
"Z": 655.08496
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Mount": true
},
{
"DataId": 2006900,
"Position": {
"X": -379.75128,
"Y": -75.21173,
"Z": 669.2759
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1016803,
"Position": {
"X": 57.297607,
"Y": -47.842846,
"Z": -174.63953
},
"TerritoryId": 398,
"InteractionType": "CompleteQuest",
"Fly": true,
"AetheryteShortcut": "The Dravanian Forelands - Anyx Trine"
}
]
}
]
}

View File

@ -0,0 +1,91 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1016803,
"Position": {
"X": 57.297607,
"Y": -47.842846,
"Z": -174.63953
},
"TerritoryId": 398,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2006909,
"Position": {
"X": -124.37634,
"Y": -86.07617,
"Z": 763.6987
},
"TerritoryId": 398,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [5548],
"Fly": true
},
{
"DataId": 2006906,
"Position": {
"X": -178.51532,
"Y": -86.167725,
"Z": 775.845
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true
},
{
"DataId": 2006908,
"Position": {
"X": -305.745,
"Y": -68.13159,
"Z": 812.7717
},
"TerritoryId": 398,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [5548],
"Fly": true
},
{
"DataId": 2006907,
"Position": {
"X": -303.36462,
"Y": -80.52191,
"Z": 734.15735
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1016803,
"Position": {
"X": 57.297607,
"Y": -47.842846,
"Z": -174.63953
},
"TerritoryId": 398,
"InteractionType": "CompleteQuest",
"Fly": true,
"AetheryteShortcut": "The Dravanian Forelands - Anyx Trine"
}
]
}
]
}

View File

@ -0,0 +1,91 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1016803,
"Position": {
"X": 57.297607,
"Y": -47.842846,
"Z": -174.63953
},
"TerritoryId": 398,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2006913,
"Position": {
"X": 566.7964,
"Y": -20.553955,
"Z": -530.2052
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true
},
{
"DataId": 2006914,
"Position": {
"X": 595.3917,
"Y": -20.187744,
"Z": -547.4785
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true
},
{
"DataId": 2006912,
"Position": {
"X": 639.8259,
"Y": -19.60791,
"Z": -588.098
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1016803,
"Position": {
"X": 57.297607,
"Y": -47.842846,
"Z": -174.63953
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true,
"AetheryteShortcut": "The Dravanian Forelands - Anyx Trine"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1016855,
"Position": {
"X": 74.906494,
"Y": -48,
"Z": -175.67712
},
"TerritoryId": 398,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -0,0 +1,96 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1016803,
"Position": {
"X": 57.297607,
"Y": -47.842846,
"Z": -174.63953
},
"TerritoryId": 398,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1017031,
"Position": {
"X": 74.20459,
"Y": -48.533592,
"Z": -171.12994
},
"TerritoryId": 398,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"Position": {
"X": -190.26477,
"Y": -104.73892,
"Z": 512.932
},
"TerritoryId": 398,
"InteractionType": "Action",
"Action": "Fumigate",
"Fly": true
}
]
},
{
"Sequence": 3,
"Steps": [
{
"Position": {
"X": -13.443237,
"Y": -129.2623,
"Z": 712.21484
},
"TerritoryId": 398,
"InteractionType": "Action",
"Action": "Fumigate",
"Fly": true
},
{
"Position": {
"X": 45.151367,
"Y": -132.12938,
"Z": 685.7556
},
"TerritoryId": 398,
"InteractionType": "Action",
"Action": "Fumigate",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1016803,
"Position": {
"X": 57.297607,
"Y": -47.842846,
"Z": -174.63953
},
"TerritoryId": 398,
"InteractionType": "CompleteQuest",
"Fly": true,
"AetheryteShortcut": "The Dravanian Forelands - Anyx Trine"
}
]
}
]
}

View File

@ -0,0 +1,72 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1016803,
"Position": {
"X": 57.297607,
"Y": -47.842846,
"Z": -174.63953
},
"TerritoryId": 398,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2006930,
"Position": {
"X": 510.3684,
"Y": -26.077698,
"Z": -592.3705
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 2006931,
"Position": {
"X": 358.81592,
"Y": -51.98755,
"Z": -137.89581
},
"TerritoryId": 398,
"InteractionType": "Combat",
"EnemySpawnType": "AfterItemUse",
"ItemId": 2001963,
"KillEnemyDataIds": [5552],
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1016803,
"Position": {
"X": 57.297607,
"Y": -47.842846,
"Z": -174.63953
},
"TerritoryId": 398,
"InteractionType": "CompleteQuest",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,124 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1016803,
"Position": {
"X": 57.297607,
"Y": -47.842846,
"Z": -174.63953
},
"TerritoryId": 398,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2006937,
"Position": {
"X": -42.282776,
"Y": -32.73065,
"Z": 183.30652
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true
},
{
"DataId": 2006935,
"Position": {
"X": -46.189087,
"Y": -47.257202,
"Z": 241.93176
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true
},
{
"DataId": 2006936,
"Position": {
"X": -83.57367,
"Y": -48.17273,
"Z": 231.89136
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true
},
{
"DataId": 2006934,
"Position": {
"X": -105.02789,
"Y": -69.68799,
"Z": 350.63696
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true
},
{
"DataId": 2006933,
"Position": {
"X": -80.03363,
"Y": -71.67163,
"Z": 412.46655
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true
},
{
"DataId": 2006932,
"Position": {
"X": -155.41315,
"Y": -71.122375,
"Z": 387.28918
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1016803,
"Position": {
"X": 57.297607,
"Y": -47.842846,
"Z": -174.63953
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true,
"AetheryteShortcut": "The Dravanian Forelands - Anyx Trine"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1016863,
"Position": {
"X": 67.948364,
"Y": -48.43746,
"Z": -168.23071
},
"TerritoryId": 398,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -0,0 +1,118 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1016803,
"Position": {
"X": 57.297607,
"Y": -47.842846,
"Z": -174.63953
},
"TerritoryId": 398,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1016879,
"Position": {
"X": -412.16144,
"Y": 2.644555,
"Z": -145.1286
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true,
"AetheryteShortcut": "The Dravanian Forelands - Anyx Trine"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 2006950,
"Position": {
"X": -450.9499,
"Y": -7.7058716,
"Z": -222.61395
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true,
"Land": true
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1016879,
"Position": {
"X": -412.16144,
"Y": 2.644555,
"Z": -145.1286
},
"TerritoryId": 398,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 2006951,
"Position": {
"X": -388.35742,
"Y": -10.238831,
"Z": -268.5741
},
"TerritoryId": 398,
"InteractionType": "Interact",
"Fly": true,
"Land": true
}
]
},
{
"Sequence": 5,
"Steps": [
{
"DataId": 1016879,
"Position": {
"X": -412.16144,
"Y": 2.644555,
"Z": -145.1286
},
"TerritoryId": 398,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1016803,
"Position": {
"X": 57.297607,
"Y": -47.842846,
"Z": -174.63953
},
"TerritoryId": 398,
"InteractionType": "CompleteQuest",
"Fly": true
}
]
}
]
}

View File

@ -13,7 +13,13 @@
"Z": 42.98462
},
"TerritoryId": 478,
"InteractionType": "AcceptQuest"
"InteractionType": "AcceptQuest",
"AetheryteShortcut": "Idyllshire",
"SkipConditions": {
"AetheryteShortcutIf": {
"InSameTerritory": true
}
}
}
]
},

View File

@ -43,7 +43,14 @@
"Z": 150.92688
},
"TerritoryId": 886,
"InteractionType": "Instruction",
"InteractionType": "PurchaseItem",
"PurchaseMenu": {
"ExcelSheet": "GilShop",
"Key": 262151,
"$": "This isn't the correct shop id, but it's also unclear how you'd find out"
},
"ItemId": 5768,
"ItemCount": 2,
"Comment": "Buy cream yellow dye",
"AethernetShortcut": [
"[Firmament] The New Nest",

View File

@ -13,7 +13,13 @@
"Z": 285.60303
},
"TerritoryId": 622,
"InteractionType": "AcceptQuest"
"InteractionType": "AcceptQuest",
"AetheryteShortcut": "Azim Steppe - Reunion",
"SkipConditions": {
"AetheryteShortcutIf": {
"InSameTerritory": true
}
}
}
]
},

View File

@ -13,7 +13,13 @@
"Z": 42.98462
},
"TerritoryId": 478,
"InteractionType": "AcceptQuest"
"InteractionType": "AcceptQuest",
"AetheryteShortcut": "Idyllshire",
"SkipConditions": {
"AetheryteShortcutIf": {
"InSameTerritory": true
}
}
}
]
},

View File

@ -155,7 +155,8 @@
},
"TerritoryId": 613,
"InteractionType": "WalkTo",
"Mount": true
"Mount": true,
"RestartNavigationIfCancelled": false
},
{
"Position": {
@ -164,7 +165,9 @@
"Z": 79.0077
},
"TerritoryId": 613,
"InteractionType": "WalkTo"
"InteractionType": "WalkTo",
"DisableNavmesh": true,
"DelaySecondsAtStart": 2
},
{
"Position": {

View File

@ -1,7 +1,6 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "liza",
"Disabled": true,
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
@ -21,6 +20,22 @@
{
"Sequence": 255,
"Steps": [
{
"TerritoryId": 817,
"InteractionType": "Gather",
"ItemsToGather": [
{
"QuestAcceptedAsClass": "Miner",
"ItemId": 29531,
"ItemCount": 3
},
{
"QuestAcceptedAsClass": "Botanist",
"ItemId": 29557,
"ItemCount": 3
}
]
},
{
"Position": {
"X": 788.1569,

View File

@ -1,7 +1,6 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "liza",
"Disabled": true,
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
@ -21,6 +20,22 @@
{
"Sequence": 255,
"Steps": [
{
"TerritoryId": 817,
"InteractionType": "Gather",
"ItemsToGather": [
{
"QuestAcceptedAsClass": "Miner",
"ItemId": 29532,
"ItemCount": 3
},
{
"QuestAcceptedAsClass": "Botanist",
"ItemId": 29558,
"ItemCount": 3
}
]
},
{
"Position": {
"X": 788.1569,

View File

@ -0,0 +1,100 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1032735,
"Position": {
"X": 803.7993,
"Y": -45.924515,
"Z": -217.94464
},
"TerritoryId": 817,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1032659,
"Position": {
"X": 802.79236,
"Y": -45.91779,
"Z": -218.58557
},
"TerritoryId": 817,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1027716,
"Position": {
"X": 494.9873,
"Y": -6.555339,
"Z": -224.93329
},
"TerritoryId": 817,
"InteractionType": "Interact",
"Fly": true,
"AetheryteShortcut": "Rak'tika - Fanow"
}
]
},
{
"Sequence": 3,
"Steps": [
{
"TerritoryId": 817,
"InteractionType": "Gather",
"ItemsToGather": [
{
"QuestAcceptedAsClass": "Miner",
"ItemId": 29514,
"ItemCount": 1
},
{
"QuestAcceptedAsClass": "Botanist",
"ItemId": 29540,
"ItemCount": 1
}
]
},
{
"DataId": 1032660,
"Position": {
"X": 804.4098,
"Y": -45.9255,
"Z": -216.41876
},
"TerritoryId": 817,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1032659,
"Position": {
"X": 802.79236,
"Y": -45.91779,
"Z": -218.58557
},
"TerritoryId": 817,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -0,0 +1,36 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1032660,
"Position": {
"X": 804.4098,
"Y": -45.9255,
"Z": -216.41876
},
"TerritoryId": 817,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1032660,
"Position": {
"X": 804.4098,
"Y": -45.9255,
"Z": -216.41876
},
"TerritoryId": 817,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -0,0 +1,36 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1032659,
"Position": {
"X": 802.79236,
"Y": -45.91779,
"Z": -218.58557
},
"TerritoryId": 817,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1032659,
"Position": {
"X": 802.79236,
"Y": -45.91779,
"Z": -218.58557
},
"TerritoryId": 817,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -96,7 +96,8 @@
"Z": -197.58272
},
"TerritoryId": 815,
"InteractionType": "WalkTo"
"InteractionType": "WalkTo",
"AetheryteShortcut": "Amh Araeng - Mord Souq"
},
{
"DataId": 1029898,
@ -106,8 +107,7 @@
"Z": -196.30737
},
"TerritoryId": 815,
"InteractionType": "Interact",
"AetheryteShortcut": "Amh Araeng - Mord Souq"
"InteractionType": "Interact"
}
]
},

View File

@ -0,0 +1,149 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "plogon_enjoyer",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1043951,
"Position": {
"X": 303.8529,
"Y": 481.99442,
"Z": 154.83325
},
"TerritoryId": 960,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1043865,
"Position": {
"X": 301.8081,
"Y": 482.13644,
"Z": 165.02625
},
"TerritoryId": 960,
"InteractionType": "Interact",
"TargetTerritoryId": 960,
"DialogueChoices": [
{
"Prompt": "TEXT_BANOMI006_04606_Q5_000_000",
"Type": "YesNo",
"Yes": true
}
]
},
{
"DataId": 1043586,
"Position": {
"X": 205.3711,
"Y": 567.4998,
"Z": 246.72314
},
"TerritoryId": 960,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1043424,
"Position": {
"X": 197.07019,
"Y": 567.49976,
"Z": 246.23486
},
"TerritoryId": 960,
"InteractionType": "Interact"
},
{
"DataId": 1043423,
"Position": {
"X": 200.67139,
"Y": 567.4998,
"Z": 236.10278
},
"TerritoryId": 960,
"InteractionType": "Interact"
},
{
"DataId": 1043592,
"Position": {
"X": 206.43921,
"Y": 567.49976,
"Z": 236.89624
},
"TerritoryId": 960,
"InteractionType": "Interact"
},
{
"DataId": 1043593,
"Position": {
"X": 218.4939,
"Y": 565.99994,
"Z": 247.18079
},
"TerritoryId": 960,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1043585,
"Position": {
"X": 203.84521,
"Y": 567.4998,
"Z": 246.87573
},
"TerritoryId": 960,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1043864,
"Position": {
"X": 244.83093,
"Y": 564.8203,
"Z": 261.76843
},
"TerritoryId": 960,
"InteractionType": "Interact",
"Fly": true,
"TargetTerritoryId": 960,
"DialogueChoices": [
{
"Prompt": "TEXT_BANOMI006_04606_Q6_000_000",
"Type": "YesNo",
"Yes": true
}
]
},
{
"DataId": 1043951,
"Position": {
"X": 303.8529,
"Y": 481.99442,
"Z": 154.83325
},
"TerritoryId": 960,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -13,7 +13,13 @@
"Z": 6.8207397
},
"TerritoryId": 819,
"InteractionType": "AcceptQuest"
"InteractionType": "AcceptQuest",
"AetheryteShortcut": "Crystarium",
"SkipConditions": {
"AetheryteShortcutIf": {
"InSameTerritory": true
}
}
}
]
},

View File

@ -20,11 +20,6 @@
{
"Sequence": 1,
"Steps": [
{
"TerritoryId": 963,
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Radz-at-Han] The High Crucible of Al-Kimiya"
},
{
"DataId": 1039589,
"Position": {

View File

@ -20,15 +20,89 @@
{
"Sequence": 1,
"Steps": [
{
"DataId": 2013960,
"Position": {
"X": 380.30054,
"Y": -16.983276,
"Z": -508.17123
},
"TerritoryId": 1190,
"InteractionType": "AttuneAetherCurrent",
"AetherCurrentId": 2818452
},
{
"Position": {
"X": 323.5058,
"Y": -16.330368,
"Z": -254.18399
"X": 616.9261,
"Y": -17.458832,
"Z": -435.18936
},
"TerritoryId": 1190,
"InteractionType": "WalkTo"
},
{
"DataId": 2013961,
"Position": {
"X": 645.5939,
"Y": -11.7647705,
"Z": -417.65472
},
"TerritoryId": 1190,
"InteractionType": "AttuneAetherCurrent",
"AetherCurrentId": 2818456
},
{
"Position": {
"X": 659.8994,
"Y": -16.525915,
"Z": -173.6375
},
"TerritoryId": 1190,
"InteractionType": "WalkTo"
},
{
"DataId": 2013963,
"Position": {
"X": 658.2893,
"Y": 21.011597,
"Z": 82.993774
},
"TerritoryId": 1190,
"InteractionType": "AttuneAetherCurrent",
"AetherCurrentId": 2818458
},
{
"Position": {
"X": 198.9425,
"Y": 6.210067,
"Z": -53.1092
},
"TerritoryId": 1190,
"InteractionType": "WalkTo"
},
{
"DataId": 2013962,
"Position": {
"X": 183.88635,
"Y": 11.917236,
"Z": -59.342346
},
"TerritoryId": 1190,
"InteractionType": "AttuneAetherCurrent",
"AetherCurrentId": 2818457,
"DisableNavmesh": true
},
{
"Position": {
"X": 290.40674,
"Y": -11.14023,
"Z": -126.13759
},
"TerritoryId": 1190,
"InteractionType": "WalkTo",
"DisableNavmesh": true
},
{
"DataId": 1050656,
"Position": {

View File

@ -59,7 +59,8 @@
},
"TerritoryId": 1190,
"InteractionType": "WalkTo",
"$": "Shaaloani Hhusatahwi Saloon Stairs (top)"
"$": "Shaaloani Hhusatahwi Saloon Stairs (top)",
"Mount": true
},
{
"Position": {

View File

@ -56,78 +56,6 @@
"InteractionType": "AttuneAetheryte",
"Aetheryte": "Shaaloani - Mehwahhetsoan"
},
{
"DataId": 2013960,
"Position": {
"X": 380.30054,
"Y": -16.983276,
"Z": -508.17123
},
"TerritoryId": 1190,
"InteractionType": "AttuneAetherCurrent",
"AetherCurrentId": 2818452
},
{
"Position": {
"X": 616.9261,
"Y": -17.458832,
"Z": -435.18936
},
"TerritoryId": 1190,
"InteractionType": "WalkTo"
},
{
"DataId": 2013961,
"Position": {
"X": 645.5939,
"Y": -11.7647705,
"Z": -417.65472
},
"TerritoryId": 1190,
"InteractionType": "AttuneAetherCurrent",
"AetherCurrentId": 2818456
},
{
"Position": {
"X": 659.8994,
"Y": -16.525915,
"Z": -173.6375
},
"TerritoryId": 1190,
"InteractionType": "WalkTo"
},
{
"DataId": 2013963,
"Position": {
"X": 658.2893,
"Y": 21.011597,
"Z": 82.993774
},
"TerritoryId": 1190,
"InteractionType": "AttuneAetherCurrent",
"AetherCurrentId": 2818458
},
{
"Position": {
"X": 198.9425,
"Y": 6.210067,
"Z": -53.1092
},
"TerritoryId": 1190,
"InteractionType": "WalkTo"
},
{
"DataId": 2013962,
"Position": {
"X": 183.88635,
"Y": 11.917236,
"Z": -59.342346
},
"TerritoryId": 1190,
"InteractionType": "AttuneAetherCurrent",
"AetherCurrentId": 2818457,
"DisableNavmesh": true
},
{
"DataId": 1046988,
"Position": {
@ -136,8 +64,7 @@
"Z": -514.6716
},
"TerritoryId": 1190,
"InteractionType": "Interact",
"AetheryteShortcut": "Shaaloani - Mehwahhetsoan"
"InteractionType": "Interact"
}
]
},

View File

@ -137,6 +137,15 @@
{
"Sequence": 3,
"Steps": [
{
"Position": {
"X": -163.63573,
"Y": 45.171337,
"Z": 12.003954
},
"TerritoryId": 1185,
"InteractionType": "WalkTo"
},
{
"DataId": 1047026,
"Position": {

View File

@ -55,7 +55,8 @@
"Z": 0.6866455
},
"TerritoryId": 1171,
"InteractionType": "Interact"
"InteractionType": "Interact",
"DelaySecondsAtStart": 3
}
]
},

View File

@ -44,12 +44,14 @@
"Z": -117.162285
},
"TerritoryId": 1186,
"InteractionType": "WalkTo"
"InteractionType": "WalkTo",
"RestartNavigationIfCancelled": false
},
{
"TerritoryId": 1186,
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Solution Nine] Resolution"
"AethernetShard": "[Solution Nine] Resolution",
"DelaySecondsAtStart": 2
},
{
"DataId": 1048073,

View File

@ -27,7 +27,8 @@
"Z": 5.1162424
},
"TerritoryId": 1186,
"InteractionType": "WalkTo"
"InteractionType": "WalkTo",
"RestartNavigationIfCancelled": false
},
{
"DataId": 1048172,
@ -37,7 +38,8 @@
"Z": 9.201172
},
"TerritoryId": 1186,
"InteractionType": "Interact"
"InteractionType": "Interact",
"DelaySecondsAtStart": 2
}
]
},

View File

@ -33,6 +33,7 @@
},
"TerritoryId": 1192,
"InteractionType": "WalkTo",
"AetheryteShortcut": "Living Memory - Leynode Mnemo",
"$": "Leynode Mnemo to Meso Terminal waypoint",
"SkipConditions": {
"StepIf": {

View File

@ -13,7 +13,17 @@
"Z": 231.37244
},
"TerritoryId": 1186,
"InteractionType": "AcceptQuest"
"InteractionType": "AcceptQuest",
"AetheryteShortcut": "Solution Nine",
"AethernetShortcut": [
"[Solution Nine] Aetheryte Plaza",
"[Solution Nine] The Arcadion"
],
"SkipConditions": {
"AetheryteShortcutIf": {
"InSameTerritory": true
}
}
}
]
},

View File

@ -8,6 +8,41 @@
{
"Sequence": 0,
"Steps": [
{
"DataId": 1049793,
"Position": {
"X": 364.3396,
"Y": 60.125,
"Z": 357.1068
},
"TerritoryId": 1186,
"InteractionType": "Interact",
"AetheryteShortcut": "Solution Nine",
"AethernetShortcut": [
"[Solution Nine] Aetheryte Plaza",
"[Solution Nine] The Arcadion"
],
"TargetTerritoryId": 1224,
"SkipConditions": {
"AetheryteShortcutIf": {
"InTerritory": [1224]
},
"StepIf": {
"NearPosition": {
"Position": {
"X": 1.6021729,
"Y": 0,
"Z": -6.088379
},
"MaximumDistance": 100,
"TerritoryId": 1224
},
"InTerritory": [
1224
]
}
}
},
{
"DataId": 1049788,
"Position": {

View File

@ -13,7 +13,13 @@
"Z": 75.66943
},
"TerritoryId": 1185,
"InteractionType": "AcceptQuest"
"InteractionType": "AcceptQuest",
"AetheryteShortcut": "Tuliyollal",
"SkipConditions": {
"AetheryteShortcutIf": {
"InSameTerritory": true
}
}
}
]
},
@ -77,7 +83,12 @@
},
"TerritoryId": 1187,
"InteractionType": "Interact",
"AetheryteShortcut": "Urqopacha - Worlar's Echo"
"AetheryteShortcut": "Urqopacha - Worlar's Echo",
"SkipConditions": {
"AetheryteShortcutIf": {
"InSameTerritory": true
}
}
}
]
},
@ -92,7 +103,14 @@
"Z": 145.00647
},
"TerritoryId": 1187,
"InteractionType": "CompleteQuest"
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Urqopacha - Worlar's Echo",
"Fly": true,
"SkipConditions": {
"AetheryteShortcutIf": {
"InSameTerritory": true
}
}
}
]
}

View File

@ -16,7 +16,17 @@
"Z": 198.07727
},
"TerritoryId": 1186,
"InteractionType": "AcceptQuest"
"InteractionType": "AcceptQuest",
"AetheryteShortcut": "Solution Nine",
"AethernetShortcut": [
"[Solution Nine] Aetheryte Plaza",
"[Solution Nine] Neon Stein"
],
"SkipConditions": {
"AetheryteShortcutIf": {
"InSameTerritory": true
}
}
}
]
},
@ -31,7 +41,13 @@
"Z": 761.68445
},
"TerritoryId": 1192,
"InteractionType": "Interact"
"InteractionType": "Interact",
"AetheryteShortcut": "Living Memory - Leynode Mnemo",
"SkipConditions": {
"AetheryteShortcutIf": {
"InSameTerritory": true
}
}
}
]
},
@ -63,7 +79,13 @@
},
"TerritoryId": 1192,
"InteractionType": "Interact",
"Fly": true
"Fly": true,
"AetheryteShortcut": "Living Memory - Leynode Mnemo",
"SkipConditions": {
"AetheryteShortcutIf": {
"InSameTerritory": true
}
}
}
]
},
@ -90,7 +112,13 @@
"StopDistance": 7,
"TerritoryId": 1192,
"InteractionType": "Interact",
"Fly": true
"Fly": true,
"AetheryteShortcut": "Living Memory - Leynode Mnemo",
"SkipConditions": {
"AetheryteShortcutIf": {
"InSameTerritory": true
}
}
}
]
},

View File

@ -119,6 +119,7 @@
"Combat",
"UseItem",
"EquipItem",
"PurchaseItem",
"EquipRecommended",
"Say",
"Emote",
@ -707,6 +708,44 @@
]
}
},
{
"if": {
"properties": {
"InteractionType": {
"const": "PurchaseItem"
}
}
},
"then": {
"properties": {
"ItemCount": {
"type": "integer"
},
"PurchaseMenu": {
"type": "object",
"description": "The text to use with /say",
"properties": {
"ExcelSheet": {
"type": "string"
},
"Key": {
"type": [
"string",
"integer"
]
}
},
"required": [
"Key"
]
}
},
"required": [
"ItemId",
"ItemCount"
]
}
},
{
"if": {
"properties": {

View File

@ -16,6 +16,7 @@ public sealed class InteractionTypeConverter() : EnumConverter<EInteractionType>
{ EInteractionType.Combat, "Combat" },
{ EInteractionType.UseItem, "UseItem" },
{ EInteractionType.EquipItem, "EquipItem" },
{ EInteractionType.PurchaseItem, "PurchaseItem" },
{ EInteractionType.EquipRecommended, "EquipRecommended" },
{ EInteractionType.Say, "Say" },
{ EInteractionType.Emote, "Emote" },

View File

@ -15,6 +15,7 @@ public enum EInteractionType
Combat,
UseItem,
EquipItem,
PurchaseItem,
EquipRecommended,
Say,
Emote,

View File

@ -0,0 +1,12 @@
using System.Text.Json.Serialization;
using Questionable.Model.Questing.Converter;
namespace Questionable.Model.Questing;
public sealed class PurchaseMenu
{
public string? ExcelSheet { get; set; }
[JsonConverter(typeof(ExcelRefConverter))]
public ExcelRef? Key { get; set; }
}

View File

@ -78,6 +78,7 @@ public sealed class QuestStep
public List<QuestWorkValue?> CompletionQuestVariablesFlags { get; set; } = [];
public List<DialogueChoice> DialogueChoices { get; set; } = [];
public List<uint> PointMenuChoices { get; set; } = [];
public PurchaseMenu? PurchaseMenu { get; set; }
// TODO: Not implemented
[JsonConverter(typeof(ElementIdConverter))]

View File

@ -35,6 +35,7 @@ internal sealed class CombatController : IDisposable
private CurrentFight? _currentFight;
private bool _wasInCombat;
private ulong? _lastTargetId;
public CombatController(
IEnumerable<ICombatModule> combatModules,
@ -92,6 +93,33 @@ internal sealed class CombatController : IDisposable
_movementController.MovementStartedAt > DateTime.Now.AddSeconds(-1))
return EStatus.Moving;
// Overworld enemies typically means that if we want to kill 3 enemies, we could have anywhere from 0 to 20
// enemies in the area (0 if someone else killed them before, like can happen with bots in Fools' Falls in
// La Noscea).
//
// For all 'normal' types, e.g. auto-spawning on entering an area, there's a fixed number of enemies that you're
// fighting with, and the enemies in the overworld aren't relevant.
if (_currentFight.Data.SpawnType is EEnemySpawnType.OverworldEnemies)
{
if (_targetManager.Target != null)
_lastTargetId = _targetManager.Target?.GameObjectId;
else
{
if (_lastTargetId != null)
{
IGameObject? lastTarget = _objectTable.FirstOrDefault(x => x.GameObjectId == _lastTargetId);
if (lastTarget != null)
{
// wait until the game cleans up the target
if (lastTarget.IsDead)
return EStatus.InCombat;
}
else
_lastTargetId = null;
}
}
}
var target = _targetManager.Target;
if (target != null)
{
@ -192,45 +220,37 @@ internal sealed class CombatController : IDisposable
public unsafe int GetKillPriority(IGameObject gameObject)
{
if (_currentFight == null)
return 0;
if (gameObject is IBattleNpc battleNpc)
{
if (_currentFight != null && !_currentFight.Module.CanAttack(battleNpc))
if (!_currentFight.Module.CanAttack(battleNpc))
return 0;
// 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.SpawnType == EEnemySpawnType.FateEnemies ||
_currentFight.Data.KillEnemyDataIds.Count > 0)
{
if (battleNpc.IsDead)
return 0;
}
if (battleNpc.IsDead)
return 0;
if (!battleNpc.IsTargetable)
return 0;
if (_currentFight != null)
var complexCombatData = _currentFight.Data.ComplexCombatDatas;
if (complexCombatData.Count >= 0)
{
var complexCombatData = _currentFight.Data.ComplexCombatDatas;
if (complexCombatData.Count >= 0)
for (int i = 0; i < complexCombatData.Count; ++i)
{
for (int i = 0; i < complexCombatData.Count; ++i)
{
if (_currentFight.Data.CompletedComplexDatas.Contains(i))
continue;
if (_currentFight.Data.CompletedComplexDatas.Contains(i))
continue;
if (complexCombatData[i].DataId == battleNpc.DataId)
return 100;
}
}
else
{
if (_currentFight.Data.KillEnemyDataIds.Contains(battleNpc.DataId))
return 90;
if (complexCombatData[i].DataId == battleNpc.DataId)
return 100;
}
}
else
{
if (_currentFight.Data.KillEnemyDataIds.Contains(battleNpc.DataId))
return 90;
}
// enemies that we have aggro on
if (battleNpc.BattleNpcKind is BattleNpcSubKind.BattleNpcPart or BattleNpcSubKind.Enemy)
@ -241,8 +261,7 @@ internal sealed class CombatController : IDisposable
if (gameObjectStruct->NamePlateIconId is 60093 or 60732)
return 0;
var enemyData =
_currentFight?.Data.ComplexCombatDatas.FirstOrDefault(x => x.DataId == battleNpc.DataId);
var enemyData = _currentFight.Data.ComplexCombatDatas.FirstOrDefault(x => x.DataId == battleNpc.DataId);
if (enemyData is { IgnoreQuestMarker: true })
{
if (battleNpc.StatusFlags.HasFlag(StatusFlags.InCombat))
@ -255,7 +274,8 @@ internal sealed class CombatController : IDisposable
// for enemies that are very far away, their nameplate doesn't render but they're in the object table
if (_currentFight?.Data.SpawnType == EEnemySpawnType.OverworldEnemies &&
Vector3.Distance(_clientState.LocalPlayer?.Position ?? Vector3.Zero, battleNpc.Position) > MaxNameplateRange)
Vector3.Distance(_clientState.LocalPlayer?.Position ?? Vector3.Zero, battleNpc.Position) >
MaxNameplateRange)
return 25;
}
else
@ -298,12 +318,14 @@ internal sealed class CombatController : IDisposable
}
else if (Vector3.Distance(_clientState.LocalPlayer!.Position, target.Position) > MaxTargetRange)
{
_logger.LogInformation("Moving to target, distance: {Distance:N2}", Vector3.Distance(_clientState.LocalPlayer!.Position, target.Position));
_logger.LogInformation("Moving to target, distance: {Distance:N2}",
Vector3.Distance(_clientState.LocalPlayer!.Position, target.Position));
_currentFight!.Module.MoveToTarget(target);
}
else
{
_logger.LogInformation("Setting target to {TargetName} ({TargetId:X8})", target.Name.ToString(), target.GameObjectId);
_logger.LogInformation("Setting target to {TargetName} ({TargetId:X8})", target.Name.ToString(),
target.GameObjectId);
_targetManager.Target = target;
_currentFight!.Module.MoveToTarget(target);
}

View File

@ -46,6 +46,7 @@ internal sealed class InteractionUiController : IDisposable
private readonly IGameGui _gameGui;
private readonly ITargetManager _targetManager;
private readonly IClientState _clientState;
private readonly ShopController _shopController;
private readonly ILogger<InteractionUiController> _logger;
private readonly Regex _returnRegex;
@ -67,6 +68,7 @@ internal sealed class InteractionUiController : IDisposable
ITargetManager targetManager,
IPluginLog pluginLog,
IClientState clientState,
ShopController shopController,
ILogger<InteractionUiController> logger)
{
_addonLifecycle = addonLifecycle;
@ -83,6 +85,7 @@ internal sealed class InteractionUiController : IDisposable
_gameGui = gameGui;
_targetManager = targetManager;
_clientState = clientState;
_shopController = shopController;
_logger = logger;
_returnRegex = _dataManager.GetExcelSheet<Addon>()!.GetRow(196)!.GetRegex(addon => addon.Text, pluginLog)!;
@ -334,7 +337,17 @@ internal sealed class InteractionUiController : IDisposable
if (step == null)
_logger.LogDebug("Ignoring current quest dialogue choices, no active step");
else
{
dialogueChoices.AddRange(step.DialogueChoices.Select(x => new DialogueChoiceInfo(quest, x)));
if (step.PurchaseMenu != null)
dialogueChoices.Add(new DialogueChoiceInfo(quest, new DialogueChoice
{
Type = EDialogChoiceType.List,
ExcelSheet = step.PurchaseMenu.ExcelSheet,
Prompt = null,
Answer = step.PurchaseMenu.Key,
}));
}
}
// add all travel dialogue choices
@ -516,9 +529,16 @@ internal sealed class InteractionUiController : IDisposable
return;
_logger.LogTrace("Prompt: '{Prompt}'", actualPrompt);
if (_shopController.IsAutoBuyEnabled && _shopController.IsAwaitingYesNo)
{
addonSelectYesno->AtkUnitBase.FireCallbackInt(0);
_shopController.IsAwaitingYesNo = false;
return;
}
var director = UIState.Instance()->DirectorTodo.Director;
if (director != null && director->EventHandlerInfo != null &&
director->EventHandlerInfo->EventId.ContentId == EventHandlerType.GatheringLeveDirector &&
if (director != null &&
director->Info.EventId.ContentId == EventHandlerType.GatheringLeveDirector &&
director->Sequence == 254)
{
// just close the dialogue for 'do you want to return to next settlement', should prolly be different for

View File

@ -0,0 +1,156 @@
using System;
using System.Linq;
using System.Numerics;
using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Component.GUI;
using LLib.GameUI;
using LLib.Shop;
using Microsoft.Extensions.Logging;
using Questionable.Model.Questing;
using Workshoppa.GameData.Shops;
using ValueType = FFXIVClientStructs.FFXIV.Component.GUI.ValueType;
namespace Questionable.Controller.GameUi;
internal sealed class ShopController : IDisposable, IShopWindow
{
private readonly QuestController _questController;
private readonly IGameGui _gameGui;
private readonly IFramework _framework;
private readonly RegularShopBase _shop;
private readonly ILogger<ShopController> _logger;
public ShopController(QuestController questController, IGameGui gameGui, IAddonLifecycle addonLifecycle,
IFramework framework, ILogger<ShopController> logger, IPluginLog pluginLog)
{
_questController = questController;
_gameGui = gameGui;
_framework = framework;
_shop = new RegularShopBase(this, "Shop", pluginLog, gameGui, addonLifecycle);
_logger = logger;
_framework.Update += FrameworkUpdate;
}
public bool IsEnabled => _questController.IsRunning;
public bool IsOpen { get; set; }
public bool IsAutoBuyEnabled => _shop.AutoBuyEnabled;
public bool IsAwaitingYesNo
{
get { return _shop.IsAwaitingYesNo; }
set { _shop.IsAwaitingYesNo = value; }
}
public Vector2? Position { get; set; } // actual implementation doesn't matter, not a real window
public void Dispose()
{
_framework.Update -= FrameworkUpdate;
_shop.Dispose();
}
private void FrameworkUpdate(IFramework framework)
{
if (IsOpen && _shop.ItemForSale != null)
{
if (_shop.PurchaseState != null)
{
_shop.HandleNextPurchaseStep();
}
else
{
var currentStep = FindCurrentStep();
if (currentStep == null || currentStep.InteractionType != EInteractionType.PurchaseItem)
return;
int missingItems = Math.Max(0,
currentStep.ItemCount.GetValueOrDefault() - (int)_shop.ItemForSale.OwnedItems);
int toPurchase = Math.Min(_shop.GetMaxItemsToPurchase(), missingItems);
if (toPurchase > 0)
{
_logger.LogDebug("Auto-buying {MissingItems} {ItemName}", missingItems, _shop.ItemForSale.ItemName);
_shop.StartAutoPurchase(missingItems);
_shop.HandleNextPurchaseStep();
}
else
_shop.CancelAutoPurchase();
}
}
}
public int GetCurrencyCount() => _shop.GetItemCount(1); // TODO: support other currencies
private QuestStep? FindCurrentStep()
{
var currentQuest = _questController.CurrentQuest;
QuestSequence? currentSequence = currentQuest?.Quest.FindSequence(currentQuest.Sequence);
return currentSequence?.FindStep(currentQuest?.Step ?? 0);
}
public unsafe void UpdateShopStock(AtkUnitBase* addon)
{
var currentStep = FindCurrentStep();
if (currentStep == null || currentStep.InteractionType != EInteractionType.PurchaseItem)
{
_shop.ItemForSale = null;
return;
}
if (addon->AtkValuesCount != 625)
{
_logger.LogError("Unexpected amount of atkvalues for Shop addon ({AtkValueCount})", addon->AtkValuesCount);
_shop.ItemForSale = null;
return;
}
var atkValues = addon->AtkValues;
// Check if on 'Current Stock' tab?
if (atkValues[0].UInt != 0)
{
_shop.ItemForSale = null;
return;
}
uint itemCount = atkValues[2].UInt;
if (itemCount == 0)
{
_shop.ItemForSale = null;
return;
}
_shop.ItemForSale = Enumerable.Range(0, (int)itemCount)
.Select(i => new ItemForSale
{
Position = i,
ItemName = atkValues[14 + i].ReadAtkString(),
Price = atkValues[75 + i].UInt,
OwnedItems = atkValues[136 + i].UInt,
ItemId = atkValues[441 + i].UInt,
})
.FirstOrDefault(x => x.ItemId == currentStep.ItemId);
}
public unsafe void TriggerPurchase(AtkUnitBase* addonShop, int buyNow)
{
var buyItem = stackalloc AtkValue[]
{
new() { Type = ValueType.Int, Int = 0 },
new() { Type = ValueType.Int, Int = _shop.ItemForSale!.Position },
new() { Type = ValueType.Int, Int = buyNow },
new() { Type = 0, Int = 0 }
};
addonShop->FireCallback(4, buyItem);
}
public void SaveExternalPluginState()
{
}
public unsafe void RestoreExternalPluginState()
{
if (_gameGui.TryGetAddonByName("Shop", out AtkUnitBase* addonShop))
addonShop->FireCallbackInt(-1);
}
}

View File

@ -135,8 +135,7 @@ internal sealed unsafe class GatheringController : MiniTaskController<GatheringC
return;
var director = UIState.Instance()->DirectorTodo.Director;
if (director != null && director->EventHandlerInfo != null &&
director->EventHandlerInfo->EventId.ContentId == EventHandlerType.GatheringLeveDirector)
if (director != null && director->Info.EventId.ContentId == EventHandlerType.GatheringLeveDirector)
{
if (director->Sequence == 254)
return;

View File

@ -167,5 +167,9 @@ internal abstract class MiniTaskController<T>
}
else
_taskQueue.InterruptWith([new WaitAtEnd.WaitDelay()]);
_logger.LogInformation("Remaining tasks after interruption:");
foreach (ITask task in _taskQueue.RemainingTasks)
_logger.LogInformation("- {TaskName}", task);
}
}

View File

@ -35,6 +35,11 @@ internal static class Interact
if (step.DataId == null)
yield break;
}
else if (step.InteractionType == EInteractionType.PurchaseItem)
{
if (step.DataId == null)
yield break;
}
else if (step.InteractionType == EInteractionType.Snipe)
{
if (!configuration.General.AutomaticallyCompleteSnipeTasks)
@ -51,7 +56,8 @@ internal static class Interact
yield return new Task(step.DataId.Value, quest, step.InteractionType,
step.TargetTerritoryId != null || quest.Id is SatisfactionSupplyNpcId ||
step.SkipConditions is { StepIf.Never: true }, step.PickUpItemId, step.SkipConditions?.StepIf);
step.SkipConditions is { StepIf.Never: true } || step.InteractionType == EInteractionType.PurchaseItem,
step.PickUpItemId, step.SkipConditions?.StepIf);
}
}
@ -72,9 +78,10 @@ internal static class Interact
GameFunctions gameFunctions,
ICondition condition,
ILogger<DoInteract> logger)
: TaskExecutor<Task>
: TaskExecutor<Task>, IConditionChangeAware
{
private bool _needsUnmount;
private EInteractionState _interactionState = EInteractionState.None;
private DateTime _continueAt = DateTime.MinValue;
public Quest? Quest => Task.Quest;
@ -111,9 +118,7 @@ internal static class Interact
if (gameObject.IsTargetable && HasAnyMarker(gameObject))
{
ProgressContext =
InteractionProgressContext.FromActionUseOrDefault(() => gameFunctions.InteractWith(gameObject));
_continueAt = DateTime.Now.AddSeconds(0.5);
TriggerInteraction(gameObject);
return true;
}
@ -148,7 +153,8 @@ internal static class Interact
}
else
{
if (ProgressContext != null && ProgressContext.WasSuccessful())
if (ProgressContext != null && (ProgressContext.WasSuccessful() ||
_interactionState == EInteractionState.InteractionConfirmed))
return ETaskResult.TaskComplete;
if (InteractionType == EInteractionType.Gather && condition[ConditionFlag.Gathering])
@ -159,12 +165,24 @@ internal static class Interact
if (gameObject == null || !gameObject.IsTargetable || !HasAnyMarker(gameObject))
return ETaskResult.StillRunning;
ProgressContext =
InteractionProgressContext.FromActionUseOrDefault(() => gameFunctions.InteractWith(gameObject));
_continueAt = DateTime.Now.AddSeconds(0.5);
TriggerInteraction(gameObject);
return ETaskResult.StillRunning;
}
private void TriggerInteraction(IGameObject gameObject)
{
ProgressContext =
InteractionProgressContext.FromActionUseOrDefault(() =>
{
if (gameFunctions.InteractWith(gameObject))
_interactionState = EInteractionState.InteractionTriggered;
else
_interactionState = EInteractionState.None;
return _interactionState != EInteractionState.None;
});
_continueAt = DateTime.Now.AddSeconds(0.5);
}
private unsafe bool HasAnyMarker(IGameObject gameObject)
{
if (Task.SkipMarkerCheck || gameObject.ObjectKind != ObjectKind.EventNpc)
@ -173,5 +191,27 @@ internal static class Interact
var gameObjectStruct = (FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject*)gameObject.Address;
return gameObjectStruct->NamePlateIconId != 0;
}
public void OnConditionChange(ConditionFlag flag, bool value)
{
if (ProgressContext != null && (ProgressContext.WasInterrupted() || ProgressContext.WasSuccessful()))
return;
logger.LogDebug("Condition change: {Flag} = {Value}", flag, value);
if (_interactionState == EInteractionState.InteractionTriggered &&
flag is ConditionFlag.OccupiedInQuestEvent or ConditionFlag.OccupiedInEvent &&
value)
{
logger.LogInformation("Interaction was most likely triggered");
_interactionState = EInteractionState.InteractionConfirmed;
}
}
private enum EInteractionState
{
None,
InteractionTriggered,
InteractionConfirmed,
}
}
}

View File

@ -0,0 +1,22 @@
using Questionable.Model;
using Questionable.Model.Questing;
namespace Questionable.Controller.Steps.Interactions;
internal static class PurchaseItem
{
internal sealed class Factory : SimpleTaskFactory
{
public override ITask? CreateTask(Quest quest, QuestSequence sequence, QuestStep step)
{
if (step.InteractionType != EInteractionType.PurchaseItem)
return null;
throw new System.NotImplementedException();
}
}
internal sealed class PurchaseRequest
{
}
}

View File

@ -44,8 +44,7 @@ internal static class InitiateLeve
{
var director = UIState.Instance()->DirectorTodo.Director;
if (director != null &&
director->EventHandlerInfo != null &&
director->EventHandlerInfo->EventId.ContentId == EventHandlerType.GatheringLeveDirector &&
director->Info.EventId.ContentId == EventHandlerType.GatheringLeveDirector &&
director->ContentId == Task.ElementId.Value)
return ETaskResult.SkipRemainingTasksForStep;

View File

@ -19,7 +19,11 @@ namespace Questionable.Controller.Steps.Shared;
internal static class AethernetShortcut
{
internal sealed class Factory(MovementController movementController)
internal sealed class Factory(
MovementController movementController,
AetheryteData aetheryteData,
TerritoryData territoryData,
IClientState clientState)
: ITaskFactory
{
public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step)
@ -31,6 +35,14 @@ internal static class AethernetShortcut
"Wait(navmesh ready)");
yield return new Task(step.AethernetShortcut.From, step.AethernetShortcut.To,
step.SkipConditions?.AethernetShortcutIf ?? new());
if (AetheryteShortcut.MoveAwayFromAetheryteExecutor.AppliesTo(step.AethernetShortcut.To))
{
yield return new WaitCondition.Task(
() => clientState.TerritoryType == aetheryteData.TerritoryIds[step.AethernetShortcut.To],
$"Wait(territory: {territoryData.GetNameAndId(aetheryteData.TerritoryIds[step.AethernetShortcut.To])})");
yield return new AetheryteShortcut.MoveAwayFromAetheryte(step.AethernetShortcut.To);
}
}
}
@ -142,7 +154,7 @@ internal static class AethernetShortcut
new(0, 8.442986f, -9),
];
Vector3 closestPoint = nearbyPoints.MinBy(x => (playerPosition - x).Length());
Vector3 closestPoint = nearbyPoints.MinBy(x => Vector3.Distance(playerPosition, x));
_moving = true;
movementController.NavigateTo(EMovementType.Quest, (uint)Task.From, closestPoint, false, true,
0.25f);

View File

@ -1,9 +1,11 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Numerics;
using Dalamud.Plugin.Services;
using Microsoft.Extensions.Logging;
using Questionable.Controller.Steps.Common;
using Questionable.Controller.Utils;
using Questionable.Data;
using Questionable.Functions;
@ -15,7 +17,8 @@ namespace Questionable.Controller.Steps.Shared;
internal static class AetheryteShortcut
{
internal sealed class Factory(AetheryteData aetheryteData) : ITaskFactory
internal sealed class Factory(AetheryteData aetheryteData, TerritoryData territoryData, IClientState clientState)
: ITaskFactory
{
public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step)
{
@ -25,6 +28,15 @@ internal static class AetheryteShortcut
yield return new Task(step, quest.Id, step.AetheryteShortcut.Value,
aetheryteData.TerritoryIds[step.AetheryteShortcut.Value]);
yield return new WaitAtEnd.WaitDelay(TimeSpan.FromSeconds(0.5));
if (MoveAwayFromAetheryteExecutor.AppliesTo(step.AetheryteShortcut.Value) &&
step.AethernetShortcut?.From != step.AetheryteShortcut.Value)
{
yield return new WaitCondition.Task(
() => clientState.TerritoryType == aetheryteData.TerritoryIds[step.AetheryteShortcut.Value],
$"Wait(territory: {territoryData.GetNameAndId(aetheryteData.TerritoryIds[step.AetheryteShortcut.Value])})");
yield return new MoveAwayFromAetheryte(step.AetheryteShortcut.Value);
}
}
}
@ -206,4 +218,47 @@ internal static class AetheryteShortcut
}
}
}
internal sealed record MoveAwayFromAetheryte(EAetheryteLocation TargetAetheryte) : ITask
{
public override string ToString() => $"MoveAway({TargetAetheryte})";
}
internal sealed class MoveAwayFromAetheryteExecutor(
MoveTo.MoveExecutor moveExecutor,
AetheryteData aetheryteData,
IClientState clientState) : TaskExecutor<MoveAwayFromAetheryte>
{
private static readonly Dictionary<EAetheryteLocation, List<Vector3>> AetherytesToMoveFrom = new()
{
{
EAetheryteLocation.SolutionNine,
[
new(0f, 8.8f, 15.5f),
new(0f, 8.8f, -15.5f),
new(15.5f, 8.8f, 0f),
new(-15.5f, 8.8f, 0f)
]
}
};
public static bool AppliesTo(EAetheryteLocation location) => AetherytesToMoveFrom.ContainsKey(location);
protected override bool Start()
{
// only relevant if we're actually near the s9 aetheryte at the end
Vector3 playerPosition = clientState.LocalPlayer!.Position;
if (aetheryteData.CalculateDistance(playerPosition, clientState.TerritoryType, Task.TargetAetheryte) >= 20)
return false;
Vector3 closestPoint = AetherytesToMoveFrom[Task.TargetAetheryte]
.MinBy(x => Vector3.Distance(x, playerPosition));
MoveTo.MoveTask task = new MoveTo.MoveTask(aetheryteData.TerritoryIds[Task.TargetAetheryte],
closestPoint, Mount: false, StopDistance: 0.25f, DisableNavmesh: true,
InteractionType: EInteractionType.None, RestartNavigation: false);
return moveExecutor.Start(task);
}
public override ETaskResult Update() => moveExecutor.Update();
}
}

View File

@ -5,6 +5,7 @@ namespace Questionable.Controller.Steps;
internal interface ITaskExecutor
{
ITask CurrentTask { get; }
public InteractionProgressContext? ProgressContext { get; }
Type GetTaskType();
@ -19,7 +20,7 @@ internal abstract class TaskExecutor<T> : ITaskExecutor
where T : class, ITask
{
protected T Task { get; set; } = null!;
protected InteractionProgressContext? ProgressContext { get; set; }
public InteractionProgressContext? ProgressContext { get; set; }
ITask ITaskExecutor.CurrentTask => Task;
public bool WasInterrupted()

View File

@ -91,6 +91,11 @@ internal sealed class ExcelFunctions
var questRow = _dataManager.GetExcelSheet<EventPathMove>()!.GetRow(rowId);
return questRow?.Unknown10;
}
else if (excelSheet is "GilShop")
{
var questRow = _dataManager.GetExcelSheet<GilShop>()!.GetRow(rowId);
return questRow?.Name;
}
else if (excelSheet is "ContentTalk" or null)
{
var questRow = _dataManager.GetExcelSheet<ContentTalk>()!.GetRow(rowId);

View File

@ -129,7 +129,8 @@ public sealed class QuestionablePlugin : IDalamudPlugin
private static void AddTaskFactories(ServiceCollection serviceCollection)
{
// individual tasks
serviceCollection.AddTaskExecutor<MoveToLandingLocation.Task, MoveToLandingLocation.MoveToLandingLocationExecutor>();
serviceCollection
.AddTaskExecutor<MoveToLandingLocation.Task, MoveToLandingLocation.MoveToLandingLocationExecutor>();
serviceCollection.AddTaskExecutor<DoGather.Task, DoGather.GatherExecutor>();
serviceCollection.AddTaskExecutor<DoGatherCollectable.Task, DoGatherCollectable.GatherCollectableExecutor>();
serviceCollection.AddTaskExecutor<SwitchClassJob.Task, SwitchClassJob.SwitchClassJobExecutor>();
@ -138,13 +139,16 @@ public sealed class QuestionablePlugin : IDalamudPlugin
// task factories
serviceCollection
.AddTaskFactoryAndExecutor<StepDisabled.SkipRemainingTasks, StepDisabled.Factory, StepDisabled.SkipDisabledStepsExecutor>();
.AddTaskFactoryAndExecutor<StepDisabled.SkipRemainingTasks, StepDisabled.Factory,
StepDisabled.SkipDisabledStepsExecutor>();
serviceCollection.AddTaskFactory<EquipRecommended.BeforeDutyOrInstance>();
serviceCollection.AddTaskFactoryAndExecutor<Gather.GatheringTask, Gather.Factory, Gather.StartGathering>();
serviceCollection.AddTaskExecutor<Gather.SkipMarker, Gather.DoSkip>();
serviceCollection
.AddTaskFactoryAndExecutor<AetheryteShortcut.Task, AetheryteShortcut.Factory,
AetheryteShortcut.UseAetheryteShortcut>();
serviceCollection
.AddTaskExecutor<AetheryteShortcut.MoveAwayFromAetheryte, AetheryteShortcut.MoveAwayFromAetheryteExecutor>();
serviceCollection
.AddTaskFactoryAndExecutor<SkipCondition.SkipTask, SkipCondition.Factory, SkipCondition.CheckSkip>();
serviceCollection
@ -156,7 +160,8 @@ public sealed class QuestionablePlugin : IDalamudPlugin
serviceCollection.AddTaskExecutor<MoveTo.WaitForNearDataId, MoveTo.WaitForNearDataIdExecutor>();
serviceCollection.AddTaskExecutor<MoveTo.LandTask, MoveTo.LandExecutor>();
serviceCollection.AddTaskFactoryAndExecutor<NextQuest.SetQuestTask, NextQuest.Factory, NextQuest.NextQuestExecutor>();
serviceCollection
.AddTaskFactoryAndExecutor<NextQuest.SetQuestTask, NextQuest.Factory, NextQuest.NextQuestExecutor>();
serviceCollection
.AddTaskFactoryAndExecutor<AetherCurrent.Attune, AetherCurrent.Factory, AetherCurrent.DoAttune>();
serviceCollection
@ -189,7 +194,8 @@ public sealed class QuestionablePlugin : IDalamudPlugin
TurnInDelivery.SatisfactionSupplyTurnIn>();
serviceCollection.AddTaskFactory<InitiateLeve.Factory>();
serviceCollection.AddTaskExecutor<InitiateLeve.SkipInitiateIfActive, InitiateLeve.SkipInitiateIfActiveExecutor>();
serviceCollection
.AddTaskExecutor<InitiateLeve.SkipInitiateIfActive, InitiateLeve.SkipInitiateIfActiveExecutor>();
serviceCollection.AddTaskExecutor<InitiateLeve.OpenJournal, InitiateLeve.OpenJournalExecutor>();
serviceCollection.AddTaskExecutor<InitiateLeve.Initiate, InitiateLeve.InitiateExecutor>();
serviceCollection.AddTaskExecutor<InitiateLeve.SelectDifficulty, InitiateLeve.SelectDifficultyExecutor>();
@ -218,6 +224,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin
serviceCollection.AddSingleton<CombatController>();
serviceCollection.AddSingleton<GatheringController>();
serviceCollection.AddSingleton<ContextMenuController>();
serviceCollection.AddSingleton<ShopController>();
serviceCollection.AddSingleton<CraftworksSupplyController>();
serviceCollection.AddSingleton<CreditsController>();
@ -278,6 +285,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin
serviceProvider.GetRequiredService<CreditsController>();
serviceProvider.GetRequiredService<HelpUiController>();
serviceProvider.GetRequiredService<LeveUiController>();
serviceProvider.GetRequiredService<ShopController>();
serviceProvider.GetRequiredService<QuestionableIpc>();
serviceProvider.GetRequiredService<DalamudInitializer>();
serviceProvider.GetRequiredService<AutoSnipeHandler>().Enable();

View File

@ -72,6 +72,11 @@ internal sealed class PriorityWindow : LWindow
ImGui.BeginDisabled(_questController.ManualPriorityQuests.Count == 0);
if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.Upload, "Export to Clibpoard"))
ExportToClipboard();
if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.Check, "Remove finished Quests"))
_questController.ManualPriorityQuests.RemoveAll(q => _questFunctions.IsQuestComplete(q.Id));
ImGui.SameLine();
if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.Trash, "Clear"))
_questController.ManualPriorityQuests.Clear();
ImGui.EndDisabled();
ImGui.Spacing();
@ -112,7 +117,7 @@ internal sealed class PriorityWindow : LWindow
foreach (var quest in foundQuests)
{
if (quest.Info.IsMainScenarioQuest || _questController.ManualPriorityQuests.Contains(quest))
if (quest.Info.IsMainScenarioQuest || _questController.ManualPriorityQuests.Any(x => x.Id == quest.Id))
continue;
bool addThis = ImGui.Selectable(quest.Info.Name);

View File

@ -29,6 +29,7 @@ namespace Questionable.Windows.QuestComponents;
internal sealed class CreationUtilsComponent
{
private readonly QuestController _questController;
private readonly MovementController _movementController;
private readonly GameFunctions _gameFunctions;
private readonly QuestFunctions _questFunctions;
@ -43,6 +44,7 @@ internal sealed class CreationUtilsComponent
private readonly ILogger<CreationUtilsComponent> _logger;
public CreationUtilsComponent(
QuestController questController,
MovementController movementController,
GameFunctions gameFunctions,
QuestFunctions questFunctions,
@ -56,6 +58,7 @@ internal sealed class CreationUtilsComponent
Configuration configuration,
ILogger<CreationUtilsComponent> logger)
{
_questController = questController;
_movementController = movementController;
_gameFunctions = gameFunctions;
_questFunctions = questFunctions;
@ -120,7 +123,8 @@ internal sealed class CreationUtilsComponent
#endif
#if false
unsafe {
unsafe
{
var questManager = QuestManager.Instance();
if (questManager != null)
{
@ -134,7 +138,8 @@ internal sealed class CreationUtilsComponent
#endif
#if false
unsafe {
unsafe
{
var director = UIState.Instance()->DirectorTodo.Director;
if (director != null)
{
@ -143,15 +148,26 @@ internal sealed class CreationUtilsComponent
ImGui.Text($"Ico: {director->IconId}");
if (director->EventHandlerInfo != null)
{
ImGui.Text($" EHI CI: {director->EventHandlerInfo->EventId.ContentId}");
ImGui.Text($" EHI EI: {director->EventHandlerInfo->EventId.Id}");
ImGui.Text($" EHI EEI: {director->EventHandlerInfo->EventId.EntryId}");
ImGui.Text($" EHI F: {director->EventHandlerInfo->Flags}");
ImGui.Text($" EHI CI: {director->Info.EventId.ContentId}");
ImGui.Text($" EHI EI: {director->Info.EventId.Id}");
ImGui.Text($" EHI EEI: {director->Info.EventId.EntryId}");
ImGui.Text($" EHI F: {director->Info.Flags}");
}
}
}
#endif
#if true
unsafe
{
var actionManager = ActionManager.Instance();
ImGui.Text(
$"A1: {actionManager->CastActionId} ({actionManager->LastUsedActionSequence} → {actionManager->LastHandledActionSequence})");
ImGui.Text($"A2: {actionManager->CastTimeElapsed} / {actionManager->CastTimeTotal}");
ImGui.Text($"{_questController.TaskQueue.CurrentTaskExecutor?.ProgressContext}");
}
#endif
if (_targetManager.Target != null)
{
DrawTargetDetails(_targetManager.Target);