Update gathering from 'RequiredGatheredItems' to a dedicated InteractionType; updated movement logic to only evaluate distance to target after teleports and such

pull/50/head
Liza 2024-09-16 20:22:12 +02:00
parent fc72f52ee3
commit 9251111b05
Signed by: liza
GPG Key ID: 7199F8D727D55F67
92 changed files with 780 additions and 575 deletions

View File

@ -118,8 +118,8 @@ internal static class QuestStepExtensions
AssignmentList(nameof(QuestStep.RequiredQuestVariables), AssignmentList(nameof(QuestStep.RequiredQuestVariables),
step.RequiredQuestVariables) step.RequiredQuestVariables)
.AsSyntaxNodeOrToken(), .AsSyntaxNodeOrToken(),
AssignmentList(nameof(QuestStep.RequiredGatheredItems), AssignmentList(nameof(QuestStep.ItemsToGather),
step.RequiredGatheredItems), step.ItemsToGather),
AssignmentList(nameof(QuestStep.CompletionQuestVariablesFlags), AssignmentList(nameof(QuestStep.CompletionQuestVariablesFlags),
step.CompletionQuestVariablesFlags) step.CompletionQuestVariablesFlags)
.AsSyntaxNodeOrToken(), .AsSyntaxNodeOrToken(),

View File

@ -33,6 +33,16 @@
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"TerritoryId": 131,
"InteractionType": "Gather",
"ItemsToGather": [
{
"ItemId": 5106,
"ItemCount": 10
}
]
},
{ {
"DataId": 1002298, "DataId": 1002298,
"Position": { "Position": {
@ -54,13 +64,7 @@
131 131
] ]
} }
}, }
"RequiredGatheredItems": [
{
"ItemId": 5106,
"ItemCount": 10
}
]
} }
] ]
} }

View File

@ -33,6 +33,16 @@
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"TerritoryId": 131,
"InteractionType": "Gather",
"ItemsToGather": [
{
"ItemId": 5432,
"ItemCount": 10
}
]
},
{ {
"DataId": 1002298, "DataId": 1002298,
"Position": { "Position": {
@ -54,13 +64,7 @@
131 131
] ]
} }
}, }
"RequiredGatheredItems": [
{
"ItemId": 5432,
"ItemCount": 10
}
]
} }
] ]
} }

View File

@ -5,6 +5,11 @@
{ {
"Sequence": 0, "Sequence": 0,
"Steps": [ "Steps": [
{
"TerritoryId": 478,
"InteractionType": "Gather",
"ItemsToGather": []
},
{ {
"Position": { "Position": {
"X": -71.31451, "X": -71.31451,
@ -13,7 +18,6 @@
}, },
"TerritoryId": 478, "TerritoryId": 478,
"InteractionType": "WalkTo", "InteractionType": "WalkTo",
"RequiredGatheredItems": [],
"AetheryteShortcut": "Idyllshire" "AetheryteShortcut": "Idyllshire"
}, },
{ {

View File

@ -188,6 +188,16 @@
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"TerritoryId": 478,
"InteractionType": "Gather",
"ItemsToGather": [
{
"ItemId": 17946,
"ItemCount": 20
}
]
},
{ {
"DataId": 1021349, "DataId": 1021349,
"Position": { "Position": {
@ -202,12 +212,6 @@
"[Idyllshire] Aetheryte Plaza", "[Idyllshire] Aetheryte Plaza",
"[Idyllshire] West Idyllshire" "[Idyllshire] West Idyllshire"
], ],
"RequiredGatheredItems": [
{
"ItemId": 17946,
"ItemCount": 20
}
],
"NextQuestId": 2623 "NextQuestId": 2623
} }
] ]

View File

@ -122,6 +122,16 @@
{ {
"Sequence": 6, "Sequence": 6,
"Steps": [ "Steps": [
{
"TerritoryId": 478,
"InteractionType": "Gather",
"ItemsToGather": [
{
"ItemId": 17947,
"ItemCount": 20
}
]
},
{ {
"DataId": 1017106, "DataId": 1017106,
"Position": { "Position": {
@ -131,13 +141,7 @@
}, },
"TerritoryId": 478, "TerritoryId": 478,
"InteractionType": "Interact", "InteractionType": "Interact",
"AetheryteShortcut": "Idyllshire", "AetheryteShortcut": "Idyllshire"
"RequiredGatheredItems": [
{
"ItemId": 17947,
"ItemCount": 20
}
]
} }
] ]
}, },

View File

@ -156,6 +156,16 @@
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"TerritoryId": 478,
"InteractionType": "Gather",
"ItemsToGather": [
{
"ItemId": 17948,
"ItemCount": 5
}
]
},
{ {
"DataId": 1021349, "DataId": 1021349,
"Position": { "Position": {
@ -170,13 +180,7 @@
"[Idyllshire] Aetheryte Plaza", "[Idyllshire] Aetheryte Plaza",
"[Idyllshire] West Idyllshire" "[Idyllshire] West Idyllshire"
], ],
"Comment": "Eorzean Time: 4:00-5:59 AM/PM", "Comment": "Eorzean Time: 4:00-5:59 AM/PM"
"RequiredGatheredItems": [
{
"ItemId": 17948,
"ItemCount": 5
}
]
} }
] ]
} }

View File

