Compare commits

..

21 Commits

Author SHA1 Message Date
Gwen
2503d1897f
New set of sidequests for Triple Triad NPCs 2025-01-04 17:22:24 +01:00
459b832ef2
Update logic for which allied society quests can be accepted 2025-01-04 16:48:13 +01:00
25130dcb7c
Add some Moogle quests 2025-01-04 16:10:01 +01:00
ee1d6ce15b
Fix Slug Shot action id + use adjusted action ids for actually executing actions 2025-01-04 15:30:00 +01:00
35649e8663
Add a slight delay in 'The Queen's Tour' for a waypoint where NPCs move weirdly 2025-01-03 19:32:47 +01:00
715ec340e0
Add a minimum delay to redeeming item rewards 2025-01-03 11:32:14 +01:00
c03afdefe7
Code clean up 2025-01-03 11:30:51 +01:00
be3f22230b
Code clean up 2025-01-03 11:19:04 +01:00
e73d04ce2d
Add a minimum delay to redeeming item rewards 2025-01-03 11:18:45 +01:00
dbc31f429f
Version bump 2025-01-03 02:26:36 +01:00
da425f551e
Use gray icons for item rewards if no quest path is available 2025-01-03 02:26:18 +01:00
341c751f0c
Minor quest adjustments 2025-01-03 02:22:06 +01:00
9aa07afff8
Don't try queueing for duties when ilvl is too low 2025-01-03 01:46:31 +01:00
6a29273c79
Update LLib 2025-01-03 01:24:51 +01:00
53374bf907 Merge pull request 'Adding some side quests to unlock Triple Triad NPCs' (#124) from Thaksin/Questionable:master into master
Reviewed-on: liza/Questionable#124
2025-01-03 00:12:58 +00:00
0a35ea3eaa
Add filter to exclude event rewards 2025-01-03 01:11:25 +01:00
58185d418c
Add a few Gold Saucer unlock quests by Starr 2025-01-03 00:40:06 +01:00
7023a1ac5f
Add Heavensturn (2025) quest by Starr 2025-01-03 00:14:51 +01:00
c0c2e324bb
Skip most of the framework update logic if no quest is running and quest window isn't visible 2025-01-02 23:25:40 +01:00
86964dd6f9
Update aether current sequence in Kozama'uka 2025-01-02 22:51:16 +01:00
c722abb6df
Automatically redeem untradeable mounts/minions/orchestrion rolls/TT cards/fashion accessories from quest rewards 2025-01-02 22:50:59 +01:00
60 changed files with 3249 additions and 169 deletions

View File

@ -1,5 +1,5 @@
<Project>
<PropertyGroup>
<Version>4.11</Version>
<Version>4.13</Version>
</PropertyGroup>
</Project>

2
LLib

@ -1 +1 @@
Subproject commit 783fea977a2524dd63e717367fc026c52efe6c23
Subproject commit b1059871154b84401020c0072fd089fcc022fb77

View File

@ -28,7 +28,15 @@
"Z": 436.94202
},
"TerritoryId": 146,
"InteractionType": "Interact"
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
16
]
},
{
"DataId": 1006600,
@ -38,7 +46,15 @@
"Z": 423.14795
},
"TerritoryId": 146,
"InteractionType": "Interact"
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"DataId": 1006599,
@ -48,7 +64,15 @@
"Z": 373.37292
},
"TerritoryId": 146,
"InteractionType": "Interact"
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 1006601,
@ -58,7 +82,15 @@
"Z": 354.63477
},
"TerritoryId": 146,
"InteractionType": "Interact"
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
}
]
},
@ -78,4 +110,4 @@
]
}
]
}
}

View File

@ -13,7 +13,8 @@
"Z": 972.5642
},
"TerritoryId": 146,
"InteractionType": "AcceptQuest"
"InteractionType": "AcceptQuest",
"Fly": true
}
]
},
@ -166,4 +167,4 @@
]
}
]
}
}

View File

@ -0,0 +1,87 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "liza",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"TerritoryId": 132,
"InteractionType": "UseItem",
"ItemId": 30362,
"TargetTerritoryId": 140,
"SkipConditions": {
"StepIf": {
"InTerritory": [
140,
212
]
}
}
},
{
"Position": {
"X": -492.96475,
"Y": 20.999884,
"Z": -380.82272
},
"TerritoryId": 140,
"InteractionType": "WalkTo",
"$": "Avoid walking around Waking Sands table",
"SkipConditions": {
"StepIf": {
"InTerritory": [
212
]
}
}
},
{
"DataId": 2001711,
"Position": {
"X": -480.9181,
"Y": 18.00103,
"Z": -386.862
},
"TerritoryId": 140,
"InteractionType": "Interact",
"TargetTerritoryId": 212,
"SkipConditions": {
"StepIf": {
"InTerritory": [
212
]
}
}
},
{
"DataId": 1011618,
"Position": {
"X": 10.330261,
"Y": -3.0000017,
"Z": -54.8562
},
"TerritoryId": 212,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1004917,
"Position": {
"X": -358.6328,
"Y": 8.469424,
"Z": 422.4154
},
"TerritoryId": 146,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Southern Thanalan - Forgotten Springs",
"NextQuestId": 1021
}
]
}
]
}

View File

@ -0,0 +1,42 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "Starr",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1011145,
"Position": {
"X": -65.38495,
"Y": 0.06979119,
"Z": 0.8086548
},
"TerritoryId": 144,
"InteractionType": "AcceptQuest",
"AetheryteShortcut": "Gold Saucer",
"SkipConditions": {
"AetheryteShortcutIf": {
"InSameTerritory": true
}
}
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1025176,
"Position": {
"X": 57.99951,
"Y": 3.9997258,
"Z": 64.774536
},
"TerritoryId": 144,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -0,0 +1,46 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "Starr",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1011145,
"Position": {
"X": -65.38495,
"Y": 0.06979119,
"Z": 0.8086548
},
"TerritoryId": 144,
"InteractionType": "AcceptQuest",
"AetheryteShortcut": "Gold Saucer",
"SkipConditions": {
"AetheryteShortcutIf": {
"InSameTerritory": true
}
}
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1016307,
"Position": {
"X": 57.14502,
"Y": 20.99973,
"Z": 83.57361
},
"TerritoryId": 144,
"InteractionType": "CompleteQuest",
"AethernetShortcut": [
"[Gold Saucer] Aetheryte Plaza",
"[Gold Saucer] Wonder Square East"
]
}
]
}
]
}

View File

@ -0,0 +1,57 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "Starr",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1010464,
"Position": {
"X": -0.015319824,
"Y": -1.8903663E-06,
"Z": -65.61273
},
"TerritoryId": 388,
"InteractionType": "AcceptQuest",
"AetheryteShortcut": "Gold Saucer",
"AethernetShortcut": [
"[Gold Saucer] Aetheryte Plaza",
"[Gold Saucer] Chocobo Square"
],
"SkipConditions": {
"AetheryteShortcutIf": {
"InSameTerritory": true,
"InTerritory": [
144
]
}
}
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1010472,
"Position": {
"X": -53.26935,
"Y": 0.3093315,
"Z": 69.41321
},
"TerritoryId": 148,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Central Shroud - Bentbranch Meadows",
"SkipConditions": {
"AetheryteShortcutIf": {
"InSameTerritory": true
}
},
"Fly": true,
"NextQuestId": 565
}
]
}
]
}

View File

@ -0,0 +1,34 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "Starr",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1011060,
"Position": {
"X": -96.87958,
"Y": -0.86297023,
"Z": 67.826294
},
"TerritoryId": 144,
"InteractionType": "AcceptQuest",
"AetheryteShortcut": "Gold Saucer",
"SkipConditions": {
"AetheryteShortcutIf": {
"InSameTerritory": true
}
},
"DialogueChoices": [
{
"Type": "YesNo",
"Yes": true,
"Prompt": "TEXT_SUBGSC102_00437_Q1_000_000"
}
]
}
]
}
]
}

View File

@ -0,0 +1,55 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "Starr",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1010472,
"Position": {
"X": -53.26935,
"Y": 0.3093315,
"Z": 69.41321
},
"TerritoryId": 148,
"InteractionType": "AcceptQuest",
"AetheryteShortcut": "Central Shroud - Bentbranch Meadows",
"SkipConditions": {
"AetheryteShortcutIf": {
"InSameTerritory": true
}
}
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1010464,
"Position": {
"X": -0.015319824,
"Y": -1.8903663E-06,
"Z": -65.61273
},
"TerritoryId": 388,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "Gold Saucer",
"AethernetShortcut": [
"[Gold Saucer] Aetheryte Plaza",
"[Gold Saucer] Chocobo Square"
],
"SkipConditions": {
"AetheryteShortcutIf": {
"InTerritory": [
388,
144
]
}
}
}
]
}
]
}

View File

@ -1,7 +1,6 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "liza",
"Disabled": true,
"QuestSequence": [
{
"Sequence": 0,
@ -18,6 +17,125 @@
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1017351,
"Position": {
"X": -74.87604,
"Y": -8.172172,
"Z": 158.70898
},
"TerritoryId": 400,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"TerritoryId": 400,
"InteractionType": "Craft",
"ItemId": 15725,
"ItemCount": 3
},
{
"DataId": 1017352,
"Position": {
"X": -56.809387,
"Y": -8.866012,
"Z": 161.8219
},
"TerritoryId": 400,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1017353,
"Position": {
"X": -33.554626,
"Y": -8.866012,
"Z": 163.43933
},
"TerritoryId": 400,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"Position": {
"X": -104.788086,
"Y": -8.655561,
"Z": 194.60593
},
"TerritoryId": 400,
"InteractionType": "WalkTo",
"Fly": true,
"SkipConditions": {
"StepIf": {
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
}
}
},
{
"DataId": 1017354,
"Position": {
"X": -104.41754,
"Y": -8.6555605,
"Z": 193.16394
},
"TerritoryId": 400,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"DataId": 1017355,
"Position": {
"X": -110.97894,
"Y": -8.866015,
"Z": 247.94385
},
"TerritoryId": 400,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
}
]
},
{
"Sequence": 255,
"Steps": [
@ -30,21 +148,7 @@
},
"TerritoryId": 400,
"InteractionType": "CompleteQuest",
"AetheryteShortcut": "The Churning Mists - Zenith",
"Fly": true,
"SkipConditions": {
"AetheryteShortcutIf": {
"NearPosition": {
"Position": {
"X": -335.56116,
"Y": 59.003433,
"Z": 313.98486
},
"TerritoryId": 400,
"MaximumDistance": 50
}
}
}
"Fly": true
}
]
}

