forked from liza/Questionable
Compare commits
13 Commits
19aa2e90fd
...
09f8cb9078
Author | SHA1 | Date | |
---|---|---|---|
09f8cb9078 | |||
3b6dc2e03b | |||
7d7a4d32e8 | |||
88a4310028 | |||
e7a2bb0cba | |||
411b121f62 | |||
|
c2a16e1ec1 | ||
|
1d3b9a9426 | ||
|
f30b6792bf | ||
|
189087a85b | ||
|
d9d95f17a8 | ||
|
f1698d4652 | ||
0c36dd324f |
@ -45,8 +45,10 @@
|
|||||||
"Y": 58.56588,
|
"Y": 58.56588,
|
||||||
"Z": -533.6083
|
"Z": -533.6083
|
||||||
},
|
},
|
||||||
"MinimumAngle": 155,
|
"MinimumAngle": 185,
|
||||||
"MaximumAngle": 325
|
"MaximumAngle": 225,
|
||||||
|
"MinimumDistance": 2,
|
||||||
|
"MaximumDistance": 3
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@ -131,4 +133,4 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
2
LLib
2
LLib
@ -1 +1 @@
|
|||||||
Subproject commit 43c3dba112c202e2d0ff1a6909020c2b83e20dc3
|
Subproject commit e6e3a1f29715e2af4976dd7338ed2f09ae82c99c
|
@ -127,6 +127,8 @@ internal static class QuestStepExtensions
|
|||||||
.AsSyntaxNodeOrToken(),
|
.AsSyntaxNodeOrToken(),
|
||||||
AssignmentList(nameof(QuestStep.PointMenuChoices), step.PointMenuChoices)
|
AssignmentList(nameof(QuestStep.PointMenuChoices), step.PointMenuChoices)
|
||||||
.AsSyntaxNodeOrToken(),
|
.AsSyntaxNodeOrToken(),
|
||||||
|
Assignment(nameof(QuestStep.PurchaseMenu), step.PurchaseMenu, emptyStep.PurchaseMenu)
|
||||||
|
.AsSyntaxNodeOrToken(),
|
||||||
Assignment(nameof(QuestStep.PickUpQuestId), step.PickUpQuestId,
|
Assignment(nameof(QuestStep.PickUpQuestId), step.PickUpQuestId,
|
||||||
emptyStep.PickUpQuestId)
|
emptyStep.PickUpQuestId)
|
||||||
.AsSyntaxNodeOrToken(),
|
.AsSyntaxNodeOrToken(),
|
||||||
|
@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -43,7 +43,14 @@
|
|||||||
"Z": 150.92688
|
"Z": 150.92688
|
||||||
},
|
},
|
||||||
"TerritoryId": 886,
|
"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",
|
"Comment": "Buy cream yellow dye",
|
||||||
"AethernetShortcut": [
|
"AethernetShortcut": [
|
||||||
"[Firmament] The New Nest",
|
"[Firmament] The New Nest",
|
||||||
|
@ -20,11 +20,6 @@
|
|||||||
{
|
{
|
||||||
"Sequence": 1,
|
"Sequence": 1,
|
||||||
"Steps": [
|
"Steps": [
|
||||||
{
|
|
||||||
"TerritoryId": 963,
|
|
||||||
"InteractionType": "AttuneAethernetShard",
|
|
||||||
"AethernetShard": "[Radz-at-Han] The High Crucible of Al-Kimiya"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"DataId": 1039589,
|
"DataId": 1039589,
|
||||||
"Position": {
|
"Position": {
|
||||||
|
@ -13,7 +13,13 @@
|
|||||||
"Z": 75.66943
|
"Z": 75.66943
|
||||||
},
|
},
|
||||||
"TerritoryId": 1185,
|
"TerritoryId": 1185,
|
||||||
"InteractionType": "AcceptQuest"
|
"InteractionType": "AcceptQuest",
|
||||||
|
"AetheryteShortcut": "Tuliyollal",
|
||||||
|
"SkipConditions": {
|
||||||
|
"AetheryteShortcutIf": {
|
||||||
|
"InSameTerritory": true
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@ -77,7 +83,12 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 1187,
|
"TerritoryId": 1187,
|
||||||
"InteractionType": "Interact",
|
"InteractionType": "Interact",
|
||||||
"AetheryteShortcut": "Urqopacha - Worlar's Echo"
|
"AetheryteShortcut": "Urqopacha - Worlar's Echo",
|
||||||
|
"SkipConditions": {
|
||||||
|
"AetheryteShortcutIf": {
|
||||||
|
"InSameTerritory": true
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@ -92,7 +103,14 @@
|
|||||||
"Z": 145.00647
|
"Z": 145.00647
|
||||||
},
|
},
|
||||||
"TerritoryId": 1187,
|
"TerritoryId": 1187,
|
||||||
"InteractionType": "CompleteQuest"
|
"InteractionType": "CompleteQuest",
|
||||||
|
"AetheryteShortcut": "Urqopacha - Worlar's Echo",
|
||||||
|
"Fly": true,
|
||||||
|
"SkipConditions": {
|
||||||
|
"AetheryteShortcutIf": {
|
||||||
|
"InSameTerritory": true
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,17 @@
|
|||||||
"Z": 198.07727
|
"Z": 198.07727
|
||||||
},
|
},
|
||||||
"TerritoryId": 1186,
|
"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
|
"Z": 761.68445
|
||||||
},
|
},
|
||||||
"TerritoryId": 1192,
|
"TerritoryId": 1192,
|
||||||
"InteractionType": "Interact"
|
"InteractionType": "Interact",
|
||||||
|
"AetheryteShortcut": "Living Memory - Leynode Mnemo",
|
||||||
|
"SkipConditions": {
|
||||||
|
"AetheryteShortcutIf": {
|
||||||
|
"InSameTerritory": true
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@ -63,7 +79,13 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 1192,
|
"TerritoryId": 1192,
|
||||||
"InteractionType": "Interact",
|
"InteractionType": "Interact",
|
||||||
"Fly": true
|
"Fly": true,
|
||||||
|
"AetheryteShortcut": "Living Memory - Leynode Mnemo",
|
||||||
|
"SkipConditions": {
|
||||||
|
"AetheryteShortcutIf": {
|
||||||
|
"InSameTerritory": true
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
@ -90,7 +112,13 @@
|
|||||||
"StopDistance": 7,
|
"StopDistance": 7,
|
||||||
"TerritoryId": 1192,
|
"TerritoryId": 1192,
|
||||||
"InteractionType": "Interact",
|
"InteractionType": "Interact",
|
||||||
"Fly": true
|
"Fly": true,
|
||||||
|
"AetheryteShortcut": "Living Memory - Leynode Mnemo",
|
||||||
|
"SkipConditions": {
|
||||||
|
"AetheryteShortcutIf": {
|
||||||
|
"InSameTerritory": true
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -119,6 +119,7 @@
|
|||||||
"Combat",
|
"Combat",
|
||||||
"UseItem",
|
"UseItem",
|
||||||
"EquipItem",
|
"EquipItem",
|
||||||
|
"PurchaseItem",
|
||||||
"EquipRecommended",
|
"EquipRecommended",
|
||||||
"Say",
|
"Say",
|
||||||
"Emote",
|
"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": {
|
"if": {
|
||||||
"properties": {
|
"properties": {
|
||||||
|
@ -16,6 +16,7 @@ public sealed class InteractionTypeConverter() : EnumConverter<EInteractionType>
|
|||||||
{ EInteractionType.Combat, "Combat" },
|
{ EInteractionType.Combat, "Combat" },
|
||||||
{ EInteractionType.UseItem, "UseItem" },
|
{ EInteractionType.UseItem, "UseItem" },
|
||||||
{ EInteractionType.EquipItem, "EquipItem" },
|
{ EInteractionType.EquipItem, "EquipItem" },
|
||||||
|
{ EInteractionType.PurchaseItem, "PurchaseItem" },
|
||||||
{ EInteractionType.EquipRecommended, "EquipRecommended" },
|
{ EInteractionType.EquipRecommended, "EquipRecommended" },
|
||||||
{ EInteractionType.Say, "Say" },
|
{ EInteractionType.Say, "Say" },
|
||||||
{ EInteractionType.Emote, "Emote" },
|
{ EInteractionType.Emote, "Emote" },
|
||||||
|
@ -15,6 +15,7 @@ public enum EInteractionType
|
|||||||
Combat,
|
Combat,
|
||||||
UseItem,
|
UseItem,
|
||||||
EquipItem,
|
EquipItem,
|
||||||
|
PurchaseItem,
|
||||||
EquipRecommended,
|
EquipRecommended,
|
||||||
Say,
|
Say,
|
||||||
Emote,
|
Emote,
|
||||||
|
12
Questionable.Model/Questing/PurchaseMenu.cs
Normal file
12
Questionable.Model/Questing/PurchaseMenu.cs
Normal 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; }
|
||||||
|
}
|
@ -78,6 +78,7 @@ public sealed class QuestStep
|
|||||||
public List<QuestWorkValue?> CompletionQuestVariablesFlags { get; set; } = [];
|
public List<QuestWorkValue?> CompletionQuestVariablesFlags { get; set; } = [];
|
||||||
public List<DialogueChoice> DialogueChoices { get; set; } = [];
|
public List<DialogueChoice> DialogueChoices { get; set; } = [];
|
||||||
public List<uint> PointMenuChoices { get; set; } = [];
|
public List<uint> PointMenuChoices { get; set; } = [];
|
||||||
|
public PurchaseMenu? PurchaseMenu { get; set; }
|
||||||
|
|
||||||
// TODO: Not implemented
|
// TODO: Not implemented
|
||||||
[JsonConverter(typeof(ElementIdConverter))]
|
[JsonConverter(typeof(ElementIdConverter))]
|
||||||
|
@ -35,6 +35,7 @@ internal sealed class CombatController : IDisposable
|
|||||||
|
|
||||||
private CurrentFight? _currentFight;
|
private CurrentFight? _currentFight;
|
||||||
private bool _wasInCombat;
|
private bool _wasInCombat;
|
||||||
|
private ulong? _lastTargetId;
|
||||||
|
|
||||||
public CombatController(
|
public CombatController(
|
||||||
IEnumerable<ICombatModule> combatModules,
|
IEnumerable<ICombatModule> combatModules,
|
||||||
@ -92,6 +93,33 @@ internal sealed class CombatController : IDisposable
|
|||||||
_movementController.MovementStartedAt > DateTime.Now.AddSeconds(-1))
|
_movementController.MovementStartedAt > DateTime.Now.AddSeconds(-1))
|
||||||
return EStatus.Moving;
|
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;
|
var target = _targetManager.Target;
|
||||||
if (target != null)
|
if (target != null)
|
||||||
{
|
{
|
||||||
@ -192,45 +220,37 @@ internal sealed class CombatController : IDisposable
|
|||||||
|
|
||||||
public unsafe int GetKillPriority(IGameObject gameObject)
|
public unsafe int GetKillPriority(IGameObject gameObject)
|
||||||
{
|
{
|
||||||
|
if (_currentFight == null)
|
||||||
|
return 0;
|
||||||
|
|
||||||
if (gameObject is IBattleNpc battleNpc)
|
if (gameObject is IBattleNpc battleNpc)
|
||||||
{
|
{
|
||||||
if (_currentFight != null && !_currentFight.Module.CanAttack(battleNpc))
|
if (!_currentFight.Module.CanAttack(battleNpc))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// TODO this works as somewhat of a delay between killing enemies if certain items/flags are checked
|
if (battleNpc.IsDead)
|
||||||
// but also delays killing the next enemy a little
|
return 0;
|
||||||
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.IsTargetable)
|
if (!battleNpc.IsTargetable)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (_currentFight != null)
|
var complexCombatData = _currentFight.Data.ComplexCombatDatas;
|
||||||
|
if (complexCombatData.Count >= 0)
|
||||||
{
|
{
|
||||||
var complexCombatData = _currentFight.Data.ComplexCombatDatas;
|
for (int i = 0; i < complexCombatData.Count; ++i)
|
||||||
if (complexCombatData.Count >= 0)
|
|
||||||
{
|
{
|
||||||
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)
|
if (complexCombatData[i].DataId == battleNpc.DataId)
|
||||||
return 100;
|
return 100;
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (_currentFight.Data.KillEnemyDataIds.Contains(battleNpc.DataId))
|
|
||||||
return 90;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (_currentFight.Data.KillEnemyDataIds.Contains(battleNpc.DataId))
|
||||||
|
return 90;
|
||||||
|
}
|
||||||
|
|
||||||
// enemies that we have aggro on
|
// enemies that we have aggro on
|
||||||
if (battleNpc.BattleNpcKind is BattleNpcSubKind.BattleNpcPart or BattleNpcSubKind.Enemy)
|
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)
|
if (gameObjectStruct->NamePlateIconId is 60093 or 60732)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
var enemyData =
|
var enemyData = _currentFight.Data.ComplexCombatDatas.FirstOrDefault(x => x.DataId == battleNpc.DataId);
|
||||||
_currentFight?.Data.ComplexCombatDatas.FirstOrDefault(x => x.DataId == battleNpc.DataId);
|
|
||||||
if (enemyData is { IgnoreQuestMarker: true })
|
if (enemyData is { IgnoreQuestMarker: true })
|
||||||
{
|
{
|
||||||
if (battleNpc.StatusFlags.HasFlag(StatusFlags.InCombat))
|
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
|
// 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 &&
|
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;
|
return 25;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -298,12 +318,14 @@ internal sealed class CombatController : IDisposable
|
|||||||
}
|
}
|
||||||
else if (Vector3.Distance(_clientState.LocalPlayer!.Position, target.Position) > MaxTargetRange)
|
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);
|
_currentFight!.Module.MoveToTarget(target);
|
||||||
}
|
}
|
||||||
else
|
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;
|
_targetManager.Target = target;
|
||||||
_currentFight!.Module.MoveToTarget(target);
|
_currentFight!.Module.MoveToTarget(target);
|
||||||
}
|
}
|
||||||
|
@ -46,6 +46,7 @@ internal sealed class InteractionUiController : IDisposable
|
|||||||
private readonly IGameGui _gameGui;
|
private readonly IGameGui _gameGui;
|
||||||
private readonly ITargetManager _targetManager;
|
private readonly ITargetManager _targetManager;
|
||||||
private readonly IClientState _clientState;
|
private readonly IClientState _clientState;
|
||||||
|
private readonly ShopController _shopController;
|
||||||
private readonly ILogger<InteractionUiController> _logger;
|
private readonly ILogger<InteractionUiController> _logger;
|
||||||
private readonly Regex _returnRegex;
|
private readonly Regex _returnRegex;
|
||||||
|
|
||||||
@ -67,6 +68,7 @@ internal sealed class InteractionUiController : IDisposable
|
|||||||
ITargetManager targetManager,
|
ITargetManager targetManager,
|
||||||
IPluginLog pluginLog,
|
IPluginLog pluginLog,
|
||||||
IClientState clientState,
|
IClientState clientState,
|
||||||
|
ShopController shopController,
|
||||||
ILogger<InteractionUiController> logger)
|
ILogger<InteractionUiController> logger)
|
||||||
{
|
{
|
||||||
_addonLifecycle = addonLifecycle;
|
_addonLifecycle = addonLifecycle;
|
||||||
@ -83,6 +85,7 @@ internal sealed class InteractionUiController : IDisposable
|
|||||||
_gameGui = gameGui;
|
_gameGui = gameGui;
|
||||||
_targetManager = targetManager;
|
_targetManager = targetManager;
|
||||||
_clientState = clientState;
|
_clientState = clientState;
|
||||||
|
_shopController = shopController;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
|
|
||||||
_returnRegex = _dataManager.GetExcelSheet<Addon>()!.GetRow(196)!.GetRegex(addon => addon.Text, pluginLog)!;
|
_returnRegex = _dataManager.GetExcelSheet<Addon>()!.GetRow(196)!.GetRegex(addon => addon.Text, pluginLog)!;
|
||||||
@ -334,7 +337,17 @@ internal sealed class InteractionUiController : IDisposable
|
|||||||
if (step == null)
|
if (step == null)
|
||||||
_logger.LogDebug("Ignoring current quest dialogue choices, no active step");
|
_logger.LogDebug("Ignoring current quest dialogue choices, no active step");
|
||||||
else
|
else
|
||||||
|
{
|
||||||
dialogueChoices.AddRange(step.DialogueChoices.Select(x => new DialogueChoiceInfo(quest, x)));
|
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
|
// add all travel dialogue choices
|
||||||
@ -516,6 +529,13 @@ internal sealed class InteractionUiController : IDisposable
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
_logger.LogTrace("Prompt: '{Prompt}'", actualPrompt);
|
_logger.LogTrace("Prompt: '{Prompt}'", actualPrompt);
|
||||||
|
if (_shopController.IsAutoBuyEnabled && _shopController.IsAwaitingYesNo)
|
||||||
|
{
|
||||||
|
addonSelectYesno->AtkUnitBase.FireCallbackInt(0);
|
||||||
|
_shopController.IsAwaitingYesNo = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var director = UIState.Instance()->DirectorTodo.Director;
|
var director = UIState.Instance()->DirectorTodo.Director;
|
||||||
if (director != null &&
|
if (director != null &&
|
||||||
director->Info.EventId.ContentId == EventHandlerType.GatheringLeveDirector &&
|
director->Info.EventId.ContentId == EventHandlerType.GatheringLeveDirector &&
|
||||||
|
156
Questionable/Controller/GameUi/ShopController.cs
Normal file
156
Questionable/Controller/GameUi/ShopController.cs
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
@ -35,6 +35,11 @@ internal static class Interact
|
|||||||
if (step.DataId == null)
|
if (step.DataId == null)
|
||||||
yield break;
|
yield break;
|
||||||
}
|
}
|
||||||
|
else if (step.InteractionType == EInteractionType.PurchaseItem)
|
||||||
|
{
|
||||||
|
if (step.DataId == null)
|
||||||
|
yield break;
|
||||||
|
}
|
||||||
else if (step.InteractionType == EInteractionType.Snipe)
|
else if (step.InteractionType == EInteractionType.Snipe)
|
||||||
{
|
{
|
||||||
if (!configuration.General.AutomaticallyCompleteSnipeTasks)
|
if (!configuration.General.AutomaticallyCompleteSnipeTasks)
|
||||||
@ -51,7 +56,8 @@ internal static class Interact
|
|||||||
|
|
||||||
yield return new Task(step.DataId.Value, quest, step.InteractionType,
|
yield return new Task(step.DataId.Value, quest, step.InteractionType,
|
||||||
step.TargetTerritoryId != null || quest.Id is SatisfactionSupplyNpcId ||
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -147,7 +153,8 @@ internal static class Interact
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (ProgressContext != null && (ProgressContext.WasSuccessful() || _interactionState == EInteractionState.InteractionConfirmed))
|
if (ProgressContext != null && (ProgressContext.WasSuccessful() ||
|
||||||
|
_interactionState == EInteractionState.InteractionConfirmed))
|
||||||
return ETaskResult.TaskComplete;
|
return ETaskResult.TaskComplete;
|
||||||
|
|
||||||
if (InteractionType == EInteractionType.Gather && condition[ConditionFlag.Gathering])
|
if (InteractionType == EInteractionType.Gather && condition[ConditionFlag.Gathering])
|
||||||
|
22
Questionable/Controller/Steps/Interactions/PurchaseItem.cs
Normal file
22
Questionable/Controller/Steps/Interactions/PurchaseItem.cs
Normal 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
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -5,6 +5,7 @@ namespace Questionable.Controller.Steps;
|
|||||||
internal interface ITaskExecutor
|
internal interface ITaskExecutor
|
||||||
{
|
{
|
||||||
ITask CurrentTask { get; }
|
ITask CurrentTask { get; }
|
||||||
|
public InteractionProgressContext? ProgressContext { get; }
|
||||||
|
|
||||||
Type GetTaskType();
|
Type GetTaskType();
|
||||||
|
|
||||||
@ -19,7 +20,7 @@ internal abstract class TaskExecutor<T> : ITaskExecutor
|
|||||||
where T : class, ITask
|
where T : class, ITask
|
||||||
{
|
{
|
||||||
protected T Task { get; set; } = null!;
|
protected T Task { get; set; } = null!;
|
||||||
protected InteractionProgressContext? ProgressContext { get; set; }
|
public InteractionProgressContext? ProgressContext { get; set; }
|
||||||
ITask ITaskExecutor.CurrentTask => Task;
|
ITask ITaskExecutor.CurrentTask => Task;
|
||||||
|
|
||||||
public bool WasInterrupted()
|
public bool WasInterrupted()
|
||||||
|
@ -91,6 +91,11 @@ internal sealed class ExcelFunctions
|
|||||||
var questRow = _dataManager.GetExcelSheet<EventPathMove>()!.GetRow(rowId);
|
var questRow = _dataManager.GetExcelSheet<EventPathMove>()!.GetRow(rowId);
|
||||||
return questRow?.Unknown10;
|
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)
|
else if (excelSheet is "ContentTalk" or null)
|
||||||
{
|
{
|
||||||
var questRow = _dataManager.GetExcelSheet<ContentTalk>()!.GetRow(rowId);
|
var questRow = _dataManager.GetExcelSheet<ContentTalk>()!.GetRow(rowId);
|
||||||
|
@ -224,6 +224,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin
|
|||||||
serviceCollection.AddSingleton<CombatController>();
|
serviceCollection.AddSingleton<CombatController>();
|
||||||
serviceCollection.AddSingleton<GatheringController>();
|
serviceCollection.AddSingleton<GatheringController>();
|
||||||
serviceCollection.AddSingleton<ContextMenuController>();
|
serviceCollection.AddSingleton<ContextMenuController>();
|
||||||
|
serviceCollection.AddSingleton<ShopController>();
|
||||||
|
|
||||||
serviceCollection.AddSingleton<CraftworksSupplyController>();
|
serviceCollection.AddSingleton<CraftworksSupplyController>();
|
||||||
serviceCollection.AddSingleton<CreditsController>();
|
serviceCollection.AddSingleton<CreditsController>();
|
||||||
@ -284,6 +285,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin
|
|||||||
serviceProvider.GetRequiredService<CreditsController>();
|
serviceProvider.GetRequiredService<CreditsController>();
|
||||||
serviceProvider.GetRequiredService<HelpUiController>();
|
serviceProvider.GetRequiredService<HelpUiController>();
|
||||||
serviceProvider.GetRequiredService<LeveUiController>();
|
serviceProvider.GetRequiredService<LeveUiController>();
|
||||||
|
serviceProvider.GetRequiredService<ShopController>();
|
||||||
serviceProvider.GetRequiredService<QuestionableIpc>();
|
serviceProvider.GetRequiredService<QuestionableIpc>();
|
||||||
serviceProvider.GetRequiredService<DalamudInitializer>();
|
serviceProvider.GetRequiredService<DalamudInitializer>();
|
||||||
serviceProvider.GetRequiredService<AutoSnipeHandler>().Enable();
|
serviceProvider.GetRequiredService<AutoSnipeHandler>().Enable();
|
||||||
|
@ -29,6 +29,7 @@ namespace Questionable.Windows.QuestComponents;
|
|||||||
|
|
||||||
internal sealed class CreationUtilsComponent
|
internal sealed class CreationUtilsComponent
|
||||||
{
|
{
|
||||||
|
private readonly QuestController _questController;
|
||||||
private readonly MovementController _movementController;
|
private readonly MovementController _movementController;
|
||||||
private readonly GameFunctions _gameFunctions;
|
private readonly GameFunctions _gameFunctions;
|
||||||
private readonly QuestFunctions _questFunctions;
|
private readonly QuestFunctions _questFunctions;
|
||||||
@ -43,6 +44,7 @@ internal sealed class CreationUtilsComponent
|
|||||||
private readonly ILogger<CreationUtilsComponent> _logger;
|
private readonly ILogger<CreationUtilsComponent> _logger;
|
||||||
|
|
||||||
public CreationUtilsComponent(
|
public CreationUtilsComponent(
|
||||||
|
QuestController questController,
|
||||||
MovementController movementController,
|
MovementController movementController,
|
||||||
GameFunctions gameFunctions,
|
GameFunctions gameFunctions,
|
||||||
QuestFunctions questFunctions,
|
QuestFunctions questFunctions,
|
||||||
@ -56,6 +58,7 @@ internal sealed class CreationUtilsComponent
|
|||||||
Configuration configuration,
|
Configuration configuration,
|
||||||
ILogger<CreationUtilsComponent> logger)
|
ILogger<CreationUtilsComponent> logger)
|
||||||
{
|
{
|
||||||
|
_questController = questController;
|
||||||
_movementController = movementController;
|
_movementController = movementController;
|
||||||
_gameFunctions = gameFunctions;
|
_gameFunctions = gameFunctions;
|
||||||
_questFunctions = questFunctions;
|
_questFunctions = questFunctions;
|
||||||
@ -154,13 +157,14 @@ internal sealed class CreationUtilsComponent
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if false
|
#if true
|
||||||
unsafe
|
unsafe
|
||||||
{
|
{
|
||||||
var actionManager = ActionManager.Instance();
|
var actionManager = ActionManager.Instance();
|
||||||
ImGui.Text(
|
ImGui.Text(
|
||||||
$"A1: {actionManager->CastActionId} ({actionManager->LastUsedActionSequence} → {actionManager->LastHandledActionSequence})");
|
$"A1: {actionManager->CastActionId} ({actionManager->LastUsedActionSequence} → {actionManager->LastHandledActionSequence})");
|
||||||
ImGui.Text($"A2: {actionManager->CastTimeElapsed} / {actionManager->CastTimeTotal}");
|
ImGui.Text($"A2: {actionManager->CastTimeElapsed} / {actionManager->CastTimeTotal}");
|
||||||
|
ImGui.Text($"{_questController.TaskQueue.CurrentTaskExecutor?.ProgressContext}");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user