@ -5,6 +5,11 @@
{ {
"Sequence": 0, "Sequence": 0,
"Steps": [ "Steps": [
{
"TerritoryId": 478,
"InteractionType": "Gather",
"ItemsToGather": []
},
{ {
"DataId": 1018393, "DataId": 1018393,
"Position": { "Position": {
@ -14,7 +19,6 @@
}, },
"TerritoryId": 478, "TerritoryId": 478,
"InteractionType": "Interact", "InteractionType": "Interact",
"RequiredGatheredItems": [],
"AetheryteShortcut": "Idyllshire", "AetheryteShortcut": "Idyllshire",
"DialogueChoices": [ "DialogueChoices": [
{ {

View File

@ -5,6 +5,11 @@
{ {
"Sequence": 0, "Sequence": 0,
"Steps": [ "Steps": [
{
"TerritoryId": 613,
"InteractionType": "Gather",
"ItemsToGather": []
},
{ {
"DataId": 1025878, "DataId": 1025878,
"Position": { "Position": {
@ -14,7 +19,6 @@
}, },
"TerritoryId": 613, "TerritoryId": 613,
"InteractionType": "Interact", "InteractionType": "Interact",
"RequiredGatheredItems": [],
"AetheryteShortcut": "Ruby Sea - Tamamizu", "AetheryteShortcut": "Ruby Sea - Tamamizu",
"DialogueChoices": [ "DialogueChoices": [
{ {

View File

@ -5,6 +5,11 @@
{ {
"Sequence": 0, "Sequence": 0,
"Steps": [ "Steps": [
{
"TerritoryId": 635,
"InteractionType": "Gather",
"ItemsToGather": []
},
{ {
"DataId": 1020337, "DataId": 1020337,
"Position": { "Position": {
@ -14,7 +19,6 @@
}, },
"TerritoryId": 635, "TerritoryId": 635,
"InteractionType": "Interact", "InteractionType": "Interact",
"RequiredGatheredItems": [],
"AetheryteShortcut": "Rhalgr's Reach", "AetheryteShortcut": "Rhalgr's Reach",
"AethernetShortcut": [ "AethernetShortcut": [
"[Rhalgr's Reach] Aetheryte Plaza", "[Rhalgr's Reach] Aetheryte Plaza",

View File

@ -21,16 +21,9 @@
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{ {
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817, "TerritoryId": 817,
"InteractionType": "WalkTo", "InteractionType": "Gather",
"AetheryteShortcut": "Rak'tika - Fanow", "ItemsToGather": [
"Fly": true,
"RequiredGatheredItems": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 29517, "ItemId": 29517,
@ -43,6 +36,17 @@
} }
] ]
}, },
{
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817,
"InteractionType": "WalkTo",
"AetheryteShortcut": "Rak'tika - Fanow",
"Fly": true
},
{ {
"DataId": 1032643, "DataId": 1032643,
"Position": { "Position": {

View File

@ -21,15 +21,9 @@
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{ {
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817, "TerritoryId": 817,
"InteractionType": "WalkTo", "InteractionType": "Gather",
"Fly": true, "ItemsToGather": [
"RequiredGatheredItems": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 29518, "ItemId": 29518,
@ -42,6 +36,16 @@
} }
] ]
}, },
{
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817,
"InteractionType": "WalkTo",
"Fly": true
},
{ {
"DataId": 1032643, "DataId": 1032643,
"Position": { "Position": {

View File

@ -21,16 +21,9 @@
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{ {
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817, "TerritoryId": 817,
"InteractionType": "WalkTo", "InteractionType": "Gather",
"AetheryteShortcut": "Rak'tika - Fanow", "ItemsToGather": [
"Fly": true,
"RequiredGatheredItems": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 29519, "ItemId": 29519,
@ -43,6 +36,17 @@
} }
] ]
}, },
{
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817,
"InteractionType": "WalkTo",
"AetheryteShortcut": "Rak'tika - Fanow",
"Fly": true
},
{ {
"DataId": 1032643, "DataId": 1032643,
"Position": { "Position": {

View File

@ -21,16 +21,9 @@
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{ {
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817, "TerritoryId": 817,
"InteractionType": "WalkTo", "InteractionType": "Gather",
"AetheryteShortcut": "Rak'tika - Fanow", "ItemsToGather": [
"Fly": true,
"RequiredGatheredItems": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 29520, "ItemId": 29520,
@ -43,6 +36,17 @@
} }
] ]
}, },
{
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817,
"InteractionType": "WalkTo",
"AetheryteShortcut": "Rak'tika - Fanow",
"Fly": true
},
{ {
"DataId": 1032643, "DataId": 1032643,
"Position": { "Position": {

View File

@ -88,9 +88,7 @@
"TerritoryId": 817, "TerritoryId": 817,
"InteractionType": "WalkTo", "InteractionType": "WalkTo",
"AetheryteShortcut": "Rak'tika - Fanow", "AetheryteShortcut": "Rak'tika - Fanow",
"Fly": true, "Fly": true
"RequiredGatheredItems": [
]
}, },
{ {
"DataId": 1032643, "DataId": 1032643,

View File

@ -21,16 +21,9 @@
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{ {
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817, "TerritoryId": 817,
"InteractionType": "WalkTo", "InteractionType": "Gather",
"AetheryteShortcut": "Rak'tika - Fanow", "ItemsToGather": [
"Fly": true,
"RequiredGatheredItems": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 29521, "ItemId": 29521,
@ -43,6 +36,17 @@
} }
] ]
}, },
{
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817,
"InteractionType": "WalkTo",
"AetheryteShortcut": "Rak'tika - Fanow",
"Fly": true
},
{ {
"DataId": 1032643, "DataId": 1032643,
"Position": { "Position": {

View File

@ -21,16 +21,9 @@
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{ {
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817, "TerritoryId": 817,
"InteractionType": "WalkTo", "InteractionType": "Gather",
"AetheryteShortcut": "Rak'tika - Fanow", "ItemsToGather": [
"Fly": true,
"RequiredGatheredItems": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 29522, "ItemId": 29522,
@ -43,6 +36,17 @@
} }
] ]
}, },
{
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817,
"InteractionType": "WalkTo",
"AetheryteShortcut": "Rak'tika - Fanow",
"Fly": true
},
{ {
"DataId": 1032643, "DataId": 1032643,
"Position": { "Position": {

View File

@ -21,16 +21,9 @@
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{ {
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817, "TerritoryId": 817,
"InteractionType": "WalkTo", "InteractionType": "Gather",
"AetheryteShortcut": "Rak'tika - Fanow", "ItemsToGather": [
"Fly": true,
"RequiredGatheredItems": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 29523, "ItemId": 29523,
@ -43,6 +36,17 @@
} }
] ]
}, },
{
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817,
"InteractionType": "WalkTo",
"AetheryteShortcut": "Rak'tika - Fanow",
"Fly": true
},
{ {
"DataId": 1032643, "DataId": 1032643,
"Position": { "Position": {

View File

@ -21,16 +21,9 @@
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{ {
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817, "TerritoryId": 817,
"InteractionType": "WalkTo", "InteractionType": "Gather",
"AetheryteShortcut": "Rak'tika - Fanow", "ItemsToGather": [
"Fly": true,
"RequiredGatheredItems": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 29524, "ItemId": 29524,
@ -43,6 +36,17 @@
} }
] ]
}, },
{
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817,
"InteractionType": "WalkTo",
"AetheryteShortcut": "Rak'tika - Fanow",
"Fly": true
},
{ {
"DataId": 1032643, "DataId": 1032643,
"Position": { "Position": {

View File

@ -30,9 +30,7 @@
"TerritoryId": 817, "TerritoryId": 817,
"InteractionType": "WalkTo", "InteractionType": "WalkTo",
"AetheryteShortcut": "Rak'tika - Fanow", "AetheryteShortcut": "Rak'tika - Fanow",
"Fly": true, "Fly": true
"RequiredGatheredItems": [
]
}, },
{ {
"DataId": 1032643, "DataId": 1032643,

View File

@ -30,9 +30,7 @@
"TerritoryId": 817, "TerritoryId": 817,
"InteractionType": "WalkTo", "InteractionType": "WalkTo",
"AetheryteShortcut": "Rak'tika - Fanow", "AetheryteShortcut": "Rak'tika - Fanow",
"Fly": true, "Fly": true
"RequiredGatheredItems": [
]
}, },
{ {
"DataId": 1032643, "DataId": 1032643,

View File

@ -30,9 +30,7 @@
"TerritoryId": 817, "TerritoryId": 817,
"InteractionType": "WalkTo", "InteractionType": "WalkTo",
"AetheryteShortcut": "Rak'tika - Fanow", "AetheryteShortcut": "Rak'tika - Fanow",
"Fly": true, "Fly": true
"RequiredGatheredItems": [
]
}, },
{ {
"DataId": 1032643, "DataId": 1032643,

View File

@ -21,16 +21,9 @@
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{ {
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817, "TerritoryId": 817,
"InteractionType": "WalkTo", "InteractionType": "Gather",
"AetheryteShortcut": "Rak'tika - Fanow", "ItemsToGather": [
"Fly": true,
"RequiredGatheredItems": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 29528, "ItemId": 29528,
@ -43,6 +36,17 @@
} }
] ]
}, },
{
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817,
"InteractionType": "WalkTo",
"AetheryteShortcut": "Rak'tika - Fanow",
"Fly": true
},
{ {
"DataId": 1032643, "DataId": 1032643,
"Position": { "Position": {

View File

@ -21,16 +21,9 @@
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{ {
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817, "TerritoryId": 817,
"InteractionType": "WalkTo", "InteractionType": "Gather",
"AetheryteShortcut": "Rak'tika - Fanow", "ItemsToGather": [
"Fly": true,
"RequiredGatheredItems": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 29529, "ItemId": 29529,
@ -43,6 +36,17 @@
} }
] ]
}, },
{
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817,
"InteractionType": "WalkTo",
"AetheryteShortcut": "Rak'tika - Fanow",
"Fly": true
},
{ {
"DataId": 1032643, "DataId": 1032643,
"Position": { "Position": {

View File

@ -21,16 +21,9 @@
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{ {
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817, "TerritoryId": 817,
"InteractionType": "WalkTo", "InteractionType": "Gather",
"AetheryteShortcut": "Rak'tika - Fanow", "ItemsToGather": [
"Fly": true,
"RequiredGatheredItems": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 29530, "ItemId": 29530,
@ -43,6 +36,17 @@
} }
] ]
}, },
{
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817,
"InteractionType": "WalkTo",
"AetheryteShortcut": "Rak'tika - Fanow",
"Fly": true
},
{ {
"DataId": 1032643, "DataId": 1032643,
"Position": { "Position": {

View File

@ -30,9 +30,7 @@
"TerritoryId": 817, "TerritoryId": 817,
"InteractionType": "WalkTo", "InteractionType": "WalkTo",
"AetheryteShortcut": "Rak'tika - Fanow", "AetheryteShortcut": "Rak'tika - Fanow",
"Fly": true, "Fly": true
"RequiredGatheredItems": [
]
}, },
{ {
"DataId": 1032643, "DataId": 1032643,

View File

@ -30,9 +30,7 @@
"TerritoryId": 817, "TerritoryId": 817,
"InteractionType": "WalkTo", "InteractionType": "WalkTo",
"AetheryteShortcut": "Rak'tika - Fanow", "AetheryteShortcut": "Rak'tika - Fanow",
"Fly": true, "Fly": true
"RequiredGatheredItems": [
]
}, },
{ {
"DataId": 1032643, "DataId": 1032643,

View File

@ -21,16 +21,9 @@
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{ {
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817, "TerritoryId": 817,
"InteractionType": "WalkTo", "InteractionType": "Gather",
"AetheryteShortcut": "Rak'tika - Fanow", "ItemsToGather": [
"Fly": true,
"RequiredGatheredItems": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 29533, "ItemId": 29533,
@ -43,6 +36,17 @@
} }
] ]
}, },
{
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817,
"InteractionType": "WalkTo",
"AetheryteShortcut": "Rak'tika - Fanow",
"Fly": true
},
{ {
"DataId": 1032643, "DataId": 1032643,
"Position": { "Position": {

View File

@ -21,16 +21,9 @@
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{ {
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817, "TerritoryId": 817,
"InteractionType": "WalkTo", "InteractionType": "Gather",
"AetheryteShortcut": "Rak'tika - Fanow", "ItemsToGather": [
"Fly": true,
"RequiredGatheredItems": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 29534, "ItemId": 29534,
@ -43,6 +36,17 @@
} }
] ]
}, },
{
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817,
"InteractionType": "WalkTo",
"AetheryteShortcut": "Rak'tika - Fanow",
"Fly": true
},
{ {
"DataId": 1032643, "DataId": 1032643,
"Position": { "Position": {

View File

@ -21,16 +21,9 @@
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{ {
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817, "TerritoryId": 817,
"InteractionType": "WalkTo", "InteractionType": "Gather",
"AetheryteShortcut": "Rak'tika - Fanow", "ItemsToGather": [
"Fly": true,
"RequiredGatheredItems": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 29535, "ItemId": 29535,
@ -43,6 +36,17 @@
} }
] ]
}, },
{
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817,
"InteractionType": "WalkTo",
"AetheryteShortcut": "Rak'tika - Fanow",
"Fly": true
},
{ {
"DataId": 1032643, "DataId": 1032643,
"Position": { "Position": {

View File

@ -21,16 +21,9 @@
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{ {
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817, "TerritoryId": 817,
"InteractionType": "WalkTo", "InteractionType": "Gather",
"AetheryteShortcut": "Rak'tika - Fanow", "ItemsToGather": [
"Fly": true,
"RequiredGatheredItems": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 29536, "ItemId": 29536,
@ -43,6 +36,17 @@
} }
] ]
}, },
{
"Position": {
"X": 788.1569,
"Y": -45.82557,
"Z": -212.9306
},
"TerritoryId": 817,
"InteractionType": "WalkTo",
"AetheryteShortcut": "Rak'tika - Fanow",
"Fly": true
},
{ {
"DataId": 1032643, "DataId": 1032643,
"Position": { "Position": {

View File

@ -30,9 +30,7 @@
"TerritoryId": 817, "TerritoryId": 817,
"InteractionType": "WalkTo", "InteractionType": "WalkTo",
"AetheryteShortcut": "Rak'tika - Fanow", "AetheryteShortcut": "Rak'tika - Fanow",
"Fly": true, "Fly": true
"RequiredGatheredItems": [
]
}, },
{ {
"DataId": 1032643, "DataId": 1032643,

View File

@ -30,9 +30,7 @@
"TerritoryId": 817, "TerritoryId": 817,
"InteractionType": "WalkTo", "InteractionType": "WalkTo",
"AetheryteShortcut": "Rak'tika - Fanow", "AetheryteShortcut": "Rak'tika - Fanow",
"Fly": true, "Fly": true
"RequiredGatheredItems": [
]
}, },
{ {
"DataId": 1032643, "DataId": 1032643,

View File

@ -91,6 +91,16 @@
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"TerritoryId": 817,
"InteractionType": "Gather",
"ItemsToGather": [
{
"ItemId": 29512,
"ItemCount": 1
}
]
},
{ {
"DataId": 1032724, "DataId": 1032724,
"Position": { "Position": {
@ -100,13 +110,7 @@
}, },
"TerritoryId": 817, "TerritoryId": 817,
"InteractionType": "CompleteQuest", "InteractionType": "CompleteQuest",
"Fly": true, "Fly": true
"RequiredGatheredItems": [
{
"ItemId": 29512,
"ItemCount": 1
}
]
} }
] ]
} }

View File

@ -38,17 +38,9 @@
"Sequence": 2, "Sequence": 2,
"Steps": [ "Steps": [
{ {
"DataId": 1032734,
"Position": {
"X": 802.6703,
"Y": -45.915627,
"Z": -214.70972
},
"TerritoryId": 817, "TerritoryId": 817,
"InteractionType": "Interact", "InteractionType": "Gather",
"AetheryteShortcut": "Rak'tika - Fanow", "ItemsToGather": [
"Fly": true,
"RequiredGatheredItems": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 29513, "ItemId": 29513,
@ -60,6 +52,18 @@
"ItemCount": 1 "ItemCount": 1
} }
] ]
},
{
"DataId": 1032734,
"Position": {
"X": 802.6703,
"Y": -45.915627,
"Z": -214.70972
},
"TerritoryId": 817,
"InteractionType": "Interact",
"AetheryteShortcut": "Rak'tika - Fanow",
"Fly": true
} }
] ]
}, },

View File

@ -5,6 +5,11 @@
{ {
"Sequence": 0, "Sequence": 0,
"Steps": [ "Steps": [
{
"TerritoryId": 820,
"InteractionType": "Gather",
"ItemsToGather": []
},
{ {
"DataId": 1031801, "DataId": 1031801,
"Position": { "Position": {
@ -14,7 +19,6 @@
}, },
"TerritoryId": 820, "TerritoryId": 820,
"InteractionType": "Interact", "InteractionType": "Interact",
"RequiredGatheredItems": [],
"AetheryteShortcut": "Eulmore", "AetheryteShortcut": "Eulmore",
"DialogueChoices": [ "DialogueChoices": [
{ {

View File

@ -22,8 +22,8 @@
"Steps": [ "Steps": [
{ {
"TerritoryId": 960, "TerritoryId": 960,
"InteractionType": "None", "InteractionType": "Gather",
"RequiredGatheredItems": [ "ItemsToGather": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 38281, "ItemId": 38281,

View File

@ -21,16 +21,9 @@
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{ {
"DataId": 2013072,
"Position": {
"X": 456.65674,
"Y": 438.04077,
"Z": 310.2312
},
"TerritoryId": 960, "TerritoryId": 960,
"InteractionType": "Interact", "InteractionType": "Gather",
"TargetTerritoryId": 960, "ItemsToGather": [
"RequiredGatheredItems": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 38282, "ItemId": 38282,
@ -41,8 +34,19 @@
"ItemId": 38306, "ItemId": 38306,
"ItemCount": 3 "ItemCount": 3
} }
], ]
"AetheryteShortcut": "Ultima Thule - Base Omicron" },
{
"DataId": 2013072,
"Position": {
"X": 456.65674,
"Y": 438.04077,
"Z": 310.2312
},
"TerritoryId": 960,
"InteractionType": "Interact",
"AetheryteShortcut": "Ultima Thule - Base Omicron",
"TargetTerritoryId": 960
}, },
{ {
"DataId": 1043417, "DataId": 1043417,

View File

@ -33,8 +33,8 @@
}, },
{ {
"TerritoryId": 1073, "TerritoryId": 1073,
"InteractionType": "None", "InteractionType": "Gather",
"RequiredGatheredItems": [ "ItemsToGather": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 38284, "ItemId": 38284,

View File

@ -21,17 +21,9 @@
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{ {
"DataId": 2013072,
"Position": {
"X": 456.65674,
"Y": 438.04077,
"Z": 310.2312
},
"TerritoryId": 960, "TerritoryId": 960,
"InteractionType": "Interact", "InteractionType": "Gather",
"TargetTerritoryId": 960, "ItemsToGather": [
"AetheryteShortcut": "Ultima Thule - Base Omicron",
"RequiredGatheredItems": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 38283, "ItemId": 38283,
@ -44,6 +36,18 @@
} }
] ]
}, },
{
"DataId": 2013072,
"Position": {
"X": 456.65674,
"Y": 438.04077,
"Z": 310.2312
},
"TerritoryId": 960,
"InteractionType": "Interact",
"TargetTerritoryId": 960,
"AetheryteShortcut": "Ultima Thule - Base Omicron"
},
{ {
"DataId": 1043417, "DataId": 1043417,
"Position": { "Position": {

View File

@ -33,8 +33,8 @@
}, },
{ {
"TerritoryId": 1073, "TerritoryId": 1073,
"InteractionType": "None", "InteractionType": "Gather",
"RequiredGatheredItems": [ "ItemsToGather": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 38285, "ItemId": 38285,

View File

@ -22,8 +22,8 @@
"Steps": [ "Steps": [
{ {
"TerritoryId": 960, "TerritoryId": 960,
"InteractionType": "None", "InteractionType": "Gather",
"RequiredGatheredItems": [ "ItemsToGather": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 38286, "ItemId": 38286,

View File

@ -34,8 +34,8 @@
}, },
{ {
"TerritoryId": 1073, "TerritoryId": 1073,
"InteractionType": "None", "InteractionType": "Gather",
"RequiredGatheredItems": [ "ItemsToGather": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 38287, "ItemId": 38287,

View File

@ -47,15 +47,9 @@
"Sequence": 2, "Sequence": 2,
"Steps": [ "Steps": [
{ {
"DataId": 1044059,
"Position": {
"X": -15.304871,
"Y": 494.9991,
"Z": -68.16211
},
"TerritoryId": 1073, "TerritoryId": 1073,
"InteractionType": "Interact", "InteractionType": "Gather",
"RequiredGatheredItems": [ "ItemsToGather": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 38289, "ItemId": 38289,
@ -67,6 +61,16 @@
"ItemCount": 3 "ItemCount": 3
} }
] ]
},
{
"DataId": 1044059,
"Position": {
"X": -15.304871,
"Y": 494.9991,
"Z": -68.16211
},
"TerritoryId": 1073,
"InteractionType": "Interact"
} }
] ]
}, },

View File

@ -21,17 +21,9 @@
"Sequence": 1, "Sequence": 1,
"Steps": [ "Steps": [
{ {
"DataId": 1044064,
"Position": {
"X": 86.503296,
"Y": 269.08234,
"Z": -515.0683
},
"TerritoryId": 960, "TerritoryId": 960,
"InteractionType": "Interact", "InteractionType": "Gather",
"AetheryteShortcut": "Ultima Thule - Abode of the Ea", "ItemsToGather": [
"Fly": true,
"RequiredGatheredItems": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 38290, "ItemId": 38290,
@ -43,6 +35,18 @@
"ItemCount": 3 "ItemCount": 3
} }
] ]
},
{
"DataId": 1044064,
"Position": {
"X": 86.503296,
"Y": 269.08234,
"Z": -515.0683
},
"TerritoryId": 960,
"InteractionType": "Interact",
"AetheryteShortcut": "Ultima Thule - Abode of the Ea",
"Fly": true
} }
] ]
}, },

View File

@ -34,8 +34,8 @@
}, },
{ {
"TerritoryId": 1073, "TerritoryId": 1073,
"InteractionType": "None", "InteractionType": "Gather",
"RequiredGatheredItems": [ "ItemsToGather": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 38291, "ItemId": 38291,

View File

@ -33,8 +33,8 @@
}, },
{ {
"TerritoryId": 1073, "TerritoryId": 1073,
"InteractionType": "None", "InteractionType": "Gather",
"RequiredGatheredItems": [ "ItemsToGather": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 38292, "ItemId": 38292,

View File

@ -33,8 +33,8 @@
}, },
{ {
"TerritoryId": 1073, "TerritoryId": 1073,
"InteractionType": "None", "InteractionType": "Gather",
"RequiredGatheredItems": [ "ItemsToGather": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 38293, "ItemId": 38293,

View File

@ -21,17 +21,9 @@
"Sequence": 1, "Sequence": 1,
"Steps": [ "Steps": [
{ {
"DataId": 1044071,
"Position": {
"X": 46.066895,
"Y": 268.99976,
"Z": -584.77155
},
"TerritoryId": 960, "TerritoryId": 960,
"InteractionType": "Interact", "InteractionType": "Gather",
"AetheryteShortcut": "Ultima Thule - Abode of the Ea", "ItemsToGather": [
"Fly": true,
"RequiredGatheredItems": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 38294, "ItemId": 38294,
@ -43,6 +35,18 @@
"ItemCount": 3 "ItemCount": 3
} }
] ]
},
{
"DataId": 1044071,
"Position": {
"X": 46.066895,
"Y": 268.99976,
"Z": -584.77155
},
"TerritoryId": 960,
"InteractionType": "Interact",
"AetheryteShortcut": "Ultima Thule - Abode of the Ea",
"Fly": true
} }
] ]
}, },

View File

@ -21,16 +21,9 @@
"Sequence": 1, "Sequence": 1,
"Steps": [ "Steps": [
{ {
"DataId": 1044074,
"Position": {
"X": -585.90063,
"Y": 75.22713,
"Z": 256.67188
},
"TerritoryId": 960, "TerritoryId": 960,
"InteractionType": "Interact", "InteractionType": "Gather",
"AetheryteShortcut": "Ultima Thule - Reah Tahra", "ItemsToGather": [
"RequiredGatheredItems": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 38295, "ItemId": 38295,
@ -42,6 +35,17 @@
"ItemCount": 3 "ItemCount": 3
} }
] ]
},
{
"DataId": 1044074,
"Position": {
"X": -585.90063,
"Y": 75.22713,
"Z": 256.67188
},
"TerritoryId": 960,
"InteractionType": "Interact",
"AetheryteShortcut": "Ultima Thule - Reah Tahra"
} }
] ]
}, },

View File

@ -47,15 +47,9 @@
"Sequence": 2, "Sequence": 2,
"Steps": [ "Steps": [
{ {
"DataId": 1044075,
"Position": {
"X": -64.4389,
"Y": 493.32922,
"Z": -4.409851
},
"TerritoryId": 1073, "TerritoryId": 1073,
"InteractionType": "Interact", "InteractionType": "Gather",
"RequiredGatheredItems": [ "ItemsToGather": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 38296, "ItemId": 38296,
@ -67,6 +61,16 @@
"ItemCount": 3 "ItemCount": 3
} }
] ]
},
{
"DataId": 1044075,
"Position": {
"X": -64.4389,
"Y": 493.32922,
"Z": -4.409851
},
"TerritoryId": 1073,
"InteractionType": "Interact"
} }
] ]
}, },

View File

@ -21,17 +21,9 @@
"Sequence": 1, "Sequence": 1,
"Steps": [ "Steps": [
{ {
"DataId": 1044076,
"Position": {
"X": -499.96188,
"Y": 77.00467,
"Z": 241.07727
},
"StopDistance": 9,
"TerritoryId": 960, "TerritoryId": 960,
"InteractionType": "Interact", "InteractionType": "Gather",
"AetheryteShortcut": "Ultima Thule - Reah Tahra", "ItemsToGather": [
"RequiredGatheredItems": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 38297, "ItemId": 38297,
@ -43,6 +35,18 @@
"ItemCount": 3 "ItemCount": 3
} }
] ]
},
{
"DataId": 1044076,
"Position": {
"X": -499.96188,
"Y": 77.00467,
"Z": 241.07727
},
"StopDistance": 9,
"TerritoryId": 960,
"InteractionType": "Interact",
"AetheryteShortcut": "Ultima Thule - Reah Tahra"
} }
] ]
}, },

View File

@ -21,16 +21,10 @@
"Sequence": 1, "Sequence": 1,
"Steps": [ "Steps": [
{ {
"DataId": 1044081,
"Position": {
"X": -503.99023,
"Y": 74.16917,
"Z": 261.82947
},
"TerritoryId": 960, "TerritoryId": 960,
"InteractionType": "Interact", "InteractionType": "Gather",
"AetheryteShortcut": "Ultima Thule - Reah Tahra", "AetheryteShortcut": "Ultima Thule - Reah Tahra",
"RequiredGatheredItems": [ "ItemsToGather": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 38299, "ItemId": 38299,
@ -42,6 +36,16 @@
"ItemCount": 3 "ItemCount": 3
} }
] ]
},
{
"DataId": 1044081,
"Position": {
"X": -503.99023,
"Y": 74.16917,
"Z": 261.82947
},
"TerritoryId": 960,
"InteractionType": "Interact"
} }
] ]
}, },

View File

@ -33,8 +33,8 @@
}, },
{ {
"TerritoryId": 1073, "TerritoryId": 1073,
"InteractionType": "None", "InteractionType": "Gather",
"RequiredGatheredItems": [ "ItemsToGather": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 38298, "ItemId": 38298,

View File

@ -113,6 +113,22 @@
{ {
"Sequence": 4, "Sequence": 4,
"Steps": [ "Steps": [
{
"TerritoryId": 960,
"InteractionType": "Gather",
"ItemsToGather": [
{
"QuestAcceptedAsClass": "Miner",
"ItemId": 38276,
"ItemCount": 3
},
{
"QuestAcceptedAsClass": "Botanist",
"ItemId": 38300,
"ItemCount": 3
}
]
},
{ {
"DataId": 2013072, "DataId": 2013072,
"Position": { "Position": {
@ -129,18 +145,6 @@
"Prompt": "TEXT_BANOMI001_04601_Q5_000_000", "Prompt": "TEXT_BANOMI001_04601_Q5_000_000",
"Yes": true "Yes": true
} }
],
"RequiredGatheredItems": [
{
"QuestAcceptedAsClass": "Miner",
"ItemId": 38276,
"ItemCount": 3
},
{
"QuestAcceptedAsClass": "Botanist",
"ItemId": 38300,
"ItemCount": 3
}
] ]
}, },
{ {

View File

@ -171,8 +171,8 @@
"Steps": [ "Steps": [
{ {
"TerritoryId": 960, "TerritoryId": 960,
"InteractionType": "None", "InteractionType": "Gather",
"RequiredGatheredItems": [ "ItemsToGather": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 38277, "ItemId": 38277,

View File

@ -139,8 +139,8 @@
"Steps": [ "Steps": [
{ {
"TerritoryId": 960, "TerritoryId": 960,
"InteractionType": "None", "InteractionType": "Gather",
"RequiredGatheredItems": [ "ItemsToGather": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 38278, "ItemId": 38278,

View File

@ -91,8 +91,8 @@
"Steps": [ "Steps": [
{ {
"TerritoryId": 398, "TerritoryId": 398,
"InteractionType": "None", "InteractionType": "Gather",
"RequiredGatheredItems": [ "ItemsToGather": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 38279, "ItemId": 38279,

View File

@ -156,8 +156,8 @@
"Steps": [ "Steps": [
{ {
"TerritoryId": 1073, "TerritoryId": 1073,
"InteractionType": "None", "InteractionType": "Gather",
"RequiredGatheredItems": [ "ItemsToGather": [
{ {
"QuestAcceptedAsClass": "Miner", "QuestAcceptedAsClass": "Miner",
"ItemId": 38280, "ItemId": 38280,

View File

@ -5,6 +5,11 @@
{ {
"Sequence": 0, "Sequence": 0,
"Steps": [ "Steps": [
{
"TerritoryId": 962,
"InteractionType": "Gather",
"ItemsToGather": []
},
{ {
"DataId": 1042241, "DataId": 1042241,
"Position": { "Position": {
@ -14,7 +19,6 @@
}, },
"TerritoryId": 962, "TerritoryId": 962,
"InteractionType": "Interact", "InteractionType": "Interact",
"RequiredGatheredItems": [],
"AetheryteShortcut": "Old Sharlayan", "AetheryteShortcut": "Old Sharlayan",
"AethernetShortcut": [ "AethernetShortcut": [
"[Old Sharlayan] Aetheryte Plaza", "[Old Sharlayan] Aetheryte Plaza",

View File

@ -5,6 +5,11 @@
{ {
"Sequence": 0, "Sequence": 0,
"Steps": [ "Steps": [
{
"TerritoryId": 816,
"InteractionType": "Gather",
"ItemsToGather": []
},
{ {
"DataId": 1044547, "DataId": 1044547,
"Position": { "Position": {
@ -14,7 +19,6 @@
}, },
"TerritoryId": 816, "TerritoryId": 816,
"InteractionType": "Interact", "InteractionType": "Interact",
"RequiredGatheredItems": [],
"AetheryteShortcut": "Il Mheg - Lydha Lran", "AetheryteShortcut": "Il Mheg - Lydha Lran",
"Fly": true, "Fly": true,
"DialogueChoices": [ "DialogueChoices": [

View File

@ -5,6 +5,11 @@
{ {
"Sequence": 0, "Sequence": 0,
"Steps": [ "Steps": [
{
"TerritoryId": 956,
"InteractionType": "Gather",
"ItemsToGather": []
},
{ {
"Position": { "Position": {
"X": -44.066154, "X": -44.066154,
@ -14,7 +19,6 @@
"TerritoryId": 956, "TerritoryId": 956,
"InteractionType": "WalkTo", "InteractionType": "WalkTo",
"AetheryteShortcut": "Labyrinthos - Sharlayan Hamlet", "AetheryteShortcut": "Labyrinthos - Sharlayan Hamlet",
"RequiredGatheredItems": [],
"Fly": true "Fly": true
}, },
{ {

View File

@ -20,6 +20,17 @@
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"TerritoryId": 962,
"InteractionType": "Gather",
"ItemsToGather": [
{
"ItemId": 35600,
"ItemCount": 6,
"Collectability": 600
}
]
},
{ {
"DataId": 1038501, "DataId": 1038501,
"Position": { "Position": {
@ -34,13 +45,6 @@
"[Old Sharlayan] Aetheryte Plaza", "[Old Sharlayan] Aetheryte Plaza",
"[Old Sharlayan] The Studium" "[Old Sharlayan] The Studium"
], ],
"RequiredGatheredItems": [
{
"ItemId": 35600,
"ItemCount": 6,
"Collectability": 600
}
],
"NextQuestId": 4155 "NextQuestId": 4155
} }
] ]

View File

@ -20,6 +20,17 @@
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"TerritoryId": 962,
"InteractionType": "Gather",
"ItemsToGather": [
{
"ItemId": 35601,
"ItemCount": 6,
"Collectability": 600
}
]
},
{ {
"DataId": 1038501, "DataId": 1038501,
"Position": { "Position": {
@ -34,13 +45,6 @@
"[Old Sharlayan] Aetheryte Plaza", "[Old Sharlayan] Aetheryte Plaza",
"[Old Sharlayan] The Studium" "[Old Sharlayan] The Studium"
], ],
"RequiredGatheredItems": [
{
"ItemId": 35601,
"ItemCount": 6,
"Collectability": 600
}
],
"NextQuestId": 4156 "NextQuestId": 4156
} }
] ]

View File

@ -20,6 +20,17 @@
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"TerritoryId": 962,
"InteractionType": "Gather",
"ItemsToGather": [
{
"ItemId": 35602,
"ItemCount": 6,
"Collectability": 600
}
]
},
{ {
"DataId": 1038501, "DataId": 1038501,
"Position": { "Position": {
@ -34,13 +45,6 @@
"[Old Sharlayan] Aetheryte Plaza", "[Old Sharlayan] Aetheryte Plaza",
"[Old Sharlayan] The Studium" "[Old Sharlayan] The Studium"
], ],
"RequiredGatheredItems": [
{
"ItemId": 35602,
"ItemCount": 6,
"Collectability": 600
}
],
"NextQuestId": 4157 "NextQuestId": 4157
} }
] ]

View File

@ -97,6 +97,16 @@
{ {
"Sequence": 5, "Sequence": 5,
"Steps": [ "Steps": [
{
"TerritoryId": 628,
"InteractionType": "Gather",
"ItemsToGather": [
{
"ItemId": 35847,
"ItemCount": 1
}
]
},
{ {
"DataId": 1038508, "DataId": 1038508,
"Position": { "Position": {
@ -110,12 +120,6 @@
"AethernetShortcut": [ "AethernetShortcut": [
"[Kugane] Aetheryte Plaza", "[Kugane] Aetheryte Plaza",
"[Kugane] The Ruby Bazaar" "[Kugane] The Ruby Bazaar"
],
"RequiredGatheredItems": [
{
"ItemId": 35847,
"ItemCount": 1
}
] ]
} }
] ]

View File

@ -20,6 +20,17 @@
{ {
"Sequence": 255, "Sequence": 255,
"Steps": [ "Steps": [
{
"TerritoryId": 962,
"InteractionType": "Gather",
"ItemsToGather": [
{
"ItemId": 35603,
"ItemCount": 6,
"Collectability": 600
}
]
},
{ {
"DataId": 1038501, "DataId": 1038501,
"Position": { "Position": {
@ -34,13 +45,6 @@
"[Old Sharlayan] Aetheryte Plaza", "[Old Sharlayan] Aetheryte Plaza",
"[Old Sharlayan] The Studium" "[Old Sharlayan] The Studium"
], ],
"RequiredGatheredItems": [
{
"ItemId": 35603,
"ItemCount": 6,
"Collectability": 600
}
],
"NextQuestId": 4159 "NextQuestId": 4159
} }
] ]

View File

@ -20,6 +20,16 @@
{ {
"Sequence": 1, "Sequence": 1,
"Steps": [ "Steps": [
{
"TerritoryId": 962,
"InteractionType": "Gather",
"ItemsToGather": [
{
"ItemId": 35848,
"ItemCount": 1
}
]
},
{ {
"DataId": 1038503, "DataId": 1038503,
"Position": { "Position": {
@ -33,12 +43,6 @@
"AethernetShortcut": [ "AethernetShortcut": [
"[Old Sharlayan] Aetheryte Plaza", "[Old Sharlayan] Aetheryte Plaza",
"[Old Sharlayan] The Studium" "[Old Sharlayan] The Studium"
],
"RequiredGatheredItems": [
{
"ItemId": 35848,
"ItemCount": 1
}
] ]
} }
] ]

View File

@ -22,18 +22,13 @@
"Steps": [ "Steps": [
{ {
"TerritoryId": 1185, "TerritoryId": 1185,
"InteractionType": "None", "InteractionType": "Gather",
"RequiredGatheredItems": [ "ItemsToGather": [
{ {
"ItemId": 43899, "ItemId": 43899,
"ItemCount": 6, "ItemCount": 6,
"Collectability": 600 "Collectability": 600
} }
],
"AetheryteShortcut": "Tuliyollal",
"AethernetShortcut": [
"[Tuliyollal] Aetheryte Plaza",
"[Tuliyollal] Wachumeqimeqi"
] ]
}, },
{ {
@ -45,7 +40,12 @@
}, },
"TerritoryId": 1185, "TerritoryId": 1185,
"InteractionType": "CompleteQuest", "InteractionType": "CompleteQuest",
"NextQuestId": 4991 "NextQuestId": 4991,
"AetheryteShortcut": "Tuliyollal",
"AethernetShortcut": [
"[Tuliyollal] Aetheryte Plaza",
"[Tuliyollal] Wachumeqimeqi"
]
} }
] ]
} }

View File

@ -22,18 +22,13 @@
"Steps": [ "Steps": [
{ {
"TerritoryId": 1185, "TerritoryId": 1185,
"InteractionType": "None", "InteractionType": "Gather",
"RequiredGatheredItems": [ "ItemsToGather": [
{ {
"ItemId": 43900, "ItemId": 43900,
"ItemCount": 6, "ItemCount": 6,
"Collectability": 600 "Collectability": 600
} }
],
"AetheryteShortcut": "Tuliyollal",
"AethernetShortcut": [
"[Tuliyollal] Aetheryte Plaza",
"[Tuliyollal] Wachumeqimeqi"
] ]
}, },
{ {
@ -45,7 +40,12 @@
}, },
"TerritoryId": 1185, "TerritoryId": 1185,
"InteractionType": "CompleteQuest", "InteractionType": "CompleteQuest",
"NextQuestId": 4992 "NextQuestId": 4992,
"AetheryteShortcut": "Tuliyollal",
"AethernetShortcut": [
"[Tuliyollal] Aetheryte Plaza",
"[Tuliyollal] Wachumeqimeqi"
]
} }
] ]
} }

View File

@ -22,18 +22,13 @@
"Steps": [ "Steps": [
{ {
"TerritoryId": 1185, "TerritoryId": 1185,
"InteractionType": "None", "InteractionType": "Gather",
"RequiredGatheredItems": [ "ItemsToGather": [
{ {
"ItemId": 43901, "ItemId": 43901,
"ItemCount": 6, "ItemCount": 6,
"Collectability": 600 "Collectability": 600
} }
],
"AetheryteShortcut": "Tuliyollal",
"AethernetShortcut": [
"[Tuliyollal] Aetheryte Plaza",
"[Tuliyollal] Wachumeqimeqi"
] ]
}, },
{ {
@ -45,7 +40,12 @@
}, },
"TerritoryId": 1185, "TerritoryId": 1185,
"InteractionType": "CompleteQuest", "InteractionType": "CompleteQuest",
"NextQuestId": 4993 "NextQuestId": 4993,
"AetheryteShortcut": "Tuliyollal",
"AethernetShortcut": [
"[Tuliyollal] Aetheryte Plaza",
"[Tuliyollal] Wachumeqimeqi"
]
} }
] ]
} }

View File

@ -41,17 +41,12 @@
"Steps": [ "Steps": [
{ {
"TerritoryId": 1185, "TerritoryId": 1185,
"InteractionType": "None", "InteractionType": "Gather",
"RequiredGatheredItems": [ "ItemsToGather": [
{ {
"ItemId": 43913, "ItemId": 43913,
"ItemCount": 1 "ItemCount": 1
} }
],
"AetheryteShortcut": "Tuliyollal",
"AethernetShortcut": [
"[Tuliyollal] Aetheryte Plaza",
"[Tuliyollal] Wachumeqimeqi"
] ]
}, },
{ {
@ -63,7 +58,12 @@
}, },
"TerritoryId": 1185, "TerritoryId": 1185,
"InteractionType": "CompleteQuest", "InteractionType": "CompleteQuest",
"NextQuestId": 4994 "NextQuestId": 4994,
"AetheryteShortcut": "Tuliyollal",
"AethernetShortcut": [
"[Tuliyollal] Aetheryte Plaza",
"[Tuliyollal] Wachumeqimeqi"
]
} }
] ]
} }

View File

@ -22,18 +22,13 @@
"Steps": [ "Steps": [
{ {
"TerritoryId": 1185, "TerritoryId": 1185,
"InteractionType": "None", "InteractionType": "Gather",
"RequiredGatheredItems": [ "ItemsToGather": [
{ {
"ItemId": 43902, "ItemId": 43902,
"ItemCount": 6, "ItemCount": 6,
"Collectability": 600 "Collectability": 600
} }
],
"AetheryteShortcut": "Tuliyollal",
"AethernetShortcut": [
"[Tuliyollal] Aetheryte Plaza",
"[Tuliyollal] Wachumeqimeqi"
] ]
}, },
{ {
@ -45,7 +40,12 @@
}, },
"TerritoryId": 1185, "TerritoryId": 1185,
"InteractionType": "CompleteQuest", "InteractionType": "CompleteQuest",
"NextQuestId": 4995 "NextQuestId": 4995,
"AetheryteShortcut": "Tuliyollal",
"AethernetShortcut": [
"[Tuliyollal] Aetheryte Plaza",
"[Tuliyollal] Wachumeqimeqi"
]
} }
] ]
} }

View File

@ -205,6 +205,16 @@
} }
} }
}, },
{
"TerritoryId": 1189,
"InteractionType": "Gather",
"ItemsToGather": [
{
"ItemId": 43914,
"ItemCount": 1
}
]
},
{ {
"Position": { "Position": {
"X": 674.17834, "X": 674.17834,
@ -213,13 +223,7 @@
}, },
"TerritoryId": 1189, "TerritoryId": 1189,
"InteractionType": "WalkTo", "InteractionType": "WalkTo",
"Fly": true, "Fly": true
"RequiredGatheredItems": [
{
"ItemId": 43914,
"ItemCount": 1
}
]
}, },
{ {
"Position": { "Position": {

View File

@ -23,8 +23,8 @@
}, },
{ {
"TerritoryId": 1188, "TerritoryId": 1188,
"InteractionType": "None", "InteractionType": "Gather",
"RequiredGatheredItems": [ "ItemsToGather": [
{ {
"ItemId": 2003516, "ItemId": 2003516,
"AlternativeItemId": 2003517, "AlternativeItemId": 2003517,

View File

@ -23,8 +23,8 @@
}, },
{ {
"TerritoryId": 1189, "TerritoryId": 1189,
"InteractionType": "None", "InteractionType": "Gather",
"RequiredGatheredItems": [ "ItemsToGather": [
{ {
"ItemId": 2003529, "ItemId": 2003529,
"AlternativeItemId": 2003530, "AlternativeItemId": 2003530,

View File

@ -23,8 +23,8 @@
}, },
{ {
"TerritoryId": 1187, "TerritoryId": 1187,
"InteractionType": "None", "InteractionType": "Gather",
"RequiredGatheredItems": [ "ItemsToGather": [
{ {
"ItemId": 2003539, "ItemId": 2003539,
"AlternativeItemId": 2003540, "AlternativeItemId": 2003540,

View File

@ -23,8 +23,8 @@
}, },
{ {
"TerritoryId": 1189, "TerritoryId": 1189,
"InteractionType": "None", "InteractionType": "Gather",
"RequiredGatheredItems": [ "ItemsToGather": [
{ {
"ItemId": 2003552, "ItemId": 2003552,
"AlternativeItemId": 2003553, "AlternativeItemId": 2003553,

View File

@ -130,6 +130,7 @@
"Jump", "Jump",
"Dive", "Dive",
"Craft", "Craft",
"Gather",
"Snipe", "Snipe",
"Instruction", "Instruction",
"AcceptQuest", "AcceptQuest",
@ -239,13 +240,19 @@
"QuestsAccepted": { "QuestsAccepted": {
"type": "array", "type": "array",
"items": { "items": {
"type": ["number", "string"] "type": [
"number",
"string"
]
} }
}, },
"QuestsCompleted": { "QuestsCompleted": {
"type": "array", "type": "array",
"items": { "items": {
"type": ["number", "string"] "type": [
"number",
"string"
]
} }
}, },
"AetheryteLocked": { "AetheryteLocked": {
@ -302,13 +309,19 @@
"QuestsAccepted": { "QuestsAccepted": {
"type": "array", "type": "array",
"items": { "items": {
"type": ["number", "string"] "type": [
"number",
"string"
]
} }
}, },
"QuestsCompleted": { "QuestsCompleted": {
"type": "array", "type": "array",
"items": { "items": {
"type": ["number", "string"] "type": [
"number",
"string"
]
} }
}, },
"AetheryteLocked": { "AetheryteLocked": {
@ -405,41 +418,6 @@
} }
} }
}, },
"RequiredGatheredItems": {
"type": "array",
"items": {
"type": "object",
"properties": {
"ItemId": {
"type": "number"
},
"AlternativeItemId": {
"description": "For leves that allow you to gather two items with different chance percentage, this is the preferred item if the gathering chance is 100% (after buffs)",
"type": "number"
},
"ItemCount": {
"type": "number",
"exclusiveMinimum": 0
},
"Collectability": {
"type": "number",
"minimum": 0,
"maximum": 1000
},
"QuestAcceptedAsClass": {
"type": "string",
"enum": [
"Miner",
"Botanist"
]
}
},
"required": [
"ItemId",
"ItemCount"
]
}
},
"DelaySecondsAtStart": { "DelaySecondsAtStart": {
"description": "Time to wait before starting", "description": "Time to wait before starting",
"type": [ "type": [
@ -1203,17 +1181,60 @@
"ItemCount" "ItemCount"
] ]
} }
} },
], {
"not": { "if": {
"anyOf": [ "properties": {
{ "InteractionType": {
"const": "Gather"
}
}
},
"then": {
"properties": {
"ItemsToGather": {
"type": "array",
"description": "Unlike crafting steps, which will always craft a single item id regardless of class, this allows for gathering different items depending on whether you've picked the quest up as miner or botanist",
"items": {
"type": "object",
"properties": {
"ItemId": {
"type": "number"
},
"AlternativeItemId": {
"description": "For leves that allow you to gather two items with different chance percentage, this is the preferred item if the gathering chance is 100% (after buffs)",
"type": "number"
},
"ItemCount": {
"type": "number",
"exclusiveMinimum": 0
},
"Collectability": {
"type": "number",
"minimum": 0,
"maximum": 1000
},
"QuestAcceptedAsClass": {
"type": "string",
"enum": [
"Miner",
"Botanist"
]
}
},
"required": [
"ItemId",
"ItemCount"
]
}
}
},
"required": [ "required": [
"SkipIf" "ItemsToGather"
] ]
} }
] }
} ]
} }
} }
} }

View File

@ -27,6 +27,7 @@ public sealed class InteractionTypeConverter() : EnumConverter<EInteractionType>
{ EInteractionType.Jump, "Jump" }, { EInteractionType.Jump, "Jump" },
{ EInteractionType.Dive, "Dive" }, { EInteractionType.Dive, "Dive" },
{ EInteractionType.Craft, "Craft" }, { EInteractionType.Craft, "Craft" },
{ EInteractionType.Gather, "Gather" },
{ EInteractionType.Snipe, "Snipe" }, { EInteractionType.Snipe, "Snipe" },
{ EInteractionType.Instruction, "Instruction" }, { EInteractionType.Instruction, "Instruction" },
{ EInteractionType.AcceptQuest, "AcceptQuest" }, { EInteractionType.AcceptQuest, "AcceptQuest" },

View File

@ -26,6 +26,7 @@ public enum EInteractionType
Jump, Jump,
Dive, Dive,
Craft, Craft,
Gather,
Snipe, Snipe,
/// <summary> /// <summary>
@ -38,7 +39,4 @@ public enum EInteractionType
AcceptLeve, AcceptLeve,
InitiateLeve, InitiateLeve,
CompleteLeve, CompleteLeve,
// unmapped extra types below
InternalGather,
} }

View File

@ -74,7 +74,7 @@ public sealed class QuestStep
public SkipConditions? SkipConditions { get; set; } public SkipConditions? SkipConditions { get; set; }
public List<List<QuestWorkValue>?> RequiredQuestVariables { get; set; } = new(); public List<List<QuestWorkValue>?> RequiredQuestVariables { get; set; } = new();
public List<GatheredItem> RequiredGatheredItems { get; set; } = []; public List<GatheredItem> ItemsToGather { get; set; } = [];
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; } = [];

View File

@ -134,8 +134,8 @@ internal sealed class ContextMenuController : IDisposable
.Single(x => x is SatisfactionSupplyInfo); .Single(x => x is SatisfactionSupplyInfo);
if (_questRegistry.TryGetQuest(info.QuestId, out Quest? quest)) if (_questRegistry.TryGetQuest(info.QuestId, out Quest? quest))
{ {
var step = quest.FindSequence(0)!.FindStep(0)!; var step = quest.FindSequence(0)!.Steps.Single(x => x.InteractionType == EInteractionType.Gather);
step.RequiredGatheredItems = step.ItemsToGather =
[ [
new GatheredItem new GatheredItem
{ {

View File

@ -658,9 +658,9 @@ internal sealed class InteractionUiController : IDisposable
step.TargetTerritoryId); step.TargetTerritoryId);
if (step != null && (step.TerritoryId != _clientState.TerritoryType || step.TargetTerritoryId == null) && if (step != null && (step.TerritoryId != _clientState.TerritoryType || step.TargetTerritoryId == null) &&
step.RequiredGatheredItems.Count > 0) step.InteractionType == EInteractionType.Gather)
{ {
if (_gatheringData.TryGetGatheringPointId(step.RequiredGatheredItems[0].ItemId, if (_gatheringData.TryGetGatheringPointId(step.ItemsToGather[0].ItemId,
(EClassJob?)_clientState.LocalPlayer?.ClassJob.Id ?? EClassJob.Adventurer, (EClassJob?)_clientState.LocalPlayer?.ClassJob.Id ?? EClassJob.Adventurer,
out GatheringPointId? gatheringPointId) && out GatheringPointId? gatheringPointId) &&
_gatheringPointRegistry.TryGetGatheringPoint(gatheringPointId, out GatheringRoot? root)) _gatheringPointRegistry.TryGetGatheringPoint(gatheringPointId, out GatheringRoot? root))

View File

@ -186,14 +186,13 @@ internal sealed unsafe class GatheringController : MiniTaskController<GatheringC
pointOnFloor = pointOnFloor.Value with { Y = pointOnFloor.Value.Y + (fly ? 3f : 0f) }; pointOnFloor = pointOnFloor.Value with { Y = pointOnFloor.Value.Y + (fly ? 3f : 0f) };
_taskQueue.Enqueue(_moveFactory.Move(new MoveTo.MoveParams(territoryId, pointOnFloor ?? averagePosition, _taskQueue.Enqueue(_moveFactory.Move(new MoveTo.MoveParams(territoryId, pointOnFloor ?? averagePosition,
50f, null, 50f, Fly: fly, IgnoreDistanceToObject: true)));
Fly: fly, IgnoreDistanceToObject: true)));
} }
_taskQueue.Enqueue(new MoveToLandingLocation(territoryId, fly, currentNode, _moveFactory, _gameFunctions, _taskQueue.Enqueue(new MoveToLandingLocation(territoryId, fly, currentNode, _moveFactory, _gameFunctions,
_objectTable, _loggerFactory.CreateLogger<MoveToLandingLocation>())); _objectTable, _loggerFactory.CreateLogger<MoveToLandingLocation>()));
_taskQueue.Enqueue(_mountFactory.Unmount()); _taskQueue.Enqueue(_mountFactory.Unmount());
_taskQueue.Enqueue(_interactFactory.Interact(currentNode.DataId, null, EInteractionType.InternalGather, true)); _taskQueue.Enqueue(_interactFactory.Interact(currentNode.DataId, null, EInteractionType.Gather, true));
QueueGatherNode(currentNode); QueueGatherNode(currentNode);
} }

View File

@ -81,7 +81,7 @@ internal abstract class MiniTaskController<T>
while (_taskQueue.TryDequeue(out ITask? nextTask)) while (_taskQueue.TryDequeue(out ITask? nextTask))
{ {
if (nextTask is ILastTask or GatheringRequiredItems.SkipMarker) if (nextTask is ILastTask or Gather.SkipMarker)
{ {
_currentTask = nextTask; _currentTask = nextTask;
return; return;

View File

@ -41,8 +41,8 @@ internal sealed class MoveToLandingLocation(
target.ToString("G", CultureInfo.InvariantCulture), degrees, range); target.ToString("G", CultureInfo.InvariantCulture), degrees, range);
bool fly = flyBetweenNodes && gameFunctions.IsFlyingUnlocked(territoryId); bool fly = flyBetweenNodes && gameFunctions.IsFlyingUnlocked(territoryId);
_moveTask = moveFactory.Move(new MoveTo.MoveParams(territoryId, target, 0.25f, DataId: gatheringNode.DataId, _moveTask = moveFactory.Move(new MoveTo.MoveParams(territoryId, target, null, 0.25f,
Fly: fly, IgnoreDistanceToObject: true)); DataId: gatheringNode.DataId, Fly: fly, IgnoreDistanceToObject: true));
return _moveTask.Start(); return _moveTask.Start();
} }

View File

@ -162,7 +162,7 @@ internal static class Interact
if (_interactionState == EInteractionState.InteractionConfirmed) if (_interactionState == EInteractionState.InteractionConfirmed)
return ETaskResult.TaskComplete; return ETaskResult.TaskComplete;
if (interactionType == EInteractionType.InternalGather && condition[ConditionFlag.Gathering]) if (interactionType == EInteractionType.Gather && condition[ConditionFlag.Gathering])
return ETaskResult.TaskComplete; return ETaskResult.TaskComplete;
} }

View File

@ -72,7 +72,7 @@ internal static class UseItem
mountFactory.Mount(140, mountFactory.Mount(140,
nextPosition != null ? Mount.EMountIf.AwayFromPosition : Mount.EMountIf.Always, nextPosition != null ? Mount.EMountIf.AwayFromPosition : Mount.EMountIf.Always,
nextPosition), nextPosition),
moveFactory.Move(new MoveTo.MoveParams(140, new(-408.92343f, 23.167036f, -351.16223f), 0.25f, moveFactory.Move(new MoveTo.MoveParams(140, new(-408.92343f, 23.167036f, -351.16223f), null, 0.25f,
DataId: null, DisableNavMesh: true, Sprint: false, Fly: false)) DataId: null, DisableNavMesh: true, Sprint: false, Fly: false))
]; ];
} }

View File

@ -16,7 +16,7 @@ using Questionable.Model.Questing;
namespace Questionable.Controller.Steps.Shared; namespace Questionable.Controller.Steps.Shared;
internal static class GatheringRequiredItems internal static class Gather
{ {
internal sealed class Factory( internal sealed class Factory(
IServiceProvider serviceProvider, IServiceProvider serviceProvider,
@ -30,20 +30,23 @@ internal static class GatheringRequiredItems
{ {
public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step) public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step)
{ {
foreach (var requiredGatheredItems in step.RequiredGatheredItems) if (step.InteractionType != EInteractionType.Gather)
yield break;
foreach (var itemToGather in step.ItemsToGather)
{ {
EClassJob currentClassJob = (EClassJob)clientState.LocalPlayer!.ClassJob.Id; EClassJob currentClassJob = (EClassJob)clientState.LocalPlayer!.ClassJob.Id;
EClassJob classJob = currentClassJob; EClassJob classJob = currentClassJob;
if (requiredGatheredItems.QuestAcceptedAsClass != null) if (itemToGather.QuestAcceptedAsClass != null)
{ {
classJob = (EClassJob)requiredGatheredItems.QuestAcceptedAsClass.Value; classJob = (EClassJob)itemToGather.QuestAcceptedAsClass.Value;
if (!IsClassJobQuestWasAcceptedWith(quest.Id, classJob)) if (!IsClassJobQuestWasAcceptedWith(quest.Id, classJob))
continue; continue;
} }
if (!gatheringData.TryGetGatheringPointId(requiredGatheredItems.ItemId, classJob, if (!gatheringData.TryGetGatheringPointId(itemToGather.ItemId, classJob,
out GatheringPointId? gatheringPointId)) out GatheringPointId? gatheringPointId))
throw new TaskException($"No gathering point found for item {requiredGatheredItems.ItemId}"); throw new TaskException($"No gathering point found for item {itemToGather.ItemId}");
if (!gatheringPointRegistry.TryGetGatheringPoint(gatheringPointId, out GatheringRoot? gatheringRoot)) if (!gatheringPointRegistry.TryGetGatheringPoint(gatheringPointId, out GatheringRoot? gatheringRoot))
throw new TaskException($"No path found for gathering point {gatheringPointId}"); throw new TaskException($"No path found for gathering point {gatheringPointId}");
@ -53,7 +56,7 @@ internal static class GatheringRequiredItems
yield return new SwitchClassJob(classJob, clientState); yield return new SwitchClassJob(classJob, clientState);
} }
if (HasRequiredItems(requiredGatheredItems)) if (HasRequiredItems(itemToGather))
continue; continue;
using (var _ = logger.BeginScope("Gathering(inner)")) using (var _ = logger.BeginScope("Gathering(inner)"))
@ -81,7 +84,7 @@ internal static class GatheringRequiredItems
yield return new WaitConditionTask(() => movementController.IsNavmeshReady, yield return new WaitConditionTask(() => movementController.IsNavmeshReady,
"Wait(navmesh ready)"); "Wait(navmesh ready)");
yield return CreateStartGatheringTask(gatheringPointId, requiredGatheredItems); yield return CreateStartGatheringTask(gatheringPointId, itemToGather);
yield return new WaitAtEnd.WaitDelay(); yield return new WaitAtEnd.WaitDelay();
} }
} }
@ -98,13 +101,13 @@ internal static class GatheringRequiredItems
return true; return true;
} }
private unsafe bool HasRequiredItems(GatheredItem requiredGatheredItems) private unsafe bool HasRequiredItems(GatheredItem itemToGather)
{ {
InventoryManager* inventoryManager = InventoryManager.Instance(); InventoryManager* inventoryManager = InventoryManager.Instance();
return inventoryManager != null && return inventoryManager != null &&
inventoryManager->GetInventoryItemCount(requiredGatheredItems.ItemId, inventoryManager->GetInventoryItemCount(itemToGather.ItemId,
minCollectability: (short)requiredGatheredItems.Collectability) >= minCollectability: (short)itemToGather.Collectability) >=
requiredGatheredItems.ItemCount; itemToGather.ItemCount;
} }
private StartGathering CreateStartGatheringTask(GatheringPointId gatheringPointId, GatheredItem gatheredItem) private StartGathering CreateStartGatheringTask(GatheringPointId gatheringPointId, GatheredItem gatheredItem)

View File

@ -67,7 +67,7 @@ internal static class MoveTo
public ITask Move(MoveParams moveParams) public ITask Move(MoveParams moveParams)
{ {
return new MoveInternal(moveParams, movementController, gameFunctions, return new MoveInternal(moveParams, movementController, mountFactory, gameFunctions,
loggerFactory.CreateLogger<MoveInternal>(), clientState, dataManager); loggerFactory.CreateLogger<MoveInternal>(), clientState, dataManager);
} }
@ -95,74 +95,18 @@ internal static class MoveTo
$"Wait(territory: {territoryData.GetNameAndId(step.TerritoryId)})"); $"Wait(territory: {territoryData.GetNameAndId(step.TerritoryId)})");
if (!step.DisableNavmesh) if (!step.DisableNavmesh)
{
yield return new WaitConditionTask(() => movementController.IsNavmeshReady, yield return new WaitConditionTask(() => movementController.IsNavmeshReady,
"Wait(navmesh ready)"); "Wait(navmesh ready)");
float stopDistance = step.CalculateActualStopDistance(); yield return Move(step, destination);
Vector3? position = clientState.LocalPlayer?.Position;
float actualDistance = position == null ? float.MaxValue : Vector3.Distance(position.Value, destination);
// if we teleport to a different zone, assume we always need to move; this is primarily relevant for cases
// where you're e.g. in Lakeland, and the step navigates via Crystarium → Tesselation back into the same
// zone.
//
// Side effects of this check being broken include:
// - mounting when near the target npc (if you spawn close enough for the next step)
// - trying to fly when near the target npc (if close enough where no movement is required)
if (step.AetheryteShortcut != null &&
aetheryteData.TerritoryIds[step.AetheryteShortcut.Value] != step.TerritoryId)
{
logger.LogDebug("Aetheryte: Changing distance to max, previous distance: {Distance}", actualDistance);
actualDistance = float.MaxValue;
}
// Fixes a case where you're initiating the gathering step when standing next to the NPC already
// TODO maybe this should be delayed up until starting movement
if (questId is SatisfactionSupplyNpcId)
{
logger.LogDebug("SatisfactionSupply: Changing distance to max, previous distance: {Distance}",
actualDistance);
actualDistance = float.MaxValue;
}
if (step.Mount == true)
yield return mountFactory.Mount(step.TerritoryId, Mount.EMountIf.Always);
else if (step.Mount == false)
yield return mountFactory.Unmount();
if (!step.DisableNavmesh)
{
if (step.Mount == null)
{
Mount.EMountIf mountIf =
actualDistance > stopDistance && step.Fly == true &&
gameFunctions.IsFlyingUnlocked(step.TerritoryId)
? Mount.EMountIf.Always
: Mount.EMountIf.AwayFromPosition;
yield return mountFactory.Mount(step.TerritoryId, mountIf, destination);
}
if (actualDistance > stopDistance)
{
yield return Move(step, destination);
}
else
logger.LogInformation("Skipping move task, distance: {ActualDistance} < {StopDistance}",
actualDistance, stopDistance);
} }
else else
{ {
// navmesh won't move close enough yield return Move(step, destination);
if (actualDistance > stopDistance)
{
yield return Move(step, destination);
}
else
logger.LogInformation("Skipping move task, distance: {ActualDistance} < {StopDistance}",
actualDistance, stopDistance);
} }
if (step.Fly == true && step.Land == true) if (step is { Fly: true, Land: true })
yield return Land(); yield return Land();
} }
} }
@ -171,6 +115,8 @@ internal static class MoveTo
{ {
private readonly string _cannotExecuteAtThisTime; private readonly string _cannotExecuteAtThisTime;
private readonly MovementController _movementController; private readonly MovementController _movementController;
private readonly Mount.Factory _mountFactory;
private readonly GameFunctions _gameFunctions;
private readonly ILogger<MoveInternal> _logger; private readonly ILogger<MoveInternal> _logger;
private readonly IClientState _clientState; private readonly IClientState _clientState;
@ -178,15 +124,19 @@ internal static class MoveTo
private readonly Vector3 _destination; private readonly Vector3 _destination;
private readonly MoveParams _moveParams; private readonly MoveParams _moveParams;
private bool _canRestart; private bool _canRestart;
private ITask? _mountTask;
public MoveInternal(MoveParams moveParams, public MoveInternal(MoveParams moveParams,
MovementController movementController, MovementController movementController,
Mount.Factory mountFactory,
GameFunctions gameFunctions, GameFunctions gameFunctions,
ILogger<MoveInternal> logger, ILogger<MoveInternal> logger,
IClientState clientState, IClientState clientState,
IDataManager dataManager) IDataManager dataManager)
{ {
_movementController = movementController; _movementController = movementController;
_mountFactory = mountFactory;
_gameFunctions = gameFunctions;
_logger = logger; _logger = logger;
_clientState = clientState; _clientState = clientState;
_cannotExecuteAtThisTime = dataManager.GetString<LogMessage>(579, x => x.Text)!; _cannotExecuteAtThisTime = dataManager.GetString<LogMessage>(579, x => x.Text)!;
@ -225,13 +175,65 @@ internal static class MoveTo
public bool Start() public bool Start()
{ {
_logger.LogInformation("Moving to {Destination}", _destination.ToString("G", CultureInfo.InvariantCulture)); float stopDistance = _moveParams.StopDistance ?? QuestStep.DefaultStopDistance;
_startAction(); Vector3? position = _clientState.LocalPlayer?.Position;
float actualDistance = position == null ? float.MaxValue : Vector3.Distance(position.Value, _destination);
if (_moveParams.Mount == true)
{
var mountTask = _mountFactory.Mount(_moveParams.TerritoryId, Mount.EMountIf.Always);
if (mountTask.Start())
{
_mountTask = mountTask;
return true;
}
}
else if (_moveParams.Mount == false)
{
var mountTask = _mountFactory.Unmount();
if (mountTask.Start())
{
_mountTask = mountTask;
return true;
}
}
if (!_moveParams.DisableNavMesh)
{
if (_moveParams.Mount == null)
{
Mount.EMountIf mountIf =
actualDistance > stopDistance && _moveParams.Fly &&
_gameFunctions.IsFlyingUnlocked(_moveParams.TerritoryId)
? Mount.EMountIf.Always
: Mount.EMountIf.AwayFromPosition;
var mountTask = _mountFactory.Mount(_moveParams.TerritoryId, mountIf, _destination);
if (mountTask.Start())
{
_mountTask = mountTask;
return true;
}
}
}
_mountTask = new NoOpTask();
return true; return true;
} }
public ETaskResult Update() public ETaskResult Update()
{ {
if (_mountTask != null)
{
if (_mountTask.Update() == ETaskResult.TaskComplete)
{
_mountTask = null;
_logger.LogInformation("Moving to {Destination}", _destination.ToString("G", CultureInfo.InvariantCulture));
_startAction();
}
return ETaskResult.StillRunning;
}
if (_movementController.IsPathfinding || _movementController.IsPathRunning) if (_movementController.IsPathfinding || _movementController.IsPathRunning)
return ETaskResult.StillRunning; return ETaskResult.StillRunning;
@ -269,9 +271,17 @@ internal static class MoveTo
} }
} }
private sealed class NoOpTask : ITask
{
public bool Start() => true;
public ETaskResult Update() => ETaskResult.TaskComplete;
}
internal sealed record MoveParams( internal sealed record MoveParams(
ushort TerritoryId, ushort TerritoryId,
Vector3 Destination, Vector3 Destination,
bool? Mount = null,
float? StopDistance = null, float? StopDistance = null,
uint? DataId = null, uint? DataId = null,
bool DisableNavMesh = false, bool DisableNavMesh = false,
@ -284,6 +294,7 @@ internal static class MoveTo
public MoveParams(QuestStep step, Vector3 destination) public MoveParams(QuestStep step, Vector3 destination)
: this(step.TerritoryId, : this(step.TerritoryId,
destination, destination,
step.Mount,
step.CalculateActualStopDistance(), step.CalculateActualStopDistance(),
step.DataId, step.DataId,
step.DisableNavmesh, step.DisableNavmesh,

View File

@ -137,7 +137,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin
// task factories // task factories
serviceCollection.AddTaskFactory<StepDisabled.Factory>(); serviceCollection.AddTaskFactory<StepDisabled.Factory>();
serviceCollection.AddTaskFactory<EquipRecommended.BeforeDutyOrInstance>(); serviceCollection.AddTaskFactory<EquipRecommended.BeforeDutyOrInstance>();
serviceCollection.AddTaskFactory<GatheringRequiredItems.Factory>(); serviceCollection.AddTaskFactory<Gather.Factory>();
serviceCollection.AddTaskFactory<AetheryteShortcut.Factory>(); serviceCollection.AddTaskFactory<AetheryteShortcut.Factory>();
serviceCollection.AddTaskFactory<SkipCondition.Factory>(); serviceCollection.AddTaskFactory<SkipCondition.Factory>();
serviceCollection.AddTaskFactory<AethernetShortcut.Factory>(); serviceCollection.AddTaskFactory<AethernetShortcut.Factory>();