View File

@ -1,7 +1,6 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "liza",
"Disabled": true,
"QuestSequence": [
{
"Sequence": 0,
@ -18,6 +17,59 @@
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1017406,
"Position": {
"X": -95.04846,
"Y": 79.8345,
"Z": -301.80823
},
"TerritoryId": 400,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1017407,
"Position": {
"X": -128.34369,
"Y": 125.92322,
"Z": -314.6258
},
"TerritoryId": 400,
"InteractionType": "Interact",
"Fly": true
}
]
},
{
"Sequence": 3,
"Steps": [
{
"TerritoryId": 400,
"InteractionType": "Craft",
"ItemId": 15736,
"ItemCount": 3
},
{
"DataId": 1017408,
"Position": {
"X": -108.59851,
"Y": 122.442116,
"Z": -318.31848
},
"TerritoryId": 400,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [

View File

@ -1,7 +1,6 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "liza",
"Disabled": true,
"QuestSequence": [
{
"Sequence": 0,
@ -18,6 +17,177 @@
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1017471,
"Position": {
"X": -391.0735,
"Y": 59.9946,
"Z": 303.1814
},
"TerritoryId": 400,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"Position": {
"X": -255.2606,
"Y": -24.29513,
"Z": 737.67456
},
"TerritoryId": 400,
"InteractionType": "WalkTo",
"Fly": true
},
{
"DataId": 1017409,
"Position": {
"X": -254.71893,
"Y": -24.295156,
"Z": 738.5519
},
"TerritoryId": 400,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 2007244,
"Position": {
"X": -658.9609,
"Y": 94.25488,
"Z": -417.07483
},
"TerritoryId": 400,
"InteractionType": "Interact",
"AetheryteShortcut": "The Churning Mists - Zenith",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"Position": {
"X": -673.58887,
"Y": 93.64293,
"Z": -506.5746
},
"TerritoryId": 400,
"InteractionType": "WalkTo",
"Fly": true,
"SkipConditions": {
"StepIf": {
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
}
}
},
{
"DataId": 2007245,
"Position": {
"X": -671.1376,
"Y": 93.91919,
"Z": -507.49982
},
"TerritoryId": 400,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"DataId": 2007246,
"Position": {
"X": -813.1685,
"Y": 94.865234,
"Z": -457.3282
},
"TerritoryId": 400,
"InteractionType": "Interact",
"Fly": true,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
}
]
},
{
"Sequence": 4,
"Steps": [
{
"Position": {
"X": -255.2606,
"Y": -24.29513,
"Z": 737.67456
},
"TerritoryId": 400,
"InteractionType": "WalkTo",
"AetheryteShortcut": "The Churning Mists - Zenith",
"Fly": true
},
{
"DataId": 1017409,
"Position": {
"X": -254.71893,
"Y": -24.295156,
"Z": 738.5519
},
"TerritoryId": 400,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 5,
"Steps": [
{
"TerritoryId": 400,
"InteractionType": "Craft",
"ItemId": 15737,
"ItemCount": 1
},
{
"DataId": 1017410,
"Position": {
"X": -246.2044,
"Y": -24.295149,
"Z": 760.7384
},
"TerritoryId": 400,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [

View File

@ -1,7 +1,6 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "liza",
"Disabled": true,
"QuestSequence": [
{
"Sequence": 0,
@ -18,6 +17,72 @@
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1017470,
"Position": {
"X": -353.53632,
"Y": 60.896175,
"Z": 299.61084
},
"TerritoryId": 400,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 2007264,
"Position": {
"X": 508.32373,
"Y": -0.77819824,
"Z": -360.49445
},
"TerritoryId": 400,
"InteractionType": "Action",
"Action": "Roar",
"Fly": true
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 2007265,
"Position": {
"X": 613.39734,
"Y": -11.917358,
"Z": -335.6222
},
"TerritoryId": 400,
"InteractionType": "Action",
"Action": "Roar",
"Fly": true
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 2007266,
"Position": {
"X": 554.0398,
"Y": 50.644653,
"Z": -393.72858
},
"TerritoryId": 400,
"InteractionType": "Action",
"Action": "Roar",
"Fly": true
}
]
},
{
"Sequence": 255,
"Steps": [

View File

@ -0,0 +1,125 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "Thaksin",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1013710,
"Position": {
"X": -294.6975,
"Y": 126.84874,
"Z": 4.5318604
},
"TerritoryId": 397,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1014133,
"Position": {
"X": -259.84595,
"Y": 126.44779,
"Z": 1.9073486
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 2006005,
"Position": {
"X": -157.70203,
"Y": 110.73462,
"Z": -52.414795
},
"TerritoryId": 397,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 2006006,
"Position": {
"X": -228.25977,
"Y": 112.47424,
"Z": -127.55017
},
"TerritoryId": 397,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"DataId": 2006007,
"Position": {
"X": -348.10413,
"Y": 116.50256,
"Z": -91.93567
},
"TerritoryId": 397,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1014133,
"Position": {
"X": -259.84595,
"Y": 126.44779,
"Z": 1.9073486
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1013710,
"Position": {
"X": -294.6975,
"Y": 126.84874,
"Z": 4.5318604
},
"TerritoryId": 397,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -0,0 +1,98 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "Thaksin",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1013710,
"Position": {
"X": -294.6975,
"Y": 126.84874,
"Z": 4.5318604
},
"TerritoryId": 397,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1014134,
"Position": {
"X": -293.23267,
"Y": 126.85495,
"Z": 5.2643433
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"Fly": true,
"DataId": 1014136,
"Position": {
"X": 292.74426,
"Y": 132.44626,
"Z": -244.73944
},
"TerritoryId": 397,
"InteractionType": "Interact"
},
{
"Position": {
"X": 289.0053,
"Y": 132.30807,
"Z": -233.57523
},
"DataId": 4041,
"TerritoryId": 397,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [
4041
]
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1014136,
"Position": {
"X": 292.74426,
"Y": 132.44626,
"Z": -244.73944
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"Fly": true,
"DataId": 1013710,
"Position": {
"X": -294.6975,
"Y": 126.84874,
"Z": 4.5318604
},
"TerritoryId": 397,
"InteractionType": "CompleteQuest",
"NextQuestId": 1765
}
]
}
]
}

View File

@ -0,0 +1,97 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "Thaksin",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1013710,
"Position": {
"X": -294.6975,
"Y": 126.84874,
"Z": 4.5318604
},
"TerritoryId": 397,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1014138,
"Position": {
"X": -219.19586,
"Y": 112.21238,
"Z": -244.1596
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"Fly": true,
"DataId": 4470,
"Position": {
"X": -468.44992,
"Y": 93.85853,
"Z": -506.40417
},
"TerritoryId": 397,
"InteractionType": "Combat",
"EnemySpawnType": "AutoOnEnterArea",
"KillEnemyDataIds": [
4470
]
}
]
},
{
"Sequence": 3,
"Steps": [
{
"Position": {
"X": -219.1624,
"Y": 112.29031,
"Z": -239.88861
},
"TerritoryId": 397,
"InteractionType": "WalkTo",
"Fly": true
},
{
"DataId": 1014138,
"Position": {
"X": -219.19586,
"Y": 112.21238,
"Z": -244.1596
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1013710,
"Position": {
"X": -294.6975,
"Y": 126.84874,
"Z": 4.5318604
},
"TerritoryId": 397,
"InteractionType": "CompleteQuest",
"NextQuestId": 1766
}
]
}
]
}

View File

@ -0,0 +1,103 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "Thaksin",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1013710,
"Position": {
"X": -294.6975,
"Y": 126.84874,
"Z": 4.5318604
},
"TerritoryId": 397,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1014138,
"Position": {
"X": -219.19586,
"Y": 112.21238,
"Z": -244.1596
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"Fly": true,
"DataId": 1014140,
"Position": {
"X": -472.19043,
"Y": 93.87282,
"Z": -503.7156
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 4468,
"Position": {
"X": -696.8278,
"Y": 100.08534,
"Z": -603.926
},
"TerritoryId": 397,
"InteractionType": "Combat",
"KillEnemyDataIds": [
4468
],
"EnemySpawnType": "AutoOnEnterArea"
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 1014140,
"Position": {
"X": -472.19043,
"Y": 93.87282,
"Z": -503.7156
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"Fly": true,
"DataId": 1013710,
"Position": {
"X": -294.6975,
"Y": 126.84874,
"Z": 4.5318604
},
"TerritoryId": 397,
"InteractionType": "CompleteQuest",
"NextQuestId": 1769
}
]
}
]
}

View File

@ -0,0 +1,185 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "Thaksin",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1013710,
"Position": {
"X": -294.6975,
"Y": 126.84874,
"Z": 4.5318604
},
"TerritoryId": 397,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"Fly": true,
"DataId": 1014142,
"Position": {
"X": -290.33344,
"Y": 76.98337,
"Z": -259.93744
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 2006013,
"Position": {
"X": -287.76996,
"Y": 77.74463,
"Z": -278.00415
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1014142,
"Position": {
"X": -290.33344,
"Y": 76.98337,
"Z": -259.93744
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 2006014,
"Position": {
"X": -291.8593,
"Y": 76.98169,
"Z": -261.0056
},
"TerritoryId": 397,
"InteractionType": "Interact"
},
{
"DataId": 4037,
"Position": {
"X": -285.1214,
"Y": 76.98337,
"Z": -275.5287
},
"TerritoryId": 397,
"InteractionType": "Combat",
"KillEnemyDataIds": [4037],
"EnemySpawnType": "AfterInteraction"
}
]
},
{
"Sequence": 5,
"Steps": [
{
"DataId": 1014142,
"Position": {
"X": -290.33344,
"Y": 76.98337,
"Z": -259.93744
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 6,
"Steps": [
{
"Fly": true,
"DataId": 1013710,
"Position": {
"X": -294.6975,
"Y": 126.84874,
"Z": 4.5318604
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 7,
"Steps": [
{
"DataId": 1014144,
"Position": {
"X": -258.16742,
"Y": 126.98671,
"Z": 12.77179
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 8,
"Steps": [
{
"DataId": 2006015,
"Position": {
"X": -252.33844,
"Y": 127.00073,
"Z": 11.093262
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 9,
"Steps": [
{
"DataId": 1014144,
"Position": {
"X": -258.16742,
"Y": 126.98671,
"Z": 12.77179
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1013710,
"Position": {
"X": -294.6975,
"Y": 126.84874,
"Z": 4.5318604
},
"TerritoryId": 397,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -0,0 +1,121 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "Thaksin",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1014146,
"Position": {
"X": -258.74725,
"Y": 126.98546,
"Z": 12.649658
},
"TerritoryId": 397,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1014147,
"Position": {
"X": -256.97723,
"Y": 126.99508,
"Z": 13.168518
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"Fly": true,
"Position": {
"X": -298.8484,
"Y": 221.68138,
"Z": 548.0529
},
"TerritoryId": 397,
"InteractionType": "WalkTo"
},
{
"Land": true,
"DataId": 1014149,
"Position": {
"X": -294.5144,
"Y": 221.58685,
"Z": 545.922
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 2006017,
"Position": {
"X": -253.34558,
"Y": 221.36255,
"Z": 528.92346
},
"TerritoryId": 397,
"InteractionType": "Interact"
},
{
"DataId": 4076,
"Position": {
"X": -257.5558,
"Y": 221.35532,
"Z": 520.9053
},
"TerritoryId": 397,
"InteractionType": "Combat",
"KillEnemyDataIds": [4076],
"EnemySpawnType": "AfterInteraction"
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 1014149,
"Position": {
"X": -294.5144,
"Y": 221.58685,
"Z": 545.922
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"Fly": true,
"DataId": 1014146,
"Position": {
"X": -258.74725,
"Y": 126.98546,
"Z": 12.649658
},
"TerritoryId": 397,
"InteractionType": "CompleteQuest",
"NextQuestId": 1890
}
]
}
]
}

View File

@ -0,0 +1,75 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "Thaksin",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1014146,
"Position": {
"X": -258.74725,
"Y": 126.98546,
"Z": 12.649658
},
"TerritoryId": 397,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"Position": {
"X": -297.49585,
"Y": 219.87524,
"Z": 281.65045
},
"TerritoryId": 397,
"InteractionType": "Combat",
"EnemySpawnType": "OverworldEnemies",
"ComplexCombatData": [
{
"DataId": 3992,
"MinimumKillCount": 5
}
]
}
]
},
{
"Sequence": 2,
"Steps": [
{
"Fly": true,
"DataId": 1014150,
"Position": {
"X": 507.13354,
"Y": 217.95148,
"Z": 791.37854
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"Fly": true,
"DataId": 1014146,
"Position": {
"X": -258.74725,
"Y": 126.98546,
"Z": 12.649658
},
"TerritoryId": 397,
"InteractionType": "CompleteQuest",
"NextQuestId": 1891
}
]
}
]
}

View File

@ -0,0 +1,98 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "Thaksin",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1014146,
"Position": {
"X": -258.74725,
"Y": 126.98546,
"Z": 12.649658
},
"TerritoryId": 397,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"Fly": true,
"DataId": 1014151,
"Position": {
"X": -156.08453,
"Y": 219.14235,
"Z": 669.7031
},
"TerritoryId": 397,
"InteractionType": "Interact"
},
{
"DataId": 732,
"Position": {
"X": -151.29321,
"Y": 218.95082,
"Z": 669.4895
},
"TerritoryId": 397,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [
732
]
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1014151,
"Position": {
"X": -156.08453,
"Y": 219.14235,
"Z": 669.7031
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1014151,
"Position": {
"X": -156.08453,
"Y": 219.14235,
"Z": 669.7031
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"Fly": true,
"DataId": 1014146,
"Position": {
"X": -258.74725,
"Y": 126.98546,
"Z": 12.649658
},
"TerritoryId": 397,
"InteractionType": "CompleteQuest",
"NextQuestId": 1892
}
]
}
]
}

View File

@ -0,0 +1,83 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "Thaksin",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1014146,
"Position": {
"X": -258.74725,
"Y": 126.98546,
"Z": 12.649658
},
"TerritoryId": 397,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"Fly": true,
"DataId": 2006019,
"Position": {
"X": -152.42242,
"Y": 219.62305,
"Z": 669.94727
},
"TerritoryId": 397,
"InteractionType": "Interact"
},
{
"DataId": 4782,
"Position": {
"X": -158.97404,
"Y": 219.45131,
"Z": 672.79553
},
"TerritoryId": 397,
"KillEnemyDataIds": [
4782
],
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 2006181,
"Position": {
"X": -152.42242,
"Y": 219.62305,
"Z": 669.94727
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"Fly": true,
"DataId": 1014146,
"Position": {
"X": -258.74725,
"Y": 126.98546,
"Z": 12.649658
},
"TerritoryId": 397,
"InteractionType": "CompleteQuest",
"NextQuestId": 1983
}
]
}
]
}

View File

@ -0,0 +1,112 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "Thaksin",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1014146,
"Position": {
"X": -258.74725,
"Y": 126.98546,
"Z": 12.649658
},
"TerritoryId": 397,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1011907,
"Position": {
"X": -288.8686,
"Y": 127.06639,
"Z": 13.199036
},
"TerritoryId": 397,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 1011910,
"Position": {
"X": -298.26813,
"Y": 126.67049,
"Z": -1.4191895
},
"TerritoryId": 397,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"DataId": 1014133,
"Position": {
"X": -259.84595,
"Y": 126.44779,
"Z": 1.9073486
},
"TerritoryId": 397,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
}
]
},
{
"Sequence": 2,
"Steps": [
{
"Fly": true,
"DataId": 1014152,
"Position": {
"X": 496.1776,
"Y": 133.93082,
"Z": -862.2416
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"Fly": true,
"DataId": 1014153,
"Position": {
"X": -295.82666,
"Y": 126.83744,
"Z": 3.829956
},
"TerritoryId": 397,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -0,0 +1,229 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "Thaksin",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1013710,
"Position": {
"X": -294.6975,
"Y": 126.84874,
"Z": 4.5318604
},
"TerritoryId": 397,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1014153,
"Position": {
"X": -295.82666,
"Y": 126.83744,
"Z": 3.829956
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1013710,
"Position": {
"X": -294.6975,
"Y": 126.84874,
"Z": 4.5318604
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 3,
"Steps": [
{
"Fly": true,
"DataId": 1014154,
"Position": {
"X": -519.1577,
"Y": 119.39417,
"Z": -161.24213
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 1014155,
"Position": {
"X": -527.245,
"Y": 118.94699,
"Z": -163.13422
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 5,
"Steps": [
{
"DataId": 2006026,
"Position": {
"X": -525.7191,
"Y": 119.06604,
"Z": -165.72827
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 6,
"Steps": [
{
"Fly": true,
"DataId": 1013710,
"Position": {
"X": -294.6975,
"Y": 126.84874,
"Z": 4.5318604
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 7,
"Steps": [
{
"Fly": true,
"Position": {
"X": -92.57648,
"Y": 96.33008,
"Z": -645.1057
},
"TerritoryId": 397,
"InteractionType": "WalkTo"
},
{
"DataId": 2006027,
"Position": {
"X": -92.57648,
"Y": 96.33008,
"Z": -645.1057
},
"TerritoryId": 397,
"InteractionType": "UseItem",
"ItemId": 2001751
}
]
},
{
"Sequence": 8,
"Steps": [
{
"DataId": 2006028,
"Position": {
"X": -92.5155,
"Y": 93.52246,
"Z": -623.621
},
"TerritoryId": 397,
"InteractionType": "Interact"
},
{
"DataId": 4621,
"Position": {
"X": -92.37683,
"Y": 95.76039,
"Z": -640.7043
},
"TerritoryId": 397,
"InteractionType": "Combat",
"EnemySpawnType": "AfterInteraction",
"KillEnemyDataIds": [
4621
]
}
]
},
{
"Sequence": 9,
"Steps": [
{
"DataId": 2006460,
"Position": {
"X": -92.57648,
"Y": 96.33008,
"Z": -645.1057
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 10,
"Steps": [
{
"Fly": true,
"DataId": 1013710,
"Position": {
"X": -294.6975,
"Y": 126.84874,
"Z": 4.5318604
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 11,
"Steps": [
{
"DataId": 1014147,
"Position": {
"X": -256.97723,
"Y": 126.99508,
"Z": 13.168518
},
"TerritoryId": 397,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1013710,
"Position": {
"X": -294.6975,
"Y": 126.84874,
"Z": 4.5318604
},
"TerritoryId": 397,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -0,0 +1,140 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "Thaksin",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1012170,
"Position": {
"X": 102.92212,
"Y": 3.6299734,
"Z": 65.56799
},
"TerritoryId": 418,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1012162,
"Position": {
"X": 135.97314,
"Y": 24.376427,
"Z": 12.619202
},
"TerritoryId": 418,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1012170,
"Position": {
"X": 102.92212,
"Y": 3.6299734,
"Z": 65.56799
},
"TerritoryId": 418,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1014711,
"Position": {
"X": 58.03003,
"Y": -7.146736,
"Z": 82.41394
},
"TerritoryId": 418,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 1014712,
"Position": {
"X": 93.91919,
"Y": -19.941168,
"Z": 78.20239
},
"TerritoryId": 418,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"DataId": 1014713,
"Position": {
"X": 131.9447,
"Y": -20.000105,
"Z": 62.027832
},
"TerritoryId": 418,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 1014714,
"Position": {
"X": 23.178406,
"Y": -12.020877,
"Z": 35.294067
},
"TerritoryId": 418,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1012170,
"Position": {
"X": 102.92212,
"Y": 3.6299734,
"Z": 65.56799
},
"TerritoryId": 418,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -0,0 +1,149 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "Thaksin",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1012180,
"Position": {
"X": -174.18176,
"Y": -12.555469,
"Z": -21.561035
},
"TerritoryId": 419,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 2006246,
"Position": {
"X": -218.40247,
"Y": -16.037292,
"Z": -34.683777
},
"TerritoryId": 419,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 2006247,
"Position": {
"X": -229.23633,
"Y": -20.035156,
"Z": -83.05487
},
"TerritoryId": 419,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"DataId": 2006248,
"Position": {
"X": -252.1554,
"Y": -20.035156,
"Z": -57.66388
},
"TerritoryId": 419,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1012180,
"Position": {
"X": -174.18176,
"Y": -12.555469,
"Z": -21.561035
},
"TerritoryId": 419,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1014721,
"Position": {
"X": 119.31018,
"Y": -12.634913,
"Z": -13.626343
},
"TerritoryId": 419,
"InteractionType": "Interact",
"AethernetShortcut": [
"[Ishgard] The Jeweled Crozier",
"[Ishgard] Athenaeum Astrologicum"
]
}
]
},
{
"Sequence": 4,
"Steps": [
{
"DataId": 2006330,
"Position": {
"X": 118.791504,
"Y": -11.6427,
"Z": -13.351685
},
"TerritoryId": 419,
"InteractionType": "Interact"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1012180,
"Position": {
"X": -174.18176,
"Y": -12.555469,
"Z": -21.561035
},
"TerritoryId": 419,
"InteractionType": "CompleteQuest",
"AethernetShortcut": [
"[Ishgard] Athenaeum Astrologicum",
"[Ishgard] The Jeweled Crozier"
]
}
]
}
]
}

View File

@ -0,0 +1,53 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "Thaksin",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1014718,
"Position": {
"X": -29.526245,
"Y": 11.965078,
"Z": 48.355713
},
"TerritoryId": 419,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1011231,
"Position": {
"X": 503.1051,
"Y": 217.95148,
"Z": 790.2189
},
"TerritoryId": 397,
"InteractionType": "Interact",
"AetheryteShortcut": "Coerthas Western Highlands - Falcon's Nest"
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1014719,
"Position": {
"X": -293.6294,
"Y": 125.4389,
"Z": -19.058533
},
"TerritoryId": 397,
"InteractionType": "CompleteQuest",
"Fly": true
}
]
}
]
}

View File

@ -0,0 +1,134 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "Thaksin",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1012085,
"Position": {
"X": 286.88477,
"Y": 14.36517,
"Z": 645.1666
},
"TerritoryId": 400,
"InteractionType": "AcceptQuest"
}
]
},
{
"Sequence": 1,
"Steps": [
{
"Fly": true,
"DataId": 2005720,
"Position": {
"X": 565.9419,
"Y": -9.445435,
"Z": -14.328308
},
"TerritoryId": 400,
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
16
],
"InteractionType": "Interact"
},
{
"DataId": 2005718,
"Position": {
"X": 664.39294,
"Y": -0.4730835,
"Z": -3.2807007
},
"Fly": true,
"TerritoryId": 400,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
64
]
},
{
"DataId": 2005721,
"Position": {
"X": 653.83374,
"Y": -0.7172241,
"Z": -70.02368
},
"TerritoryId": 400,
"Fly": true,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null, null,
null, null,
null, 8
]
},
{
"DataId": 2005717,
"Position": {
"X": 639.00195,
"Y": 46.463623,
"Z": -113.05414
},
"TerritoryId": 400,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
128
]
},
{
"DataId": 2005719,
"Position": {
"X": 527.0923,
"Y": -4.287842,
"Z": -84.916504
},
"Fly": true,
"TerritoryId": 400,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null,
null,
null,
null,
null,
32
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"Fly": true,
"DataId": 1012085,
"Position": {
"X": 286.88477,
"Y": 14.36517,
"Z": 645.1666
},
"TerritoryId": 400,
"InteractionType": "CompleteQuest"
}
]
}
]
}

View File

@ -13,7 +13,8 @@
"Z": -135.91211
},
"TerritoryId": 398,
"InteractionType": "AcceptQuest"
"InteractionType": "AcceptQuest",
"Fly": true
}
]
},
@ -27,12 +28,16 @@
"Y": -99.931335,
"Z": 644.4646
},
"StopDistance": 0.5,
"TerritoryId": 398,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null, null,
null, null,
null, 128
null,
null,
null,
null,
null,
128
],
"Fly": true
},
@ -43,13 +48,18 @@
"Y": -94.10242,
"Z": 597.9553
},
"StopDistance": 0.5,
"TerritoryId": 398,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
null, null,
null, null,
null, 64
]
null,
null,
null,
null,
null,
64
],
"Fly": true
}
]
},
@ -65,9 +75,10 @@
},
"TerritoryId": 398,
"InteractionType": "CompleteQuest",
"Fly": true
"Fly": true,
"NextQuestId": 1793
}
]
}
]
}
}

