.AsSyntaxNodeOrToken(),
AssignmentList(nameof(QuestStep.DialogueChoices), step.DialogueChoices)
.AsSyntaxNodeOrToken(),
+ AssignmentList(nameof(QuestStep.PointMenuChoices), step.PointMenuChoices)
+ .AsSyntaxNodeOrToken(),
Assignment(nameof(QuestStep.QuestId), step.QuestId, emptyStep.QuestId)
.AsSyntaxNodeOrToken()))))),
Token(SyntaxKind.CommaToken),
"Y": -129.27074,
"Z": -351.33496
},
+ "StopDistance": 0.25,
"TerritoryId": 1187,
"InteractionType": "Combat",
"EnemySpawnType": "AutoOnEnterArea",
}
]
},
+ {
+ "Sequence": 3,
+ "Steps": [
+ {
+ "Position": {
+ "X": 0,
+ "Y": 0,
+ "Z": 0
+ },
+ "TerritoryId": 1,
+ "InteractionType": "WalkTo",
+ "Comment": "Filler"
+ }
+ ]
+ },
{
"Sequence": 4,
"Steps": [
"Z": 129.80847
},
"TerritoryId": 1185,
- "InteractionType": "WaitForManualProgress",
- "Comment": "Click all tablets (PointMenu)",
+ "InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "YesNo",
"Prompt": "TEXT_KINGMA104_04863_Q2_000_000",
"Answer": "TEXT_KINGMA104_04863_A2_000_001"
}
+ ],
+ "PointMenuChoices": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 0,
+ 1,
+ 2,
+ 3
]
}
]
}
]
},
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "Position": {
+ "X": 0,
+ "Y": 0,
+ "Z": 0
+ },
+ "TerritoryId": 1,
+ "InteractionType": "WalkTo",
+ "Comment": "Filler"
+ }
+ ]
+ },
{
"Sequence": 3,
"Steps": [
"Z": -388.50995
},
"TerritoryId": 1188,
- "InteractionType": "Interact"
+ "InteractionType": "Interact",
+ "AetheryteShortcut": "Kozama'uka - Ok'hanu"
}
]
},
{
"Sequence": 8,
"Steps": [
+ {
+ "Position": {
+ "X": -510.96463,
+ "Y": -0.47684515,
+ "Z": -305.96155
+ },
+ "TerritoryId": 1188,
+ "InteractionType": "WalkTo",
+ "Comment": "Waypoint after swimming through the river"
+ },
{
"DataId": 2013936,
"Position": {
{
"Sequence": 4,
"Steps": [
+ {
+ "Position": {
+ "X": 303.21774,
+ "Y": 7.475274,
+ "Z": -215.19496
+ },
+ "TerritoryId": 1188,
+ "InteractionType": "WalkTo",
+ "DisableNavmesh": true,
+ "Mount": true
+ },
{
"DataId": 2013632,
"Position": {
"Z": -171.58777
},
"TerritoryId": 1187,
- "InteractionType": "WaitForManualProgress",
- "Comment": "Pick Disconcerted Hoobigo",
+ "InteractionType": "Interact",
"DialogueChoices": [
{
"Type": "List",
"Prompt": "TEXT_KINGMA114_04873_Q1_000_000",
"Answer": "TEXT_KINGMA114_04873_A1_000_001"
}
+ ],
+ "PointMenuChoices": [
+ 3
]
}
]
"Comment": "Wachumeqimeqi"
},
{
- "DataId": 1046763,
"Position": {
- "X": -114.64105,
- "Y": -19.642736,
- "Z": 201.12915
+ "X": -130.34163,
+ "Y": -14.999287,
+ "Z": 198.40685
},
"TerritoryId": 1185,
- "InteractionType": "Interact",
+ "InteractionType": "WalkTo",
"AethernetShortcut": [
"[Tuliyollal] Wachumeqimeqi",
"[Tuliyollal] The For'ard Cabins"
]
+ },
+ {
+ "Position": {
+ "X": -122.40268,
+ "Y": -19.754322,
+ "Z": 202.20439
+ },
+ "TerritoryId": 1185,
+ "InteractionType": "WalkTo",
+ "DisableNavmesh": true
+ },
+ {
+ "DataId": 1046763,
+ "Position": {
+ "X": -114.64105,
+ "Y": -19.642736,
+ "Z": 201.12915
+ },
+ "TerritoryId": 1185,
+ "InteractionType": "Interact"
}
]
},
}
]
},
+ {
+ "Sequence": 4,
+ "Steps": [
+ {
+ "Position": {
+ "X": 0,
+ "Y": 0,
+ "Z": 0
+ },
+ "TerritoryId": 1,
+ "InteractionType": "WalkTo",
+ "Comment": "Filler"
+ }
+ ]
+ },
{
"Sequence": 5,
"Steps": [
{
"Sequence": 1,
"Steps": [
- {
- "DataId": 2013943,
- "Position": {
- "X": 485.89294,
- "Y": 121.3855,
- "Z": 831.29626
- },
- "TerritoryId": 1188,
- "InteractionType": "AttuneAetherCurrent",
- "AetherCurrentId": 2818428
- },
{
"DataId": 203,
"Position": {
"TerritoryId": 1188,
"InteractionType": "AttuneAetheryte"
},
+ {
+ "Position": {
+ "X": 533.37555,
+ "Y": 122.98077,
+ "Z": 790.01416
+ },
+ "TerritoryId": 1188,
+ "InteractionType": "WalkTo",
+ "AetheryteShortcut": "Tuliyollal",
+ "AethernetShortcut": [
+ "[Tuliyollal] Aetheryte Plaza",
+ "[Tuliyollal] Ihuykatumu (Kozama'uka)"
+ ]
+ },
+ {
+ "Position": {
+ "X": 522.3003,
+ "Y": 120.81023,
+ "Z": 803.62744
+ },
+ "TerritoryId": 1188,
+ "InteractionType": "WalkTo",
+ "DisableNavmesh": true
+ },
+ {
+ "DataId": 2013943,
+ "Position": {
+ "X": 485.89294,
+ "Y": 121.3855,
+ "Z": 831.29626
+ },
+ "TerritoryId": 1188,
+ "InteractionType": "AttuneAetherCurrent",
+ "AetherCurrentId": 2818428
+ },
{
"DataId": 1046603,
"Position": {
"Z": 259.66272
},
"TerritoryId": 1188,
- "InteractionType": "Interact"
+ "InteractionType": "Interact",
+ "AetheryteShortcut": "Kozama'uka - Many Fires"
}
]
},
"Y": 122.89019,
"Z": 348.47034
},
+ "StopDistance": 5,
"TerritoryId": 1188,
"InteractionType": "CompleteQuest"
}
"Y": 122.950645,
"Z": 345.6626
},
+ "StopDistance": 5,
"TerritoryId": 1188,
"InteractionType": "AcceptQuest"
}
"Y": -17.964504,
"Z": 166.55212
},
+ "StopDistance": 5,
"TerritoryId": 1185,
"InteractionType": "Interact"
}
}
]
},
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "Position": {
+ "X": 0,
+ "Y": 0,
+ "Z": 0
+ },
+ "TerritoryId": 1,
+ "InteractionType": "WalkTo",
+ "Comment": "Filler"
+ }
+ ]
+ },
{
"Sequence": 3,
"Steps": [
},
"TerritoryId": 1188,
"InteractionType": "WaitForNpcAtPosition",
- "NpcWaitDistance": 1
+ "NpcWaitDistance": 3
},
{
"DataId": 1046648,
{
"Sequence": 1,
"Steps": [
+ {
+ "Position": {
+ "X": 531.60944,
+ "Y": 116.17938,
+ "Z": 166.65599
+ },
+ "TerritoryId": 1188,
+ "InteractionType": "WalkTo"
+ },
{
"DataId": 2013610,
"Position": {
"Y": 110.795235,
"Z": 256.5983
},
+ "StopDistance": 0.25,
"TerritoryId": 1188,
"InteractionType": "Combat",
"EnemySpawnType": "AutoOnEnterArea",
"Z": 229.96863
},
"TerritoryId": 1188,
- "InteractionType": "Interact",
- "Comment": "TODO Verify this is the correct sequence"
+ "InteractionType": "Interact"
}
]
},
"Z": 465.87305
},
"TerritoryId": 1188,
- "InteractionType": "Interact"
+ "InteractionType": "Interact",
+ "AetheryteShortcut": "Kozama'uka - Earthenshire"
}
]
},
},
{
"Position": {
- "X": 282.9373,
- "Y": 47.77521,
- "Z": 140.4986
+ "X": 341.56342,
+ "Y": 57.53834,
+ "Z": 10.309054
+ },
+ "TerritoryId": 1187,
+ "InteractionType": "WalkTo"
+ },
+ {
+ "Position": {
+ "X": 308.72827,
+ "Y": 60.2934,
+ "Z": 111.43004
},
"TerritoryId": 1187,
"InteractionType": "WalkTo"
"Y": 129.04724,
"Z": 652.12476
},
+ "StopDistance": 5,
"TerritoryId": 1187,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
"Y": 111.135,
"Z": 557.7324
},
+ "StopDistance": 5,
"TerritoryId": 1187,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
"Y": 111.135,
"Z": 697.4745
},
+ "StopDistance": 5,
"TerritoryId": 1187,
"InteractionType": "Interact",
"CompletionQuestVariablesFlags": [
"Y": 109.359344,
"Z": 395.2364
},
+ "StopDistance": 0.25,
"TerritoryId": 1187,
"InteractionType": "Combat",
"EnemySpawnType": "AutoOnEnterArea",
}
]
},
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "Position": {
+ "X": 0,
+ "Y": 0,
+ "Z": 0
+ },
+ "TerritoryId": 1,
+ "InteractionType": "WalkTo",
+ "Comment": "Filler"
+ }
+ ]
+ },
{
"Sequence": 3,
"Steps": [
"Z": -403.21973
},
"TerritoryId": 1189,
- "InteractionType": "Interact",
- "Comment": "TODO Verify this shouldn't have a teleport (was removed due to AC moving)"
+ "InteractionType": "Interact"
}
]
},
"Y": 19.501463,
"Z": -358.05298
},
+ "StopDistance": 5,
"TerritoryId": 1189,
"InteractionType": "AcceptQuest"
}
}
]
},
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "Position": {
+ "X": 0,
+ "Y": 0,
+ "Z": 0
+ },
+ "TerritoryId": 1,
+ "InteractionType": "WalkTo",
+ "Comment": "Filler"
+ }
+ ]
+ },
{
"Sequence": 3,
"Steps": [
}
]
},
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "Position": {
+ "X": 0,
+ "Y": 0,
+ "Z": 0
+ },
+ "TerritoryId": 1,
+ "InteractionType": "WalkTo",
+ "Comment": "Filler"
+ }
+ ]
+ },
{
"Sequence": 3,
"Steps": [
}
]
},
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "Position": {
+ "X": 0,
+ "Y": 0,
+ "Z": 0
+ },
+ "TerritoryId": 1,
+ "InteractionType": "WalkTo",
+ "Comment": "Filler"
+ }
+ ]
+ },
{
"Sequence": 3,
"Steps": [
}
]
},
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "Position": {
+ "X": 0,
+ "Y": 0,
+ "Z": 0
+ },
+ "TerritoryId": 1,
+ "InteractionType": "WalkTo",
+ "Comment": "Filler"
+ }
+ ]
+ },
{
"Sequence": 3,
"Steps": [
}
]
},
+ {
+ "Sequence": 3,
+ "Steps": [
+ {
+ "Position": {
+ "X": 0,
+ "Y": 0,
+ "Z": 0
+ },
+ "TerritoryId": 1,
+ "InteractionType": "WalkTo",
+ "Comment": "Filler"
+ }
+ ]
+ },
{
"Sequence": 4,
"Steps": [
}
]
},
+ {
+ "Sequence": 5,
+ "Steps": [
+ {
+ "Position": {
+ "X": 0,
+ "Y": 0,
+ "Z": 0
+ },
+ "TerritoryId": 1,
+ "InteractionType": "WalkTo",
+ "Comment": "Filler"
+ }
+ ]
+ },
{
"Sequence": 6,
"Steps": [
}
]
},
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "Position": {
+ "X": 0,
+ "Y": 0,
+ "Z": 0
+ },
+ "TerritoryId": 1,
+ "InteractionType": "WalkTo",
+ "Comment": "Filler"
+ }
+ ]
+ },
{
"Sequence": 3,
"Steps": [
}
]
},
+ {
+ "Sequence": 4,
+ "Steps": [
+ {
+ "Position": {
+ "X": 0,
+ "Y": 0,
+ "Z": 0
+ },
+ "TerritoryId": 1,
+ "InteractionType": "WalkTo",
+ "Comment": "Filler"
+ }
+ ]
+ },
{
"Sequence": 5,
"Steps": [
}
]
},
+ {
+ "Sequence": 3,
+ "Steps": [
+ {
+ "Position": {
+ "X": 0,
+ "Y": 0,
+ "Z": 0
+ },
+ "TerritoryId": 1,
+ "InteractionType": "WalkTo",
+ "Comment": "Filler"
+ }
+ ]
+ },
{
"Sequence": 4,
"Steps": [
"Z": 201.28174
},
"TerritoryId": 1185,
- "InteractionType": "Interact"
+ "InteractionType": "AcceptQuest"
}
]
}
"Z": 194.72034
},
"TerritoryId": 1185,
+ "InteractionType": "AcceptQuest"
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 1048335,
+ "Position": {
+ "X": -16.739136,
+ "Y": 0.5999997,
+ "Z": -55.10034
+ },
+ "TerritoryId": 963,
+ "InteractionType": "Interact",
+ "AetheryteShortcut": "Radz-at-Han"
+ }
+ ]
+ },
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "DataId": 1048337,
+ "Position": {
+ "X": 155.87085,
+ "Y": 5.297462,
+ "Z": 618.2803
+ },
+ "TerritoryId": 957,
"InteractionType": "Interact"
}
]
+ },
+ {
+ "Sequence": 3,
+ "Steps": [
+ {
+ "DataId": 2013708,
+ "Position": {
+ "X": 48.90515,
+ "Y": 90.22656,
+ "Z": -83.024414
+ },
+ "StopDistance": 0.5,
+ "TerritoryId": 957,
+ "InteractionType": "Interact"
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1048331,
+ "Position": {
+ "X": 214.03821,
+ "Y": 5.2600574,
+ "Z": 628.3817
+ },
+ "TerritoryId": 957,
+ "InteractionType": "CompleteQuest"
+ }
+ ]
}
]
}
--- /dev/null
+{
+ "$schema": "https://carvel.li/questionable/quest-1.0",
+ "Author": "liza",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "DataId": 1048331,
+ "Position": {
+ "X": 214.03821,
+ "Y": 5.2600574,
+ "Z": 628.3817
+ },
+ "TerritoryId": 957,
+ "InteractionType": "AcceptQuest"
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 1048332,
+ "Position": {
+ "X": 52.506226,
+ "Y": -5.20688E-07,
+ "Z": -54.154297
+ },
+ "TerritoryId": 963,
+ "InteractionType": "Interact",
+ "AetheryteShortcut": "Radz-at-Han"
+ }
+ ]
+ },
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "DataId": 1048340,
+ "Position": {
+ "X": -186.69415,
+ "Y": 4.0499983,
+ "Z": -108.11017
+ },
+ "TerritoryId": 963,
+ "InteractionType": "Interact",
+ "AethernetShortcut": [
+ "[Radz-at-Han] Aetheryte Plaza",
+ "[Radz-at-Han] Hall of the Radiant Host"
+ ]
+ }
+ ]
+ },
+ {
+ "Sequence": 3,
+ "Steps": [
+ {
+ "DataId": 1048332,
+ "Position": {
+ "X": 52.506226,
+ "Y": -5.20688E-07,
+ "Z": -54.154297
+ },
+ "TerritoryId": 963,
+ "InteractionType": "Interact",
+ "AethernetShortcut": [
+ "[Radz-at-Han] Hall of the Radiant Host",
+ "[Radz-at-Han] Aetheryte Plaza"
+ ]
+ }
+ ]
+ },
+ {
+ "Sequence": 4,
+ "Steps": [
+ {
+ "DataId": 1048343,
+ "Position": {
+ "X": -336.53772,
+ "Y": 52.243706,
+ "Z": -165.05688
+ },
+ "TerritoryId": 957,
+ "InteractionType": "Interact",
+ "AetheryteShortcut": "Thavnair - Great Work"
+ }
+ ]
+ },
+ {
+ "Sequence": 5,
+ "Steps": [
+ {
+ "Position": {
+ "X": -427.5108,
+ "Y": -0.015813708,
+ "Z": -710.37146
+ },
+ "StopDistance": 0.25,
+ "TerritoryId": 957,
+ "InteractionType": "Combat",
+ "EnemySpawnType": "AutoOnEnterArea",
+ "KillEnemyDataIds": [
+ 17625
+ ]
+ }
+ ]
+ },
+ {
+ "Sequence": 6,
+ "Steps": [
+ {
+ "DataId": 1048344,
+ "Position": {
+ "X": -419.028,
+ "Y": 0.06509568,
+ "Z": -710.9331
+ },
+ "StopDistance": 7,
+ "TerritoryId": 957,
+ "InteractionType": "Interact"
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1048331,
+ "Position": {
+ "X": 214.03821,
+ "Y": 5.2600574,
+ "Z": 628.3817
+ },
+ "TerritoryId": 957,
+ "InteractionType": "CompleteQuest"
+ }
+ ]
+ }
+ ]
+}
--- /dev/null
+{
+ "$schema": "https://carvel.li/questionable/quest-1.0",
+ "Author": "liza",
+ "QuestSequence": [
+ {
+ "Sequence": 0,
+ "Steps": [
+ {
+ "DataId": 1048331,
+ "Position": {
+ "X": 214.03821,
+ "Y": 5.2600574,
+ "Z": 628.3817
+ },
+ "TerritoryId": 957,
+ "InteractionType": "AcceptQuest"
+ }
+ ]
+ },
+ {
+ "Sequence": 1,
+ "Steps": [
+ {
+ "DataId": 1048348,
+ "Position": {
+ "X": -118.76105,
+ "Y": 88.94139,
+ "Z": -556.90857
+ },
+ "TerritoryId": 957,
+ "InteractionType": "Interact"
+ }
+ ]
+ },
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "Position": {
+ "X": 77.94611,
+ "Y": 82.44486,
+ "Z": -548.9286
+ },
+ "StopDistance": 10,
+ "TerritoryId": 957,
+ "InteractionType": "Instruction",
+ "EnemySpawnType": "AutoOnEnterArea",
+ "KillEnemyDataIds": [
+ 17626
+ ],
+ "ItemId": 2003495,
+ "Comment": "TODO Needs item use?"
+ }
+ ]
+ },
+ {
+ "Sequence": 3,
+ "Steps": [
+ {
+ "DataId": 1048348,
+ "Position": {
+ "X": -118.76105,
+ "Y": 88.94139,
+ "Z": -556.90857
+ },
+ "TerritoryId": 957,
+ "InteractionType": "Interact"
+ }
+ ]
+ },
+ {
+ "Sequence": 4,
+ "Steps": [
+ {
+ "DataId": 1048350,
+ "Position": {
+ "X": -508.53745,
+ "Y": 12.375278,
+ "Z": 97.3678
+ },
+ "TerritoryId": 957,
+ "InteractionType": "Interact",
+ "AetheryteShortcut": "Thavnair - Great Work"
+ }
+ ]
+ },
+ {
+ "Sequence": 5,
+ "Steps": [
+ {
+ "DataId": 1048354,
+ "Position": {
+ "X": 154.28394,
+ "Y": 5.2641535,
+ "Z": 618.40234
+ },
+ "TerritoryId": 957,
+ "InteractionType": "Interact",
+ "AetheryteShortcut": "Thavnair - Yedlihmad",
+ "CompletionQuestVariablesFlags": [
+ null,
+ null,
+ null,
+ null,
+ null,
+ 32
+ ]
+ },
+ {
+ "DataId": 1048355,
+ "Position": {
+ "X": 227.98499,
+ "Y": 10.19656,
+ "Z": 563.31726
+ },
+ "TerritoryId": 957,
+ "InteractionType": "Interact",
+ "CompletionQuestVariablesFlags": [
+ null,
+ null,
+ null,
+ null,
+ null,
+ 64
+ ]
+ },
+ {
+ "DataId": 1048352,
+ "Position": {
+ "X": 195.5138,
+ "Y": 15.136732,
+ "Z": 529.015
+ },
+ "TerritoryId": 957,
+ "InteractionType": "Interact",
+ "CompletionQuestVariablesFlags": [
+ null,
+ null,
+ null,
+ null,
+ null,
+ 128
+ ]
+ }
+ ]
+ },
+ {
+ "Sequence": 255,
+ "Steps": [
+ {
+ "DataId": 1048331,
+ "Position": {
+ "X": 214.03821,
+ "Y": 5.2600574,
+ "Z": 628.3817
+ },
+ "TerritoryId": 957,
+ "InteractionType": "CompleteQuest"
+ }
+ ]
+ }
+ ]
+}
"Z": 198.68762
},
"TerritoryId": 1185,
- "InteractionType": "Interact"
+ "InteractionType": "AcceptQuest"
}
]
}
"Z": 203.38745
},
"TerritoryId": 1185,
- "InteractionType": "Interact"
+ "InteractionType": "AcceptQuest"
}
]
}
}
]
},
+ {
+ "Sequence": 3,
+ "Steps": [
+ {
+ "Position": {
+ "X": 0,
+ "Y": 0,
+ "Z": 0
+ },
+ "TerritoryId": 1,
+ "InteractionType": "WalkTo",
+ "Comment": "Filler"
+ }
+ ]
+ },
{
"Sequence": 4,
"Steps": [
}
]
}
+ },
+ "PointMenuChoices": {
+ "type": "array",
+ "items": {
+ "type": "integer",
+ "minimum": 0
+ }
}
}
}
public IList<ESkipCondition> SkipIf { get; set; } = new List<ESkipCondition>();
public IList<short?> CompletionQuestVariablesFlags { get; set; } = new List<short?>();
public IList<DialogueChoice> DialogueChoices { get; set; } = new List<DialogueChoice>();
+ public IList<uint> PointMenuChoices { get; set; } = new List<uint>();
public ushort? QuestId { get; set; }
[JsonConstructor]
_addonLifecycle.RegisterListener(AddonEvent.PostSetup, "CutSceneSelectString", CutsceneSelectStringPostSetup);
_addonLifecycle.RegisterListener(AddonEvent.PostSetup, "SelectIconString", SelectIconStringPostSetup);
_addonLifecycle.RegisterListener(AddonEvent.PostSetup, "SelectYesno", SelectYesnoPostSetup);
+ _addonLifecycle.RegisterListener(AddonEvent.PostSetup, "PointMenu", PointMenuPostSetup);
_addonLifecycle.RegisterListener(AddonEvent.PostSetup, "Credit", CreditPostSetup);
_addonLifecycle.RegisterListener(AddonEvent.PostSetup, "AkatsukiNote", UnendingCodexPostSetup);
_addonLifecycle.RegisterListener(AddonEvent.PostSetup, "ContentsTutorial", ContentsTutorialPostSetup);
_logger.LogInformation("SelectYesno window is open");
SelectYesnoPostSetup(addonSelectYesno, true);
}
+
+ if (_gameGui.TryGetAddonByName("PointMenu", out AtkUnitBase* addonPointMenu))
+ {
+ _logger.LogInformation("PointMenu is open");
+ PointMenuPostSetup(addonPointMenu);
+ }
}
private unsafe void SelectStringPostSetup(AddonEvent type, AddonArgs args)
}
}
+ private unsafe void PointMenuPostSetup(AddonEvent type, AddonArgs args)
+ {
+ AtkUnitBase* addonPointMenu = (AtkUnitBase*)args.Addon;
+ PointMenuPostSetup(addonPointMenu);
+ }
+
+ private unsafe void PointMenuPostSetup(AtkUnitBase* addonPointMenu)
+ {
+ var currentQuest = _questController.CurrentQuest;
+ if (currentQuest == null)
+ {
+ _logger.LogInformation("Ignoring point menu, no active quest");
+ return;
+ }
+
+ var sequence = currentQuest.Quest.FindSequence(currentQuest.Sequence);
+ if (sequence == null)
+ return;
+
+ QuestStep? step = sequence.FindStep(currentQuest.Step);
+ if (step == null)
+ return;
+
+ if (step.PointMenuChoices.Count == 0)
+ {
+ _logger.LogWarning("No point menu choices");
+ return;
+ }
+
+ int counter = currentQuest.StepProgress.PointMenuCounter;
+ if (counter >= step.PointMenuChoices.Count)
+ {
+ _logger.LogWarning("No remaining point menu choices");
+ return;
+ }
+
+ uint choice = step.PointMenuChoices[counter];
+
+ _logger.LogInformation("Handling point menu, picking choice {Choice} (index = {Index})", choice, counter);
+ var selectChoice = stackalloc AtkValue[]
+ {
+ new() { Type = ValueType.Int, Int = 13 },
+ new() { Type = ValueType.UInt, UInt = choice }
+ };
+ addonPointMenu->FireCallback(2, selectChoice);
+
+ _questController.CurrentQuest = currentQuest with
+ {
+ StepProgress = currentQuest.StepProgress with
+ {
+ PointMenuCounter = counter + 1,
+ }
+ };
+ }
+
private unsafe void CreditPostSetup(AddonEvent type, AddonArgs args)
{
_logger.LogInformation("Closing Credits sequence");
_addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "ContentsTutorial", ContentsTutorialPostSetup);
_addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "AkatsukiNote", UnendingCodexPostSetup);
_addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "Credit", CreditPostSetup);
+ _addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "PointMenu", PointMenuPostSetup);
_addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "SelectYesno", SelectYesnoPostSetup);
_addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "SelectIconString", SelectIconStringPostSetup);
_addonLifecycle.UnregisterListener(AddonEvent.PostSetup, "CutSceneSelectString", CutsceneSelectStringPostSetup);
(QuestSequence? seq, QuestStep? step) = GetNextStep();
if (CurrentQuest == null || seq == null || step == null)
{
- _logger.LogWarning("Could not retrieve next quest step, not doing anything");
+ _logger.LogWarning("Could not retrieve next quest step, not doing anything [{QuestId}, {Sequence}, {Step}]",
+ CurrentQuest?.Quest.QuestId, CurrentQuest?.Sequence, CurrentQuest?.Step);
return;
}
}
public sealed record StepProgress(
- DateTime StartedAt);
+ DateTime StartedAt,
+ int PointMenuCounter = 0);
}
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
+using System.Linq;
using System.IO;
using System.Text.Json;
using Dalamud.Plugin;
quest.Name = questData.Name.ToString();
quest.Level = questData.ClassJobLevel0;
+
+#if !RELEASE
+ int missingSteps = quest.Data.QuestSequence.Where(x => x.Sequence < 255).Max(x => x.Sequence) - quest.Data.QuestSequence.Count(x => x.Sequence < 255) + 1;
+ if (missingSteps != 0)
+ _logger.LogWarning("Quest has missing steps: {QuestId} / {QuestName} → {Count}", quest.QuestId, quest.Name, missingSteps);
+#endif
}
_logger.LogInformation("Loaded {Count} quests", _quests.Count);
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Questionable.Controller.Steps.BaseTasks;
+using Questionable.Data;
using Questionable.Model;
using Questionable.Model.V1;
ILogger<MoveBuilder> logger,
GameFunctions gameFunctions,
IClientState clientState,
- MovementController movementController)
+ MovementController movementController,
+ TerritoryData territoryData)
{
public QuestStep Step { get; set; } = null!;
public Vector3 Destination { get; set; }
}
yield return new WaitConditionTask(() => clientState.TerritoryType == Step.TerritoryId,
- $"Wait(territory: {Step.TerritoryId})");
+ $"Wait(territory: {territoryData.GetNameAndId(Step.TerritoryId)})");
if (!Step.DisableNavmesh)
yield return new WaitConditionTask(() => movementController.IsNavmeshReady,
using FFXIVClientStructs.FFXIV.Client.Game;
using Microsoft.Extensions.DependencyInjection;
using Questionable.Controller.Steps.BaseTasks;
+using Questionable.Data;
using Questionable.Model;
using Questionable.Model.V1;
internal static class WaitAtEnd
{
- internal sealed class Factory(IServiceProvider serviceProvider, IClientState clientState, ICondition condition)
+ internal sealed class Factory(IServiceProvider serviceProvider, IClientState clientState, ICondition condition,
+ TerritoryData territoryData)
: ITaskFactory
{
public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step)
// interaction moves to a different territory
waitInteraction = new WaitConditionTask(
() => clientState.TerritoryType == step.TargetTerritoryId,
- $"Wait(tp to territory: {step.TargetTerritoryId})");
+ $"Wait(tp to territory: {territoryData.GetNameAndId(step.TargetTerritoryId.Value)})");
}
else
{
using System.Collections.Immutable;
+using System.Globalization;
using System.Linq;
using Dalamud.Plugin.Services;
+using FFXIVClientStructs.FFXIV.Client.Game.Character;
using Lumina.Excel.GeneratedSheets;
namespace Questionable.Data;
public string? GetName(ushort territoryId) => _territoryNames.GetValueOrDefault(territoryId);
+ public string GetNameAndId(ushort territoryId)
+ {
+ string? territoryName = GetName(territoryId);
+ if (territoryName != null)
+ return string.Create(CultureInfo.InvariantCulture, $"{territoryName} ({territoryId})");
+ else
+ return territoryId.ToString(CultureInfo.InvariantCulture);
+ }
+
public bool CanUseMount(ushort territoryId) => _territoriesWithMount.Contains(territoryId);
}
{
Debug.Assert(_clientState.LocalPlayer != null, "_clientState.LocalPlayer != null");
- string? territoryName = _territoryData.GetName(_clientState.TerritoryType);
- if (territoryName != null)
- territoryName += string.Create(CultureInfo.InvariantCulture, $" ({_clientState.TerritoryType})");
- else
- territoryName = _clientState.TerritoryType.ToString(CultureInfo.InvariantCulture);
-
+ string territoryName = _territoryData.GetNameAndId(_clientState.TerritoryType);
ImGui.Text(territoryName);
+
if (_gameFunctions.IsFlyingUnlockedInCurrentZone())
{
ImGui.SameLine();
{
string interactionType = gameObject->NamePlateIconId switch
{
- 71201 or 71211 or 71221 or 71231 or 71341 => "AcceptQuest",
- 71202 or 71212 or 71222 or 71232 or 71342 => "AcceptQuest", // repeatable
- 71205 or 71215 or 71225 or 71235 or 71345 => "CompleteQuest",
+ 71201 or 71211 or 71221 or 71231 or 71341 or 71351 => "AcceptQuest",
+ 71202 or 71212 or 71222 or 71232 or 71342 or 71352 => "AcceptQuest", // repeatable
+ 71205 or 71215 or 71225 or 71235 or 71345 or 71355 => "CompleteQuest",
_ => "Interact",
};
ImGui.SetClipboardText($$"""