View File

@ -13,7 +13,8 @@
"Z": -135.91211
},
"TerritoryId": 398,
"InteractionType": "AcceptQuest"
"InteractionType": "AcceptQuest",
"Fly": true
}
]
},
@ -55,8 +56,8 @@
null,
null,
32
]
],
"Fly": true
},
{
"DataId": 2005633,
@ -74,7 +75,8 @@
null,
null,
128
]
],
"Fly": true
},
{
"DataId": 2005634,
@ -92,7 +94,8 @@
null,
null,
64
]
],
"Fly": true
}
]
},{
@ -112,4 +115,4 @@
]
}
]
}
}

View File

@ -14,7 +14,8 @@
"Z": -186.4195
},
"TerritoryId": 399,
"InteractionType": "AcceptQuest"
"InteractionType": "AcceptQuest",
"Fly": true
}
]
},
@ -59,4 +60,4 @@
}
]
}
}

View File

@ -61,8 +61,7 @@
{
"TerritoryId": 399,
"InteractionType": "Duty",
"AutoDutyEnabled": true,
"ContentFinderConditionId": 62
"ContentFinderConditionId": 584
}
]
},
@ -82,4 +81,4 @@
]
}
]
}
}

View File

@ -94,23 +94,6 @@
}
}
},
{
"DataId": 2013938,
"Position": {
"X": 516.80774,
"Y": 17.959839,
"Z": -348.0431
},
"TerritoryId": 1188,
"InteractionType": "AttuneAetherCurrent",
"AetherCurrentId": 2818425,
"AetheryteShortcut": "Kozama'uka - Dock Poga",
"SkipConditions": {
"AetheryteShortcutIf": {
"AetheryteLocked": "Kozama'uka - Dock Poga"
}
}
},
{
"DataId": 1048826,
"Position": {
@ -119,7 +102,13 @@
"Z": -527.36707
},
"TerritoryId": 1188,
"InteractionType": "Interact"
"InteractionType": "Interact",
"AetheryteShortcut": "Kozama'uka - Dock Poga",
"SkipConditions": {
"AetheryteShortcutIf": {
"AetheryteLocked": "Kozama'uka - Dock Poga"
}
}
}
]
},

View File

@ -84,6 +84,17 @@
"DisableNavmesh": true,
"Mount": true
},
{
"DataId": 2013938,
"Position": {
"X": 516.80774,
"Y": 17.959839,
"Z": -348.0431
},
"TerritoryId": 1188,
"InteractionType": "AttuneAetherCurrent",
"AetherCurrentId": 2818425
},
{
"DataId": 2013632,
"Position": {

View File

@ -88,6 +88,15 @@
"InteractionType": "AttuneAethernetShard",
"AethernetShard": "[Solution Nine] Nexus Arcade"
},
{
"Position": {
"X": -320.34818,
"Y": 9.519508,
"Z": -6.9244547
},
"TerritoryId": 1186,
"InteractionType": "WalkTo"
},
{
"DataId": 1048065,
"Position": {
@ -97,7 +106,8 @@
},
"StopDistance": 0.25,
"TerritoryId": 1186,
"InteractionType": "Interact"
"InteractionType": "Interact",
"DelaySecondsAtStart": 3
}
]
},

View File

@ -0,0 +1,118 @@
{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "Starr",
"QuestSequence": [
{
"Sequence": 0,
"Steps": [
{
"DataId": 1050356,
"Position": {
"X": 17.288391,
"Y": 45.656,
"Z": 133.95886
},
"TerritoryId": 128,
"InteractionType": "AcceptQuest",
"AetheryteShortcut": "Limsa Lominsa",
"AethernetShortcut": [
"[Limsa Lominsa] Aetheryte Plaza",
"[Limsa Lominsa] The Aftcastle"
],
"SkipConditions": {
"AetheryteShortcutIf": {
"InTerritory": [
128
]
}
}
}
]
},
{
"Sequence": 1,
"Steps": [
{
"DataId": 1050357,
"Position": {
"X": -4.6845703,
"Y": 40.000004,
"Z": 73.3501
},
"TerritoryId": 128,
"InteractionType": "Interact",
"DialogueChoices": [
{
"Prompt": "TEXT_FESNYX101_05186_Q1_000_000",
"Answer": "TEXT_FESNYX101_05186_A1_000_000",
"Type": "List"
}
]
}
]
},
{
"Sequence": 2,
"Steps": [
{
"DataId": 1050358,
"Position": {
"X": -18.143005,
"Y": 44,
"Z": -33.49359
},
"TerritoryId": 128,
"InteractionType": "Interact",
"DialogueChoices": [
{
"Prompt": "TEXT_FESNYX101_05186_Q2_000_000",
"Answer": "TEXT_FESNYX101_05186_A2_000_001",
"Type": "List"
}
]
}
]
},
{
"Sequence": 3,
"Steps": [
{
"DataId": 1050359,
"Position": {
"X": -44.235962,
"Y": 39.473606,
"Z": -163.77509
},
"TerritoryId": 128,
"InteractionType": "Interact",
"DialogueChoices": [
{
"Prompt": "TEXT_FESNYX101_05186_Q3_000_000",
"Answer": "TEXT_FESNYX101_05186_A3_000_000",
"Type": "List"
}
]
}
]
},
{
"Sequence": 255,
"Steps": [
{
"DataId": 1050356,
"Position": {
"X": 17.288391,
"Y": 45.656,
"Z": 133.95886
},
"TerritoryId": 128,
"InteractionType": "CompleteQuest",
"AethernetShortcut": [
"[Limsa Lominsa] Culinarians' Guild",
"[Limsa Lominsa] The Aftcastle"
]
}
]
}
]
}

View File

@ -48,7 +48,7 @@ public enum EAction
Katon = 2266,
Raiton = 2267,
RabbitMedium = 2272,
SlugShot = 7412,
SlugShot = 2868,
BosomBrook = 37173,
Souleater = 3632,
Fire3 = 152,

View File

@ -25,6 +25,7 @@
<s:Boolean x:Key="/Default/UserDictionary/Words/=mnemo/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=nightsoil/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=ondo/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=orchestrion/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=ostall/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=palaka_0027s/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=rostra/@EntryIndexedValue">True</s:Boolean>

View File

@ -14,16 +14,16 @@ namespace Questionable.Controller.CombatModules;
internal sealed class RotationSolverRebornModule : ICombatModule, IDisposable
{
private readonly ILogger<RotationSolverRebornModule> _logger;
private readonly IClientState _clientState;
private readonly Configuration _configuration;
private readonly ICallGateSubscriber<string, object> _test;
private readonly ICallGateSubscriber<StateCommandType, object> _changeOperationMode;
public RotationSolverRebornModule(ILogger<RotationSolverRebornModule> logger, MovementController movementController,
IClientState clientState, IDalamudPluginInterface pluginInterface, Configuration configuration)
public RotationSolverRebornModule(
ILogger<RotationSolverRebornModule> logger,
IDalamudPluginInterface pluginInterface,
Configuration configuration)
{
_logger = logger;
_clientState = clientState;
_configuration = configuration;
_test = pluginInterface.GetIpcSubscriber<string, object>("RotationSolverReborn.Test");
_changeOperationMode =

View File

@ -146,6 +146,8 @@ internal sealed class QuestController : MiniTaskController<QuestController>, IDi
public string? DebugState { get; private set; }
public Func<bool> IsQuestWindowOpen { private get; set; } = () => true;
public void Reload()
{
lock (_progressLock)
@ -181,6 +183,9 @@ internal sealed class QuestController : MiniTaskController<QuestController>, IDi
}
}
if (AutomationType == EAutomationType.Manual && !IsRunning && !IsQuestWindowOpen())
return;
UpdateCurrentQuest();
if (!_clientState.IsLoggedIn || _condition[ConditionFlag.Unconscious])

View File

@ -24,7 +24,7 @@ internal static class SendNotification
new Task(step.InteractionType, step.Comment),
EInteractionType.Duty when !autoDutyIpc.IsConfiguredToRunContent(step.ContentFinderConditionId, step.AutoDutyEnabled) =>
new Task(step.InteractionType, step.ContentFinderConditionId.HasValue
? territoryData.GetContentFinderConditionName(step.ContentFinderConditionId.Value)
? territoryData.GetContentFinderCondition(step.ContentFinderConditionId.Value)?.Name
: step.Comment),
EInteractionType.SinglePlayerDuty => new Task(step.InteractionType, quest.Info.Name),
_ => null,

View File

@ -2,6 +2,9 @@
using System.Collections.Generic;
using Dalamud.Game.ClientState.Conditions;
using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game;
using LLib.Gear;
using Questionable.Controller.Steps.Common;
using Questionable.Controller.Steps.Shared;
using Questionable.Data;
using Questionable.External;
@ -41,23 +44,54 @@ internal static class Duty
}
internal sealed class StartAutoDutyExecutor(
GearStatsCalculator gearStatsCalculator,
AutoDutyIpc autoDutyIpc,
TerritoryData territoryData,
IClientState clientState) : TaskExecutor<StartAutoDutyTask>
IClientState clientState,
IChatGui chatGui,
SendNotification.Executor sendNotificationExecutor) : TaskExecutor<StartAutoDutyTask>
{
protected override bool Start()
{
if (!territoryData.TryGetContentFinderCondition(Task.ContentFinderConditionId,
out var cfcData))
throw new TaskException("Failed to get territory ID for content finder condition");
unsafe
{
InventoryManager* inventoryManager = InventoryManager.Instance();
if (inventoryManager == null)
throw new TaskException("Inventory unavailable");
var equippedItems = inventoryManager->GetInventoryContainer(InventoryType.EquippedItems);
if (equippedItems == null)
throw new TaskException("Equipped items unavailable");
var currentItemLevel = gearStatsCalculator.CalculateAverageItemLevel(equippedItems);
if (cfcData.RequiredItemLevel > currentItemLevel)
{
string errorText =
$"Could not use AutoDuty to queue for {cfcData.Name}, required item level: {cfcData.RequiredItemLevel}, current item level: {currentItemLevel}.";
if (!sendNotificationExecutor.Start(new SendNotification.Task(EInteractionType.Duty, errorText)))
chatGui.PrintError(errorText, CommandHandler.MessageTag, CommandHandler.TagColor);
return false;
}
}
autoDutyIpc.StartInstance(Task.ContentFinderConditionId);
return true;
}
public override ETaskResult Update()
{
if (!territoryData.TryGetTerritoryIdForContentFinderCondition(Task.ContentFinderConditionId,
out uint territoryId))
if (!territoryData.TryGetContentFinderCondition(Task.ContentFinderConditionId,
out var cfcData))
throw new TaskException("Failed to get territory ID for content finder condition");
return clientState.TerritoryType == territoryId ? ETaskResult.TaskComplete : ETaskResult.StillRunning;
return clientState.TerritoryType == cfcData.TerritoryId
? ETaskResult.TaskComplete
: ETaskResult.StillRunning;
}
}
@ -75,11 +109,11 @@ internal static class Duty
public override ETaskResult Update()
{
if (!territoryData.TryGetTerritoryIdForContentFinderCondition(Task.ContentFinderConditionId,
out uint territoryId))
if (!territoryData.TryGetContentFinderCondition(Task.ContentFinderConditionId,
out var cfcData))
throw new TaskException("Failed to get territory ID for content finder condition");
return clientState.TerritoryType != territoryId && autoDutyIpc.IsStopped()
return clientState.TerritoryType != cfcData.TerritoryId && autoDutyIpc.IsStopped()
? ETaskResult.TaskComplete
: ETaskResult.StillRunning;
}

View File

@ -0,0 +1,78 @@
using System;
using System.Collections.Generic;
using Dalamud.Game.ClientState.Conditions;
using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game;
using Questionable.Data;
using Questionable.Functions;
using Questionable.Model;
using Questionable.Model.Questing;
namespace Questionable.Controller.Steps.Shared;
internal static class RedeemRewardItems
{
internal sealed class Factory(QuestData questData) : ITaskFactory
{
public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step)
{
if (step.InteractionType != EInteractionType.AcceptQuest)
return [];
List<ITask> tasks = [];
unsafe
{
InventoryManager* inventoryManager = InventoryManager.Instance();
if (inventoryManager == null)
return tasks;
foreach (var itemReward in questData.RedeemableItems)
{
if (inventoryManager->GetInventoryItemCount(itemReward.ItemId) > 0 &&
!itemReward.IsUnlocked())
{
tasks.Add(new Task(itemReward));
}
}
}
return tasks;
}
}
internal sealed record Task(ItemReward ItemReward) : ITask
{
public override string ToString() => $"TryRedeem({ItemReward.Name})";
}
internal sealed class Executor(
GameFunctions gameFunctions,
ICondition condition) : TaskExecutor<Task>
{
private static readonly TimeSpan MinimumCastTime = TimeSpan.FromSeconds(4);
private DateTime _continueAt;
protected override bool Start()
{
if (condition[ConditionFlag.Mounted])
return false;
TimeSpan castTime = Task.ItemReward.CastTime;
if (castTime < MinimumCastTime)
castTime = MinimumCastTime;
_continueAt = DateTime.Now
.Add(castTime)
.AddSeconds(3);
return gameFunctions.UseItem(Task.ItemReward.ItemId);
}
public override ETaskResult Update()
{
if (condition[ConditionFlag.Casting])
return ETaskResult.StillRunning;
return DateTime.Now <= _continueAt ? ETaskResult.StillRunning : ETaskResult.TaskComplete;
}
}
}

View File

@ -53,7 +53,7 @@ internal sealed class AlliedSocietyData
else if (alliedSociety == EAlliedSociety.Moogles)
{
normalNpcs = [];
mountNpcs = [1017322, 1017470];
mountNpcs = [1017322, 1017470, 1017471];
}
else
{

View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Dalamud.Plugin.Services;
@ -218,8 +219,15 @@ internal sealed class QuestData
quest.JournalGenre = 82;
quest.SortKey = 0;
}
RedeemableItems = quests.Where(x => x is QuestInfo)
.Cast<QuestInfo>()
.SelectMany(x => x.ItemRewards)
.ToImmutableHashSet();
}
public ImmutableHashSet<ItemReward> RedeemableItems { get; }
private void AddPreviousQuest(QuestId questToUpdate, QuestId requiredQuestId)
{
QuestInfo quest = (QuestInfo)_quests[questToUpdate];

View File

@ -1,12 +1,11 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Linq;
using Dalamud.Game;
using Dalamud.Plugin.Services;
using Dalamud.Utility;
using FFXIVClientStructs.FFXIV.Client.Game.Character;
using Lumina.Excel.Sheets;
namespace Questionable.Data;
@ -17,8 +16,7 @@ internal sealed class TerritoryData
private readonly ImmutableHashSet<ushort> _territoriesWithMount;
private readonly ImmutableDictionary<ushort, uint> _dutyTerritories;
private readonly ImmutableDictionary<uint, string> _instanceNames;
private readonly ImmutableDictionary<uint, string> _contentFinderConditionNames;
private readonly ImmutableDictionary<uint, uint> _contentFinderConditionIds;
private readonly ImmutableDictionary<uint, ContentFinderConditionData> _contentFinderConditions;
public TerritoryData(IDataManager dataManager)
{
@ -46,12 +44,10 @@ internal sealed class TerritoryData
.Where(x => x.RowId > 0 && x.Content.RowId != 0 && x.ContentLinkType == 1 && x.ContentType.RowId != 6)
.ToImmutableDictionary(x => x.Content.RowId, x => x.Name.ToDalamudString().ToString());
_contentFinderConditionNames = dataManager.GetExcelSheet<ContentFinderCondition>()
_contentFinderConditions = dataManager.GetExcelSheet<ContentFinderCondition>()
.Where(x => x.RowId > 0 && x.Content.RowId != 0 && x.ContentLinkType == 1 && x.ContentType.RowId != 6)
.ToImmutableDictionary(x => x.RowId, x => FixName(x.Name.ToDalamudString().ToString(), dataManager.Language));
_contentFinderConditionIds = dataManager.GetExcelSheet<ContentFinderCondition>()
.Where(x => x.RowId > 0 && x.Content.RowId != 0 && x.ContentLinkType == 1 && x.ContentType.RowId != 6)
.ToImmutableDictionary(x => x.RowId, x => x.TerritoryType.RowId);
.Select(x => new ContentFinderConditionData(x, dataManager.Language))
.ToImmutableDictionary(x => x.ContentFinderConditionId, x => x);
}
public string? GetName(ushort territoryId) => _territoryNames.GetValueOrDefault(territoryId);
@ -74,10 +70,12 @@ internal sealed class TerritoryData
public string? GetInstanceName(ushort instanceId) => _instanceNames.GetValueOrDefault(instanceId);
public string? GetContentFinderConditionName(uint cfcId) => _contentFinderConditionNames.GetValueOrDefault(cfcId);
public ContentFinderConditionData? GetContentFinderCondition(uint cfcId) =>
_contentFinderConditions.GetValueOrDefault(cfcId);
public bool TryGetTerritoryIdForContentFinderCondition(uint cfcId, out uint territoryId) =>
_contentFinderConditionIds.TryGetValue(cfcId, out territoryId);
public bool TryGetContentFinderCondition(uint cfcId,
[NotNullWhen(true)] out ContentFinderConditionData? contentFinderConditionData) =>
_contentFinderConditions.TryGetValue(cfcId, out contentFinderConditionData);
private static string FixName(string name, ClientLanguage language)
{
@ -86,4 +84,17 @@ internal sealed class TerritoryData
return string.Concat(name[0].ToString().ToUpper(CultureInfo.InvariantCulture), name.AsSpan(1));
}
public sealed record ContentFinderConditionData(
uint ContentFinderConditionId,
string Name,
uint TerritoryId,
ushort RequiredItemLevel)
{
public ContentFinderConditionData(ContentFinderCondition condition, ClientLanguage clientLanguage)
: this(condition.RowId, FixName(condition.Name.ToDalamudString().ToString(), clientLanguage),
condition.TerritoryType.RowId, condition.ItemLevelRequired)
{
}
}
}

View File

@ -38,7 +38,7 @@ internal sealed class AutoDutyIpc
return false;
if (_configuration.Duties.WhitelistedDutyCfcIds.Contains(cfcId.Value) &&
_territoryData.TryGetTerritoryIdForContentFinderCondition(cfcId.Value, out _))
_territoryData.TryGetContentFinderCondition(cfcId.Value, out _))
return true;
return autoDutyEnabled && HasPath(cfcId.Value);
@ -46,28 +46,28 @@ internal sealed class AutoDutyIpc
public bool HasPath(uint cfcId)
{
if (!_territoryData.TryGetTerritoryIdForContentFinderCondition(cfcId, out uint territoryType))
if (!_territoryData.TryGetContentFinderCondition(cfcId, out var cfcData))
return false;
try
{
return _contentHasPath.InvokeFunc(territoryType);
return _contentHasPath.InvokeFunc(cfcData.TerritoryId);
}
catch (IpcError e)
{
_logger.LogWarning("Unable to query AutoDuty for path in territory {TerritoryType}: {Message}", territoryType, e.Message);
_logger.LogWarning("Unable to query AutoDuty for path in territory {TerritoryType}: {Message}", cfcData.TerritoryId, e.Message);
return false;
}
}
public void StartInstance(uint cfcId)
{
if (!_territoryData.TryGetTerritoryIdForContentFinderCondition(cfcId, out uint territoryType))
if (!_territoryData.TryGetContentFinderCondition(cfcId, out var cfcData))
throw new TaskException($"Unknown ContentFinderConditionId {cfcId}");
try
{
_run.InvokeAction(territoryType, 0, true);
_run.InvokeAction(cfcData.TerritoryId, 0, true);
}
catch (IpcError e)
{

View File

@ -206,10 +206,12 @@ internal sealed unsafe class GameFunctions
public bool UseAction(EAction action)
{
if (ActionManager.Instance()->GetActionStatus(ActionType.Action, (uint)action) == 0)
uint actionId = ActionManager.Instance()->GetAdjustedActionId((uint)action);
if (ActionManager.Instance()->GetActionStatus(ActionType.Action, actionId) == 0)
{
bool result = ActionManager.Instance()->UseAction(ActionType.Action, (uint)action);
_logger.LogInformation("UseAction {Action} result: {Result}", action, result);
bool result = ActionManager.Instance()->UseAction(ActionType.Action, actionId);
_logger.LogInformation("UseAction {Action} (adjusted: {AdjustedActionId}) result: {Result}", action,
actionId, result);
return result;
}
@ -219,31 +221,34 @@ internal sealed unsafe class GameFunctions
public bool UseAction(IGameObject gameObject, EAction action, bool checkCanUse = true)
{
var actionRow = _dataManager.GetExcelSheet<Action>().GetRow((uint)action);
if (checkCanUse && !ActionManager.CanUseActionOnTarget((uint)action, (GameObject*)gameObject.Address))
uint actionId = ActionManager.Instance()->GetAdjustedActionId((uint)action);
var actionRow = _dataManager.GetExcelSheet<Action>().GetRow(actionId);
if (checkCanUse && !ActionManager.CanUseActionOnTarget(actionId, (GameObject*)gameObject.Address))
{
_logger.LogWarning("Can not use action {Action} on target {Target}", action, gameObject);
_logger.LogWarning("Can not use action {Action} (adjusted: {AdjustedActionId}) on target {Target}", action,
actionId, gameObject);
return false;
}
_targetManager.Target = gameObject;
if (ActionManager.Instance()->GetActionStatus(ActionType.Action, (uint)action, gameObject.GameObjectId) == 0)
if (ActionManager.Instance()->GetActionStatus(ActionType.Action, actionId, gameObject.GameObjectId) == 0)
{
bool result;
if (actionRow.TargetArea)
{
Vector3 position = gameObject.Position;
result = ActionManager.Instance()->UseActionLocation(ActionType.Action, (uint)action,
result = ActionManager.Instance()->UseActionLocation(ActionType.Action, actionId,
location: &position);
_logger.LogInformation("UseAction {Action} on target area {Target} result: {Result}", action,
gameObject,
result);
_logger.LogInformation(
"UseAction {Action} (adjusted: {AdjustedActionId}) on target area {Target} result: {Result}",
action, actionId, gameObject, result);
}
else
{
result = ActionManager.Instance()->UseAction(ActionType.Action, (uint)action, gameObject.GameObjectId);
_logger.LogInformation("UseAction {Action} on target {Target} result: {Result}", action, gameObject,
result);
result = ActionManager.Instance()->UseAction(ActionType.Action, actionId, gameObject.GameObjectId);
_logger.LogInformation(
"UseAction {Action} (adjusted: {AdjustedActionId}) on target {Target} result: {Result}", action,
actionId, gameObject, result);
}
return result;
@ -307,7 +312,7 @@ internal sealed unsafe class GameFunctions
StatusManager* statusManager = battleChara->GetStatusManager();
return statusManager->HasStatus((uint)statusId);
}
public static bool RemoveStatus(EStatus statusId)
{
return StatusManager.ExecuteStatusOff((uint)statusId);
@ -452,7 +457,8 @@ internal sealed unsafe class GameFunctions
public bool IsLoadingScreenVisible()
{
if (_gameGui.TryGetAddonByName("FadeMiddle", out AtkUnitBase* fade) && LAddon.IsAddonReady(fade) && fade->IsVisible)
if (_gameGui.TryGetAddonByName("FadeMiddle", out AtkUnitBase* fade) && LAddon.IsAddonReady(fade) &&
fade->IsVisible)
return true;
if (_gameGui.TryGetAddonByName("FadeBack", out fade) && LAddon.IsAddonReady(fade) && fade->IsVisible)

View File

@ -450,14 +450,19 @@ internal sealed unsafe class QuestFunctions
if (IsQuestAccepted(questId))
return false;
if (quest.Info.AlliedSociety != EAlliedSociety.None)
if (questId is QuestId qId && IsDailyAlliedSocietyQuest(qId))
{
if (QuestManager.Instance()->IsDailyQuestCompleted(questId.Value))
return false;
}
if (IsQuestComplete(questId))
return false;
if (!IsDailyAlliedSocietyQuestAndAvailableToday(qId))
return false;
}
else
{
if (IsQuestComplete(questId))
return false;
}
}
else
{

View File

@ -0,0 +1,99 @@
using System;
using Dalamud.Utility;
using FFXIVClientStructs.FFXIV.Client.Game.UI;
using Lumina.Excel.Sheets;
using Questionable.Model.Questing;
namespace Questionable.Model;
public enum EItemRewardType
{
Mount,
Minion,
OrchestrionRoll,
TripleTriadCard,
FashionAccessory,
}
public sealed class ItemRewardDetails(Item item, ElementId elementId)
{
public uint ItemId { get; } = item.RowId;
public string Name { get; } = item.Name.ToDalamudString().ToString();
public TimeSpan CastTime { get; } = TimeSpan.FromSeconds(item.CastTimeSeconds);
public ElementId ElementId { get; } = elementId;
}
public abstract record ItemReward(ItemRewardDetails Item)
{
internal static ItemReward? CreateFromItem(Item item, ElementId elementId)
{
if (item.ItemAction.ValueNullable?.Type is 1322)
return new MountReward(new ItemRewardDetails(item, elementId), item.ItemAction.Value.Data[0]);
if (item.ItemAction.ValueNullable?.Type is 853)
return new MinionReward(new ItemRewardDetails(item, elementId), item.ItemAction.Value.Data[0]);
if (item.AdditionalData.GetValueOrDefault<Orchestrion>() is { } orchestrionRoll)
return new OrchestrionRollReward(new ItemRewardDetails(item, elementId), orchestrionRoll.RowId);
if (item.AdditionalData.GetValueOrDefault<TripleTriadCard>() is { } tripleTriadCard)
return new TripleTriadCardReward(new ItemRewardDetails(item, elementId), (ushort)tripleTriadCard.RowId);
if (item.ItemAction.ValueNullable?.Type is 20086)
return new FashionAccessoryReward(new ItemRewardDetails(item, elementId), item.ItemAction.Value.Data[0]);
return null;
}
public uint ItemId => Item.ItemId;
public string Name => Item.Name;
public ElementId ElementId => Item.ElementId;
public TimeSpan CastTime => Item.CastTime;
public abstract EItemRewardType Type { get; }
public abstract bool IsUnlocked();
}
public sealed record MountReward(ItemRewardDetails Item, uint MountId)
: ItemReward(Item)
{
public override EItemRewardType Type => EItemRewardType.Mount;
public override unsafe bool IsUnlocked()
=> PlayerState.Instance()->IsMountUnlocked(MountId);
}
public sealed record MinionReward(ItemRewardDetails Item, uint MinionId)
: ItemReward(Item)
{
public override EItemRewardType Type => EItemRewardType.Minion;
public override unsafe bool IsUnlocked()
=> UIState.Instance()->IsCompanionUnlocked(MinionId);
}
public sealed record OrchestrionRollReward(ItemRewardDetails Item, uint OrchestrionRollId)
: ItemReward(Item)
{
public override EItemRewardType Type => EItemRewardType.OrchestrionRoll;
public override unsafe bool IsUnlocked() =>
PlayerState.Instance()->IsOrchestrionRollUnlocked(OrchestrionRollId);
}
public sealed record TripleTriadCardReward(ItemRewardDetails Item, ushort TripleTriadCardId)
: ItemReward(Item)
{
public override EItemRewardType Type => EItemRewardType.TripleTriadCard;
public override unsafe bool IsUnlocked() =>
UIState.Instance()->IsTripleTriadCardUnlocked(TripleTriadCardId);
}
public sealed record FashionAccessoryReward(ItemRewardDetails Item, uint AccessoryId)
: ItemReward(Item)
{
public override EItemRewardType Type => EItemRewardType.FashionAccessory;
public override unsafe bool IsUnlocked() =>
PlayerState.Instance()->IsOrnamentUnlocked(AccessoryId);
}

View File

@ -2,10 +2,11 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using FFXIVClientStructs.FFXIV.Client.UI.Agent;
using LLib.GameData;
using Lumina.Excel.Sheets;
using Questionable.Model.Questing;
using ExcelQuest = Lumina.Excel.Sheets.Quest;
using GrandCompany = FFXIVClientStructs.FFXIV.Client.UI.Agent.GrandCompany;
namespace Questionable.Model;
@ -54,7 +55,8 @@ internal sealed class QuestInfo : IQuestInfo
QuestLockJoin = (EQuestJoin)quest.QuestLockJoin;
JournalGenre = quest.JournalGenre.ValueNullable?.RowId;
SortKey = quest.SortKey;
IsMainScenarioQuest = quest.JournalGenre.ValueNullable?.JournalCategory.ValueNullable?.JournalSection.ValueNullable?.RowId is 0 or 1;
IsMainScenarioQuest = quest.JournalGenre.ValueNullable?.JournalCategory.ValueNullable?.JournalSection
.ValueNullable?.RowId is 0 or 1;
CompletesInstantly = quest.TodoParams[0].ToDoCompleteSeq == 0;
PreviousInstanceContent = quest.InstanceContent.Select(x => (ushort)x.RowId).Where(x => x != 0).ToList();
PreviousInstanceContentJoin = (EQuestJoin)quest.InstanceContentJoin;
@ -67,6 +69,15 @@ internal sealed class QuestInfo : IQuestInfo
NewGamePlusChapter = newGamePlusChapter;
StartingCity = startingCity;
MoogleDeliveryLevel = (byte)quest.DeliveryQuest.RowId;
ItemRewards = quest.Reward.Where(x => x.RowId > 0 && x.Is<Item>())
.Select(x => x.GetValueOrDefault<Item>())
.Where(x => x != null)
.Cast<Item>()
.Where(x => x.IsUntradable)
.Select(x => ItemReward.CreateFromItem(x, QuestId))
.Where(x => x != null)
.Cast<ItemReward>()
.ToList();
Expansion = (EExpansionVersion)quest.Expansion.RowId;
}
@ -79,7 +90,6 @@ internal sealed class QuestInfo : IQuestInfo
});
}
public ElementId QuestId { get; }
public string Name { get; }
public ushort Level { get; }
@ -105,6 +115,7 @@ internal sealed class QuestInfo : IQuestInfo
public byte StartingCity { get; set; }
public byte MoogleDeliveryLevel { get; }
public bool IsMoogleDeliveryQuest => JournalGenre == 87;
public IReadOnlyList<ItemReward> ItemRewards { get; }
public EExpansionVersion Expansion { get; }
public void AddPreviousQuest(PreviousQuestInfo questId)

View File

@ -7,6 +7,7 @@ using Dalamud.Interface.Windowing;
using Dalamud.Plugin;
using Dalamud.Plugin.Services;
using LLib;
using LLib.Gear;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Questionable.Controller;
@ -130,6 +131,8 @@ public sealed class QuestionablePlugin : IDalamudPlugin
serviceCollection.AddSingleton<NotificationMasterIpc>();
serviceCollection.AddSingleton<AutomatonIpc>();
serviceCollection.AddSingleton<AutoDutyIpc>();
serviceCollection.AddSingleton<GearStatsCalculator>();
}
private static void AddTaskFactories(ServiceCollection serviceCollection)
@ -138,6 +141,8 @@ public sealed class QuestionablePlugin : IDalamudPlugin
serviceCollection.AddTaskFactory<QuestCleanUp.CheckAlliedSocietyMount>();
serviceCollection
.AddTaskExecutor<MoveToLandingLocation.Task, MoveToLandingLocation.MoveToLandingLocationExecutor>();
serviceCollection
.AddTaskFactoryAndExecutor<RedeemRewardItems.Task, RedeemRewardItems.Factory, RedeemRewardItems.Executor>();
serviceCollection.AddTaskExecutor<DoGather.Task, DoGather.GatherExecutor>();
serviceCollection.AddTaskExecutor<DoGatherCollectable.Task, DoGatherCollectable.GatherCollectableExecutor>();
serviceCollection.AddTaskFactoryAndExecutor<SwitchClassJob.Task, SwitchClassJob.Factory,
@ -155,7 +160,8 @@ public sealed class QuestionablePlugin : IDalamudPlugin
.AddTaskFactoryAndExecutor<AetheryteShortcut.Task, AetheryteShortcut.Factory,
AetheryteShortcut.UseAetheryteShortcut>();
serviceCollection
.AddTaskExecutor<AetheryteShortcut.MoveAwayFromAetheryte, AetheryteShortcut.MoveAwayFromAetheryteExecutor>();
.AddTaskExecutor<AetheryteShortcut.MoveAwayFromAetheryte,
AetheryteShortcut.MoveAwayFromAetheryteExecutor>();
serviceCollection
.AddTaskFactoryAndExecutor<SkipCondition.SkipTask, SkipCondition.Factory, SkipCondition.CheckSkip>();
serviceCollection.AddTaskFactoryAndExecutor<Gather.GatheringTask, Gather.Factory, Gather.StartGathering>();
@ -179,7 +185,8 @@ public sealed class QuestionablePlugin : IDalamudPlugin
.AddTaskFactoryAndExecutor<AethernetShard.Attune, AethernetShard.Factory, AethernetShard.DoAttune>();
serviceCollection.AddTaskFactoryAndExecutor<Aetheryte.Attune, Aetheryte.Factory, Aetheryte.DoAttune>();
serviceCollection.AddTaskFactoryAndExecutor<Combat.Task, Combat.Factory, Combat.HandleCombat>();
serviceCollection.AddTaskFactoryAndExecutor<Duty.OpenDutyFinderTask, Duty.Factory, Duty.OpenDutyFinderExecutor>();
serviceCollection
.AddTaskFactoryAndExecutor<Duty.OpenDutyFinderTask, Duty.Factory, Duty.OpenDutyFinderExecutor>();
serviceCollection.AddTaskExecutor<Duty.StartAutoDutyTask, Duty.StartAutoDutyExecutor>();
serviceCollection.AddTaskExecutor<Duty.WaitAutoDutyTask, Duty.WaitAutoDutyExecutor>();
serviceCollection.AddTaskFactory<Emote.Factory>();
@ -269,6 +276,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin
serviceCollection.AddSingleton<QuestJournalUtils>();
serviceCollection.AddSingleton<QuestJournalComponent>();
serviceCollection.AddSingleton<QuestRewardComponent>();
serviceCollection.AddSingleton<GatheringJournalComponent>();
serviceCollection.AddSingleton<AlliedSocietyJournalComponent>();

View File

@ -99,7 +99,7 @@ internal sealed class ConfigWindow : LWindow, IPersistableWindowConfig
{
Expansion = (EExpansionVersion)x.TerritoryType.Value.ExVersion.RowId,
CfcId = x.RowId,
Name = territoryData.GetContentFinderConditionName(x.RowId) ?? "?",
Name = territoryData.GetContentFinderCondition(x.RowId)?.Name ?? "?",
TerritoryId = x.TerritoryType.RowId,
ContentType = x.ContentType.RowId,
Level = x.ClassJobLevelRequired,

View File

@ -17,7 +17,9 @@ internal sealed class AlliedSocietyJournalComponent
private static readonly string[] RankNames =
["Neutral", "Recognized", "Friendly", "Trusted", "Respected", "Honored", "Sworn", "Allied"];
#if DEBUG
private readonly QuestFunctions _questFunctions;
#endif
private readonly AlliedSocietyQuestFunctions _alliedSocietyQuestFunctions;
private readonly QuestData _questData;
private readonly QuestRegistry _questRegistry;
@ -26,7 +28,9 @@ internal sealed class AlliedSocietyJournalComponent
private readonly UiUtils _uiUtils;
public AlliedSocietyJournalComponent(
#if DEBUG
QuestFunctions questFunctions,
#endif
AlliedSocietyQuestFunctions alliedSocietyQuestFunctions,
QuestData questData,
QuestRegistry questRegistry,
@ -34,7 +38,9 @@ internal sealed class AlliedSocietyJournalComponent
QuestTooltipComponent questTooltipComponent,
UiUtils uiUtils)
{
#if DEBUG
_questFunctions = questFunctions;
#endif
_alliedSocietyQuestFunctions = alliedSocietyQuestFunctions;
_questData = questData;
_questRegistry = questRegistry;

View File

@ -0,0 +1,93 @@
using System;
using System.Linq;
using Dalamud.Game.Text;
using Dalamud.Interface;
using Dalamud.Interface.Colors;
using Dalamud.Interface.Utility.Raii;
using ImGuiNET;
using Questionable.Controller;
using Questionable.Data;
using Questionable.Model;
using Questionable.Windows.QuestComponents;
namespace Questionable.Windows.JournalComponents;
internal sealed class QuestRewardComponent
{
private readonly QuestRegistry _questRegistry;
private readonly QuestData _questData;
private readonly QuestTooltipComponent _questTooltipComponent;
private readonly UiUtils _uiUtils;
private bool _showEventRewards;
public QuestRewardComponent(
QuestRegistry questRegistry,
QuestData questData,
QuestTooltipComponent questTooltipComponent,
UiUtils uiUtils)
{
_questRegistry = questRegistry;
_questData = questData;
_questTooltipComponent = questTooltipComponent;
_uiUtils = uiUtils;
}
public void DrawItemRewards()
{
using var tab = ImRaii.TabItem("Item Rewards");
if (!tab)
return;
ImGui.Checkbox("Show rewards from seasonal event quests", ref _showEventRewards);
ImGui.Spacing();
ImGui.BulletText(
"Only untradeable items are listed (e.g. the Wind-up Airship can be sold on the market board).");
DrawGroup("Mounts", EItemRewardType.Mount);
DrawGroup("Minions", EItemRewardType.Minion);
DrawGroup("Orchestrion Rolls", EItemRewardType.OrchestrionRoll);
DrawGroup("Triple Triad Cards", EItemRewardType.TripleTriadCard);
DrawGroup("Fashion Accessories", EItemRewardType.FashionAccessory);
}
private void DrawGroup(string label, EItemRewardType type)
{
if (!ImGui.CollapsingHeader($"{label}###Reward{type}"))
return;
foreach (var item in _questData.RedeemableItems.Where(x => x.Type == type)
.OrderBy(x => x.Name, StringComparer.CurrentCultureIgnoreCase))
{
if (_questData.TryGetQuestInfo(item.ElementId, out var questInfo))
{
bool isEventQuest = questInfo is QuestInfo { IsSeasonalEvent: true };
if (!_showEventRewards && isEventQuest)
continue;
string name = item.Name;
if (isEventQuest)
name += $" {SeIconChar.Clock.ToIconString()}";
bool complete = item.IsUnlocked();
var color = !_questRegistry.IsKnownQuest(item.ElementId)
? ImGuiColors.DalamudGrey
: complete
? ImGuiColors.ParsedGreen
: ImGuiColors.DalamudRed;
var icon = complete ? FontAwesomeIcon.Check : FontAwesomeIcon.Times;
if (_uiUtils.ChecklistItem(name, color, icon))
{
using var tooltip = ImRaii.Tooltip();
if (!tooltip)
continue;
ImGui.Text($"Obtained from: {questInfo.Name}");
using (ImRaii.PushIndent())
_questTooltipComponent.DrawInner(questInfo, false);
}
}
}
}
}

View File

@ -12,12 +12,14 @@ internal sealed class JournalProgressWindow : LWindow, IDisposable
{
private readonly QuestJournalComponent _questJournalComponent;
private readonly AlliedSocietyJournalComponent _alliedSocietyJournalComponent;
private readonly QuestRewardComponent _questRewardComponent;
private readonly GatheringJournalComponent _gatheringJournalComponent;
private readonly QuestRegistry _questRegistry;
private readonly IClientState _clientState;
public JournalProgressWindow(
QuestJournalComponent questJournalComponent,
QuestRewardComponent questRewardComponent,
AlliedSocietyJournalComponent alliedSocietyJournalComponent,
GatheringJournalComponent gatheringJournalComponent,
QuestRegistry questRegistry,
@ -26,6 +28,7 @@ internal sealed class JournalProgressWindow : LWindow, IDisposable
{
_questJournalComponent = questJournalComponent;
_alliedSocietyJournalComponent = alliedSocietyJournalComponent;
_questRewardComponent = questRewardComponent;
_gatheringJournalComponent = gatheringJournalComponent;
_questRegistry = questRegistry;
_clientState = clientState;
@ -64,6 +67,7 @@ internal sealed class JournalProgressWindow : LWindow, IDisposable
_questJournalComponent.DrawQuests();
_alliedSocietyJournalComponent.DrawAlliedSocietyQuests();
_questRewardComponent.DrawItemRewards();
_gatheringJournalComponent.DrawGatheringItems();
}

View File

@ -22,7 +22,7 @@ internal sealed class EventInfoComponent
[SuppressMessage("ReSharper", "CollectionNeverUpdated.Local")]
private readonly List<EventQuest> _eventQuests =
[
new("Starlight Celebration", [new(5227), new(5228)], AtDailyReset(new(2024, 12, 31))),
new("Heavensturn", [new(5186)], AtDailyReset(new(2025, 1, 16))),
];
private readonly QuestData _questData;

View File

@ -40,48 +40,58 @@ internal sealed class QuestTooltipComponent
{
using var tooltip = ImRaii.Tooltip();
if (tooltip)
{
ImGui.Text($"{SeIconChar.LevelEn.ToIconString()}{questInfo.Level}");
ImGui.SameLine();
var (color, _, tooltipText) = _uiUtils.GetQuestStyle(questInfo.QuestId);
ImGui.TextColored(color, tooltipText);
if (questInfo.IsRepeatable)
{
ImGui.SameLine();
ImGui.TextUnformatted("Repeatable");
}
if (questInfo is QuestInfo { CompletesInstantly: true })
{
ImGui.SameLine();
ImGui.TextUnformatted("Instant");
}
if (_questRegistry.TryGetQuest(questInfo.QuestId, out Quest? quest))
{
if (quest.Root.Disabled)
{
ImGui.SameLine();
ImGui.TextColored(ImGuiColors.DalamudRed, "Disabled");
}
if (quest.Root.Author.Count == 1)
ImGui.Text($"Author: {quest.Root.Author[0]}");
else
ImGui.Text($"Authors: {string.Join(", ", quest.Root.Author)}");
}
else
{
ImGui.SameLine();
ImGui.TextColored(ImGuiColors.DalamudRed, "NoQuestPath");
}
DrawQuestUnlocks(questInfo, 0);
}
DrawInner(questInfo, true);
}
private void DrawQuestUnlocks(IQuestInfo questInfo, int counter)
public void DrawInner(IQuestInfo questInfo, bool showItemRewards)
{
ImGui.Text($"{SeIconChar.LevelEn.ToIconString()}{questInfo.Level}");
ImGui.SameLine();
var (color, _, tooltipText) = _uiUtils.GetQuestStyle(questInfo.QuestId);
ImGui.TextColored(color, tooltipText);
if (questInfo is QuestInfo { IsSeasonalEvent: true })
{
ImGui.SameLine();
ImGui.TextUnformatted("Event");
}
if (questInfo.IsRepeatable)
{
ImGui.SameLine();
ImGui.TextUnformatted("Repeatable");
}
if (questInfo is QuestInfo { CompletesInstantly: true })
{
ImGui.SameLine();
ImGui.TextUnformatted("Instant");
}
if (_questRegistry.TryGetQuest(questInfo.QuestId, out Quest? quest))
{
if (quest.Root.Disabled)
{
ImGui.SameLine();
ImGui.TextColored(ImGuiColors.DalamudRed, "Disabled");
}
if (quest.Root.Author.Count == 1)
ImGui.Text($"Author: {quest.Root.Author[0]}");
else
ImGui.Text($"Authors: {string.Join(", ", quest.Root.Author)}");
}
else
{
ImGui.SameLine();
ImGui.TextColored(ImGuiColors.DalamudRed, "NoQuestPath");
}
DrawQuestUnlocks(questInfo, 0, showItemRewards);
}
private void DrawQuestUnlocks(IQuestInfo questInfo, int counter, bool showItemRewards)
{
if (counter >= 10)
return;
@ -118,12 +128,13 @@ internal sealed class QuestTooltipComponent
_questFunctions.IsQuestComplete(q.QuestId) ? byte.MinValue : q.Sequence), iconColor, icon);
if (qInfo is QuestInfo qstInfo && (counter <= 2 || icon != FontAwesomeIcon.Check))
DrawQuestUnlocks(qstInfo, counter + 1);
DrawQuestUnlocks(qstInfo, counter + 1, false);
}
else
{
using var _ = ImRaii.Disabled();
_uiUtils.ChecklistItem($"Unknown Quest ({q.QuestId})", ImGuiColors.DalamudGrey, FontAwesomeIcon.Question);
_uiUtils.ChecklistItem($"Unknown Quest ({q.QuestId})", ImGuiColors.DalamudGrey,
FontAwesomeIcon.Question);
}
}
}
@ -193,6 +204,16 @@ internal sealed class QuestTooltipComponent
GrandCompany currentGrandCompany = _questFunctions.GetGrandCompany();
_uiUtils.ChecklistItem($"Grand Company: {gcName}", actualQuestInfo.GrandCompany == currentGrandCompany);
}
if (showItemRewards && actualQuestInfo.ItemRewards.Count > 0)
{
ImGui.Separator();
ImGui.Text("Item Rewards:");
foreach (var reward in actualQuestInfo.ItemRewards)
{
ImGui.BulletText(reward.Name);
}
}
}
if (counter > 0)

View File

@ -104,6 +104,7 @@ internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
_activeQuestComponent.Reload += OnReload;
_quickAccessButtonsComponent.Reload += OnReload;
_questController.IsQuestWindowOpen = () => IsOpen;
}
public WindowConfig WindowConfig => _configuration.DebugWindowConfig;